kenaz 0.3.2 → 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.
- package/core/.agents/skills/typesafe-ai/LICENSE +21 -21
- package/core/.agents/skills/typesafe-ai/SKILL.md +149 -149
- package/core/.claude/commands/Ansuz.md +19 -30
- package/core/.claude/hooks/_ansuz-conversation.js +1 -0
- package/core/.claude/hooks/_ansuz-conversation.test.js +6 -0
- package/core/.claude/hooks/_run-user-prompt.js +0 -4
- package/core/.claude/hooks/_run-user-prompt.test.js +2 -3
- package/core/.claude/hooks/session-init.ps1 +49 -49
- package/core/.claude/settings.json +0 -37
- package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
- package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
- package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
- package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
- package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
- package/core/.collaboration/core/task-api.js +3 -8
- package/core/.formation/tests/hello.txt +2 -2
- package/core/.formation/tools/prompt.js +58 -5
- package/core/.formation/tools/prompt.test.js +29 -0
- package/core/.kenaz/claude-hooks-manifest.json +16 -16
- package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
- package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
- package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
- package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
- package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
- package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
- package/core/.kenaz/muninn_episode_write.ps1 +17 -17
- package/core/.kenaz/specialist/field_report_watermark.json +1 -1
- package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
- package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
- package/core/.kenaz/specialist/t1777_probe.txt +1 -1
- package/core/.matrix/index.matrix +5 -5
- package/core/.specialist/Ansuz/RULES.md +6 -10
- package/core/.specialist/tools/__tests__/task-2218-boot-session-id.test.js +17 -1
- package/core/.specialist/tools/__tests__/task-2222-session-identity-interleave.test.js +17 -1
- package/core/.specialist/tools/__tests__/task-2254-handoff-archive-contract.test.js +6 -5
- package/core/.specialist/tools/ansuz-boot-fast.js +44 -100
- package/core/.specialist/tools/ansuz-boot-fast.test.js +45 -1
- package/core/KENAZ_CORE_VERSION +1 -1
- package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
- package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
- package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
- package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
- package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
- package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
- package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
- package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
- package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
- package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
- package/core/dev/jev-eval/README.md +99 -99
- package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
- package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
- package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
- package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
- package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
- package/core/dev/pipeline/tasks/.gitkeep +1 -1
- package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
- package/core/dev/plans/ANSUZ_SLIM_PLAN.md +68 -0
- package/core/dev/scripts/init_git.sh +0 -0
- package/core/dev/scripts/init_project.sh +0 -0
- package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
- package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
- package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
- package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
- package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
- package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
- package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
- package/core/dev/scripts/run_once.sh +0 -0
- package/core/dev/scripts/setup_mcp.sh +0 -0
- package/core/dev/scripts/setup_rag.sh +0 -0
- package/core/dev/scripts/start_dev_agent.sh +0 -0
- package/core/dev/scripts/start_multi_agent.sh +0 -0
- package/core/dev/scripts/sync_task_queue.sh +0 -0
- package/core/k-cli/dist/alaya/run.js +91 -0
- package/core/k-cli/dist/core/output.js +24 -0
- package/core/k-cli/dist/core/process.js +38 -0
- package/core/k-cli/dist/core/project.js +80 -0
- package/core/k-cli/dist/core/spawn.js +268 -0
- package/core/k-cli/dist/core/types.js +2 -0
- package/core/k-cli/dist/dashboard/update.js +53 -0
- package/core/k-cli/dist/dashboard/version.js +20 -0
- package/core/k-cli/dist/dispatch/run.js +241 -0
- package/core/k-cli/dist/dispatch/status.js +103 -0
- package/core/k-cli/dist/index.js +283 -0
- package/core/k-cli/dist/project/initialize.js +301 -0
- package/core/k-cli/dist/project/install.js +89 -0
- package/core/k-cli/dist/project/status.js +138 -0
- package/core/k-cli/dist/specialist/list.js +100 -0
- package/core/k-cli/dist/specialist/run.js +93 -0
- package/core/k-cli/dist/task/create.js +194 -0
- package/core/k-cli/dist/task/delete.js +98 -0
- package/core/k-cli/dist/task/get.js +55 -0
- package/core/k-cli/dist/task/list.js +58 -0
- package/core/k-cli/dist/task/submit.js +156 -0
- package/core/k-cli/dist/ygg/run.js +51 -0
- package/core/k-cli/node_modules/.bin/yaml +16 -0
- package/core/k-cli/node_modules/.bin/yaml.cmd +17 -0
- package/core/k-cli/node_modules/.bin/yaml.ps1 +28 -0
- package/core/k-cli/node_modules/.package-lock.json +23 -0
- package/core/k-cli/node_modules/yaml/LICENSE +13 -0
- package/core/k-cli/node_modules/yaml/README.md +172 -0
- package/core/k-cli/node_modules/yaml/bin.mjs +11 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +217 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +223 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/core/k-cli/node_modules/yaml/browser/dist/errors.js +57 -0
- package/core/k-cli/node_modules/yaml/browser/dist/index.js +17 -0
- package/core/k-cli/node_modules/yaml/browser/dist/log.js +11 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +114 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +717 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +967 -0
- package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +64 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +24 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/core/k-cli/node_modules/yaml/browser/dist/util.js +11 -0
- package/core/k-cli/node_modules/yaml/browser/dist/visit.js +233 -0
- package/core/k-cli/node_modules/yaml/browser/index.js +5 -0
- package/core/k-cli/node_modules/yaml/browser/package.json +3 -0
- package/core/k-cli/node_modules/yaml/dist/cli.d.ts +8 -0
- package/core/k-cli/node_modules/yaml/dist/cli.mjs +201 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/core/k-cli/node_modules/yaml/dist/compose/composer.js +222 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +225 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/core/k-cli/node_modules/yaml/dist/doc/Document.js +337 -0
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/core/k-cli/node_modules/yaml/dist/doc/directives.js +178 -0
- package/core/k-cli/node_modules/yaml/dist/errors.d.ts +21 -0
- package/core/k-cli/node_modules/yaml/dist/errors.js +62 -0
- package/core/k-cli/node_modules/yaml/dist/index.d.ts +25 -0
- package/core/k-cli/node_modules/yaml/dist/index.js +50 -0
- package/core/k-cli/node_modules/yaml/dist/log.d.ts +3 -0
- package/core/k-cli/node_modules/yaml/dist/log.js +19 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +116 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +43 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/options.d.ts +350 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst.js +112 -0
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +719 -0
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/core/k-cli/node_modules/yaml/dist/parse/parser.js +972 -0
- package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/core/k-cli/node_modules/yaml/dist/public-api.js +107 -0
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/core/k-cli/node_modules/yaml/dist/schema/tags.js +99 -0
- package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +68 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +26 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/test-events.js +134 -0
- package/core/k-cli/node_modules/yaml/dist/util.d.ts +16 -0
- package/core/k-cli/node_modules/yaml/dist/util.js +28 -0
- package/core/k-cli/node_modules/yaml/dist/visit.d.ts +102 -0
- package/core/k-cli/node_modules/yaml/dist/visit.js +236 -0
- package/core/k-cli/node_modules/yaml/package.json +97 -0
- package/core/k-cli/node_modules/yaml/util.js +2 -0
- package/core/plugins/kenaz/commands/Ansuz.md +19 -30
- package/core/plugins/kenaz/hooks/hooks.json +1 -5
- package/core/plugins/kenaz/hooks/kenaz-hook.js +0 -4
- package/core/plugins/kenaz/scripts/kenaz.test.js +1 -1
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
- package/lib/cli.js +36 -2
- package/lib/cli.test.js +24 -0
- package/lib/dashboard.js +10 -0
- package/package.json +6 -6
- package/core/.specialist/tools/__tests__/task-1863-boot-lease-reuse.test.js +0 -99
- package/core/.specialist/tools/__tests__/task-1977-banner-cap.test.js +0 -129
|
@@ -1,144 +1,144 @@
|
|
|
1
|
-
diff --git a/src/storage/index/hash_index.cpp b/src/storage/index/hash_index.cpp
|
|
2
|
-
index b65b3da86..2e952966e 100644
|
|
3
|
-
--- a/src/storage/index/hash_index.cpp
|
|
4
|
-
+++ b/src/storage/index/hash_index.cpp
|
|
5
|
-
@@ -770,13 +770,15 @@ void PrimaryKeyIndex::checkpoint(main::ClientContext*, storage::PageAllocator& p
|
|
6
|
-
indexChanged = true;
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
+ // Assign both header pages under one condition: the constructor rejects an overflow
|
|
10
|
-
+ // header page without index header pages.
|
|
11
|
-
if (indexChanged) {
|
|
12
|
-
writeHeaders(pageAllocator);
|
|
13
|
-
hashIndexDiskArrays->checkpoint(getDiskArrayFirstHeaderPage(), pageAllocator);
|
|
14
|
-
- }
|
|
15
|
-
- if (overflowFile) {
|
|
16
|
-
- overflowFile->checkpoint(pageAllocator);
|
|
17
|
-
- updateOverflowHeaderPageIfNeeded(storageInfo.get(), overflowFile.get());
|
|
18
|
-
+ if (overflowFile) {
|
|
19
|
-
+ overflowFile->checkpoint(pageAllocator);
|
|
20
|
-
+ updateOverflowHeaderPageIfNeeded(storageInfo.get(), overflowFile.get());
|
|
21
|
-
+ }
|
|
22
|
-
}
|
|
23
|
-
// Make sure that changes which bypassed the WAL are written.
|
|
24
|
-
// There is no other mechanism for enforcing that they are flushed
|
|
25
|
-
diff --git a/test/storage/CMakeLists.txt b/test/storage/CMakeLists.txt
|
|
26
|
-
index 581979387..3cabd5c2b 100644
|
|
27
|
-
--- a/test/storage/CMakeLists.txt
|
|
28
|
-
+++ b/test/storage/CMakeLists.txt
|
|
29
|
-
@@ -3,6 +3,7 @@ add_lbug_test(compression_test compression_test.cpp compress_chunk_test.cpp)
|
|
30
|
-
add_lbug_test(alp_exception_chunk_test alp_exception_chunk_test.cpp)
|
|
31
|
-
add_lbug_test(column_chunk_metadata_test column_chunk_metadata_test.cpp)
|
|
32
|
-
add_lbug_test(local_hash_index_test local_hash_index_test.cpp)
|
|
33
|
-
+add_lbug_test(pk_index_checkpoint_test pk_index_checkpoint_test.cpp)
|
|
34
|
-
add_lbug_test(disk_array_collection_test disk_array_collection_test.cpp)
|
|
35
|
-
add_lbug_test(buffer_manager_test buffer_manager_test.cpp)
|
|
36
|
-
add_lbug_test(rel_tests rel_scan_test.cpp rel_delete_test.cpp)
|
|
37
|
-
diff --git a/test/storage/pk_index_checkpoint_test.cpp b/test/storage/pk_index_checkpoint_test.cpp
|
|
38
|
-
new file mode 100644
|
|
39
|
-
index 000000000..1e577c45f
|
|
40
|
-
--- /dev/null
|
|
41
|
-
+++ b/test/storage/pk_index_checkpoint_test.cpp
|
|
42
|
-
@@ -0,0 +1,102 @@
|
|
43
|
-
+#include "catalog/catalog.h"
|
|
44
|
-
+#include "catalog/catalog_entry/node_table_catalog_entry.h"
|
|
45
|
-
+#include "graph_test/private_graph_test.h"
|
|
46
|
-
+#include "storage/index/hash_index.h"
|
|
47
|
-
+#include "storage/storage_manager.h"
|
|
48
|
-
+#include "storage/table/node_table.h"
|
|
49
|
-
+#include "test_helper/test_helper.h"
|
|
50
|
-
+#include "transaction/transaction.h"
|
|
51
|
-
+
|
|
52
|
-
+using namespace lbug::common;
|
|
53
|
-
+using namespace lbug::catalog;
|
|
54
|
-
+using namespace lbug::storage;
|
|
55
|
-
+using namespace lbug::transaction;
|
|
56
|
-
+
|
|
57
|
-
+namespace lbug {
|
|
58
|
-
+namespace testing {
|
|
59
|
-
+
|
|
60
|
-
+// Regression tests for #464: checkpointing an empty STRING primary-key index must not persist an
|
|
61
|
-
+// overflow header page without the index header pages, which the constructor rejects on reopen.
|
|
62
|
-
+class PKIndexCheckpointTest : public EmptyDBTest {
|
|
63
|
-
+protected:
|
|
64
|
-
+ void SetUp() override {
|
|
65
|
-
+ EmptyDBTest::SetUp();
|
|
66
|
-
+ createDBAndConn();
|
|
67
|
-
+ }
|
|
68
|
-
+
|
|
69
|
-
+ void assertQuery(const std::string& query) const {
|
|
70
|
-
+ auto result = conn->query(query);
|
|
71
|
-
+ ASSERT_TRUE(result->isSuccess()) << query << ": " << result->toString();
|
|
72
|
-
+ }
|
|
73
|
-
+
|
|
74
|
-
+ const PrimaryKeyIndexStorageInfo& getPKStorageInfo(const std::string& tableName) const {
|
|
75
|
-
+ auto* entry = database->getCatalog()
|
|
76
|
-
+ ->getTableCatalogEntry(&DUMMY_CHECKPOINT_TRANSACTION, tableName)
|
|
77
|
-
+ ->ptrCast<NodeTableCatalogEntry>();
|
|
78
|
-
+ auto& nodeTable =
|
|
79
|
-
+ database->getStorageManager()->getTable(entry->getTableID())->cast<NodeTable>();
|
|
80
|
-
+ return nodeTable.getPKIndex()->getStorageInfo().constCast<PrimaryKeyIndexStorageInfo>();
|
|
81
|
-
+ }
|
|
82
|
-
+
|
|
83
|
-
+ // Both header pointers are assigned together, so an unset index header page implies an unset
|
|
84
|
-
+ // overflow header page.
|
|
85
|
-
+ void assertHeaderPagesConsistent(const std::string& tableName) const {
|
|
86
|
-
+ const auto& info = getPKStorageInfo(tableName);
|
|
87
|
-
+ if (info.firstHeaderPage == INVALID_PAGE_IDX) {
|
|
88
|
-
+ EXPECT_EQ(info.overflowHeaderPage, INVALID_PAGE_IDX)
|
|
89
|
-
+ << "overflow header page persisted without index header pages";
|
|
90
|
-
+ }
|
|
91
|
-
+ }
|
|
92
|
-
+
|
|
93
|
-
+ void reopen() {
|
|
94
|
-
+ conn.reset();
|
|
95
|
-
+ createDBAndConn();
|
|
96
|
-
+ }
|
|
97
|
-
+};
|
|
98
|
-
+
|
|
99
|
-
+TEST_F(PKIndexCheckpointTest, EmptyStringPKCheckpointAfterAlter) {
|
|
100
|
-
+ if (inMemMode) {
|
|
101
|
-
+ GTEST_SKIP();
|
|
102
|
-
+ }
|
|
103
|
-
+ assertQuery("CREATE NODE TABLE t(id STRING PRIMARY KEY);");
|
|
104
|
-
+ assertQuery("ALTER TABLE t ADD v INT64;");
|
|
105
|
-
+ assertQuery("CHECKPOINT;");
|
|
106
|
-
+ assertHeaderPagesConsistent("t");
|
|
107
|
-
+
|
|
108
|
-
+ ASSERT_NO_THROW(reopen());
|
|
109
|
-
+ auto result = conn->query("MATCH (n:t) RETURN count(*);");
|
|
110
|
-
+ ASSERT_TRUE(result->isSuccess()) << result->toString();
|
|
111
|
-
+ EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"0"});
|
|
112
|
-
+ assertHeaderPagesConsistent("t");
|
|
113
|
-
+}
|
|
114
|
-
+
|
|
115
|
-
+TEST_F(PKIndexCheckpointTest, InsertAfterEmptyStringPKCheckpoint) {
|
|
116
|
-
+ if (inMemMode) {
|
|
117
|
-
+ GTEST_SKIP();
|
|
118
|
-
+ }
|
|
119
|
-
+ assertQuery("CREATE NODE TABLE t(id STRING PRIMARY KEY);");
|
|
120
|
-
+ assertQuery("ALTER TABLE t ADD v INT64;");
|
|
121
|
-
+ assertQuery("CHECKPOINT;");
|
|
122
|
-
+ assertQuery("CREATE (:t {id: 'a-key-longer-than-twelve-bytes', v: 1});");
|
|
123
|
-
+ assertQuery("CREATE (:t {id: 'short', v: 2});");
|
|
124
|
-
+ assertQuery("CHECKPOINT;");
|
|
125
|
-
+ assertHeaderPagesConsistent("t");
|
|
126
|
-
+
|
|
127
|
-
+ ASSERT_NO_THROW(reopen());
|
|
128
|
-
+ auto result = conn->query("MATCH (n:t) WHERE n.id = 'a-key-longer-than-twelve-bytes' "
|
|
129
|
-
+ "RETURN n.v;");
|
|
130
|
-
+ ASSERT_TRUE(result->isSuccess()) << result->toString();
|
|
131
|
-
+ EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"1"});
|
|
132
|
-
+ result = conn->query("MATCH (n:t) WHERE n.id = 'short' RETURN n.v;");
|
|
133
|
-
+ ASSERT_TRUE(result->isSuccess()) << result->toString();
|
|
134
|
-
+ EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"2"});
|
|
135
|
-
+ // The primary key must still reject duplicates after reopen.
|
|
136
|
-
+ result = conn->query("CREATE (:t {id: 'a-key-longer-than-twelve-bytes', v: 3});");
|
|
137
|
-
+ EXPECT_FALSE(result->isSuccess());
|
|
138
|
-
+ const auto& info = getPKStorageInfo("t");
|
|
139
|
-
+ EXPECT_NE(info.firstHeaderPage, INVALID_PAGE_IDX);
|
|
140
|
-
+ EXPECT_NE(info.overflowHeaderPage, INVALID_PAGE_IDX);
|
|
141
|
-
+}
|
|
142
|
-
+
|
|
143
|
-
+} // namespace testing
|
|
144
|
-
+} // namespace lbug
|
|
1
|
+
diff --git a/src/storage/index/hash_index.cpp b/src/storage/index/hash_index.cpp
|
|
2
|
+
index b65b3da86..2e952966e 100644
|
|
3
|
+
--- a/src/storage/index/hash_index.cpp
|
|
4
|
+
+++ b/src/storage/index/hash_index.cpp
|
|
5
|
+
@@ -770,13 +770,15 @@ void PrimaryKeyIndex::checkpoint(main::ClientContext*, storage::PageAllocator& p
|
|
6
|
+
indexChanged = true;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
+ // Assign both header pages under one condition: the constructor rejects an overflow
|
|
10
|
+
+ // header page without index header pages.
|
|
11
|
+
if (indexChanged) {
|
|
12
|
+
writeHeaders(pageAllocator);
|
|
13
|
+
hashIndexDiskArrays->checkpoint(getDiskArrayFirstHeaderPage(), pageAllocator);
|
|
14
|
+
- }
|
|
15
|
+
- if (overflowFile) {
|
|
16
|
+
- overflowFile->checkpoint(pageAllocator);
|
|
17
|
+
- updateOverflowHeaderPageIfNeeded(storageInfo.get(), overflowFile.get());
|
|
18
|
+
+ if (overflowFile) {
|
|
19
|
+
+ overflowFile->checkpoint(pageAllocator);
|
|
20
|
+
+ updateOverflowHeaderPageIfNeeded(storageInfo.get(), overflowFile.get());
|
|
21
|
+
+ }
|
|
22
|
+
}
|
|
23
|
+
// Make sure that changes which bypassed the WAL are written.
|
|
24
|
+
// There is no other mechanism for enforcing that they are flushed
|
|
25
|
+
diff --git a/test/storage/CMakeLists.txt b/test/storage/CMakeLists.txt
|
|
26
|
+
index 581979387..3cabd5c2b 100644
|
|
27
|
+
--- a/test/storage/CMakeLists.txt
|
|
28
|
+
+++ b/test/storage/CMakeLists.txt
|
|
29
|
+
@@ -3,6 +3,7 @@ add_lbug_test(compression_test compression_test.cpp compress_chunk_test.cpp)
|
|
30
|
+
add_lbug_test(alp_exception_chunk_test alp_exception_chunk_test.cpp)
|
|
31
|
+
add_lbug_test(column_chunk_metadata_test column_chunk_metadata_test.cpp)
|
|
32
|
+
add_lbug_test(local_hash_index_test local_hash_index_test.cpp)
|
|
33
|
+
+add_lbug_test(pk_index_checkpoint_test pk_index_checkpoint_test.cpp)
|
|
34
|
+
add_lbug_test(disk_array_collection_test disk_array_collection_test.cpp)
|
|
35
|
+
add_lbug_test(buffer_manager_test buffer_manager_test.cpp)
|
|
36
|
+
add_lbug_test(rel_tests rel_scan_test.cpp rel_delete_test.cpp)
|
|
37
|
+
diff --git a/test/storage/pk_index_checkpoint_test.cpp b/test/storage/pk_index_checkpoint_test.cpp
|
|
38
|
+
new file mode 100644
|
|
39
|
+
index 000000000..1e577c45f
|
|
40
|
+
--- /dev/null
|
|
41
|
+
+++ b/test/storage/pk_index_checkpoint_test.cpp
|
|
42
|
+
@@ -0,0 +1,102 @@
|
|
43
|
+
+#include "catalog/catalog.h"
|
|
44
|
+
+#include "catalog/catalog_entry/node_table_catalog_entry.h"
|
|
45
|
+
+#include "graph_test/private_graph_test.h"
|
|
46
|
+
+#include "storage/index/hash_index.h"
|
|
47
|
+
+#include "storage/storage_manager.h"
|
|
48
|
+
+#include "storage/table/node_table.h"
|
|
49
|
+
+#include "test_helper/test_helper.h"
|
|
50
|
+
+#include "transaction/transaction.h"
|
|
51
|
+
+
|
|
52
|
+
+using namespace lbug::common;
|
|
53
|
+
+using namespace lbug::catalog;
|
|
54
|
+
+using namespace lbug::storage;
|
|
55
|
+
+using namespace lbug::transaction;
|
|
56
|
+
+
|
|
57
|
+
+namespace lbug {
|
|
58
|
+
+namespace testing {
|
|
59
|
+
+
|
|
60
|
+
+// Regression tests for #464: checkpointing an empty STRING primary-key index must not persist an
|
|
61
|
+
+// overflow header page without the index header pages, which the constructor rejects on reopen.
|
|
62
|
+
+class PKIndexCheckpointTest : public EmptyDBTest {
|
|
63
|
+
+protected:
|
|
64
|
+
+ void SetUp() override {
|
|
65
|
+
+ EmptyDBTest::SetUp();
|
|
66
|
+
+ createDBAndConn();
|
|
67
|
+
+ }
|
|
68
|
+
+
|
|
69
|
+
+ void assertQuery(const std::string& query) const {
|
|
70
|
+
+ auto result = conn->query(query);
|
|
71
|
+
+ ASSERT_TRUE(result->isSuccess()) << query << ": " << result->toString();
|
|
72
|
+
+ }
|
|
73
|
+
+
|
|
74
|
+
+ const PrimaryKeyIndexStorageInfo& getPKStorageInfo(const std::string& tableName) const {
|
|
75
|
+
+ auto* entry = database->getCatalog()
|
|
76
|
+
+ ->getTableCatalogEntry(&DUMMY_CHECKPOINT_TRANSACTION, tableName)
|
|
77
|
+
+ ->ptrCast<NodeTableCatalogEntry>();
|
|
78
|
+
+ auto& nodeTable =
|
|
79
|
+
+ database->getStorageManager()->getTable(entry->getTableID())->cast<NodeTable>();
|
|
80
|
+
+ return nodeTable.getPKIndex()->getStorageInfo().constCast<PrimaryKeyIndexStorageInfo>();
|
|
81
|
+
+ }
|
|
82
|
+
+
|
|
83
|
+
+ // Both header pointers are assigned together, so an unset index header page implies an unset
|
|
84
|
+
+ // overflow header page.
|
|
85
|
+
+ void assertHeaderPagesConsistent(const std::string& tableName) const {
|
|
86
|
+
+ const auto& info = getPKStorageInfo(tableName);
|
|
87
|
+
+ if (info.firstHeaderPage == INVALID_PAGE_IDX) {
|
|
88
|
+
+ EXPECT_EQ(info.overflowHeaderPage, INVALID_PAGE_IDX)
|
|
89
|
+
+ << "overflow header page persisted without index header pages";
|
|
90
|
+
+ }
|
|
91
|
+
+ }
|
|
92
|
+
+
|
|
93
|
+
+ void reopen() {
|
|
94
|
+
+ conn.reset();
|
|
95
|
+
+ createDBAndConn();
|
|
96
|
+
+ }
|
|
97
|
+
+};
|
|
98
|
+
+
|
|
99
|
+
+TEST_F(PKIndexCheckpointTest, EmptyStringPKCheckpointAfterAlter) {
|
|
100
|
+
+ if (inMemMode) {
|
|
101
|
+
+ GTEST_SKIP();
|
|
102
|
+
+ }
|
|
103
|
+
+ assertQuery("CREATE NODE TABLE t(id STRING PRIMARY KEY);");
|
|
104
|
+
+ assertQuery("ALTER TABLE t ADD v INT64;");
|
|
105
|
+
+ assertQuery("CHECKPOINT;");
|
|
106
|
+
+ assertHeaderPagesConsistent("t");
|
|
107
|
+
+
|
|
108
|
+
+ ASSERT_NO_THROW(reopen());
|
|
109
|
+
+ auto result = conn->query("MATCH (n:t) RETURN count(*);");
|
|
110
|
+
+ ASSERT_TRUE(result->isSuccess()) << result->toString();
|
|
111
|
+
+ EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"0"});
|
|
112
|
+
+ assertHeaderPagesConsistent("t");
|
|
113
|
+
+}
|
|
114
|
+
+
|
|
115
|
+
+TEST_F(PKIndexCheckpointTest, InsertAfterEmptyStringPKCheckpoint) {
|
|
116
|
+
+ if (inMemMode) {
|
|
117
|
+
+ GTEST_SKIP();
|
|
118
|
+
+ }
|
|
119
|
+
+ assertQuery("CREATE NODE TABLE t(id STRING PRIMARY KEY);");
|
|
120
|
+
+ assertQuery("ALTER TABLE t ADD v INT64;");
|
|
121
|
+
+ assertQuery("CHECKPOINT;");
|
|
122
|
+
+ assertQuery("CREATE (:t {id: 'a-key-longer-than-twelve-bytes', v: 1});");
|
|
123
|
+
+ assertQuery("CREATE (:t {id: 'short', v: 2});");
|
|
124
|
+
+ assertQuery("CHECKPOINT;");
|
|
125
|
+
+ assertHeaderPagesConsistent("t");
|
|
126
|
+
+
|
|
127
|
+
+ ASSERT_NO_THROW(reopen());
|
|
128
|
+
+ auto result = conn->query("MATCH (n:t) WHERE n.id = 'a-key-longer-than-twelve-bytes' "
|
|
129
|
+
+ "RETURN n.v;");
|
|
130
|
+
+ ASSERT_TRUE(result->isSuccess()) << result->toString();
|
|
131
|
+
+ EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"1"});
|
|
132
|
+
+ result = conn->query("MATCH (n:t) WHERE n.id = 'short' RETURN n.v;");
|
|
133
|
+
+ ASSERT_TRUE(result->isSuccess()) << result->toString();
|
|
134
|
+
+ EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"2"});
|
|
135
|
+
+ // The primary key must still reject duplicates after reopen.
|
|
136
|
+
+ result = conn->query("CREATE (:t {id: 'a-key-longer-than-twelve-bytes', v: 3});");
|
|
137
|
+
+ EXPECT_FALSE(result->isSuccess());
|
|
138
|
+
+ const auto& info = getPKStorageInfo("t");
|
|
139
|
+
+ EXPECT_NE(info.firstHeaderPage, INVALID_PAGE_IDX);
|
|
140
|
+
+ EXPECT_NE(info.overflowHeaderPage, INVALID_PAGE_IDX);
|
|
141
|
+
+}
|
|
142
|
+
+
|
|
143
|
+
+} // namespace testing
|
|
144
|
+
+} // namespace lbug
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
@@ -290,6 +290,12 @@ NodeGroupScanResult CSRNodeGroup::scanCommittedInMemSequential(const Transaction
|
|
2
|
-
const ChunkedNodeGroup* chunkedGroup = nullptr;
|
|
3
|
-
{
|
|
4
|
-
const auto lock = chunkedGroups.lock();
|
|
5
|
-
+ // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel) can yield an
|
|
6
|
-
+ // out-of-range chunk group index. Guard against it instead of dereferencing
|
|
7
|
-
+ // a null/out-of-bounds group. See LadybugDB/ladybug#611.
|
|
8
|
-
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
9
|
-
+ return NODE_GROUP_SCAN_EMPTY_RESULT;
|
|
10
|
-
+ }
|
|
11
|
-
chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
12
|
-
}
|
|
13
|
-
chunkedGroup->scan(transaction, tableState, nodeGroupScanState, startRowInChunk, numRows);
|
|
14
|
-
@@ -315,8 +321,15 @@ NodeGroupScanResult CSRNodeGroup::scanCommittedInMemRandom(const Transaction* tr
|
|
15
|
-
auto [chunkIdx, rowInChunk] =
|
|
16
|
-
StorageUtils::getQuotientRemainder(rowIdx, StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
17
|
-
if (chunkIdx != currentChunkIdx) {
|
|
18
|
-
- currentChunkIdx = chunkIdx;
|
|
19
|
-
const auto lock = chunkedGroups.lock();
|
|
20
|
-
+ // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel) can yield an
|
|
21
|
-
+ // out-of-range chunk group index. Skip such rows instead of dereferencing
|
|
22
|
-
+ // a null/out-of-bounds group. See LadybugDB/ladybug#611.
|
|
23
|
-
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
24
|
-
+ nextRow++;
|
|
25
|
-
+ continue;
|
|
26
|
-
+ }
|
|
27
|
-
+ currentChunkIdx = chunkIdx;
|
|
28
|
-
chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
29
|
-
}
|
|
30
|
-
DASSERT(chunkedGroup);
|
|
31
|
-
@@ -409,6 +422,11 @@ void CSRNodeGroup::update(const Transaction* transaction, CSRNodeGroupScanSource
|
|
32
|
-
auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(rowIdxInGroup,
|
|
33
|
-
StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
34
|
-
const auto lock = chunkedGroups.lock();
|
|
35
|
-
+ // A stale CSR index entry can yield an out-of-range chunk group index; treat
|
|
36
|
-
+ // the update as a no-op in that case. See LadybugDB/ladybug#611.
|
|
37
|
-
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
38
|
-
+ return;
|
|
39
|
-
+ }
|
|
40
|
-
const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
41
|
-
return chunkedGroup->update(transaction, rowInChunk, columnID, propertyVector);
|
|
42
|
-
}
|
|
43
|
-
@@ -431,6 +449,11 @@ bool CSRNodeGroup::delete_(const Transaction* transaction, CSRNodeGroupScanSourc
|
|
44
|
-
auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(rowIdxInGroup,
|
|
45
|
-
StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
46
|
-
const auto lock = chunkedGroups.lock();
|
|
47
|
-
+ // A stale CSR index entry can yield an out-of-range chunk group index; treat
|
|
48
|
-
+ // the delete as a no-op in that case. See LadybugDB/ladybug#611.
|
|
49
|
-
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
50
|
-
+ return false;
|
|
51
|
-
+ }
|
|
52
|
-
const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
53
|
-
return chunkedGroup->delete_(transaction, rowInChunk);
|
|
54
|
-
}
|
|
55
|
-
@@ -913,6 +936,15 @@ void CSRNodeGroup::collectInMemRegionChangesAndUpdateHeaderLength(const UniqLock
|
|
56
|
-
const auto row = rows[i];
|
|
57
|
-
auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(row,
|
|
58
|
-
StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
59
|
-
+ // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel from a
|
|
60
|
-
+ // prior checkpoint pass) can yield an out-of-range chunk group index.
|
|
61
|
-
+ // Treat it as already deleted and skip. See LadybugDB/ladybug#611.
|
|
62
|
-
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
63
|
-
+ csrIndex->indices[nodeOffset].turnToNonSequential();
|
|
64
|
-
+ csrIndex->indices[nodeOffset].setInvalid(i);
|
|
65
|
-
+ numInMemDeletionsInCSR++;
|
|
66
|
-
+ continue;
|
|
67
|
-
+ }
|
|
68
|
-
const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
69
|
-
if (chunkedGroup->isDeleted(txn, rowInChunk)) {
|
|
70
|
-
csrIndex->indices[nodeOffset].turnToNonSequential();
|
|
71
|
-
@@ -1117,6 +1149,15 @@ void CSRNodeGroup::populateCSRLengthInMemOnly(const UniqLock& lock, offset_t num
|
|
72
|
-
const auto row = rows[i];
|
|
73
|
-
auto [chunkIdx, rowInChunk] =
|
|
74
|
-
StorageUtils::getQuotientRemainder(row, StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
75
|
-
+ // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel from a prior
|
|
76
|
-
+ // checkpoint pass) can yield an out-of-range chunk group index. Treat it
|
|
77
|
-
+ // as already deleted. See LadybugDB/ladybug#611.
|
|
78
|
-
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
79
|
-
+ csrIndex->indices[offset].turnToNonSequential();
|
|
80
|
-
+ csrIndex->indices[offset].setInvalid(i);
|
|
81
|
-
+ lengthAfterDelete--;
|
|
82
|
-
+ continue;
|
|
83
|
-
+ }
|
|
84
|
-
const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
85
|
-
const auto isDeleted = chunkedGroup->isDeleted(txn, rowInChunk);
|
|
86
|
-
if (isDeleted) {
|
|
1
|
+
@@ -290,6 +290,12 @@ NodeGroupScanResult CSRNodeGroup::scanCommittedInMemSequential(const Transaction
|
|
2
|
+
const ChunkedNodeGroup* chunkedGroup = nullptr;
|
|
3
|
+
{
|
|
4
|
+
const auto lock = chunkedGroups.lock();
|
|
5
|
+
+ // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel) can yield an
|
|
6
|
+
+ // out-of-range chunk group index. Guard against it instead of dereferencing
|
|
7
|
+
+ // a null/out-of-bounds group. See LadybugDB/ladybug#611.
|
|
8
|
+
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
9
|
+
+ return NODE_GROUP_SCAN_EMPTY_RESULT;
|
|
10
|
+
+ }
|
|
11
|
+
chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
12
|
+
}
|
|
13
|
+
chunkedGroup->scan(transaction, tableState, nodeGroupScanState, startRowInChunk, numRows);
|
|
14
|
+
@@ -315,8 +321,15 @@ NodeGroupScanResult CSRNodeGroup::scanCommittedInMemRandom(const Transaction* tr
|
|
15
|
+
auto [chunkIdx, rowInChunk] =
|
|
16
|
+
StorageUtils::getQuotientRemainder(rowIdx, StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
17
|
+
if (chunkIdx != currentChunkIdx) {
|
|
18
|
+
- currentChunkIdx = chunkIdx;
|
|
19
|
+
const auto lock = chunkedGroups.lock();
|
|
20
|
+
+ // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel) can yield an
|
|
21
|
+
+ // out-of-range chunk group index. Skip such rows instead of dereferencing
|
|
22
|
+
+ // a null/out-of-bounds group. See LadybugDB/ladybug#611.
|
|
23
|
+
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
24
|
+
+ nextRow++;
|
|
25
|
+
+ continue;
|
|
26
|
+
+ }
|
|
27
|
+
+ currentChunkIdx = chunkIdx;
|
|
28
|
+
chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
29
|
+
}
|
|
30
|
+
DASSERT(chunkedGroup);
|
|
31
|
+
@@ -409,6 +422,11 @@ void CSRNodeGroup::update(const Transaction* transaction, CSRNodeGroupScanSource
|
|
32
|
+
auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(rowIdxInGroup,
|
|
33
|
+
StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
34
|
+
const auto lock = chunkedGroups.lock();
|
|
35
|
+
+ // A stale CSR index entry can yield an out-of-range chunk group index; treat
|
|
36
|
+
+ // the update as a no-op in that case. See LadybugDB/ladybug#611.
|
|
37
|
+
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
38
|
+
+ return;
|
|
39
|
+
+ }
|
|
40
|
+
const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
41
|
+
return chunkedGroup->update(transaction, rowInChunk, columnID, propertyVector);
|
|
42
|
+
}
|
|
43
|
+
@@ -431,6 +449,11 @@ bool CSRNodeGroup::delete_(const Transaction* transaction, CSRNodeGroupScanSourc
|
|
44
|
+
auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(rowIdxInGroup,
|
|
45
|
+
StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
46
|
+
const auto lock = chunkedGroups.lock();
|
|
47
|
+
+ // A stale CSR index entry can yield an out-of-range chunk group index; treat
|
|
48
|
+
+ // the delete as a no-op in that case. See LadybugDB/ladybug#611.
|
|
49
|
+
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
50
|
+
+ return false;
|
|
51
|
+
+ }
|
|
52
|
+
const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
53
|
+
return chunkedGroup->delete_(transaction, rowInChunk);
|
|
54
|
+
}
|
|
55
|
+
@@ -913,6 +936,15 @@ void CSRNodeGroup::collectInMemRegionChangesAndUpdateHeaderLength(const UniqLock
|
|
56
|
+
const auto row = rows[i];
|
|
57
|
+
auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(row,
|
|
58
|
+
StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
59
|
+
+ // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel from a
|
|
60
|
+
+ // prior checkpoint pass) can yield an out-of-range chunk group index.
|
|
61
|
+
+ // Treat it as already deleted and skip. See LadybugDB/ladybug#611.
|
|
62
|
+
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
63
|
+
+ csrIndex->indices[nodeOffset].turnToNonSequential();
|
|
64
|
+
+ csrIndex->indices[nodeOffset].setInvalid(i);
|
|
65
|
+
+ numInMemDeletionsInCSR++;
|
|
66
|
+
+ continue;
|
|
67
|
+
+ }
|
|
68
|
+
const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
69
|
+
if (chunkedGroup->isDeleted(txn, rowInChunk)) {
|
|
70
|
+
csrIndex->indices[nodeOffset].turnToNonSequential();
|
|
71
|
+
@@ -1117,6 +1149,15 @@ void CSRNodeGroup::populateCSRLengthInMemOnly(const UniqLock& lock, offset_t num
|
|
72
|
+
const auto row = rows[i];
|
|
73
|
+
auto [chunkIdx, rowInChunk] =
|
|
74
|
+
StorageUtils::getQuotientRemainder(row, StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
|
|
75
|
+
+ // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel from a prior
|
|
76
|
+
+ // checkpoint pass) can yield an out-of-range chunk group index. Treat it
|
|
77
|
+
+ // as already deleted. See LadybugDB/ladybug#611.
|
|
78
|
+
+ if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
|
|
79
|
+
+ csrIndex->indices[offset].turnToNonSequential();
|
|
80
|
+
+ csrIndex->indices[offset].setInvalid(i);
|
|
81
|
+
+ lengthAfterDelete--;
|
|
82
|
+
+ continue;
|
|
83
|
+
+ }
|
|
84
|
+
const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
|
|
85
|
+
const auto isDeleted = chunkedGroup->isDeleted(txn, rowInChunk);
|
|
86
|
+
if (isDeleted) {
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
$episodeStart = @{
|
|
2
|
-
task_id = 'SESSION_ansuz-prompt-1785056865691'
|
|
3
|
-
scope = 'Bifrost adapter invariant, dispatch routing symmetry'
|
|
4
|
-
agent_role = 'ansuz'
|
|
5
|
-
agent_skill = 'session-observer'
|
|
6
|
-
projectPath = 'C:\Users\user\Documents\GitHub\KenazAI'
|
|
7
|
-
} | ConvertTo-Json
|
|
8
|
-
|
|
9
|
-
$response = Invoke-WebRequest -Uri 'http://127.0.0.1:18080/api/hippocampus/episode_start' `
|
|
10
|
-
-Method POST `
|
|
11
|
-
-ContentType 'application/json' `
|
|
12
|
-
-Body $episodeStart `
|
|
13
|
-
-ErrorAction Stop
|
|
14
|
-
|
|
15
|
-
$episode = $response.Content | ConvertFrom-Json
|
|
16
|
-
Write-Output "Episode created: $($episode.episode_id)"
|
|
17
|
-
$episode.episode_id
|
|
1
|
+
$episodeStart = @{
|
|
2
|
+
task_id = 'SESSION_ansuz-prompt-1785056865691'
|
|
3
|
+
scope = 'Bifrost adapter invariant, dispatch routing symmetry'
|
|
4
|
+
agent_role = 'ansuz'
|
|
5
|
+
agent_skill = 'session-observer'
|
|
6
|
+
projectPath = 'C:\Users\user\Documents\GitHub\KenazAI'
|
|
7
|
+
} | ConvertTo-Json
|
|
8
|
+
|
|
9
|
+
$response = Invoke-WebRequest -Uri 'http://127.0.0.1:18080/api/hippocampus/episode_start' `
|
|
10
|
+
-Method POST `
|
|
11
|
+
-ContentType 'application/json' `
|
|
12
|
+
-Body $episodeStart `
|
|
13
|
+
-ErrorAction Stop
|
|
14
|
+
|
|
15
|
+
$episode = $response.Content | ConvertFrom-Json
|
|
16
|
+
Write-Output "Episode created: $($episode.episode_id)"
|
|
17
|
+
$episode.episode_id
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"last_seen_max_id":
|
|
1
|
+
{"last_seen_max_id":2368}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"28d36a7a-fcf1-488c-a1ed-d794ac52615f":{"files":["reference_worktree_rust_verify_recipe.md","feedback_mcp_default_project_drift.md","feedback_mark_landed_after_scoped_merge.md","feedback_heredoc_template_literal_escapes.md","reference_dashboard_release_procedure.md"],"lastFiredAtMs":1790248806590,"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge"]},"30cd222d-1a83-4617-a267-65ce8ec74a3e":{"files":["feedback_mcp_default_project_drift.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790249042951},"a0067f0e-60c1-4713-bdcb-8a34cd5205fd":{"files":["feedback_heredoc_template_literal_escapes.md","feedback_mcp_default_project_drift.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790259958980},"ee35d32d-321b-47e3-8a30-a8e096995cdd":{"files":["reference_worktree_rust_verify_recipe.md","feedback_never_cd_into_agent_worktrees.md","feedback_agent_tool_worktree_collision.md","feedback_mark_landed_after_scoped_merge.md","feedback_heredoc_template_literal_escapes.md","feedback_mcp_default_project_drift.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness"],"lastFiredAtMs":1790276539381},"1531340e-bf07-4bd6-909c-f22394d60876":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process"],"lastFiredAtMs":1790279018827},"73e6ee82-700b-4cbf-b002-c0b9b79dbab4":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process"],"lastFiredAtMs":1790365961440},"0722c428-a54f-47dc-9c1c-e12c1199dfe3":{"files":["feedback_never_cd_into_agent_worktrees.md","feedback_heredoc_template_literal_escapes.md","feedback_mark_landed_after_scoped_merge.md","feedback_agent_tool_worktree_collision.md","rune_synapse_incremental_index_blind_gap.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process"],"lastFiredAtMs":1790418630509},"f17d4fd3-7d6c-4e5e-9369-2b72a9266f90":{"files":["feedback_never_cd_into_agent_worktrees.md","feedback_heredoc_template_literal_escapes.md","rune_synapse_incremental_index_blind_gap.md","reference_dashboard_release_procedure.md","feedback_scoped_checkout_clobbers_worktree_state.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release"],"lastFiredAtMs":1790457931617},"6794bd6e-562a-4b58-a746-b5bdcaca0e7c":{"files":["feedback_mark_landed_after_scoped_merge.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge"],"lastFiredAtMs":1790455100260},"75239ce3-f0a2-4792-81f5-d842d132528f":{"files":["feedback_never_cd_into_agent_worktrees.md","feedback_mark_landed_after_scoped_merge.md","feedback_agent_tool_worktree_collision.md","feedback_heredoc_template_literal_escapes.md","reference_dashboard_release_procedure.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release"],"lastFiredAtMs":1790507402115},"804ea3d7-3de3-4586-b955-e6c8c684ff15":{"files":["feedback_heredoc_template_literal_escapes.md","feedback_never_cd_into_agent_worktrees.md","feedback_mcp_default_project_drift.md","feedback_mark_landed_after_scoped_merge.md","reference_worktree_rust_verify_recipe.md","reference_dashboard_release_procedure.md","feedback_agent_tool_worktree_collision.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness"],"lastFiredAtMs":1790581324936},"3e9b8a3f-882d-45d4-bbe5-a258b2bb3ce4":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790542391812},"3e15f2bf-f80a-4e4d-8960-bcd1a640fdff":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790543837477},"61843060-69da-46a7-b86f-e5a0b342cea8":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790581238348},"5b87c0bf-873f-4d27-a261-fbde5ea03299":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790619871099},"9c6a266c-9db4-4810-a341-5ffcd1de8726":{"files":["reference_dashboard_release_procedure.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790621819503},"12bd9885-66a8-4c0c-9811-0b327d551fc0":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790629466743},"bb010604-4dca-4993-9de0-aecb4754ad8e":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790666206918},"4b12601f-6069-452b-a58c-bf8263400324":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790666901610},"4df219ec-ba5e-4f76-97c5-a43137f300de":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release"],"lastFiredAtMs":1790713272079},"3eecd2fc-56d7-4ee8-9a4f-2290da3fd123":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790718864114},"a806aaa3-3eaa-46bf-a9f2-f30cfa33acaa":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":[],"lastFiredAtMs":1790786463472},"c699f823-b467-4f50-ab73-e7351250a897":{"files":["reference_dashboard_release_procedure.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release"],"lastFiredAtMs":1790790894539},"2a1ccb2b-e66f-4b3a-a4e6-2ec48622defe":{"files":["rune_synapse_incremental_index_blind_gap.md","feedback_mcp_default_project_drift.md","reference_worktree_rust_verify_recipe.md","feedback_never_cd_into_agent_worktrees.md","feedback_heredoc_template_literal_escapes.md","feedback_agent_tool_worktree_collision.md","feedback_mark_landed_after_scoped_merge.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness"],"lastFiredAtMs":1790868373263},"9782d641-82fa-4c35-acf6-97758550adbb":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge"],"lastFiredAtMs":1790806751702},"cd5fc5ea-1d77-4c15-8b09-3bcb5da02559":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790863308920}}
|
|
1
|
+
{"566fcb6b-3fdb-4c39-801c-824eaeeadfbc":{"files":["feedback_heredoc_template_literal_escapes.md","feedback_never_cd_into_agent_worktrees.md","feedback_rust_merge_restarts_live_dashboard.md","feedback_eprintln_not_in_backend_log.md","feedback_msys_pathconv_mangles_rev_path.md","reference_dashboard_release_procedure.md","feedback_next_cache_after_frontend_deletions.md","feedback_never_truncate_tsc_output.md","feedback_cargo_feature_change_verify_tauri_dev.md","reference_worktree_rust_verify_recipe.md","feedback_agent_tool_worktree_collision.md","feedback_mark_landed_after_scoped_merge.md","feedback_worktree_remove_junction_empties_main.md","feedback_no_concurrent_next_build_vs_live_dev.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse memory & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness"],"lastFiredAtMs":1791567819597},"t-mg":{"files":["feedback_rust_merge_restarts_live_dashboard.md"],"areas":[],"lastFiredAtMs":1791544419180}}
|