cognitive-core 0.2.0 → 0.2.2
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/.claude/settings.json +111 -2
- package/.sessionlog/settings.json +4 -0
- package/dist/atlas.d.ts +10 -0
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +65 -0
- package/dist/atlas.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/learning/index.d.ts +1 -1
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/pipeline.d.ts +4 -31
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +12 -64
- package/dist/learning/pipeline.js.map +1 -1
- package/dist/learning/unified-pipeline.d.ts +30 -0
- package/dist/learning/unified-pipeline.d.ts.map +1 -1
- package/dist/learning/unified-pipeline.js +207 -0
- package/dist/learning/unified-pipeline.js.map +1 -1
- package/dist/memory/candidate-retrieval.d.ts.map +1 -1
- package/dist/memory/candidate-retrieval.js +3 -1
- package/dist/memory/candidate-retrieval.js.map +1 -1
- package/dist/memory/curated-loader.d.ts +21 -4
- package/dist/memory/curated-loader.d.ts.map +1 -1
- package/dist/memory/curated-loader.js +53 -16
- package/dist/memory/curated-loader.js.map +1 -1
- package/dist/memory/index.d.ts +2 -1
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +3 -1
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/playbook.d.ts +6 -0
- package/dist/memory/playbook.d.ts.map +1 -1
- package/dist/memory/playbook.js +15 -0
- package/dist/memory/playbook.js.map +1 -1
- package/dist/memory/source-resolver.d.ts +120 -0
- package/dist/memory/source-resolver.d.ts.map +1 -0
- package/dist/memory/source-resolver.js +300 -0
- package/dist/memory/source-resolver.js.map +1 -0
- package/dist/types/config.d.ts +141 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +40 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/error-classifier.js +8 -8
- package/dist/utils/error-classifier.js.map +1 -1
- package/dist/workspace/efficacy-toolkit.d.ts +164 -0
- package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
- package/dist/workspace/efficacy-toolkit.js +281 -0
- package/dist/workspace/efficacy-toolkit.js.map +1 -0
- package/dist/workspace/index.d.ts +2 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +3 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/templates/index.d.ts +3 -0
- package/dist/workspace/templates/index.d.ts.map +1 -1
- package/dist/workspace/templates/index.js +6 -0
- package/dist/workspace/templates/index.js.map +1 -1
- package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
- package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-decay-detection.js +197 -0
- package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
- package/dist/workspace/types.d.ts +12 -54
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js.map +1 -1
- package/package.json +8 -2
- package/playbooks/compound-engineering/adversarial-review.json +51 -0
- package/playbooks/compound-engineering/agent-native-architecture.json +59 -0
- package/playbooks/compound-engineering/agent-native-review.json +54 -0
- package/playbooks/compound-engineering/api-contract-review.json +52 -0
- package/playbooks/compound-engineering/brainstorm-requirements.json +55 -0
- package/playbooks/compound-engineering/bug-reproduction.json +62 -0
- package/playbooks/compound-engineering/confidence-calibration.json +49 -0
- package/playbooks/compound-engineering/correctness-review.json +49 -0
- package/playbooks/compound-engineering/data-migration-safety.json +59 -0
- package/playbooks/compound-engineering/deployment-verification.json +63 -0
- package/playbooks/compound-engineering/error-recovery-patterns.json +53 -0
- package/playbooks/compound-engineering/implementation-planning.json +64 -0
- package/playbooks/compound-engineering/issue-pattern-analysis.json +53 -0
- package/playbooks/compound-engineering/knowledge-compounding.json +63 -0
- package/playbooks/compound-engineering/learnings-research.json +54 -0
- package/playbooks/compound-engineering/maintainability-review.json +49 -0
- package/playbooks/compound-engineering/performance-review.json +54 -0
- package/playbooks/compound-engineering/plan-adversarial-review.json +56 -0
- package/playbooks/compound-engineering/plan-feasibility-review.json +56 -0
- package/playbooks/compound-engineering/project-standards-review.json +52 -0
- package/playbooks/compound-engineering/reliability-review.json +53 -0
- package/playbooks/compound-engineering/review-orchestration.json +64 -0
- package/playbooks/compound-engineering/security-review.json +54 -0
- package/playbooks/compound-engineering/systematic-execution.json +64 -0
- package/playbooks/compound-engineering/testing-review.json +50 -0
- package/src/atlas.ts +96 -0
- package/src/index.ts +27 -0
- package/src/learning/index.ts +1 -0
- package/src/learning/unified-pipeline.ts +271 -1
- package/src/memory/candidate-retrieval.ts +2 -1
- package/src/memory/curated-loader.ts +69 -16
- package/src/memory/index.ts +16 -0
- package/src/memory/playbook.ts +19 -0
- package/src/memory/source-resolver.ts +422 -0
- package/src/types/config.ts +46 -0
- package/src/types/index.ts +4 -0
- package/src/utils/error-classifier.ts +8 -8
- package/src/workspace/efficacy-toolkit.ts +496 -0
- package/src/workspace/index.ts +29 -0
- package/src/workspace/templates/index.ts +24 -0
- package/src/workspace/templates/playbook-decay-detection.ts +272 -0
- package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
- package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
- package/src/workspace/types.ts +22 -78
- package/tests/fixtures/behavioral-trajectories.ts +210 -0
- package/tests/integration/curated-sources-e2e.test.ts +502 -0
- package/tests/integration/pipeline-data-correctness.test.ts +794 -0
- package/tests/learning/meta-learner.test.ts +418 -0
- package/tests/learning/pipeline-memory-updates.test.ts +721 -0
- package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
- package/tests/memory/candidate-retrieval.test.ts +167 -0
- package/tests/memory/compound-engineering-seed.test.ts +338 -0
- package/tests/memory/curated-loader-extended.test.ts +225 -0
- package/tests/memory/meta.test.ts +399 -0
- package/tests/memory/playbook-quality-validation.test.ts +430 -0
- package/tests/memory/source-resolver.test.ts +700 -0
- package/tests/search/evaluator.test.ts +257 -0
- package/tests/search/verification-runner.test.ts +357 -0
- package/tests/utils/error-classifier.test.ts +149 -0
- package/tests/utils/trajectory-helpers.test.ts +163 -0
- package/tests/workspace/efficacy-toolkit.test.ts +404 -0
- package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
- package/.claude/settings.local.json +0 -11
- package/dist/learning/llm-extractor.d.ts +0 -88
- package/dist/learning/llm-extractor.d.ts.map +0 -1
- package/dist/learning/llm-extractor.js +0 -372
- package/dist/learning/llm-extractor.js.map +0 -1
- package/dist/learning/loop-coordinator.d.ts +0 -61
- package/dist/learning/loop-coordinator.d.ts.map +0 -1
- package/dist/learning/loop-coordinator.js +0 -96
- package/dist/learning/loop-coordinator.js.map +0 -1
- package/references/agent-workspace/CLAUDE.md +0 -74
- package/references/agent-workspace/README.md +0 -587
- package/references/agent-workspace/media/banner.png +0 -0
- package/references/agent-workspace/package-lock.json +0 -2061
- package/references/agent-workspace/package.json +0 -54
- package/references/agent-workspace/src/handle.ts +0 -122
- package/references/agent-workspace/src/index.ts +0 -32
- package/references/agent-workspace/src/manager.ts +0 -102
- package/references/agent-workspace/src/readers/json.ts +0 -71
- package/references/agent-workspace/src/readers/markdown.ts +0 -37
- package/references/agent-workspace/src/readers/raw.ts +0 -27
- package/references/agent-workspace/src/types.ts +0 -68
- package/references/agent-workspace/src/validation.ts +0 -93
- package/references/agent-workspace/src/writers/json.ts +0 -17
- package/references/agent-workspace/src/writers/markdown.ts +0 -27
- package/references/agent-workspace/src/writers/raw.ts +0 -22
- package/references/agent-workspace/tests/errors.test.ts +0 -652
- package/references/agent-workspace/tests/handle.test.ts +0 -144
- package/references/agent-workspace/tests/manager.test.ts +0 -124
- package/references/agent-workspace/tests/readers.test.ts +0 -205
- package/references/agent-workspace/tests/validation.test.ts +0 -196
- package/references/agent-workspace/tests/writers.test.ts +0 -108
- package/references/agent-workspace/tsconfig.json +0 -20
- package/references/agent-workspace/tsup.config.ts +0 -9
- package/references/minimem/.claude/settings.json +0 -7
- package/references/minimem/.sudocode/issues.jsonl +0 -18
- package/references/minimem/.sudocode/specs.jsonl +0 -1
- package/references/minimem/CLAUDE.md +0 -310
- package/references/minimem/README.md +0 -556
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
- package/references/minimem/claude-plugin/.mcp.json +0 -7
- package/references/minimem/claude-plugin/README.md +0 -158
- package/references/minimem/claude-plugin/commands/recall.md +0 -47
- package/references/minimem/claude-plugin/commands/remember.md +0 -41
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
- package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
- package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
- package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
- package/references/minimem/package-lock.json +0 -5373
- package/references/minimem/package.json +0 -60
- package/references/minimem/scripts/postbuild.js +0 -35
- package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
- package/references/minimem/src/__tests__/errors.test.ts +0 -265
- package/references/minimem/src/__tests__/helpers.ts +0 -199
- package/references/minimem/src/__tests__/internal.test.ts +0 -407
- package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
- package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
- package/references/minimem/src/__tests__/session.test.ts +0 -190
- package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
- package/references/minimem/src/cli/commands/append.ts +0 -76
- package/references/minimem/src/cli/commands/config.ts +0 -262
- package/references/minimem/src/cli/commands/conflicts.ts +0 -413
- package/references/minimem/src/cli/commands/daemon.ts +0 -169
- package/references/minimem/src/cli/commands/index.ts +0 -12
- package/references/minimem/src/cli/commands/init.ts +0 -88
- package/references/minimem/src/cli/commands/mcp.ts +0 -177
- package/references/minimem/src/cli/commands/push-pull.ts +0 -213
- package/references/minimem/src/cli/commands/search.ts +0 -158
- package/references/minimem/src/cli/commands/status.ts +0 -84
- package/references/minimem/src/cli/commands/sync-init.ts +0 -290
- package/references/minimem/src/cli/commands/sync.ts +0 -70
- package/references/minimem/src/cli/commands/upsert.ts +0 -197
- package/references/minimem/src/cli/config.ts +0 -584
- package/references/minimem/src/cli/index.ts +0 -264
- package/references/minimem/src/cli/shared.ts +0 -161
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
- package/references/minimem/src/cli/sync/central.ts +0 -292
- package/references/minimem/src/cli/sync/conflicts.ts +0 -204
- package/references/minimem/src/cli/sync/daemon.ts +0 -407
- package/references/minimem/src/cli/sync/detection.ts +0 -138
- package/references/minimem/src/cli/sync/index.ts +0 -107
- package/references/minimem/src/cli/sync/operations.ts +0 -373
- package/references/minimem/src/cli/sync/registry.ts +0 -279
- package/references/minimem/src/cli/sync/state.ts +0 -355
- package/references/minimem/src/cli/sync/validation.ts +0 -206
- package/references/minimem/src/cli/sync/watcher.ts +0 -234
- package/references/minimem/src/cli/version.ts +0 -34
- package/references/minimem/src/core/index.ts +0 -9
- package/references/minimem/src/core/indexer.ts +0 -628
- package/references/minimem/src/core/searcher.ts +0 -221
- package/references/minimem/src/db/schema.ts +0 -183
- package/references/minimem/src/db/sqlite-vec.ts +0 -24
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
- package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
- package/references/minimem/src/embeddings/batch-openai.ts +0 -409
- package/references/minimem/src/embeddings/embeddings.ts +0 -434
- package/references/minimem/src/index.ts +0 -109
- package/references/minimem/src/internal.ts +0 -299
- package/references/minimem/src/minimem.ts +0 -1276
- package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
- package/references/minimem/src/search/graph.ts +0 -234
- package/references/minimem/src/search/hybrid.ts +0 -151
- package/references/minimem/src/search/search.ts +0 -256
- package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
- package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
- package/references/minimem/src/server/mcp.ts +0 -326
- package/references/minimem/src/server/tools.ts +0 -720
- package/references/minimem/src/session.ts +0 -460
- package/references/minimem/tsconfig.json +0 -19
- package/references/minimem/tsup.config.ts +0 -26
- package/references/minimem/vitest.config.ts +0 -24
- package/references/sessionlog/.husky/pre-commit +0 -1
- package/references/sessionlog/.lintstagedrc.json +0 -4
- package/references/sessionlog/.prettierignore +0 -4
- package/references/sessionlog/.prettierrc.json +0 -11
- package/references/sessionlog/LICENSE +0 -21
- package/references/sessionlog/README.md +0 -453
- package/references/sessionlog/eslint.config.js +0 -58
- package/references/sessionlog/package-lock.json +0 -3672
- package/references/sessionlog/package.json +0 -65
- package/references/sessionlog/src/__tests__/agent-hooks.test.ts +0 -570
- package/references/sessionlog/src/__tests__/agent-registry.test.ts +0 -127
- package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +0 -225
- package/references/sessionlog/src/__tests__/claude-generator.test.ts +0 -46
- package/references/sessionlog/src/__tests__/commit-msg.test.ts +0 -86
- package/references/sessionlog/src/__tests__/cursor-agent.test.ts +0 -224
- package/references/sessionlog/src/__tests__/e2e-live.test.ts +0 -890
- package/references/sessionlog/src/__tests__/event-log.test.ts +0 -183
- package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +0 -105
- package/references/sessionlog/src/__tests__/gemini-agent.test.ts +0 -375
- package/references/sessionlog/src/__tests__/git-hooks.test.ts +0 -78
- package/references/sessionlog/src/__tests__/hook-managers.test.ts +0 -121
- package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +0 -759
- package/references/sessionlog/src/__tests__/opencode-agent.test.ts +0 -338
- package/references/sessionlog/src/__tests__/redaction.test.ts +0 -136
- package/references/sessionlog/src/__tests__/session-repo.test.ts +0 -353
- package/references/sessionlog/src/__tests__/session-store.test.ts +0 -166
- package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +0 -466
- package/references/sessionlog/src/__tests__/skill-live.test.ts +0 -461
- package/references/sessionlog/src/__tests__/summarize.test.ts +0 -348
- package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +0 -610
- package/references/sessionlog/src/__tests__/task-plan-live.test.ts +0 -632
- package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +0 -121
- package/references/sessionlog/src/__tests__/types.test.ts +0 -166
- package/references/sessionlog/src/__tests__/utils.test.ts +0 -333
- package/references/sessionlog/src/__tests__/validation.test.ts +0 -103
- package/references/sessionlog/src/__tests__/worktree.test.ts +0 -57
- package/references/sessionlog/src/agent/agents/claude-code.ts +0 -1089
- package/references/sessionlog/src/agent/agents/cursor.ts +0 -361
- package/references/sessionlog/src/agent/agents/gemini-cli.ts +0 -632
- package/references/sessionlog/src/agent/agents/opencode.ts +0 -540
- package/references/sessionlog/src/agent/registry.ts +0 -143
- package/references/sessionlog/src/agent/session-types.ts +0 -113
- package/references/sessionlog/src/agent/types.ts +0 -220
- package/references/sessionlog/src/cli.ts +0 -597
- package/references/sessionlog/src/commands/clean.ts +0 -133
- package/references/sessionlog/src/commands/disable.ts +0 -84
- package/references/sessionlog/src/commands/doctor.ts +0 -145
- package/references/sessionlog/src/commands/enable.ts +0 -202
- package/references/sessionlog/src/commands/explain.ts +0 -261
- package/references/sessionlog/src/commands/reset.ts +0 -105
- package/references/sessionlog/src/commands/resume.ts +0 -180
- package/references/sessionlog/src/commands/rewind.ts +0 -195
- package/references/sessionlog/src/commands/setup-ccweb.ts +0 -275
- package/references/sessionlog/src/commands/status.ts +0 -172
- package/references/sessionlog/src/config.ts +0 -165
- package/references/sessionlog/src/events/event-log.ts +0 -126
- package/references/sessionlog/src/git-operations.ts +0 -558
- package/references/sessionlog/src/hooks/git-hooks.ts +0 -165
- package/references/sessionlog/src/hooks/lifecycle.ts +0 -391
- package/references/sessionlog/src/index.ts +0 -650
- package/references/sessionlog/src/security/redaction.ts +0 -283
- package/references/sessionlog/src/session/state-machine.ts +0 -452
- package/references/sessionlog/src/store/checkpoint-store.ts +0 -509
- package/references/sessionlog/src/store/native-store.ts +0 -173
- package/references/sessionlog/src/store/provider-types.ts +0 -99
- package/references/sessionlog/src/store/session-store.ts +0 -266
- package/references/sessionlog/src/strategy/attribution.ts +0 -296
- package/references/sessionlog/src/strategy/common.ts +0 -207
- package/references/sessionlog/src/strategy/content-overlap.ts +0 -228
- package/references/sessionlog/src/strategy/manual-commit.ts +0 -988
- package/references/sessionlog/src/strategy/types.ts +0 -279
- package/references/sessionlog/src/summarize/claude-generator.ts +0 -115
- package/references/sessionlog/src/summarize/summarize.ts +0 -432
- package/references/sessionlog/src/types.ts +0 -508
- package/references/sessionlog/src/utils/chunk-files.ts +0 -49
- package/references/sessionlog/src/utils/commit-message.ts +0 -65
- package/references/sessionlog/src/utils/detect-agent.ts +0 -36
- package/references/sessionlog/src/utils/hook-managers.ts +0 -125
- package/references/sessionlog/src/utils/ide-tags.ts +0 -32
- package/references/sessionlog/src/utils/paths.ts +0 -79
- package/references/sessionlog/src/utils/preview-rewind.ts +0 -80
- package/references/sessionlog/src/utils/rewind-conflict.ts +0 -121
- package/references/sessionlog/src/utils/shadow-branch.ts +0 -109
- package/references/sessionlog/src/utils/string-utils.ts +0 -46
- package/references/sessionlog/src/utils/todo-extract.ts +0 -188
- package/references/sessionlog/src/utils/trailers.ts +0 -187
- package/references/sessionlog/src/utils/transcript-parse.ts +0 -177
- package/references/sessionlog/src/utils/transcript-timestamp.ts +0 -59
- package/references/sessionlog/src/utils/tree-ops.ts +0 -219
- package/references/sessionlog/src/utils/tty.ts +0 -72
- package/references/sessionlog/src/utils/validation.ts +0 -65
- package/references/sessionlog/src/utils/worktree.ts +0 -58
- package/references/sessionlog/src/wire-types.ts +0 -59
- package/references/sessionlog/templates/setup-env.sh +0 -153
- package/references/sessionlog/tsconfig.json +0 -18
- package/references/sessionlog/vitest.config.ts +0 -12
- package/references/skill-tree/.claude/settings.json +0 -6
- package/references/skill-tree/.sudocode/issues.jsonl +0 -19
- package/references/skill-tree/.sudocode/specs.jsonl +0 -3
- package/references/skill-tree/CLAUDE.md +0 -126
- package/references/skill-tree/README.md +0 -372
- package/references/skill-tree/docs/GAPS_v1.md +0 -221
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
- package/references/skill-tree/docs/TODOS.md +0 -91
- package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
- package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
- package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
- package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
- package/references/skill-tree/docs/scraper/README.md +0 -170
- package/references/skill-tree/examples/basic-usage.ts +0 -164
- package/references/skill-tree/package-lock.json +0 -1852
- package/references/skill-tree/package.json +0 -66
- package/references/skill-tree/scraper/README.md +0 -123
- package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
- package/references/skill-tree/scraper/docs/PLAN.md +0 -336
- package/references/skill-tree/scraper/drizzle.config.ts +0 -10
- package/references/skill-tree/scraper/package-lock.json +0 -6329
- package/references/skill-tree/scraper/package.json +0 -68
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
- package/references/skill-tree/scraper/tsup.config.ts +0 -14
- package/references/skill-tree/scraper/vitest.config.ts +0 -17
- package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
- package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
- package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
- package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
- package/references/skill-tree/test/run-all.ts +0 -106
- package/references/skill-tree/test/utils.ts +0 -128
- package/references/skill-tree/vitest.config.ts +0 -16
|
@@ -0,0 +1,794 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeline Data-Correctness Integration Tests
|
|
3
|
+
*
|
|
4
|
+
* Validates that the learning pipeline properly:
|
|
5
|
+
* 1. Identifies improvement points from trajectories (analysis)
|
|
6
|
+
* 2. Writes through to memory stores (experience, playbook, causal, reflexion)
|
|
7
|
+
* 3. Makes stored data retrievable via the correct query paths
|
|
8
|
+
* 4. Handles batch extraction → playbook library indexing
|
|
9
|
+
* 5. Coordinates hot + cold paths correctly
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
13
|
+
import { InstantLoop } from '../../src/learning/instant-loop.js';
|
|
14
|
+
import { LearningPipeline, createLearningPipeline } from '../../src/learning/pipeline.js';
|
|
15
|
+
import { LoopCoordinator } from '../../src/learning/loop-coordinator.js';
|
|
16
|
+
import { MemorySystem } from '../../src/memory/system.js';
|
|
17
|
+
import { createPlaybook } from '../../src/types/playbook.js';
|
|
18
|
+
import { createTrajectory, type Trajectory } from '../../src/types/trajectory.js';
|
|
19
|
+
import { createTask } from '../../src/types/task.js';
|
|
20
|
+
import { createStep } from '../../src/types/step.js';
|
|
21
|
+
import { successOutcome, failureOutcome } from '../../src/types/outcome.js';
|
|
22
|
+
import { createSqlitePersistence, type SqlitePersistence } from '../../src/persistence/index.js';
|
|
23
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
24
|
+
import { join } from 'node:path';
|
|
25
|
+
import { tmpdir } from 'node:os';
|
|
26
|
+
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Helpers
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
function makeSuccessTrajectory(opts?: {
|
|
32
|
+
domain?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
id?: string;
|
|
35
|
+
}): Trajectory {
|
|
36
|
+
return createTrajectory({
|
|
37
|
+
id: opts?.id,
|
|
38
|
+
task: createTask({
|
|
39
|
+
description: opts?.description ?? 'Fix the broken authentication module',
|
|
40
|
+
domain: opts?.domain ?? 'typescript',
|
|
41
|
+
}),
|
|
42
|
+
steps: [
|
|
43
|
+
createStep({
|
|
44
|
+
thought: 'Need to read the auth module',
|
|
45
|
+
action: 'ReadFile src/auth.ts',
|
|
46
|
+
observation: 'File content: export function login() { /* ... */ }',
|
|
47
|
+
}),
|
|
48
|
+
createStep({
|
|
49
|
+
thought: 'Found the bug — missing null check',
|
|
50
|
+
action: 'EditFile src/auth.ts',
|
|
51
|
+
observation: 'File updated: added null check for user token',
|
|
52
|
+
metadata: { attributionScore: 0.9 },
|
|
53
|
+
}),
|
|
54
|
+
createStep({
|
|
55
|
+
action: 'RunTests npm test',
|
|
56
|
+
observation: 'All 42 tests passed',
|
|
57
|
+
}),
|
|
58
|
+
],
|
|
59
|
+
outcome: successOutcome('Added null check in login() to prevent crash on undefined token'),
|
|
60
|
+
agentId: 'test-agent',
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function makeFailureTrajectory(opts?: {
|
|
65
|
+
domain?: string;
|
|
66
|
+
description?: string;
|
|
67
|
+
errorInfo?: string;
|
|
68
|
+
}): Trajectory {
|
|
69
|
+
return createTrajectory({
|
|
70
|
+
task: createTask({
|
|
71
|
+
description: opts?.description ?? 'Fix the database connection timeout',
|
|
72
|
+
domain: opts?.domain ?? 'typescript',
|
|
73
|
+
}),
|
|
74
|
+
steps: [
|
|
75
|
+
createStep({
|
|
76
|
+
thought: 'Check db config',
|
|
77
|
+
action: 'ReadFile src/db.ts',
|
|
78
|
+
observation: 'File content: const pool = createPool({ timeout: 5000 })',
|
|
79
|
+
}),
|
|
80
|
+
createStep({
|
|
81
|
+
thought: 'Try increasing timeout',
|
|
82
|
+
action: 'EditFile src/db.ts',
|
|
83
|
+
observation: 'File updated: timeout: 30000',
|
|
84
|
+
}),
|
|
85
|
+
],
|
|
86
|
+
outcome: failureOutcome(opts?.errorInfo ?? 'ECONNREFUSED 127.0.0.1:5432 - database server not running'),
|
|
87
|
+
agentId: 'test-agent',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// Test suite
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
|
|
95
|
+
describe('Pipeline Data Correctness', () => {
|
|
96
|
+
let tempDir: string;
|
|
97
|
+
let persistence: SqlitePersistence;
|
|
98
|
+
let memory: MemorySystem;
|
|
99
|
+
|
|
100
|
+
beforeEach(async () => {
|
|
101
|
+
tempDir = await mkdtemp(join(tmpdir(), 'atlas-data-correctness-'));
|
|
102
|
+
persistence = createSqlitePersistence({ baseDir: tempDir });
|
|
103
|
+
await persistence.init();
|
|
104
|
+
memory = new MemorySystem(persistence, tempDir);
|
|
105
|
+
await memory.init();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
afterEach(async () => {
|
|
109
|
+
await memory.close();
|
|
110
|
+
persistence.close();
|
|
111
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// =========================================================================
|
|
115
|
+
// 1. InstantLoop → Memory store write-through
|
|
116
|
+
// =========================================================================
|
|
117
|
+
describe('InstantLoop write-through to memory stores', () => {
|
|
118
|
+
let loop: InstantLoop;
|
|
119
|
+
|
|
120
|
+
beforeEach(() => {
|
|
121
|
+
loop = new InstantLoop(memory);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('should store experience that is retrievable by ID and by similarity', async () => {
|
|
125
|
+
const trajectory = makeSuccessTrajectory();
|
|
126
|
+
const result = await loop.process(trajectory);
|
|
127
|
+
|
|
128
|
+
// Verify retrievable by ID
|
|
129
|
+
const exp = await memory.experiences.get(result.experienceId);
|
|
130
|
+
expect(exp).toBeDefined();
|
|
131
|
+
expect(exp!.taskInput).toBe(trajectory.task.description);
|
|
132
|
+
expect(exp!.success).toBe(true);
|
|
133
|
+
|
|
134
|
+
// Verify retrievable by similarity search
|
|
135
|
+
const similar = await memory.experiences.findSimilar(
|
|
136
|
+
'authentication module bug fix',
|
|
137
|
+
{ k: 5 }
|
|
138
|
+
);
|
|
139
|
+
expect(similar.length).toBeGreaterThanOrEqual(1);
|
|
140
|
+
expect(similar.some(s => s.experience.id === result.experienceId)).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('should store causal edge for failed trajectory that is queryable', async () => {
|
|
144
|
+
const trajectory = makeFailureTrajectory();
|
|
145
|
+
const result = await loop.process(trajectory);
|
|
146
|
+
|
|
147
|
+
expect(result.causalEdgesExtracted).toBeGreaterThanOrEqual(1);
|
|
148
|
+
|
|
149
|
+
// Verify edge stored in CausalStore and queryable
|
|
150
|
+
const edges = await memory.causal.getByDomain('typescript');
|
|
151
|
+
expect(edges.length).toBeGreaterThanOrEqual(1);
|
|
152
|
+
|
|
153
|
+
const failureEdge = edges.find(e => e.id === `ce-fail-${trajectory.id}`);
|
|
154
|
+
expect(failureEdge).toBeDefined();
|
|
155
|
+
expect(failureEdge!.cause).toContain('database connection timeout');
|
|
156
|
+
expect(failureEdge!.effect).toContain('ECONNREFUSED');
|
|
157
|
+
expect(failureEdge!.confidence).toBe(0.4);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it('should store causal edge for successful trajectory with approach→outcome', async () => {
|
|
161
|
+
const trajectory = makeSuccessTrajectory();
|
|
162
|
+
const result = await loop.process(trajectory);
|
|
163
|
+
|
|
164
|
+
expect(result.causalEdgesExtracted).toBeGreaterThanOrEqual(1);
|
|
165
|
+
|
|
166
|
+
const edges = await memory.causal.getByDomain('typescript');
|
|
167
|
+
const successEdge = edges.find(e => e.id === `ce-succ-${trajectory.id}`);
|
|
168
|
+
expect(successEdge).toBeDefined();
|
|
169
|
+
expect(successEdge!.cause).toContain('authentication');
|
|
170
|
+
expect(successEdge!.effect).toContain('null check');
|
|
171
|
+
expect(successEdge!.confidence).toBe(0.7);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('should generate and store reflexion episode that is queryable by trajectory', async () => {
|
|
175
|
+
const trajectory = makeFailureTrajectory();
|
|
176
|
+
const result = await loop.process(trajectory);
|
|
177
|
+
|
|
178
|
+
expect(result.reflexionEpisodeId).toBeDefined();
|
|
179
|
+
|
|
180
|
+
// Verify reflexion stored and retrievable
|
|
181
|
+
const episode = await memory.reflexion.getByTrajectory(trajectory.id);
|
|
182
|
+
expect(episode).toBeDefined();
|
|
183
|
+
expect(episode!.id).toBe(result.reflexionEpisodeId);
|
|
184
|
+
expect(episode!.trajectoryId).toBe(trajectory.id);
|
|
185
|
+
expect(episode!.outcome).toBe('failure');
|
|
186
|
+
expect(episode!.selfCritique).toBeTruthy();
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it('should generate reflexion episode for successful trajectory too', async () => {
|
|
190
|
+
const trajectory = makeSuccessTrajectory();
|
|
191
|
+
const result = await loop.process(trajectory);
|
|
192
|
+
|
|
193
|
+
expect(result.reflexionEpisodeId).toBeDefined();
|
|
194
|
+
|
|
195
|
+
const episode = await memory.reflexion.getByTrajectory(trajectory.id);
|
|
196
|
+
expect(episode).toBeDefined();
|
|
197
|
+
expect(episode!.outcome).toBe('success');
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('should bump playbook confidence on success and persist the change', async () => {
|
|
201
|
+
const playbook = createPlaybook({
|
|
202
|
+
name: 'fix-auth-bugs',
|
|
203
|
+
confidence: 0.5,
|
|
204
|
+
applicability: {
|
|
205
|
+
situations: ['authentication bug', 'auth module error'],
|
|
206
|
+
triggers: ['authentication', 'auth module'],
|
|
207
|
+
antiPatterns: [],
|
|
208
|
+
domains: ['typescript'],
|
|
209
|
+
},
|
|
210
|
+
guidance: {
|
|
211
|
+
strategy: 'Check null references in auth flow',
|
|
212
|
+
tactics: ['add null checks', 'verify token handling'],
|
|
213
|
+
steps: [],
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
await memory.playbooks.add(playbook);
|
|
217
|
+
|
|
218
|
+
const trajectory = makeSuccessTrajectory({
|
|
219
|
+
description: 'Fix the authentication module crash',
|
|
220
|
+
});
|
|
221
|
+
const result = await loop.process(trajectory);
|
|
222
|
+
|
|
223
|
+
// Verify confidence was bumped
|
|
224
|
+
const match = result.matchedPlaybooks.find(m => m.id === playbook.id);
|
|
225
|
+
expect(match).toBeDefined();
|
|
226
|
+
expect(match!.confidenceDelta).toBeGreaterThan(0);
|
|
227
|
+
|
|
228
|
+
// Verify persisted value reflects the bump
|
|
229
|
+
const updated = await memory.playbooks.get(playbook.id);
|
|
230
|
+
expect(updated).toBeDefined();
|
|
231
|
+
expect(updated!.confidence).toBeGreaterThan(0.5);
|
|
232
|
+
expect(updated!.evolution.successCount).toBeGreaterThan(0);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('should decrease playbook confidence on failure and record failure context', async () => {
|
|
236
|
+
const playbook = createPlaybook({
|
|
237
|
+
name: 'fix-db-timeout',
|
|
238
|
+
confidence: 0.7,
|
|
239
|
+
applicability: {
|
|
240
|
+
situations: ['database connection timeout'],
|
|
241
|
+
triggers: ['database timeout', 'connection timeout'],
|
|
242
|
+
antiPatterns: [],
|
|
243
|
+
domains: ['typescript'],
|
|
244
|
+
},
|
|
245
|
+
guidance: {
|
|
246
|
+
strategy: 'Increase pool timeout',
|
|
247
|
+
tactics: [],
|
|
248
|
+
steps: [],
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
await memory.playbooks.add(playbook);
|
|
252
|
+
|
|
253
|
+
const trajectory = makeFailureTrajectory({
|
|
254
|
+
description: 'Fix the database connection timeout issue',
|
|
255
|
+
});
|
|
256
|
+
const result = await loop.process(trajectory);
|
|
257
|
+
|
|
258
|
+
const match = result.matchedPlaybooks.find(m => m.id === playbook.id);
|
|
259
|
+
if (match) {
|
|
260
|
+
expect(match.confidenceDelta).toBeLessThan(0);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Verify failure recorded in evolution
|
|
264
|
+
const updated = await memory.playbooks.get(playbook.id);
|
|
265
|
+
expect(updated).toBeDefined();
|
|
266
|
+
expect(updated!.confidence).toBeLessThan(0.7);
|
|
267
|
+
expect(updated!.evolution.failureCount).toBeGreaterThan(0);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('should process multiple trajectories and each writes independently', async () => {
|
|
271
|
+
const t1 = makeSuccessTrajectory({ description: 'Fix auth bug', domain: 'auth' });
|
|
272
|
+
const t2 = makeFailureTrajectory({ description: 'Fix DB issue', domain: 'database' });
|
|
273
|
+
const t3 = makeSuccessTrajectory({ description: 'Fix CSS layout', domain: 'frontend' });
|
|
274
|
+
|
|
275
|
+
const r1 = await loop.process(t1);
|
|
276
|
+
const r2 = await loop.process(t2);
|
|
277
|
+
const r3 = await loop.process(t3);
|
|
278
|
+
|
|
279
|
+
// All three experiences should exist
|
|
280
|
+
const e1 = await memory.experiences.get(r1.experienceId);
|
|
281
|
+
const e2 = await memory.experiences.get(r2.experienceId);
|
|
282
|
+
const e3 = await memory.experiences.get(r3.experienceId);
|
|
283
|
+
expect(e1).toBeDefined();
|
|
284
|
+
expect(e2).toBeDefined();
|
|
285
|
+
expect(e3).toBeDefined();
|
|
286
|
+
|
|
287
|
+
// Total experience count should be 3
|
|
288
|
+
const allExperiences = await memory.experiences.getAll();
|
|
289
|
+
expect(allExperiences.length).toBe(3);
|
|
290
|
+
|
|
291
|
+
// Causal edges should exist for all trajectories
|
|
292
|
+
const authEdges = await memory.causal.getByDomain('auth');
|
|
293
|
+
const dbEdges = await memory.causal.getByDomain('database');
|
|
294
|
+
const feEdges = await memory.causal.getByDomain('frontend');
|
|
295
|
+
expect(authEdges.length).toBeGreaterThanOrEqual(1);
|
|
296
|
+
expect(dbEdges.length).toBeGreaterThanOrEqual(1);
|
|
297
|
+
expect(feEdges.length).toBeGreaterThanOrEqual(1);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// =========================================================================
|
|
302
|
+
// 2. Batch pipeline → playbook extraction → library indexing
|
|
303
|
+
// =========================================================================
|
|
304
|
+
describe('Batch pipeline playbook extraction and indexing', () => {
|
|
305
|
+
let pipeline: LearningPipeline;
|
|
306
|
+
|
|
307
|
+
beforeEach(() => {
|
|
308
|
+
pipeline = createLearningPipeline(
|
|
309
|
+
memory,
|
|
310
|
+
{
|
|
311
|
+
minTrajectories: 2,
|
|
312
|
+
deduplicationThreshold: 0.95, // High threshold so similar tasks create new playbooks
|
|
313
|
+
minSuccessRate: 0.5,
|
|
314
|
+
maxExperiences: 1000,
|
|
315
|
+
},
|
|
316
|
+
{ enableTemporalCompression: false, enableReasoningBank: false },
|
|
317
|
+
);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it('should extract playbooks from successful trajectories and make them findable', async () => {
|
|
321
|
+
// Feed enough similar successful trajectories to trigger extraction
|
|
322
|
+
for (let i = 0; i < 4; i++) {
|
|
323
|
+
const t = makeSuccessTrajectory({
|
|
324
|
+
description: `Fix authentication null pointer in module ${i}`,
|
|
325
|
+
domain: 'typescript',
|
|
326
|
+
});
|
|
327
|
+
await pipeline.processTrajectory(t);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
const batchResult = await pipeline.runBatchLearning();
|
|
331
|
+
expect(batchResult.trajectoriesProcessed).toBe(4);
|
|
332
|
+
|
|
333
|
+
if (batchResult.playbooksExtracted > 0) {
|
|
334
|
+
// Verify extracted playbooks are findable via findMatching
|
|
335
|
+
const matches = await memory.playbooks.findMatching(
|
|
336
|
+
'Fix authentication null pointer bug',
|
|
337
|
+
{ k: 5, domains: ['typescript'] }
|
|
338
|
+
);
|
|
339
|
+
expect(matches.length).toBeGreaterThanOrEqual(1);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Regardless of extraction, all 4 experiences should be stored
|
|
343
|
+
const allExperiences = await memory.experiences.getAll();
|
|
344
|
+
expect(allExperiences.length).toBe(4);
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
it('should accumulate analyses with correct credit assignment', async () => {
|
|
348
|
+
const trajectory = makeSuccessTrajectory();
|
|
349
|
+
const result = await pipeline.processTrajectory(trajectory);
|
|
350
|
+
|
|
351
|
+
expect(result.analysis).toBeDefined();
|
|
352
|
+
expect(result.analysis.success).toBe(true);
|
|
353
|
+
expect(result.analysis.stepAttribution.length).toBe(trajectory.steps.length);
|
|
354
|
+
|
|
355
|
+
// Key steps should be identified (steps with highest attribution)
|
|
356
|
+
expect(result.analysis.keySteps.length).toBeGreaterThanOrEqual(1);
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
it('should identify error patterns from failed trajectories', async () => {
|
|
360
|
+
const trajectory = makeFailureTrajectory({
|
|
361
|
+
errorInfo: 'TypeError: Cannot read properties of undefined (reading "token")',
|
|
362
|
+
});
|
|
363
|
+
const result = await pipeline.processTrajectory(trajectory);
|
|
364
|
+
|
|
365
|
+
expect(result.analysis.success).toBe(false);
|
|
366
|
+
expect(result.analysis.errorPatterns).toBeDefined();
|
|
367
|
+
expect(result.analysis.errorPatterns!.length).toBeGreaterThanOrEqual(1);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
it('should run temporal compression on batch and update experiences', async () => {
|
|
371
|
+
const pipelineWithCompression = createLearningPipeline(
|
|
372
|
+
memory,
|
|
373
|
+
{ minTrajectories: 2, maxExperiences: 1000 },
|
|
374
|
+
{ enableTemporalCompression: true, enableReasoningBank: false },
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
// Process trajectories
|
|
378
|
+
for (let i = 0; i < 3; i++) {
|
|
379
|
+
await pipelineWithCompression.processTrajectory(
|
|
380
|
+
makeSuccessTrajectory({ description: `Task ${i}` })
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const batchResult = await pipelineWithCompression.runBatchLearning();
|
|
385
|
+
expect(batchResult.trajectoriesProcessed).toBe(3);
|
|
386
|
+
|
|
387
|
+
// After compression, experiences should still be queryable
|
|
388
|
+
const all = await memory.experiences.getAll();
|
|
389
|
+
expect(all.length).toBeGreaterThan(0);
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it('should build reasoning clusters in batch and persist them', async () => {
|
|
393
|
+
const pipelineWithClustering = createLearningPipeline(
|
|
394
|
+
memory,
|
|
395
|
+
{ minTrajectories: 2, maxExperiences: 1000 },
|
|
396
|
+
{ enableTemporalCompression: false, enableReasoningBank: true },
|
|
397
|
+
persistence,
|
|
398
|
+
);
|
|
399
|
+
|
|
400
|
+
// Process enough trajectories for clustering
|
|
401
|
+
for (let i = 0; i < 5; i++) {
|
|
402
|
+
await pipelineWithClustering.processTrajectory(
|
|
403
|
+
makeSuccessTrajectory({ description: `Fix module issue #${i}` })
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const batchResult = await pipelineWithClustering.runBatchLearning();
|
|
408
|
+
expect(batchResult.experiencesClustered).toBeGreaterThanOrEqual(5);
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
// =========================================================================
|
|
413
|
+
// 3. LoopCoordinator → hot + cold path coordination
|
|
414
|
+
// =========================================================================
|
|
415
|
+
describe('LoopCoordinator hot+cold path coordination', () => {
|
|
416
|
+
let loop: InstantLoop;
|
|
417
|
+
let coordinator: LoopCoordinator;
|
|
418
|
+
|
|
419
|
+
beforeEach(() => {
|
|
420
|
+
loop = new InstantLoop(memory);
|
|
421
|
+
coordinator = new LoopCoordinator(loop, { batchThreshold: 3 }, persistence);
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
it('should process via instant loop and track pending count', async () => {
|
|
425
|
+
const t1 = makeSuccessTrajectory({ description: 'Task A' });
|
|
426
|
+
const t2 = makeFailureTrajectory({ description: 'Task B' });
|
|
427
|
+
|
|
428
|
+
await coordinator.onTrajectoryComplete(t1);
|
|
429
|
+
expect(coordinator.getPendingCount()).toBe(1);
|
|
430
|
+
expect(coordinator.shouldRunBatch()).toBe(false);
|
|
431
|
+
|
|
432
|
+
await coordinator.onTrajectoryComplete(t2);
|
|
433
|
+
expect(coordinator.getPendingCount()).toBe(2);
|
|
434
|
+
expect(coordinator.shouldRunBatch()).toBe(false);
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
it('should signal batch at threshold', async () => {
|
|
438
|
+
for (let i = 0; i < 3; i++) {
|
|
439
|
+
await coordinator.onTrajectoryComplete(
|
|
440
|
+
makeSuccessTrajectory({ description: `Task ${i}` })
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
expect(coordinator.shouldRunBatch()).toBe(true);
|
|
444
|
+
expect(coordinator.getPendingCount()).toBe(3);
|
|
445
|
+
});
|
|
446
|
+
|
|
447
|
+
it('should reset pending count after batch acknowledged', async () => {
|
|
448
|
+
for (let i = 0; i < 3; i++) {
|
|
449
|
+
await coordinator.onTrajectoryComplete(
|
|
450
|
+
makeSuccessTrajectory({ description: `Task ${i}` })
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
expect(coordinator.shouldRunBatch()).toBe(true);
|
|
454
|
+
|
|
455
|
+
coordinator.resetPendingCount();
|
|
456
|
+
expect(coordinator.getPendingCount()).toBe(0);
|
|
457
|
+
expect(coordinator.shouldRunBatch()).toBe(false);
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
it('should persist pending count and restore on new coordinator', async () => {
|
|
461
|
+
// Process 2 trajectories
|
|
462
|
+
await coordinator.onTrajectoryComplete(makeSuccessTrajectory({ description: 'T1' }));
|
|
463
|
+
await coordinator.onTrajectoryComplete(makeSuccessTrajectory({ description: 'T2' }));
|
|
464
|
+
expect(coordinator.getPendingCount()).toBe(2);
|
|
465
|
+
|
|
466
|
+
// Create a new coordinator with same persistence — should restore count
|
|
467
|
+
const loop2 = new InstantLoop(memory);
|
|
468
|
+
const coordinator2 = new LoopCoordinator(loop2, { batchThreshold: 3 }, persistence);
|
|
469
|
+
expect(coordinator2.getPendingCount()).toBe(2);
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
it('should persist reset and restore zero', async () => {
|
|
473
|
+
await coordinator.onTrajectoryComplete(makeSuccessTrajectory({ description: 'T1' }));
|
|
474
|
+
coordinator.resetPendingCount();
|
|
475
|
+
|
|
476
|
+
const loop2 = new InstantLoop(memory);
|
|
477
|
+
const coordinator2 = new LoopCoordinator(loop2, { batchThreshold: 3 }, persistence);
|
|
478
|
+
expect(coordinator2.getPendingCount()).toBe(0);
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
it('should store all experiences in memory during hot path', async () => {
|
|
482
|
+
const trajectories: Trajectory[] = [];
|
|
483
|
+
for (let i = 0; i < 4; i++) {
|
|
484
|
+
const t = makeSuccessTrajectory({ description: `Coordinator task ${i}` });
|
|
485
|
+
trajectories.push(t);
|
|
486
|
+
await coordinator.onTrajectoryComplete(t);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// All 4 should be in memory
|
|
490
|
+
const all = await memory.experiences.getAll();
|
|
491
|
+
expect(all.length).toBe(4);
|
|
492
|
+
|
|
493
|
+
// Each should have reflexion
|
|
494
|
+
for (const t of trajectories) {
|
|
495
|
+
const episode = await memory.reflexion.getByTrajectory(t.id);
|
|
496
|
+
expect(episode).toBeDefined();
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
// =========================================================================
|
|
502
|
+
// 4. End-to-end: hot path → batch → verify all stores
|
|
503
|
+
// =========================================================================
|
|
504
|
+
describe('End-to-end hot path → batch → store verification', () => {
|
|
505
|
+
it('should properly flow trajectory through instant loop then batch', async () => {
|
|
506
|
+
const loop = new InstantLoop(memory);
|
|
507
|
+
const coordinator = new LoopCoordinator(loop, { batchThreshold: 3 }, persistence);
|
|
508
|
+
const pipeline = createLearningPipeline(
|
|
509
|
+
memory,
|
|
510
|
+
{ minTrajectories: 3, maxExperiences: 1000 },
|
|
511
|
+
{ enableTemporalCompression: true, enableReasoningBank: true },
|
|
512
|
+
persistence,
|
|
513
|
+
);
|
|
514
|
+
|
|
515
|
+
// Hot path: process 4 trajectories
|
|
516
|
+
const trajectories: Trajectory[] = [];
|
|
517
|
+
for (let i = 0; i < 4; i++) {
|
|
518
|
+
const t = i < 3
|
|
519
|
+
? makeSuccessTrajectory({ description: `Fix auth issue variant ${i}`, domain: 'auth' })
|
|
520
|
+
: makeFailureTrajectory({ description: 'Fix auth timeout', domain: 'auth' });
|
|
521
|
+
trajectories.push(t);
|
|
522
|
+
await coordinator.onTrajectoryComplete(t);
|
|
523
|
+
// Also feed into pipeline (skipStore since instant loop already stored)
|
|
524
|
+
await pipeline.processTrajectory(t, { skipStore: true });
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// Verify hot-path wrote everything
|
|
528
|
+
expect(coordinator.shouldRunBatch()).toBe(true);
|
|
529
|
+
const allExperiences = await memory.experiences.getAll();
|
|
530
|
+
expect(allExperiences.length).toBe(4);
|
|
531
|
+
|
|
532
|
+
// Verify reflexion episodes exist for all
|
|
533
|
+
for (const t of trajectories) {
|
|
534
|
+
const episode = await memory.reflexion.getByTrajectory(t.id);
|
|
535
|
+
expect(episode).toBeDefined();
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
// Verify causal edges exist (similar edges may be merged by CausalStore)
|
|
539
|
+
const causalEdges = await memory.causal.getByDomain('auth');
|
|
540
|
+
expect(causalEdges.length).toBeGreaterThanOrEqual(2); // At least success + failure patterns
|
|
541
|
+
|
|
542
|
+
// Cold path: run batch
|
|
543
|
+
const batchResult = await pipeline.runBatchLearning();
|
|
544
|
+
expect(batchResult.trajectoriesProcessed).toBe(4);
|
|
545
|
+
expect(batchResult.successRate).toBeCloseTo(0.75, 2);
|
|
546
|
+
|
|
547
|
+
// After batch, experiences should still be queryable
|
|
548
|
+
const postBatchExperiences = await memory.experiences.getAll();
|
|
549
|
+
expect(postBatchExperiences.length).toBeGreaterThan(0);
|
|
550
|
+
|
|
551
|
+
// Reset coordinator
|
|
552
|
+
coordinator.resetPendingCount();
|
|
553
|
+
expect(coordinator.getPendingCount()).toBe(0);
|
|
554
|
+
});
|
|
555
|
+
|
|
556
|
+
it('should not double-store experiences when skipStore is used', async () => {
|
|
557
|
+
const loop = new InstantLoop(memory);
|
|
558
|
+
const pipeline = createLearningPipeline(memory, { minTrajectories: 1 });
|
|
559
|
+
|
|
560
|
+
const trajectory = makeSuccessTrajectory();
|
|
561
|
+
|
|
562
|
+
// Hot path stores it
|
|
563
|
+
await loop.process(trajectory);
|
|
564
|
+
|
|
565
|
+
// Cold path with skipStore
|
|
566
|
+
await pipeline.processTrajectory(trajectory, { skipStore: true });
|
|
567
|
+
|
|
568
|
+
// Should only have 1 experience, not 2
|
|
569
|
+
const byTrajectory = await memory.experiences.getByTrajectory(trajectory.id);
|
|
570
|
+
expect(byTrajectory.length).toBe(1);
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
it('should double-store when skipStore is not used (documents expected behavior)', async () => {
|
|
574
|
+
const loop = new InstantLoop(memory);
|
|
575
|
+
const pipeline = createLearningPipeline(memory, { minTrajectories: 1 });
|
|
576
|
+
|
|
577
|
+
const trajectory = makeSuccessTrajectory();
|
|
578
|
+
|
|
579
|
+
// Hot path stores it
|
|
580
|
+
await loop.process(trajectory);
|
|
581
|
+
|
|
582
|
+
// Cold path without skipStore — stores again
|
|
583
|
+
await pipeline.processTrajectory(trajectory);
|
|
584
|
+
|
|
585
|
+
// Two experiences from the same trajectory
|
|
586
|
+
const byTrajectory = await memory.experiences.getByTrajectory(trajectory.id);
|
|
587
|
+
expect(byTrajectory.length).toBe(2);
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
// =========================================================================
|
|
592
|
+
// 5. Analysis quality — credit assignment and error patterns
|
|
593
|
+
// =========================================================================
|
|
594
|
+
describe('Analysis quality and improvement identification', () => {
|
|
595
|
+
let pipeline: LearningPipeline;
|
|
596
|
+
|
|
597
|
+
beforeEach(() => {
|
|
598
|
+
pipeline = createLearningPipeline(memory, { minTrajectories: 1 });
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
it('should correctly identify key steps with high attribution', async () => {
|
|
602
|
+
const trajectory = createTrajectory({
|
|
603
|
+
task: createTask({
|
|
604
|
+
description: 'Fix the rendering bug',
|
|
605
|
+
domain: 'frontend',
|
|
606
|
+
}),
|
|
607
|
+
steps: [
|
|
608
|
+
createStep({ action: 'ReadFile src/component.tsx', observation: 'JSX code' }),
|
|
609
|
+
createStep({ action: 'ReadFile src/styles.css', observation: 'CSS code' }),
|
|
610
|
+
createStep({
|
|
611
|
+
thought: 'Found the bug — z-index conflict',
|
|
612
|
+
action: 'EditFile src/styles.css',
|
|
613
|
+
observation: 'Fixed z-index from 1 to 10',
|
|
614
|
+
}),
|
|
615
|
+
createStep({ action: 'RunTests npm test', observation: 'All tests pass' }),
|
|
616
|
+
],
|
|
617
|
+
outcome: successOutcome('Fixed z-index conflict in styles.css'),
|
|
618
|
+
agentId: 'test-agent',
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
const result = await pipeline.processTrajectory(trajectory);
|
|
622
|
+
|
|
623
|
+
// The edit step (index 2) should have high attribution
|
|
624
|
+
expect(result.analysis.stepAttribution.length).toBe(4);
|
|
625
|
+
expect(result.analysis.keySteps.length).toBeGreaterThanOrEqual(1);
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
it('should mark trajectory with many steps as abstractable', async () => {
|
|
629
|
+
const trajectory = createTrajectory({
|
|
630
|
+
task: createTask({
|
|
631
|
+
description: 'Fix the flaky test',
|
|
632
|
+
domain: 'testing',
|
|
633
|
+
}),
|
|
634
|
+
steps: [
|
|
635
|
+
createStep({ action: 'RunTests npm test', observation: 'Test failed: timeout' }),
|
|
636
|
+
createStep({ action: 'EditFile src/test.ts', observation: 'Updated timeout' }),
|
|
637
|
+
createStep({ action: 'RunTests npm test', observation: 'Test failed: timeout' }),
|
|
638
|
+
createStep({ action: 'EditFile src/test.ts', observation: 'Increased timeout more' }),
|
|
639
|
+
createStep({ action: 'RunTests npm test', observation: 'Test passed' }),
|
|
640
|
+
],
|
|
641
|
+
outcome: successOutcome('Increased test timeout'),
|
|
642
|
+
agentId: 'test-agent',
|
|
643
|
+
});
|
|
644
|
+
|
|
645
|
+
const result = await pipeline.processTrajectory(trajectory);
|
|
646
|
+
|
|
647
|
+
// A successful trajectory with multiple steps should be abstractable
|
|
648
|
+
expect(result.analysis.success).toBe(true);
|
|
649
|
+
expect(result.analysis.stepAttribution.length).toBe(5);
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
it('should classify error patterns in failed trajectories', async () => {
|
|
653
|
+
const trajectory = createTrajectory({
|
|
654
|
+
task: createTask({
|
|
655
|
+
description: 'Deploy the application',
|
|
656
|
+
domain: 'devops',
|
|
657
|
+
}),
|
|
658
|
+
steps: [
|
|
659
|
+
createStep({ action: 'RunCommand docker build .', observation: 'Build complete' }),
|
|
660
|
+
createStep({
|
|
661
|
+
action: 'RunCommand docker push registry/app:latest',
|
|
662
|
+
observation: 'Error: denied: access forbidden',
|
|
663
|
+
}),
|
|
664
|
+
],
|
|
665
|
+
outcome: failureOutcome('Permission denied: docker push requires authentication'),
|
|
666
|
+
agentId: 'test-agent',
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
const result = await pipeline.processTrajectory(trajectory);
|
|
670
|
+
|
|
671
|
+
expect(result.analysis.success).toBe(false);
|
|
672
|
+
expect(result.analysis.errorPatterns).toBeDefined();
|
|
673
|
+
expect(result.analysis.errorPatterns!.length).toBeGreaterThanOrEqual(1);
|
|
674
|
+
// The error should be classified (from our error-classifier)
|
|
675
|
+
expect(result.analysis.errorPatterns![0].type).toBeDefined();
|
|
676
|
+
});
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
// =========================================================================
|
|
680
|
+
// 6. Playbook evolution — success/failure tracking updates playbook state
|
|
681
|
+
// =========================================================================
|
|
682
|
+
describe('Playbook evolution through learning', () => {
|
|
683
|
+
it('should track success count and version through multiple trajectories', async () => {
|
|
684
|
+
const playbook = createPlaybook({
|
|
685
|
+
name: 'fix-broken-authentication-module',
|
|
686
|
+
confidence: 0.5,
|
|
687
|
+
applicability: {
|
|
688
|
+
situations: ['Fix the broken authentication module', 'authentication module is broken'],
|
|
689
|
+
triggers: ['broken authentication module', 'authentication module'],
|
|
690
|
+
antiPatterns: [],
|
|
691
|
+
domains: ['typescript'],
|
|
692
|
+
},
|
|
693
|
+
guidance: {
|
|
694
|
+
strategy: 'Add null checks in authentication flow',
|
|
695
|
+
tactics: ['check token', 'verify user object'],
|
|
696
|
+
steps: [],
|
|
697
|
+
},
|
|
698
|
+
});
|
|
699
|
+
await memory.playbooks.add(playbook);
|
|
700
|
+
|
|
701
|
+
const loop = new InstantLoop(memory);
|
|
702
|
+
|
|
703
|
+
// Process 3 successful trajectories that match this playbook's triggers
|
|
704
|
+
for (let i = 0; i < 3; i++) {
|
|
705
|
+
await loop.process(
|
|
706
|
+
makeSuccessTrajectory({
|
|
707
|
+
description: 'Fix the broken authentication module',
|
|
708
|
+
domain: 'typescript',
|
|
709
|
+
})
|
|
710
|
+
);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
const updated = await memory.playbooks.get(playbook.id);
|
|
714
|
+
expect(updated).toBeDefined();
|
|
715
|
+
expect(updated!.confidence).toBeGreaterThan(0.5);
|
|
716
|
+
expect(updated!.evolution.successCount).toBeGreaterThanOrEqual(3);
|
|
717
|
+
});
|
|
718
|
+
|
|
719
|
+
it('should track failure context for later analysis', async () => {
|
|
720
|
+
const playbook = createPlaybook({
|
|
721
|
+
name: 'increase-timeout',
|
|
722
|
+
confidence: 0.6,
|
|
723
|
+
applicability: {
|
|
724
|
+
situations: ['connection timeout', 'request timeout'],
|
|
725
|
+
triggers: ['timeout'],
|
|
726
|
+
antiPatterns: [],
|
|
727
|
+
domains: ['typescript'],
|
|
728
|
+
},
|
|
729
|
+
guidance: {
|
|
730
|
+
strategy: 'Increase timeout values',
|
|
731
|
+
tactics: [],
|
|
732
|
+
steps: [],
|
|
733
|
+
},
|
|
734
|
+
});
|
|
735
|
+
await memory.playbooks.add(playbook);
|
|
736
|
+
|
|
737
|
+
const loop = new InstantLoop(memory);
|
|
738
|
+
|
|
739
|
+
// Process 2 failures
|
|
740
|
+
for (let i = 0; i < 2; i++) {
|
|
741
|
+
await loop.process(
|
|
742
|
+
makeFailureTrajectory({
|
|
743
|
+
description: `Fix connection timeout in service ${i}`,
|
|
744
|
+
errorInfo: `ECONNREFUSED: service ${i} unreachable`,
|
|
745
|
+
})
|
|
746
|
+
);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
const updated = await memory.playbooks.get(playbook.id);
|
|
750
|
+
expect(updated).toBeDefined();
|
|
751
|
+
expect(updated!.confidence).toBeLessThan(0.6);
|
|
752
|
+
expect(updated!.evolution.failureCount).toBeGreaterThanOrEqual(2);
|
|
753
|
+
expect(updated!.evolution.failures.length).toBeGreaterThanOrEqual(1);
|
|
754
|
+
});
|
|
755
|
+
});
|
|
756
|
+
|
|
757
|
+
// =========================================================================
|
|
758
|
+
// 7. Cross-store consistency — domain partitioning
|
|
759
|
+
// =========================================================================
|
|
760
|
+
describe('Cross-store domain consistency', () => {
|
|
761
|
+
it('should partition data by domain across all stores', async () => {
|
|
762
|
+
const loop = new InstantLoop(memory);
|
|
763
|
+
|
|
764
|
+
// Process trajectories from different domains
|
|
765
|
+
await loop.process(makeSuccessTrajectory({ description: 'Fix auth bug', domain: 'auth' }));
|
|
766
|
+
await loop.process(makeSuccessTrajectory({ description: 'Fix UI layout', domain: 'frontend' }));
|
|
767
|
+
await loop.process(makeFailureTrajectory({ description: 'Fix DB query', domain: 'database' }));
|
|
768
|
+
|
|
769
|
+
// Experiences should be queryable by domain
|
|
770
|
+
const authExperiences = await memory.experiences.findSimilar(
|
|
771
|
+
'authentication',
|
|
772
|
+
{ k: 10, domain: 'auth' }
|
|
773
|
+
);
|
|
774
|
+
const feExperiences = await memory.experiences.findSimilar(
|
|
775
|
+
'UI layout',
|
|
776
|
+
{ k: 10, domain: 'frontend' }
|
|
777
|
+
);
|
|
778
|
+
|
|
779
|
+
// Each domain query should return results from that domain
|
|
780
|
+
for (const { experience } of authExperiences) {
|
|
781
|
+
expect(experience.domain).toBe('auth');
|
|
782
|
+
}
|
|
783
|
+
for (const { experience } of feExperiences) {
|
|
784
|
+
expect(experience.domain).toBe('frontend');
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// Causal edges should be domain-partitioned
|
|
788
|
+
const authEdges = await memory.causal.getByDomain('auth');
|
|
789
|
+
const dbEdges = await memory.causal.getByDomain('database');
|
|
790
|
+
expect(authEdges.every(e => e.domain === 'auth')).toBe(true);
|
|
791
|
+
expect(dbEdges.every(e => e.domain === 'database')).toBe(true);
|
|
792
|
+
});
|
|
793
|
+
});
|
|
794
|
+
});
|