neotoma 0.3.0 → 0.3.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/README.md +9 -9
- package/dist/actions.js +2 -2
- package/dist/actions.js.map +1 -1
- package/dist/cli/bootstrap.js +0 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +158 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/crypto/auth.js +1 -1
- package/dist/crypto/auth.js.map +1 -1
- package/dist/mcp_ws_bridge.js +1 -1
- package/dist/mcp_ws_bridge.js.map +1 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/services/field_converters.js +3 -3
- package/dist/services/field_converters.js.map +1 -1
- package/dist/services/field_validation.js +1 -1
- package/dist/services/field_validation.js.map +1 -1
- package/dist/services/mcp_auth.js +1 -1
- package/dist/services/mcp_auth.js.map +1 -1
- package/dist/services/mcp_oauth.js +1 -1
- package/dist/services/mcp_oauth.js.map +1 -1
- package/dist/services/parquet_reader.js +1 -1
- package/dist/services/parquet_reader.js.map +1 -1
- package/dist/services/public_key_registry.js +2 -2
- package/dist/services/public_key_registry.js.map +1 -1
- package/package.json +27 -7
- package/.claude/CLAUDE.md +0 -81
- package/.claude/rules/agent_constraints.md +0 -201
- package/.claude/rules/agent_instructions_sync_rules.md +0 -100
- package/.claude/rules/agent_test_execution.md +0 -358
- package/.claude/rules/autonomous_execution.md +0 -119
- package/.claude/rules/bug_fix_detection.md +0 -145
- package/.claude/rules/bug_learning.md +0 -154
- package/.claude/rules/checkpoint_management.md +0 -194
- package/.claude/rules/configuration_management.md +0 -159
- package/.claude/rules/content_style_enforcement.md +0 -141
- package/.claude/rules/dependency_installation.md +0 -148
- package/.claude/rules/document_loading_order.md +0 -197
- package/.claude/rules/documentation_rules.md +0 -169
- package/.claude/rules/downstream_doc_updates.md +0 -269
- package/.claude/rules/env_check.md +0 -55
- package/.claude/rules/environment_variables_1password.md +0 -315
- package/.claude/rules/environment_variables_env_file.md +0 -124
- package/.claude/rules/feature_unit_detection.md +0 -132
- package/.claude/rules/file_naming.md +0 -34
- package/.claude/rules/git_remote_sync.md +0 -242
- package/.claude/rules/instruction_documentation.md +0 -287
- package/.claude/rules/native_browser_debugging.md +0 -68
- package/.claude/rules/plan_execution_testing.md +0 -101
- package/.claude/rules/plan_format.md +0 -38
- package/.claude/rules/post_build_testing.md +0 -162
- package/.claude/rules/prefer_cli_tools.md +0 -233
- package/.claude/rules/readme_maintenance.md +0 -156
- package/.claude/rules/release_detection.md +0 -95
- package/.claude/rules/release_status_readme_update.md +0 -62
- package/.claude/rules/risk_management.md +0 -170
- package/.claude/rules/security.md +0 -168
- package/.claude/rules/social_media_conventions.md +0 -42
- package/.claude/rules/test_first_workflow.md +0 -344
- package/.claude/rules/worktree_env.md +0 -56
- package/.claude/settings.json +0 -5
- package/.claude/skills/commit.md +0 -762
- package/.claude/skills/create_feature_unit.md +0 -176
- package/.claude/skills/create_release.md +0 -428
- package/.claude/skills/fix_feature_bug.md +0 -93
- package/.claude/skills/pull.md +0 -314
- package/.claude/skills/setup_symlinks.md +0 -228
- package/.codex/config.toml +0 -92
- package/.cursor/commands/analyze.md +0 -574
- package/.cursor/commands/commit.md +0 -768
- package/.cursor/commands/create_feature_unit.md +0 -182
- package/.cursor/commands/create_prototype.md +0 -95
- package/.cursor/commands/create_release.md +0 -434
- package/.cursor/commands/create_rule.md +0 -296
- package/.cursor/commands/debug.md +0 -985
- package/.cursor/commands/final_review.md +0 -97
- package/.cursor/commands/fix_feature_bug.md +0 -99
- package/.cursor/commands/manage_error_debugging.md +0 -186
- package/.cursor/commands/migrate_plans.md +0 -499
- package/.cursor/commands/publish.md +0 -559
- package/.cursor/commands/pull.md +0 -320
- package/.cursor/commands/push.md +0 -259
- package/.cursor/commands/report.md +0 -1506
- package/.cursor/commands/report_error.md +0 -1505
- package/.cursor/commands/run_feature_workflow.md +0 -83
- package/.cursor/commands/setup_commands.md +0 -87
- package/.cursor/commands/setup_symlinks.md +0 -234
- package/.cursor/commands/sync_env_from_1password.md +0 -321
- package/.cursor/commands.json +0 -100
- package/.cursor/environment.json +0 -5
- package/.cursor/mcp.json.template +0 -16
- package/.cursor/plans/agent_skills_analysis_aac0f1b6.plan.md +0 -949
- package/.cursor/plans/agent_trust_framework_eb38ca7d.plan.md +0 -634
- package/.cursor/plans/all-storage-unstructured_provenance_df0b7a8f.plan.md +0 -112
- package/.cursor/plans/automated_error_debugging_cloud_agents.plan.md +0 -526
- package/.cursor/plans/automated_error_debugging_cursor_cli.plan.md +0 -599
- package/.cursor/plans/automated_error_debugging_localhost_clarified.plan.md +0 -510
- package/.cursor/plans/bug_report_and_contribution_client_guidance.plan.md +0 -143
- package/.cursor/plans/convert_1password_sync_to_mcp_343ca61c.plan.md +0 -282
- package/.cursor/plans/debug_pending_errors_command.plan.md +0 -531
- package/.cursor/plans/error_reporting_command_8868f27b.plan.md +0 -255
- package/.cursor/plans/mcp-cli-action-item-01-openapi-core.plan.md +0 -30
- package/.cursor/plans/mcp-cli-action-item-02-openapi-mcp-cli-mapping.plan.md +0 -18
- package/.cursor/plans/mcp-cli-action-item-03-cli-equivalent-logging.plan.md +0 -18
- package/.cursor/plans/mcp-cli-action-item-06-error-taxonomy.plan.md +0 -18
- package/.cursor/plans/mcp-cli-action-item-07-fixture-replay-graphs.plan.md +0 -18
- package/.cursor/plans/mcp-cli-action-item-08-cli-reference-executor.plan.md +0 -18
- package/.cursor/plans/mcp-cli-action-item-09-mcp-tools-atomic.plan.md +0 -18
- package/.cursor/plans/mcp-cli-action-item-10-canonical-walkthrough.plan.md +0 -18
- package/.cursor/plans/mcp-cli-action-item-11-fixtures-expected-outputs.plan.md +0 -18
- package/.cursor/plans/mcp-cli-action-item-12-failure-gallery.plan.md +0 -18
- package/.cursor/plans/mcp_source-path_documentation_5ce48609.plan.md +0 -83
- package/.cursor/plans/me_and_get_authenticated_user_response_updates.plan.md +0 -125
- package/.cursor/plans/multi-llm_provider_support_3fdeb361.plan.md +0 -120
- package/.cursor/plans/plan_migration_command_integrated.plan.md +0 -393
- package/.cursor/plans/schema_icon_enhancements_plan.md +0 -533
- package/.cursor/plans/site-react-tailwind-parity.plan.md +0 -82
- package/.cursor/plans/sources-first-ingestion-v8.plan.md +0 -0
- package/.cursor/plans/sources-first_ingestion_v10_baef2ba2.plan.md +0 -363
- package/.cursor/plans/test_coverage_gap_analysis_9cb70022.plan.md +0 -39
- package/.cursor/port_to_foundation_analysis.md +0 -217
- package/.cursor/rules/agent_constraints.mdc +0 -210
- package/.cursor/rules/autonomous_execution.mdc +0 -128
- package/.cursor/rules/configuration_management.mdc +0 -168
- package/.cursor/rules/cursor_rules_editing.mdc +0 -99
- package/.cursor/rules/cursor_rules_sync.mdc +0 -74
- package/.cursor/rules/cursor_rules_sync_requirement.mdc +0 -156
- package/.cursor/rules/developer_agent_instructions_sync_rules.mdc +0 -109
- package/.cursor/rules/document_loading_order.mdc +0 -206
- package/.cursor/rules/instruction_documentation.mdc +0 -296
- package/.cursor/rules/risk_management.mdc +0 -179
- package/.cursor/rules/security.mdc +0 -177
- package/.cursor/skipped_records/companies_skipped.json +0 -27
- package/.cursor/skipped_records/contacts_skipped.json +0 -23
- package/.cursor/skipped_records/goals_skipped.json +0 -7
- package/.cursor/skipped_records/people_skipped.json +0 -14
- package/.cursor/skipped_records/projects_skipped.json +0 -39
- package/.cursor/worktrees.json +0 -12
- package/.dockerignore +0 -9
- package/.env.example +0 -84
- package/.eslintrc.json +0 -11
- package/.github/workflows/deploy-pages-site.yml +0 -55
- package/.gitmodules +0 -12
- package/.husky/pre-commit +0 -42
- package/.mcp.json +0 -13
- package/.nvmrc +0 -1
- package/.prettierrc.json +0 -7
- package/.vscode/extensions.json +0 -5
- package/.vscode/settings.json +0 -47
- package/CONTRIBUTING.md +0 -23
- package/Dockerfile +0 -28
- package/SECURITY.md +0 -41
- package/components.json +0 -21
- package/cursor_rules_manifest.json +0 -28
- package/dist/__fixtures__/helpers.d.ts +0 -91
- package/dist/__fixtures__/helpers.d.ts.map +0 -1
- package/dist/__fixtures__/helpers.js +0 -384
- package/dist/__fixtures__/helpers.js.map +0 -1
- package/dist/__fixtures__/types.d.ts +0 -285
- package/dist/__fixtures__/types.d.ts.map +0 -1
- package/dist/__fixtures__/types.js +0 -7
- package/dist/__fixtures__/types.js.map +0 -1
- package/dist/__fixtures__/validation.d.ts +0 -45
- package/dist/__fixtures__/validation.d.ts.map +0 -1
- package/dist/__fixtures__/validation.js +0 -311
- package/dist/__fixtures__/validation.js.map +0 -1
- package/dist/config/plaid.d.ts +0 -21
- package/dist/config/plaid.d.ts.map +0 -1
- package/dist/config/plaid.js +0 -38
- package/dist/config/plaid.js.map +0 -1
- package/dist/events/event_emitter.d.ts +0 -24
- package/dist/events/event_emitter.d.ts.map +0 -1
- package/dist/events/event_emitter.js +0 -85
- package/dist/events/event_emitter.js.map +0 -1
- package/dist/events/event_log.d.ts +0 -23
- package/dist/events/event_log.d.ts.map +0 -1
- package/dist/events/event_log.js +0 -77
- package/dist/events/event_log.js.map +0 -1
- package/dist/events/event_schema.d.ts +0 -58
- package/dist/events/event_schema.d.ts.map +0 -1
- package/dist/events/event_schema.js +0 -43
- package/dist/events/event_schema.js.map +0 -1
- package/dist/events/event_validator.d.ts +0 -23
- package/dist/events/event_validator.d.ts.map +0 -1
- package/dist/events/event_validator.js +0 -90
- package/dist/events/event_validator.js.map +0 -1
- package/dist/events/index.d.ts +0 -9
- package/dist/events/index.d.ts.map +0 -1
- package/dist/events/index.js +0 -9
- package/dist/events/index.js.map +0 -1
- package/dist/events/replay.d.ts +0 -27
- package/dist/events/replay.d.ts.map +0 -1
- package/dist/events/replay.js +0 -62
- package/dist/events/replay.js.map +0 -1
- package/dist/hashing/hash_chain.d.ts +0 -31
- package/dist/hashing/hash_chain.d.ts.map +0 -1
- package/dist/hashing/hash_chain.js +0 -52
- package/dist/hashing/hash_chain.js.map +0 -1
- package/dist/integrations/plaid/client.d.ts +0 -53
- package/dist/integrations/plaid/client.d.ts.map +0 -1
- package/dist/integrations/plaid/client.js +0 -224
- package/dist/integrations/plaid/client.js.map +0 -1
- package/dist/integrations/plaid/normalizers.d.ts +0 -26
- package/dist/integrations/plaid/normalizers.d.ts.map +0 -1
- package/dist/integrations/plaid/normalizers.js +0 -166
- package/dist/integrations/plaid/normalizers.js.map +0 -1
- package/dist/integrations/providers/asana.d.ts +0 -9
- package/dist/integrations/providers/asana.d.ts.map +0 -1
- package/dist/integrations/providers/asana.js +0 -62
- package/dist/integrations/providers/asana.js.map +0 -1
- package/dist/integrations/providers/base.d.ts +0 -17
- package/dist/integrations/providers/base.d.ts.map +0 -1
- package/dist/integrations/providers/base.js +0 -64
- package/dist/integrations/providers/base.js.map +0 -1
- package/dist/integrations/providers/facebook.d.ts +0 -9
- package/dist/integrations/providers/facebook.d.ts.map +0 -1
- package/dist/integrations/providers/facebook.js +0 -58
- package/dist/integrations/providers/facebook.js.map +0 -1
- package/dist/integrations/providers/gmail.d.ts +0 -10
- package/dist/integrations/providers/gmail.d.ts.map +0 -1
- package/dist/integrations/providers/gmail.js +0 -67
- package/dist/integrations/providers/gmail.js.map +0 -1
- package/dist/integrations/providers/index.d.ts +0 -6
- package/dist/integrations/providers/index.d.ts.map +0 -1
- package/dist/integrations/providers/index.js +0 -25
- package/dist/integrations/providers/index.js.map +0 -1
- package/dist/integrations/providers/instagram.d.ts +0 -9
- package/dist/integrations/providers/instagram.d.ts.map +0 -1
- package/dist/integrations/providers/instagram.js +0 -47
- package/dist/integrations/providers/instagram.js.map +0 -1
- package/dist/integrations/providers/metadata.d.ts +0 -25
- package/dist/integrations/providers/metadata.d.ts.map +0 -1
- package/dist/integrations/providers/metadata.js +0 -407
- package/dist/integrations/providers/metadata.js.map +0 -1
- package/dist/integrations/providers/types.d.ts +0 -39
- package/dist/integrations/providers/types.d.ts.map +0 -1
- package/dist/integrations/providers/types.js +0 -2
- package/dist/integrations/providers/types.js.map +0 -1
- package/dist/integrations/providers/x.d.ts +0 -9
- package/dist/integrations/providers/x.d.ts.map +0 -1
- package/dist/integrations/providers/x.js +0 -78
- package/dist/integrations/providers/x.js.map +0 -1
- package/dist/reducers/record_reducer.d.ts +0 -25
- package/dist/reducers/record_reducer.d.ts.map +0 -1
- package/dist/reducers/record_reducer.js +0 -93
- package/dist/reducers/record_reducer.js.map +0 -1
- package/dist/reducers/reducer_registry.d.ts +0 -47
- package/dist/reducers/reducer_registry.d.ts.map +0 -1
- package/dist/reducers/reducer_registry.js +0 -82
- package/dist/reducers/reducer_registry.js.map +0 -1
- package/dist/repositories/db/event_repo.d.ts +0 -14
- package/dist/repositories/db/event_repo.d.ts.map +0 -1
- package/dist/repositories/db/event_repo.js +0 -67
- package/dist/repositories/db/event_repo.js.map +0 -1
- package/dist/repositories/db/state_repo.d.ts +0 -14
- package/dist/repositories/db/state_repo.d.ts.map +0 -1
- package/dist/repositories/db/state_repo.js +0 -61
- package/dist/repositories/db/state_repo.js.map +0 -1
- package/dist/repositories/file/event_repo.d.ts +0 -18
- package/dist/repositories/file/event_repo.d.ts.map +0 -1
- package/dist/repositories/file/event_repo.js +0 -148
- package/dist/repositories/file/event_repo.js.map +0 -1
- package/dist/repositories/file/state_repo.d.ts +0 -21
- package/dist/repositories/file/state_repo.d.ts.map +0 -1
- package/dist/repositories/file/state_repo.js +0 -89
- package/dist/repositories/file/state_repo.js.map +0 -1
- package/dist/repositories/sqlite/supabase_adapter.d.ts +0 -135
- package/dist/repositories/sqlite/supabase_adapter.d.ts.map +0 -1
- package/dist/repositories/sqlite/supabase_adapter.js +0 -810
- package/dist/repositories/sqlite/supabase_adapter.js.map +0 -1
- package/dist/services/connectors.d.ts +0 -89
- package/dist/services/connectors.d.ts.map +0 -1
- package/dist/services/connectors.js +0 -248
- package/dist/services/connectors.js.map +0 -1
- package/dist/services/event_generation.d.ts +0 -37
- package/dist/services/event_generation.d.ts.map +0 -1
- package/dist/services/event_generation.js +0 -236
- package/dist/services/event_generation.js.map +0 -1
- package/dist/services/extraction/rules.d.ts +0 -26
- package/dist/services/extraction/rules.d.ts.map +0 -1
- package/dist/services/extraction/rules.js +0 -691
- package/dist/services/extraction/rules.js.map +0 -1
- package/dist/services/file_analysis.d.ts +0 -38
- package/dist/services/file_analysis.d.ts.map +0 -1
- package/dist/services/file_analysis.js +0 -325
- package/dist/services/file_analysis.js.map +0 -1
- package/dist/services/graph_builder.d.ts +0 -51
- package/dist/services/graph_builder.d.ts.map +0 -1
- package/dist/services/graph_builder.js +0 -279
- package/dist/services/graph_builder.js.map +0 -1
- package/dist/services/importers.d.ts +0 -28
- package/dist/services/importers.d.ts.map +0 -1
- package/dist/services/importers.js +0 -174
- package/dist/services/importers.js.map +0 -1
- package/dist/services/observation_ingestion.d.ts +0 -26
- package/dist/services/observation_ingestion.d.ts.map +0 -1
- package/dist/services/observation_ingestion.js +0 -364
- package/dist/services/observation_ingestion.js.map +0 -1
- package/dist/services/payload_compiler.d.ts +0 -36
- package/dist/services/payload_compiler.d.ts.map +0 -1
- package/dist/services/payload_compiler.js +0 -121
- package/dist/services/payload_compiler.js.map +0 -1
- package/dist/services/payload_identity.d.ts +0 -35
- package/dist/services/payload_identity.d.ts.map +0 -1
- package/dist/services/payload_identity.js +0 -101
- package/dist/services/payload_identity.js.map +0 -1
- package/dist/services/payload_schema.d.ts +0 -104
- package/dist/services/payload_schema.d.ts.map +0 -1
- package/dist/services/payload_schema.js +0 -46
- package/dist/services/payload_schema.js.map +0 -1
- package/dist/services/plaid_sync.d.ts +0 -77
- package/dist/services/plaid_sync.d.ts.map +0 -1
- package/dist/services/plaid_sync.js +0 -273
- package/dist/services/plaid_sync.js.map +0 -1
- package/dist/services/record_comparison.d.ts +0 -29
- package/dist/services/record_comparison.d.ts.map +0 -1
- package/dist/services/record_comparison.js +0 -84
- package/dist/services/record_comparison.js.map +0 -1
- package/dist/services/records.d.ts +0 -31
- package/dist/services/records.d.ts.map +0 -1
- package/dist/services/records.js +0 -184
- package/dist/services/records.js.map +0 -1
- package/dist/services/search.d.ts +0 -15
- package/dist/services/search.d.ts.map +0 -1
- package/dist/services/search.js +0 -81
- package/dist/services/search.js.map +0 -1
- package/dist/services/summary.d.ts +0 -5
- package/dist/services/summary.d.ts.map +0 -1
- package/dist/services/summary.js +0 -118
- package/dist/services/summary.js.map +0 -1
- package/docs/NEOTOMA_MANIFEST.md +0 -152
- package/docs/api/rest_api.md +0 -466
- package/docs/architecture/agentic_portfolio_overview.md +0 -99
- package/docs/architecture/agentic_wallet_overview.md +0 -93
- package/docs/architecture/architectural_decisions.md +0 -462
- package/docs/architecture/architecture.md +0 -842
- package/docs/architecture/blockchain_readiness_assessment.md +0 -248
- package/docs/architecture/consistency.md +0 -539
- package/docs/architecture/conversational_ux_architecture.md +0 -240
- package/docs/architecture/determinism.md +0 -762
- package/docs/architecture/idempotence_pattern.md +0 -139
- package/docs/architecture/mcp_actions_assessment.md +0 -182
- package/docs/architecture/ner_vs_schema_first_extraction.md +0 -280
- package/docs/architecture/schema_expansion.md +0 -260
- package/docs/architecture/schema_handling.md +0 -209
- package/docs/architecture/source_material_model.md +0 -281
- package/docs/assets/neotoma_banner.png +0 -0
- package/docs/conventions/TEST_EXECUTION_IMPROVEMENTS.md +0 -205
- package/docs/conventions/always_on_rules_review.md +0 -66
- package/docs/conventions/code_conventions_implementation.md +0 -111
- package/docs/conventions/code_conventions_plan.md +0 -124
- package/docs/conventions/code_review_summary.md +0 -96
- package/docs/conventions/documentation_standards.md +0 -104
- package/docs/conventions/estimation_methodology.md +0 -146
- package/docs/conventions/file_naming_migration_status.md +0 -94
- package/docs/conventions/readme_generation_framework.md +0 -230
- package/docs/conventions/time_tracking_template.md +0 -60
- package/docs/conventions/writing_style_guide.md +0 -252
- package/docs/developer/agent_cli_configuration.md +0 -140
- package/docs/developer/agent_instructions_sync_rules.mdc +0 -97
- package/docs/developer/canonical_walkthrough.md +0 -137
- package/docs/developer/cli_agent_instructions.md +0 -141
- package/docs/developer/cli_overview.md +0 -207
- package/docs/developer/cli_reference.md +0 -518
- package/docs/developer/developer_preview_launch_checklist.md +0 -128
- package/docs/developer/developer_preview_storage.md +0 -35
- package/docs/developer/developer_release_manual_test_checklist.md +0 -209
- package/docs/developer/development_workflow.md +0 -308
- package/docs/developer/environment/CONNECTOR_SECRET_KEY_SETUP.md +0 -96
- package/docs/developer/environment/DEV_CONNECTOR_SECRET_KEY_EXPLANATION.md +0 -80
- package/docs/developer/environment/ENV_MAPPINGS_STATUS.md +0 -86
- package/docs/developer/environment/ENV_VAR_NAMING_STRATEGY.md +0 -145
- package/docs/developer/environment/MIGRATION_TO_SINGLE_VAR_NAMES.md +0 -89
- package/docs/developer/environment/QUICK_START_1PASSWORD.md +0 -126
- package/docs/developer/environment/README.md +0 -27
- package/docs/developer/environment/SETUP_ENV_MAPPINGS.md +0 -256
- package/docs/developer/environment_distinction_audit.md +0 -43
- package/docs/developer/fix_doc_inconsistencies_plan.md +0 -63
- package/docs/developer/getting_started.md +0 -100
- package/docs/developer/import_interpretation_debug.md +0 -69
- package/docs/developer/launchd_dev_servers.md +0 -51
- package/docs/developer/launchd_watch_build.md +0 -37
- package/docs/developer/mcp/instructions.md +0 -71
- package/docs/developer/mcp/invalid_connection_id_handling.md +0 -181
- package/docs/developer/mcp/tool_descriptions.yaml +0 -41
- package/docs/developer/mcp/unauthenticated.md +0 -30
- package/docs/developer/mcp_chatgpt_setup.md +0 -159
- package/docs/developer/mcp_claude_code_setup.md +0 -519
- package/docs/developer/mcp_https_testing.md +0 -178
- package/docs/developer/mcp_https_testing_status.md +0 -130
- package/docs/developer/mcp_https_tunnel_status.md +0 -147
- package/docs/developer/mcp_oauth_migration_guide.md +0 -196
- package/docs/developer/mcp_overview.md +0 -145
- package/docs/developer/mcp_server_examples_from_cursor_docs.md +0 -485
- package/docs/developer/observation_architecture_documentation_integration.md +0 -368
- package/docs/developer/release_orchestrator.md +0 -197
- package/docs/developer/repository_cleanup_plan.md +0 -87
- package/docs/developer/resolved_blockers.md +0 -49
- package/docs/developer/schema_initialization.md +0 -182
- package/docs/developer/secrets/README.md +0 -15
- package/docs/developer/secrets/secrets_architecture.md +0 -95
- package/docs/developer/secrets/secrets_manager_value.md +0 -53
- package/docs/developer/secrets/secrets_secure_approach.md +0 -103
- package/docs/developer/secrets/secrets_setup.md +0 -116
- package/docs/developer/shared_components_submodule_setup.md +0 -273
- package/docs/developer/spec_compliance_validation_system.md +0 -261
- package/docs/developer/test_coverage_gap_analysis_plan.md +0 -36
- package/docs/developer/tunnels.md +0 -327
- package/docs/developer/vite_troubleshooting.md +0 -111
- package/docs/doc_dependencies.yaml +0 -497
- package/docs/examples/schema_breaking_change_reconciliation.md +0 -515
- package/docs/feature_units/completed/FU-050/FU-050_spec.md +0 -341
- package/docs/feature_units/completed/FU-050/manifest.yaml +0 -330
- package/docs/feature_units/completed/FU-051/FU-051_spec.md +0 -173
- package/docs/feature_units/completed/FU-051/manifest.yaml +0 -229
- package/docs/feature_units/completed/FU-052/FU-052_spec.md +0 -158
- package/docs/feature_units/completed/FU-052/manifest.yaml +0 -188
- package/docs/feature_units/completed/FU-053/FU-053_spec.md +0 -144
- package/docs/feature_units/completed/FU-053/manifest.yaml +0 -145
- package/docs/feature_units/completed/FU-054/FU-054_spec.md +0 -144
- package/docs/feature_units/completed/FU-054/manifest.yaml +0 -139
- package/docs/feature_units/completed/FU-702/billing_spec.md +0 -413
- package/docs/feature_units/completed/FU-702/manifest.yaml +0 -418
- package/docs/feature_units/standards/DISCOVERY_CAGAN_ALIGNMENT.md +0 -214
- package/docs/feature_units/standards/creating_feature_units.md +0 -385
- package/docs/feature_units/standards/discovery_process.md +0 -821
- package/docs/feature_units/standards/error_protocol.md +0 -60
- package/docs/feature_units/standards/execution_instructions.md +0 -87
- package/docs/feature_units/standards/feature_unit_spec.md +0 -325
- package/docs/feature_units/standards/integration_test_execution.md +0 -127
- package/docs/feature_units/standards/manifest_template.yaml +0 -370
- package/docs/feature_units/standards/model_selection.md +0 -207
- package/docs/feature_units/standards/multi_agent_orchestration.md +0 -411
- package/docs/feature_units/standards/release_report_generation.md +0 -448
- package/docs/feature_units/standards/release_report_spec.md +0 -444
- package/docs/feature_units/standards/release_report_template.md +0 -76
- package/docs/feature_units/standards/spec_compliance_validation.md +0 -147
- package/docs/feature_units/standards/worker_agent_template.md +0 -191
- package/docs/foundation/ai_safety.md +0 -10
- package/docs/foundation/composability_analysis.md +0 -308
- package/docs/foundation/core_identity.md +0 -50
- package/docs/foundation/documentation_design_system.md +0 -505
- package/docs/foundation/entity_resolution.md +0 -34
- package/docs/foundation/layered_architecture.md +0 -99
- package/docs/foundation/mmry_comparison.md +0 -176
- package/docs/foundation/philosophy.md +0 -103
- package/docs/foundation/problem_statement.md +0 -41
- package/docs/foundation/product_positioning.md +0 -69
- package/docs/foundation/product_principles.md +0 -18
- package/docs/foundation/quality_requirements.md +0 -68
- package/docs/foundation/timeline_events.md +0 -19
- package/docs/foundation/user_workflows.md +0 -38
- package/docs/implementation/PARQUET_MCP_SERVER_FIXES.md +0 -373
- package/docs/implementation/PARQUET_SUPPORT_IMPLEMENTATION.md +0 -207
- package/docs/infrastructure/deployment.md +0 -372
- package/docs/legal/README.md +0 -51
- package/docs/legal/compliance.md +0 -854
- package/docs/legal/privacy_policy.md +0 -114
- package/docs/legal/privacy_policy_changelog.md +0 -49
- package/docs/legal/terms_of_service.md +0 -185
- package/docs/legal/terms_of_service_changelog.md +0 -62
- package/docs/migration/llm_extraction_removal.md +0 -387
- package/docs/migration/llm_interpretation_docs_update.md +0 -130
- package/docs/observability/logging.md +0 -50
- package/docs/observability/metrics_standard.md +0 -38
- package/docs/observability/tracing.md +0 -41
- package/docs/operations/debugging/README.md +0 -11
- package/docs/operations/debugging/error_debug_instructions.md +0 -55
- package/docs/operations/health_check.md +0 -73
- package/docs/operations/runbook.md +0 -88
- package/docs/prompts/llm_extraction_system_prompt.md +0 -31
- package/docs/proposals/IMPLEMENTATION_SUMMARY.md +0 -198
- package/docs/proposals/MIGRATION_REPORT.md +0 -65
- package/docs/proposals/PROPOSAL_TEMPLATE.md +0 -58
- package/docs/proposals/README.md +0 -57
- package/docs/proposals/agent-trust-framework.md +0 -621
- package/docs/proposals/conversation_turn_identity_reverts_forks.md +0 -144
- package/docs/proposals/document-v023-release.md +0 -898
- package/docs/proposals/iterative_chat_store_mcp_instructions.md +0 -155
- package/docs/proposals/llm_sampling_parameters_interpretation_config.md +0 -196
- package/docs/proposals/mcp-cli-action-items.md +0 -207
- package/docs/proposals/plan-migration-command-integrated-with-commit.md +0 -386
- package/docs/proposals/sources-first-ingestion-v10.md +0 -348
- package/docs/proposals/test-coverage-gap-analysis.md +0 -26
- package/docs/prototypes/PROTOTYPE_QUICKSTART.md +0 -56
- package/docs/prototypes/README.md +0 -74
- package/docs/reference/error_codes.md +0 -223
- package/docs/releases/archived/aspirational/README.md +0 -57
- package/docs/releases/archived/aspirational/v0.4.0/manifest.yaml +0 -94
- package/docs/releases/archived/aspirational/v0.4.0/release_plan.md +0 -51
- package/docs/releases/archived/aspirational/v0.5.0/manifest.yaml +0 -152
- package/docs/releases/archived/aspirational/v0.5.0/release_plan.md +0 -236
- package/docs/releases/archived/aspirational/v0.9.0/README.md +0 -78
- package/docs/releases/archived/aspirational/v0.9.0/manifest.yaml +0 -111
- package/docs/releases/archived/aspirational/v0.9.0/release_plan.md +0 -238
- package/docs/releases/archived/aspirational/v0.9.0/status.md +0 -89
- package/docs/releases/archived/aspirational/v1.0.0/UI_REFACTORING_PLAN.md +0 -239
- package/docs/releases/archived/aspirational/v1.0.0/acceptance_criteria.md +0 -88
- package/docs/releases/archived/aspirational/v1.0.0/approach_comparison.md +0 -558
- package/docs/releases/archived/aspirational/v1.0.0/architectural_impact_chat_ui.md +0 -195
- package/docs/releases/archived/aspirational/v1.0.0/blog_post_update_directives.md +0 -491
- package/docs/releases/archived/aspirational/v1.0.0/business_viability_discovery_plan.md +0 -135
- package/docs/releases/archived/aspirational/v1.0.0/compliance_reports/FU-100_compliance.md +0 -23
- package/docs/releases/archived/aspirational/v1.0.0/compliance_reports/FU-101_compliance.md +0 -23
- package/docs/releases/archived/aspirational/v1.0.0/compliance_reports/FU-102_compliance.md +0 -23
- package/docs/releases/archived/aspirational/v1.0.0/compliance_reports/FU-103_compliance.md +0 -23
- package/docs/releases/archived/aspirational/v1.0.0/compliance_reports/FU-105_compliance.md +0 -23
- package/docs/releases/archived/aspirational/v1.0.0/continuous_discovery_log.md +0 -77
- package/docs/releases/archived/aspirational/v1.0.0/continuous_discovery_plan.md +0 -145
- package/docs/releases/archived/aspirational/v1.0.0/cross_platform_signal_detection.md +0 -181
- package/docs/releases/archived/aspirational/v1.0.0/deployment_strategy.md +0 -115
- package/docs/releases/archived/aspirational/v1.0.0/discovery_checklist.md +0 -195
- package/docs/releases/archived/aspirational/v1.0.0/discovery_filtering_criteria.md +0 -197
- package/docs/releases/archived/aspirational/v1.0.0/discovery_filtering_keywords.md +0 -143
- package/docs/releases/archived/aspirational/v1.0.0/discovery_lead_sourcing_tools.md +0 -438
- package/docs/releases/archived/aspirational/v1.0.0/discovery_plan.md +0 -185
- package/docs/releases/archived/aspirational/v1.0.0/execution_schedule.md +0 -130
- package/docs/releases/archived/aspirational/v1.0.0/feasibility_validation_plan.md +0 -116
- package/docs/releases/archived/aspirational/v1.0.0/handle_registration.md +0 -263
- package/docs/releases/archived/aspirational/v1.0.0/implementation_logs/FU-100_implementation_log.md +0 -51
- package/docs/releases/archived/aspirational/v1.0.0/implementation_logs/FU-101_implementation_log.md +0 -51
- package/docs/releases/archived/aspirational/v1.0.0/implementation_logs/FU-102_implementation_log.md +0 -51
- package/docs/releases/archived/aspirational/v1.0.0/implementation_logs/FU-103_implementation_log.md +0 -51
- package/docs/releases/archived/aspirational/v1.0.0/implementation_logs/FU-105_implementation_log.md +0 -51
- package/docs/releases/archived/aspirational/v1.0.0/manifest.yaml +0 -160
- package/docs/releases/archived/aspirational/v1.0.0/marketing_agent_instructions.md +0 -209
- package/docs/releases/archived/aspirational/v1.0.0/marketing_automation_implementation.md +0 -996
- package/docs/releases/archived/aspirational/v1.0.0/marketing_automation_plan.md +0 -291
- package/docs/releases/archived/aspirational/v1.0.0/marketing_dogfooding_analysis.md +0 -295
- package/docs/releases/archived/aspirational/v1.0.0/marketing_metrics_plan.md +0 -120
- package/docs/releases/archived/aspirational/v1.0.0/marketing_plan.md +0 -280
- package/docs/releases/archived/aspirational/v1.0.0/marketing_segments_plan.md +0 -128
- package/docs/releases/archived/aspirational/v1.0.0/participant_recruitment_log.md +0 -392
- package/docs/releases/archived/aspirational/v1.0.0/post_launch_marketing_plan.md +0 -252
- package/docs/releases/archived/aspirational/v1.0.0/pre_launch_marketing_plan.md +0 -748
- package/docs/releases/archived/aspirational/v1.0.0/pre_mortem.md +0 -122
- package/docs/releases/archived/aspirational/v1.0.0/subscription_detection_strategy.md +0 -160
- package/docs/releases/archived/aspirational/v1.0.0/usability_discovery_plan.md +0 -115
- package/docs/releases/archived/aspirational/v1.0.0/value_discovery_plan.md +0 -279
- package/docs/releases/archived/aspirational/v1.0.0/visibility_timing_analysis.md +0 -402
- package/docs/releases/archived/aspirational/v2.0.0/status.md +0 -120
- package/docs/releases/archived/aspirational/v2.1.0/manifest.yaml +0 -469
- package/docs/releases/archived/aspirational/v2.2.0/manifest.yaml +0 -165
- package/docs/releases/archived/aspirational/v2.2.0/status.md +0 -283
- package/docs/releases/compliance_reports/all_fus_compliance_summary.md +0 -112
- package/docs/releases/in_progress/v0.2.0/agent_status.json +0 -420
- package/docs/releases/in_progress/v0.2.0/status.md +0 -90
- package/docs/releases/v0.1.0/agent_status.json +0 -242
- package/docs/releases/v0.1.0/agent_status.json.example +0 -76
- package/docs/releases/v0.1.0/compliance_reports/FU-000_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-002_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-050_compliance.md +0 -59
- package/docs/releases/v0.1.0/compliance_reports/FU-051_compliance.md +0 -39
- package/docs/releases/v0.1.0/compliance_reports/FU-052_compliance.md +0 -44
- package/docs/releases/v0.1.0/compliance_reports/FU-053_compliance.md +0 -25
- package/docs/releases/v0.1.0/compliance_reports/FU-054_compliance.md +0 -31
- package/docs/releases/v0.1.0/compliance_reports/FU-055_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-056_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-057_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-058_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-059_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-061_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-100_compliance.md +0 -97
- package/docs/releases/v0.1.0/compliance_reports/FU-104_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-200_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-201_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-202_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-203_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-204_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-205_compliance.md +0 -23
- package/docs/releases/v0.1.0/compliance_reports/FU-206_compliance.md +0 -23
- package/docs/releases/v0.1.0/execution_schedule.md +0 -174
- package/docs/releases/v0.1.0/fu_spec_status.md +0 -83
- package/docs/releases/v0.1.0/implementation_logs/FU-000_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-002_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-050_implementation_log.md +0 -111
- package/docs/releases/v0.1.0/implementation_logs/FU-051_implementation_log.md +0 -91
- package/docs/releases/v0.1.0/implementation_logs/FU-052_implementation_log.md +0 -81
- package/docs/releases/v0.1.0/implementation_logs/FU-053_implementation_log.md +0 -71
- package/docs/releases/v0.1.0/implementation_logs/FU-054_implementation_log.md +0 -71
- package/docs/releases/v0.1.0/implementation_logs/FU-055_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-056_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-057_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-058_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-059_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-061_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-100_implementation_log.md +0 -251
- package/docs/releases/v0.1.0/implementation_logs/FU-104_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-200_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-201_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-202_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-203_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-204_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-205_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/implementation_logs/FU-206_implementation_log.md +0 -51
- package/docs/releases/v0.1.0/integration_tests.md +0 -316
- package/docs/releases/v0.1.0/manifest.yaml +0 -291
- package/docs/releases/v0.1.0/mcp_actions_status.md +0 -101
- package/docs/releases/v0.1.0/release_plan.md +0 -196
- package/docs/releases/v0.1.0/status.md +0 -148
- package/docs/releases/v0.1.0/test_coverage_setup_notes.md +0 -39
- package/docs/releases/v0.1.1/manifest.yaml +0 -153
- package/docs/releases/v0.2.0/status.md +0 -167
- package/docs/releases/v0.2.1/acceptance_criteria.md +0 -200
- package/docs/releases/v0.2.1/execution_schedule.md +0 -114
- package/docs/releases/v0.2.1/feature_unit_overview.md +0 -246
- package/docs/releases/v0.2.1/integration_tests.md +0 -281
- package/docs/releases/v0.2.1/manifest.yaml +0 -141
- package/docs/releases/v0.2.1/release_plan.md +0 -211
- package/docs/releases/v0.2.1/status.md +0 -106
- package/docs/releases/v0.2.15/README.md +0 -79
- package/docs/releases/v0.2.15/migrations/01_add_source_graph_edges.sql +0 -109
- package/docs/releases/v0.2.15/migrations/02_drop_legacy_tables.sql +0 -130
- package/docs/releases/v0.2.2/execution_schedule.md +0 -123
- package/docs/releases/v0.2.2/integration_tests.md +0 -258
- package/docs/releases/v0.2.2/manifest.yaml +0 -108
- package/docs/releases/v0.2.2/release_plan.md +0 -246
- package/docs/releases/v0.2.2/status.md +0 -113
- package/docs/releases/v0.2.3/agent_skills_alignment.md +0 -738
- package/docs/releases/v0.2.3/enhancements_summary.md +0 -309
- package/docs/releases/v0.2.3/integration_guide.md +0 -3400
- package/docs/releases/v0.2.3/manifest.yaml +0 -212
- package/docs/releases/v0.2.3/mcp_actions.md +0 -491
- package/docs/releases/v0.2.3/plan_completion_review.md +0 -410
- package/docs/releases/v0.2.3/release_overview.md +0 -13
- package/docs/releases/v0.2.3/schema_extensions/agent_decision.md +0 -311
- package/docs/releases/v0.2.3/schema_extensions/agent_session.md +0 -464
- package/docs/releases/v0.2.3/schema_extensions/architectural_decision.md +0 -390
- package/docs/releases/v0.2.3/schema_extensions/codebase_entity.md +0 -404
- package/docs/releases/v0.2.3/schema_extensions/feature_unit.md +0 -307
- package/docs/releases/v0.2.3/schema_extensions/release.md +0 -338
- package/docs/releases/v0.2.3/schema_extensions/validation_result.md +0 -377
- package/docs/releases/v0.2.3/spec.md +0 -569
- package/docs/releases/v0.3.0/manifest.yaml +0 -77
- package/docs/releases/v0.3.0/migrations/01_add_source_graph_edges.sql +0 -110
- package/docs/releases/v0.3.0/migrations/02_drop_legacy_tables.sql +0 -131
- package/docs/releases/v0.3.0/status.md +0 -193
- package/docs/reports/AUTO_ENHANCEMENT_TEST_RESULTS.md +0 -51
- package/docs/reports/AUTO_ENHANCEMENT_TEST_SUMMARY.md +0 -64
- package/docs/reports/BIGINT_SERIALIZATION_DEBUG.md +0 -75
- package/docs/reports/BUG_LEARNING_PROTOCOL_ESTABLISHED.md +0 -179
- package/docs/reports/CONSOLE_LOG_MCP_PROTOCOL_FIX.md +0 -58
- package/docs/reports/CRYPTO_TRANSACTION_DISCREPANCY_RESOLUTION.md +0 -108
- package/docs/reports/CRYPTO_TRANSACTION_SIDE_BY_SIDE_COMPARISON.md +0 -165
- package/docs/reports/FAILING_TESTS_ANALYSIS.md +0 -140
- package/docs/reports/FAILING_TESTS_SUMMARY.md +0 -106
- package/docs/reports/FINAL_PARQUET_COMPARISON.md +0 -226
- package/docs/reports/FINAL_TEST_STATUS.md +0 -145
- package/docs/reports/LEGACY_REMOVAL_SUMMARY.md +0 -108
- package/docs/reports/MCP_ACTIONS_SUMMARY.md +0 -329
- package/docs/reports/MCP_ACTION_TEST_COVERAGE.md +0 -132
- package/docs/reports/MCP_SPEC_COMPARISON.md +0 -306
- package/docs/reports/MCP_SPEC_COMPARISON_UPDATED.md +0 -247
- package/docs/reports/MCP_SPEC_VOCABULARY_CONFORMANCE.md +0 -220
- package/docs/reports/MCP_TEST_SUITE_IMPLEMENTATION.md +0 -180
- package/docs/reports/MCP_TEST_SUITE_RESULTS.md +0 -182
- package/docs/reports/PARQUET_MCP_BUG_REPORT.md +0 -70
- package/docs/reports/PARQUET_MCP_STORAGE_COMPLETE.md +0 -214
- package/docs/reports/PARQUET_SAMPLE_FILES_CREATED.md +0 -49
- package/docs/reports/PARQUET_STORAGE_SUCCESS.md +0 -263
- package/docs/reports/PARQUET_VS_NEOTOMA_COMPARISON.md +0 -241
- package/docs/reports/REIMPORT_TASKS_BLOCKER.md +0 -50
- package/docs/reports/SAMPLE_FILE_STRUCTURE_UPDATE.md +0 -68
- package/docs/reports/SAMPLE_PARQUET_IMPORT_TEST_RESULTS.md +0 -91
- package/docs/reports/SCHEMA_ENHANCEMENT_STATUS.md +0 -84
- package/docs/reports/SCHEMA_ENHANCEMENT_TEST_RESULTS.md +0 -78
- package/docs/reports/TASK_RELOAD_BLOCKER.md +0 -40
- package/docs/reports/TEST_FIXES_SUMMARY.md +0 -96
- package/docs/reports/VOCABULARY_CONFORMANCE_REVIEW.md +0 -177
- package/docs/reports/WHY_TESTS_MISSED_BIGINT_ISSUE.md +0 -144
- package/docs/reports/beyond_rag_agent_memory_neotoma_architecture_report.md +0 -103
- package/docs/reports/dhh_clankers_with_claws_neotoma_report.md +0 -102
- package/docs/reports/dr_cintas_pageindex_structure_over_embeddings_report.md +0 -77
- package/docs/reports/failure_gallery.md +0 -97
- package/docs/reports/fixture_expansion_summary.md +0 -204
- package/docs/reports/mcp_action_names_review.md +0 -131
- package/docs/reports/mcp_cli_action_items_fidelity_report.md +0 -189
- package/docs/reports/neotoma_pdf_interpreted_as_note_investigation_2026_02_23.md +0 -89
- package/docs/reports/plan_execution_changes_report.md +0 -122
- package/docs/reports/schema_distinctions.md +0 -210
- package/docs/reports/schema_redundancy_analysis.md +0 -304
- package/docs/specs/FUNCTIONAL_REQUIREMENTS.md +0 -160
- package/docs/specs/GENERAL_REQUIREMENTS.md +0 -30
- package/docs/specs/ICP_PRIORITY_TIERS.md +0 -132
- package/docs/specs/ICP_PROFILES.md +0 -2345
- package/docs/specs/INTERNAL_MCP_RELEASE.md +0 -300
- package/docs/specs/MANIFEST_ALIGNMENT_SUMMARY.md +0 -162
- package/docs/specs/MCP_SPEC.md +0 -2275
- package/docs/specs/METRICS_REQUIREMENTS.md +0 -386
- package/docs/specs/MVP_EXECUTION_PLAN.md +0 -956
- package/docs/specs/MVP_FEATURE_UNITS.md +0 -1821
- package/docs/specs/MVP_OVERVIEW.md +0 -184
- package/docs/specs/NONFUNCTIONAL_REQUIREMENTS.md +0 -98
- package/docs/specs/ONBOARDING_SPEC.md +0 -591
- package/docs/specs/PARQUET_MCP_RESOURCES_SPEC.md +0 -328
- package/docs/specs/TEST_PLAN.md +0 -116
- package/docs/specs/UI_SPEC.md +0 -93
- package/docs/subsystems/accessibility.md +0 -48
- package/docs/subsystems/auth.md +0 -170
- package/docs/subsystems/deletion.md +0 -494
- package/docs/subsystems/entity_merge.md +0 -300
- package/docs/subsystems/errors.md +0 -82
- package/docs/subsystems/events.md +0 -50
- package/docs/subsystems/i18n.md +0 -42
- package/docs/subsystems/ingestion/ingestion.md +0 -772
- package/docs/subsystems/ingestion/state_machines.md +0 -49
- package/docs/subsystems/observation_architecture.md +0 -379
- package/docs/subsystems/privacy.md +0 -71
- package/docs/subsystems/record_types.md +0 -753
- package/docs/subsystems/reducer.md +0 -436
- package/docs/subsystems/relationships.md +0 -455
- package/docs/subsystems/schema.md +0 -1213
- package/docs/subsystems/schema_registry.md +0 -588
- package/docs/subsystems/schema_snapshots/.gitkeep +0 -6
- package/docs/subsystems/schema_snapshots/README.md +0 -209
- package/docs/subsystems/schema_snapshots/account/v1.0.json +0 -52
- package/docs/subsystems/schema_snapshots/address/v1.0.json +0 -79
- package/docs/subsystems/schema_snapshots/agent_message/v1.0.json +0 -96
- package/docs/subsystems/schema_snapshots/balance/v1.0.json +0 -64
- package/docs/subsystems/schema_snapshots/company/v1.0.json +0 -86
- package/docs/subsystems/schema_snapshots/contact/v1.0.json +0 -68
- package/docs/subsystems/schema_snapshots/contact/v1.1.json +0 -112
- package/docs/subsystems/schema_snapshots/contract/v1.0.json +0 -48
- package/docs/subsystems/schema_snapshots/conversation/v1.0.json +0 -102
- package/docs/subsystems/schema_snapshots/crypto_transaction/v1.0.json +0 -76
- package/docs/subsystems/schema_snapshots/email/v1.0.json +0 -87
- package/docs/subsystems/schema_snapshots/event/v1.0.json +0 -79
- package/docs/subsystems/schema_snapshots/exercise/v1.0.json +0 -72
- package/docs/subsystems/schema_snapshots/fixed_cost/v1.0.json +0 -112
- package/docs/subsystems/schema_snapshots/flow/v1.0.json +0 -84
- package/docs/subsystems/schema_snapshots/goal/v1.0.json +0 -71
- package/docs/subsystems/schema_snapshots/holding/v1.0.json +0 -75
- package/docs/subsystems/schema_snapshots/income/v1.0.json +0 -68
- package/docs/subsystems/schema_snapshots/liability/v1.0.json +0 -60
- package/docs/subsystems/schema_snapshots/location/v1.0.json +0 -79
- package/docs/subsystems/schema_snapshots/meal/v1.0.json +0 -68
- package/docs/subsystems/schema_snapshots/message/v1.0.json +0 -72
- package/docs/subsystems/schema_snapshots/note/v1.0.json +0 -64
- package/docs/subsystems/schema_snapshots/order/v1.0.json +0 -72
- package/docs/subsystems/schema_snapshots/person/v1.0.json +0 -86
- package/docs/subsystems/schema_snapshots/project/v1.0.json +0 -75
- package/docs/subsystems/schema_snapshots/property/v1.0.json +0 -64
- package/docs/subsystems/schema_snapshots/purchase/v1.0.json +0 -75
- package/docs/subsystems/schema_snapshots/relationship/v1.0.json +0 -63
- package/docs/subsystems/schema_snapshots/task/v1.0.json +0 -91
- package/docs/subsystems/schema_snapshots/tax_event/v1.0.json +0 -72
- package/docs/subsystems/schema_snapshots/tax_filing/v1.0.json +0 -83
- package/docs/subsystems/schema_snapshots/transaction/v1.0.json +0 -40
- package/docs/subsystems/schema_snapshots/transfer/v1.0.json +0 -76
- package/docs/subsystems/schema_snapshots/wallet/v1.0.json +0 -68
- package/docs/subsystems/search/search.md +0 -63
- package/docs/subsystems/sources.md +0 -493
- package/docs/subsystems/vector_ops.md +0 -72
- package/docs/templates/issue_template.md +0 -36
- package/docs/templates/pr_template.md +0 -74
- package/docs/testing/ROUTE_COVERAGE_MATRIX.md +0 -104
- package/docs/testing/WHY_PARTIAL_ROUTE_COVERAGE.md +0 -183
- package/docs/testing/automated_test_catalog.md +0 -353
- package/docs/testing/cli_command_coverage_review.md +0 -130
- package/docs/testing/fixtures_standard.md +0 -202
- package/docs/testing/test_coverage_audit_summary.md +0 -571
- package/docs/testing/testing_standard.md +0 -146
- package/docs/ui/DESIGN_SYSTEM_UPDATE_SUMMARY.md +0 -152
- package/docs/ui/SHADCN_INTEGRATION_COMPLETE.md +0 -255
- package/docs/ui/design_constraints_template.yaml +0 -228
- package/docs/ui/design_system/accessibility.md +0 -38
- package/docs/ui/design_system/authentication_components.md +0 -38
- package/docs/ui/design_system/billing_components.md +0 -36
- package/docs/ui/design_system/brand_alignment.md +0 -35
- package/docs/ui/design_system/color_palette.md +0 -95
- package/docs/ui/design_system/component_styles.md +0 -241
- package/docs/ui/design_system/dark_mode.md +0 -30
- package/docs/ui/design_system/empty_states.md +0 -47
- package/docs/ui/design_system/error_states.md +0 -35
- package/docs/ui/design_system/file_upload_components.md +0 -60
- package/docs/ui/design_system/future_considerations.md +0 -19
- package/docs/ui/design_system/iconography.md +0 -21
- package/docs/ui/design_system/icp_aesthetic_analysis.md +0 -35
- package/docs/ui/design_system/icp_preference_alignment.md +0 -33
- package/docs/ui/design_system/implementation_notes.md +0 -119
- package/docs/ui/design_system/loading_states.md +0 -40
- package/docs/ui/design_system/motion_and_animation.md +0 -45
- package/docs/ui/design_system/navigation_components.md +0 -63
- package/docs/ui/design_system/onboarding_components.md +0 -48
- package/docs/ui/design_system/responsive_design.md +0 -26
- package/docs/ui/design_system/search_components.md +0 -32
- package/docs/ui/design_system/settings_components.md +0 -29
- package/docs/ui/design_system/spacing_and_layout.md +0 -67
- package/docs/ui/design_system/style_guide.md +0 -395
- package/docs/ui/design_system/typography.md +0 -88
- package/docs/ui/design_system/visual_hierarchy.md +0 -64
- package/docs/ui/design_system.md +0 -124
- package/docs/ui/dsl_spec.md +0 -97
- package/docs/ui/patterns/dashboard.md +0 -58
- package/docs/ui/patterns/detail.md +0 -68
- package/docs/ui/patterns/list.md +0 -72
- package/docs/ui/patterns/navigation.md +0 -314
- package/docs/ui/patterns/settings.md +0 -52
- package/docs/ui/patterns/wizard.md +0 -53
- package/docs/ui/prototype_guide.md +0 -300
- package/docs/ui/shadcn_components.md +0 -189
- package/docs/ui/style_guide_updates.md +0 -74
- package/docs/vocabulary/canonical_terms.md +0 -318
- package/fly.toml +0 -29
- package/foundation/.cursor/rules/agent_constraints.mdc +0 -198
- package/foundation/.cursor/rules/agent_test_execution.mdc +0 -356
- package/foundation/.cursor/rules/autonomous_execution.mdc +0 -117
- package/foundation/.cursor/rules/behavioral_self_adaptation.mdc +0 -531
- package/foundation/.cursor/rules/bug_fix_detection.mdc +0 -142
- package/foundation/.cursor/rules/checkpoint_management.mdc +0 -191
- package/foundation/.cursor/rules/configuration_management.mdc +0 -156
- package/foundation/.cursor/rules/content_style_enforcement.mdc +0 -138
- package/foundation/.cursor/rules/dependency_installation.mdc +0 -146
- package/foundation/.cursor/rules/document_loading_order.mdc +0 -194
- package/foundation/.cursor/rules/documentation_rules.mdc +0 -166
- package/foundation/.cursor/rules/downstream_doc_updates.mdc +0 -266
- package/foundation/.cursor/rules/environment_variables_1password.mdc +0 -307
- package/foundation/.cursor/rules/environment_variables_env_file.mdc +0 -121
- package/foundation/.cursor/rules/feature_unit_detection.mdc +0 -129
- package/foundation/.cursor/rules/file_naming.mdc +0 -31
- package/foundation/.cursor/rules/git_remote_sync.mdc +0 -240
- package/foundation/.cursor/rules/instruction_documentation.mdc +0 -302
- package/foundation/.cursor/rules/native_browser_debugging.mdc +0 -65
- package/foundation/.cursor/rules/plan_execution_testing.mdc +0 -98
- package/foundation/.cursor/rules/post_build_testing.mdc +0 -159
- package/foundation/.cursor/rules/prefer_cli_tools.mdc +0 -234
- package/foundation/.cursor/rules/readme_maintenance.mdc +0 -153
- package/foundation/.cursor/rules/release_detection.mdc +0 -92
- package/foundation/.cursor/rules/release_status_readme_update.mdc +0 -64
- package/foundation/.cursor/rules/risk_management.mdc +0 -167
- package/foundation/.cursor/rules/security.mdc +0 -158
- package/foundation/.cursor/rules/test_first_workflow.mdc +0 -341
- package/foundation/.cursor/rules/worktree_env.mdc +0 -53
- package/foundation/.cursor/skills/analyze/SKILL.md +0 -566
- package/foundation/.cursor/skills/commit/SKILL.md +0 -782
- package/foundation/.cursor/skills/create-feature-unit/SKILL.md +0 -180
- package/foundation/.cursor/skills/create-prototype/SKILL.md +0 -91
- package/foundation/.cursor/skills/create-release/SKILL.md +0 -432
- package/foundation/.cursor/skills/create-rule/SKILL.md +0 -292
- package/foundation/.cursor/skills/debug/SKILL.md +0 -980
- package/foundation/.cursor/skills/final-review/SKILL.md +0 -93
- package/foundation/.cursor/skills/fix-feature-bug/SKILL.md +0 -100
- package/foundation/.cursor/skills/manage-error-debugging/SKILL.md +0 -182
- package/foundation/.cursor/skills/publish/SKILL.md +0 -554
- package/foundation/.cursor/skills/pull/SKILL.md +0 -315
- package/foundation/.cursor/skills/push/SKILL.md +0 -254
- package/foundation/.cursor/skills/report/SKILL.md +0 -1501
- package/foundation/.cursor/skills/report-error/SKILL.md +0 -1501
- package/foundation/.cursor/skills/run-feature-workflow/SKILL.md +0 -79
- package/foundation/.cursor/skills/setup-commands/SKILL.md +0 -28
- package/foundation/.cursor/skills/setup-cursor-copies/SKILL.md +0 -233
- package/foundation/.cursor/skills/sync-env-from-1password/SKILL.md +0 -302
- package/foundation/CONTRIBUTING.md +0 -202
- package/foundation/LICENSE +0 -22
- package/foundation/MIGRATION.md +0 -396
- package/foundation/README.md +0 -391
- package/foundation/agent_instructions/README.md +0 -559
- package/foundation/config/foundation-config.yaml +0 -498
- package/foundation/config/foundation_config.yaml +0 -475
- package/foundation/config/repo_adapters/personal.yaml +0 -40
- package/foundation/config/repo_adapters/template.yaml +0 -45
- package/foundation/conventions/code_conventions.md +0 -908
- package/foundation/conventions/documentation_standards.md +0 -459
- package/foundation/conventions/naming_patterns.yaml +0 -139
- package/foundation/conventions/testing_conventions.md +0 -374
- package/foundation/conventions/writing_style_guide.md +0 -221
- package/foundation/development/branch_strategy.md +0 -266
- package/foundation/development/feature_unit_workflow.md +0 -423
- package/foundation/development/pr_process.md +0 -385
- package/foundation/development/release_workflow.md +0 -2296
- package/foundation/development/templates/feature_unit_spec_template.md +0 -312
- package/foundation/development/templates/manifest_template_extended.yaml +0 -303
- package/foundation/development/templates/manifest_template_simple.yaml +0 -148
- package/foundation/development/workflow.md +0 -509
- package/foundation/development/worktree_setup.sh +0 -207
- package/foundation/scripts/README.md +0 -230
- package/foundation/scripts/__pycache__/op_sync_env_from_1password.cpython-314.pyc +0 -0
- package/foundation/scripts/install-foundation.sh +0 -232
- package/foundation/scripts/install_foundation.sh +0 -232
- package/foundation/scripts/op_sync_env_from_1password.py +0 -1007
- package/foundation/scripts/report_error_create_dirs.sh +0 -14
- package/foundation/scripts/report_error_generate_id.sh +0 -10
- package/foundation/scripts/report_error_update_queue.sh +0 -24
- package/foundation/scripts/report_error_validate_target.sh +0 -34
- package/foundation/scripts/report_error_wait_resolution.sh +0 -69
- package/foundation/scripts/validate_setup.sh +0 -147
- package/foundation/security/credential_management.md +0 -263
- package/foundation/security/pre_commit_audit.sh +0 -78
- package/foundation/security/security_rules.md +0 -163
- package/foundation/strategy/README.md +0 -279
- package/foundation/strategy/competitive_analysis_template.md +0 -271
- package/foundation/strategy/partnership_analysis_template.md +0 -423
- package/foundation/strategy/project_assessment_framework.md +0 -485
- package/foundation/strategy/relevance_analysis_template.md +0 -297
- package/foundation/tooling/README.md +0 -198
- package/foundation/validation/README.md +0 -120
- package/foundation-config.yaml +0 -543
- package/frontend/docs.html +0 -43
- package/frontend/frontend/.vite-prototype/deps/@noble_curves_ed25519__js.js +0 -2859
- package/frontend/frontend/.vite-prototype/deps/@noble_curves_ed25519__js.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/@noble_hashes_utils__js.js +0 -62
- package/frontend/frontend/.vite-prototype/deps/@noble_hashes_utils__js.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-dialog.js +0 -464
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-dialog.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-dropdown-menu.js +0 -1488
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-dropdown-menu.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-label.js +0 -84
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-label.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-scroll-area.js +0 -757
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-scroll-area.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-select.js +0 -1351
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-select.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-slot.js +0 -18
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-slot.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-toast.js +0 -675
- package/frontend/frontend/.vite-prototype/deps/@radix-ui_react-toast.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/@tanstack_react-table.js +0 -3254
- package/frontend/frontend/.vite-prototype/deps/@tanstack_react-table.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/_metadata.json +0 -187
- package/frontend/frontend/.vite-prototype/deps/chunk-557GXNYU.js +0 -23
- package/frontend/frontend/.vite-prototype/deps/chunk-557GXNYU.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-6FYWT56J.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-C7HFWHWH.js +0 -271
- package/frontend/frontend/.vite-prototype/deps/chunk-C7HFWHWH.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-CJDTXCAB.js +0 -49
- package/frontend/frontend/.vite-prototype/deps/chunk-CJDTXCAB.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-DC5AMYBS.js +0 -39
- package/frontend/frontend/.vite-prototype/deps/chunk-DC5AMYBS.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-F4FBYZZO.js +0 -2258
- package/frontend/frontend/.vite-prototype/deps/chunk-F4FBYZZO.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-GIBJ3MQP.js +0 -129
- package/frontend/frontend/.vite-prototype/deps/chunk-GIBJ3MQP.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-IMIZXM4S.js +0 -218
- package/frontend/frontend/.vite-prototype/deps/chunk-IMIZXM4S.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-K236IVZX.js +0 -21628
- package/frontend/frontend/.vite-prototype/deps/chunk-K236IVZX.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-LPO6FEV6.js +0 -21
- package/frontend/frontend/.vite-prototype/deps/chunk-LPO6FEV6.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-PZJDTVNM.js +0 -144
- package/frontend/frontend/.vite-prototype/deps/chunk-PZJDTVNM.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-RGYP7AMI.js +0 -1116
- package/frontend/frontend/.vite-prototype/deps/chunk-RGYP7AMI.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-SMVRXQSC.js +0 -928
- package/frontend/frontend/.vite-prototype/deps/chunk-SMVRXQSC.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-SPBFJIQZ.js +0 -49
- package/frontend/frontend/.vite-prototype/deps/chunk-SPBFJIQZ.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-UQF5EARV.js +0 -9
- package/frontend/frontend/.vite-prototype/deps/chunk-UQF5EARV.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-VEFHXNY4.js +0 -186
- package/frontend/frontend/.vite-prototype/deps/chunk-VEFHXNY4.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/chunk-Z55WIHBM.js +0 -349
- package/frontend/frontend/.vite-prototype/deps/chunk-Z55WIHBM.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/class-variance-authority.js +0 -51
- package/frontend/frontend/.vite-prototype/deps/class-variance-authority.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/clsx.js +0 -10
- package/frontend/frontend/.vite-prototype/deps/clsx.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/lucide-react.js +0 -31586
- package/frontend/frontend/.vite-prototype/deps/lucide-react.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/package.json +0 -3
- package/frontend/frontend/.vite-prototype/deps/papaparse.js +0 -431
- package/frontend/frontend/.vite-prototype/deps/papaparse.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/react-dom.js +0 -7
- package/frontend/frontend/.vite-prototype/deps/react-dom.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/react-dom_client.js +0 -39
- package/frontend/frontend/.vite-prototype/deps/react-dom_client.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/react.js +0 -6
- package/frontend/frontend/.vite-prototype/deps/react.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/react_jsx-dev-runtime.js +0 -913
- package/frontend/frontend/.vite-prototype/deps/react_jsx-dev-runtime.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/react_jsx-runtime.js +0 -7
- package/frontend/frontend/.vite-prototype/deps/react_jsx-runtime.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/sonner.js +0 -1139
- package/frontend/frontend/.vite-prototype/deps/sonner.js.map +0 -7
- package/frontend/frontend/.vite-prototype/deps/tailwind-merge.js +0 -2534
- package/frontend/frontend/.vite-prototype/deps/tailwind-merge.js.map +0 -7
- package/frontend/index.html +0 -38
- package/frontend/src/App.tsx +0 -15
- package/frontend/src/bridge/discovery.ts +0 -126
- package/frontend/src/bridge/index.ts +0 -9
- package/frontend/src/bridge/mcp.ts +0 -85
- package/frontend/src/bridge/types.ts +0 -24
- package/frontend/src/bridge/websocket.ts +0 -349
- package/frontend/src/components/AIAgentBridge.tsx +0 -75
- package/frontend/src/components/AboutPage.tsx +0 -102
- package/frontend/src/components/AppNavigationSidebar.tsx +0 -181
- package/frontend/src/components/AppSidebar.tsx +0 -206
- package/frontend/src/components/AuthErrorHandler.tsx +0 -23
- package/frontend/src/components/Dashboard.tsx +0 -303
- package/frontend/src/components/DashboardPage.tsx +0 -78
- package/frontend/src/components/EmptyPlaceholder.tsx +0 -58
- package/frontend/src/components/EntityDetail.tsx +0 -801
- package/frontend/src/components/EntityList.tsx +0 -409
- package/frontend/src/components/ErrorBoundary.tsx +0 -131
- package/frontend/src/components/FileUploadView.tsx +0 -246
- package/frontend/src/components/FloatingSettingsButton.tsx +0 -46
- package/frontend/src/components/Header.tsx +0 -43
- package/frontend/src/components/IntegrationsPage.tsx +0 -46
- package/frontend/src/components/InterpretationList.tsx +0 -246
- package/frontend/src/components/KeyManagementDialog.tsx +0 -227
- package/frontend/src/components/Layout.tsx +0 -67
- package/frontend/src/components/MCPChatGPTPage.tsx +0 -128
- package/frontend/src/components/MCPClaudePage.tsx +0 -112
- package/frontend/src/components/MCPCodeiumPage.tsx +0 -100
- package/frontend/src/components/MCPConfigurationPage.tsx +0 -624
- package/frontend/src/components/MCPConnectionDialog.tsx +0 -177
- package/frontend/src/components/MCPConnectionsList.tsx +0 -197
- package/frontend/src/components/MCPContinuePage.tsx +0 -90
- package/frontend/src/components/MCPCursorPage.tsx +0 -379
- package/frontend/src/components/MCPGeminiPage.tsx +0 -102
- package/frontend/src/components/MCPGitHubCopilotPage.tsx +0 -100
- package/frontend/src/components/MCPGrokPage.tsx +0 -99
- package/frontend/src/components/MCPJetBrainsPage.tsx +0 -107
- package/frontend/src/components/MCPManusPage.tsx +0 -104
- package/frontend/src/components/MCPSetupDialog.tsx +0 -268
- package/frontend/src/components/MCPVSCodePage.tsx +0 -100
- package/frontend/src/components/MCPWindsurfPage.tsx +0 -99
- package/frontend/src/components/MainApp.tsx +0 -19
- package/frontend/src/components/NotFound.tsx +0 -46
- package/frontend/src/components/OAuthPage.tsx +0 -426
- package/frontend/src/components/ObservationList.tsx +0 -277
- package/frontend/src/components/ProtectedRoute.tsx +0 -38
- package/frontend/src/components/QuickEntryPanel.tsx +0 -99
- package/frontend/src/components/RealtimeStatusIndicator.tsx +0 -32
- package/frontend/src/components/RecentActivityFeed.tsx +0 -198
- package/frontend/src/components/RelationshipDetail.tsx +0 -232
- package/frontend/src/components/RelationshipList.tsx +0 -269
- package/frontend/src/components/SchemaDetail.test.tsx +0 -53
- package/frontend/src/components/SchemaDetail.tsx +0 -230
- package/frontend/src/components/SchemaList.tsx +0 -228
- package/frontend/src/components/SearchResults.tsx +0 -318
- package/frontend/src/components/SeoHead.tsx +0 -40
- package/frontend/src/components/SitePage.tsx +0 -654
- package/frontend/src/components/SourceDetail.tsx +0 -382
- package/frontend/src/components/SourceTable.tsx +0 -243
- package/frontend/src/components/StyleGuide.md +0 -48
- package/frontend/src/components/StyleGuide.tsx +0 -2316
- package/frontend/src/components/TimelineView.tsx +0 -321
- package/frontend/src/components/UniversalSearch.tsx +0 -518
- package/frontend/src/components/design-system/BadgesPage.tsx +0 -47
- package/frontend/src/components/design-system/ButtonsPage.tsx +0 -67
- package/frontend/src/components/design-system/CardsPage.tsx +0 -31
- package/frontend/src/components/design-system/CollapsiblePage.tsx +0 -84
- package/frontend/src/components/design-system/ColorsPage.tsx +0 -125
- package/frontend/src/components/design-system/DesignSystemIndex.tsx +0 -73
- package/frontend/src/components/design-system/DesignSystemLayout.tsx +0 -22
- package/frontend/src/components/design-system/DesignSystemRouter.tsx +0 -43
- package/frontend/src/components/design-system/InputsPage.tsx +0 -40
- package/frontend/src/components/design-system/PageFormatsPage.tsx +0 -263
- package/frontend/src/components/design-system/ProgressPage.tsx +0 -54
- package/frontend/src/components/design-system/SkeletonPage.tsx +0 -68
- package/frontend/src/components/design-system/SpacingPage.tsx +0 -45
- package/frontend/src/components/design-system/StyleGuidePage.tsx +0 -313
- package/frontend/src/components/design-system/SwitchPage.tsx +0 -60
- package/frontend/src/components/design-system/TablesPage.tsx +0 -206
- package/frontend/src/components/design-system/TabsPage.tsx +0 -88
- package/frontend/src/components/design-system/TooltipPage.tsx +0 -94
- package/frontend/src/components/design-system/TypographyPage.tsx +0 -81
- package/frontend/src/components/icons/CursorIcon.tsx +0 -26
- package/frontend/src/components/quick-entry/ContactDialog.tsx +0 -177
- package/frontend/src/components/quick-entry/EventDialog.tsx +0 -204
- package/frontend/src/components/quick-entry/TaskDialog.tsx +0 -204
- package/frontend/src/components/quick-entry/TransactionDialog.tsx +0 -188
- package/frontend/src/components/ui/alert.tsx +0 -59
- package/frontend/src/components/ui/badge.tsx +0 -36
- package/frontend/src/components/ui/breadcrumb.tsx +0 -120
- package/frontend/src/components/ui/button.tsx +0 -56
- package/frontend/src/components/ui/card.tsx +0 -68
- package/frontend/src/components/ui/collapsible.tsx +0 -9
- package/frontend/src/components/ui/dialog.tsx +0 -81
- package/frontend/src/components/ui/dropdown-menu.tsx +0 -195
- package/frontend/src/components/ui/input-group.tsx +0 -26
- package/frontend/src/components/ui/input.tsx +0 -24
- package/frontend/src/components/ui/label.tsx +0 -19
- package/frontend/src/components/ui/progress.tsx +0 -26
- package/frontend/src/components/ui/scroll-area.tsx +0 -35
- package/frontend/src/components/ui/select.tsx +0 -173
- package/frontend/src/components/ui/separator.tsx +0 -31
- package/frontend/src/components/ui/sheet.tsx +0 -139
- package/frontend/src/components/ui/sidebar.tsx +0 -851
- package/frontend/src/components/ui/skeleton.tsx +0 -15
- package/frontend/src/components/ui/switch.tsx +0 -35
- package/frontend/src/components/ui/table-scroll-wrapper.tsx +0 -96
- package/frontend/src/components/ui/table.tsx +0 -127
- package/frontend/src/components/ui/tabs.tsx +0 -53
- package/frontend/src/components/ui/textarea.tsx +0 -23
- package/frontend/src/components/ui/toast.tsx +0 -122
- package/frontend/src/components/ui/toaster.tsx +0 -32
- package/frontend/src/components/ui/tooltip.tsx +0 -28
- package/frontend/src/components/ui/use-toast.ts +0 -194
- package/frontend/src/constants/integrations.ts +0 -51
- package/frontend/src/contexts/AuthContext.tsx +0 -205
- package/frontend/src/contexts/RealtimeContext.tsx +0 -119
- package/frontend/src/docs/DocumentationApp.tsx +0 -104
- package/frontend/src/docs/DocumentationDirectory.tsx +0 -159
- package/frontend/src/docs/DocumentationLayout.tsx +0 -31
- package/frontend/src/docs/DocumentationPage.tsx +0 -38
- package/frontend/src/docs/DocumentationSidebar.tsx +0 -15
- package/frontend/src/docs/MarkdownContent.tsx +0 -212
- package/frontend/src/docs/README.md +0 -198
- package/frontend/src/docs/main.tsx +0 -12
- package/frontend/src/hooks/use-mobile.tsx +0 -19
- package/frontend/src/hooks/useKeys.ts +0 -202
- package/frontend/src/hooks/useMCPConfig.ts +0 -175
- package/frontend/src/hooks/useRealtimeEntities.ts +0 -56
- package/frontend/src/hooks/useRealtimeObservations.ts +0 -56
- package/frontend/src/hooks/useRealtimeRelationships.ts +0 -56
- package/frontend/src/hooks/useRealtimeSources.ts +0 -53
- package/frontend/src/hooks/useRealtimeTimeline.ts +0 -53
- package/frontend/src/hooks/useSettings.ts +0 -95
- package/frontend/src/hooks/useStorageQuota.ts +0 -65
- package/frontend/src/hooks/useTheme.tsx +0 -42
- package/frontend/src/index.css +0 -247
- package/frontend/src/lib/api_client.ts +0 -8
- package/frontend/src/lib/auth.ts +0 -100
- package/frontend/src/lib/idempotency.ts +0 -25
- package/frontend/src/lib/utils.ts +0 -7
- package/frontend/src/main.tsx +0 -40
- package/frontend/src/sample-data/sets-medium.csv +0 -55
- package/frontend/src/sample-data/sets-medium.ts +0 -45
- package/frontend/src/shared/.eslintrc.json +0 -35
- package/frontend/src/shared/.github/README.md +0 -55
- package/frontend/src/shared/.github/workflows/ci.yml +0 -88
- package/frontend/src/shared/.github/workflows/release.yml +0 -34
- package/frontend/src/shared/.github/workflows/setup.yml +0 -56
- package/frontend/src/shared/README.md +0 -163
- package/frontend/src/shared/SETUP.md +0 -121
- package/frontend/src/shared/components.json +0 -20
- package/frontend/src/shared/package-lock.json +0 -4508
- package/frontend/src/shared/package.json +0 -78
- package/frontend/src/shared/src/components/AppSidebar.tsx +0 -77
- package/frontend/src/shared/src/components/ErrorBoundary.tsx +0 -87
- package/frontend/src/shared/src/components/Layout.tsx +0 -262
- package/frontend/src/shared/src/components/ui/breadcrumb.tsx +0 -115
- package/frontend/src/shared/src/components/ui/button.tsx +0 -56
- package/frontend/src/shared/src/components/ui/calendar.tsx +0 -211
- package/frontend/src/shared/src/components/ui/input.tsx +0 -22
- package/frontend/src/shared/src/components/ui/popover.tsx +0 -29
- package/frontend/src/shared/src/components/ui/separator.tsx +0 -29
- package/frontend/src/shared/src/components/ui/sheet.tsx +0 -140
- package/frontend/src/shared/src/components/ui/sidebar.tsx +0 -519
- package/frontend/src/shared/src/components/ui/skeleton.tsx +0 -15
- package/frontend/src/shared/src/components/ui/tooltip.tsx +0 -28
- package/frontend/src/shared/src/hooks/use-mobile.tsx +0 -19
- package/frontend/src/shared/src/index.css +0 -75
- package/frontend/src/shared/src/index.ts +0 -34
- package/frontend/src/shared/src/lib/utils.ts +0 -6
- package/frontend/src/shared/tailwind.config.mjs +0 -67
- package/frontend/src/shared/tsconfig.json +0 -29
- package/frontend/src/site/seo_metadata.ts +0 -133
- package/frontend/src/site/site_data.test.ts +0 -36
- package/frontend/src/site/site_data.ts +0 -575
- package/frontend/src/store/README.md +0 -10
- package/frontend/src/utils/api_access.ts +0 -24
- package/frontend/src/utils/csv.test.ts +0 -42
- package/frontend/src/utils/csv.ts +0 -45
- package/frontend/src/utils/csv_summary.ts +0 -139
- package/frontend/src/utils/debounce.ts +0 -24
- package/frontend/src/utils/entity_display.test.ts +0 -334
- package/frontend/src/utils/entity_display.ts +0 -23
- package/frontend/src/utils/entity_type_formatter.ts +0 -56
- package/frontend/src/utils/error_utils.ts +0 -137
- package/frontend/src/utils/property_keys.ts +0 -36
- package/frontend/src/utils/schema_icons.test.ts +0 -59
- package/frontend/src/utils/schema_icons.ts +0 -229
- package/frontend/src/utils/time.ts +0 -37
- package/frontend/src/vite-env.d.ts +0 -14
- package/frontend/tsconfig.json +0 -27
- package/frontend/tsconfig.node.json +0 -11
- package/mcp/web-scraper/README.md +0 -475
- package/mcp/web-scraper/SETUP.md +0 -150
- package/mcp/web-scraper/__init__.py +0 -3
- package/mcp/web-scraper/chatgpt_scraper_mcp_server.py +0 -435
- package/mcp/web-scraper/create_repo.sh +0 -50
- package/mcp/web-scraper/imports/spotify/playlist_3i0FY58V7n8XIUyWDm3AYA.json +0 -1052
- package/mcp/web-scraper/nytimes_article.json +0 -7
- package/mcp/web-scraper/plugins/__init__.py +0 -3
- package/mcp/web-scraper/plugins/chatgpt_scraper.py +0 -105
- package/mcp/web-scraper/plugins/metacast_scraper.py +0 -828
- package/mcp/web-scraper/plugins/nyt_podcast_scraper.py +0 -538
- package/mcp/web-scraper/plugins/spotify_scraper.py +0 -618
- package/mcp/web-scraper/plugins/twitter_scraper.py +0 -576
- package/mcp/web-scraper/plugins/url_body_fetcher.py +0 -172
- package/mcp/web-scraper/pytest.ini +0 -11
- package/mcp/web-scraper/requirements-test.txt +0 -6
- package/mcp/web-scraper/requirements.txt +0 -6
- package/mcp/web-scraper/run-web-scraper-mcp.sh +0 -38
- package/mcp/web-scraper/scrape_spotify_playlist.py +0 -77
- package/mcp/web-scraper/scraper.py +0 -819
- package/mcp/web-scraper/scraper_base.py +0 -88
- package/mcp/web-scraper/scraper_registry.py +0 -32
- package/mcp/web-scraper/scripts/scrape_tweet_and_verify_referenced.py +0 -65
- package/mcp/web-scraper/store_songs_to_parquet.py +0 -120
- package/mcp/web-scraper/tests/__init__.py +0 -0
- package/mcp/web-scraper/tests/conftest.py +0 -40
- package/mcp/web-scraper/tests/integration/__init__.py +0 -0
- package/mcp/web-scraper/tests/unit/__init__.py +0 -0
- package/mcp/web-scraper/tests/unit/test_source_detection.py +0 -60
- package/mcp/web-scraper/web_scraper_mcp_server.py +0 -639
- package/openapi.yaml +0 -2071
- package/playwright/fixtures/servers.ts +0 -180
- package/playwright/global_setup.ts +0 -3
- package/playwright/tests/auto-enhancement.spec.ts +0 -370
- package/playwright/tests/coverage-map.json +0 -135
- package/playwright/tests/design-system.spec.ts +0 -216
- package/playwright/tests/entity-detail.spec.ts +0 -268
- package/playwright/tests/entity-list.spec.ts +0 -266
- package/playwright/tests/floating-settings-button.spec.ts +0 -95
- package/playwright/tests/graph-integrity.spec.ts +0 -344
- package/playwright/tests/helpers.ts +0 -560
- package/playwright/tests/interpretations.spec.ts +0 -285
- package/playwright/tests/mcp-configuration.spec.ts +0 -208
- package/playwright/tests/mcp-relationships.spec.ts +0 -631
- package/playwright/tests/mcp-store-retrieve.spec.ts +0 -288
- package/playwright/tests/not-found.spec.ts +0 -30
- package/playwright/tests/oauth-flow.spec.ts +0 -790
- package/playwright/tests/observations.spec.ts +0 -295
- package/playwright/tests/relationship-detail.spec.ts +0 -305
- package/playwright/tests/relationships-list.spec.ts +0 -275
- package/playwright/tests/schema-detail.spec.ts +0 -300
- package/playwright/tests/schemas-list.spec.ts +0 -262
- package/playwright/tests/search-flow.spec.ts +0 -216
- package/playwright/tests/site-page.spec.ts +0 -23
- package/playwright/tests/source-detail.spec.ts +0 -300
- package/playwright/tests/sources-list.spec.ts +0 -254
- package/playwright/tests/upload-flow.spec.ts +0 -279
- package/playwright/tsconfig.json +0 -17
- package/playwright/types.d.ts +0 -14
- package/playwright/utils/servers.ts +0 -435
- package/playwright.config.ts +0 -77
- package/postcss.config.mjs +0 -7
- package/scripts/add_ngrok_mapping.py +0 -99
- package/scripts/add_required_observation_fields.js +0 -96
- package/scripts/add_required_source_fields.js +0 -95
- package/scripts/analyze-data-dir-schemas.js +0 -256
- package/scripts/analyze_data_dir_for_schemas.ts +0 -378
- package/scripts/analyze_low_confidence_fields.ts +0 -235
- package/scripts/analyze_schema_redundancies.ts +0 -228
- package/scripts/apply_documentation_rules.sh +0 -81
- package/scripts/apply_file_naming_convention.sh +0 -75
- package/scripts/backfill_entity_embeddings.ts +0 -95
- package/scripts/branch.js +0 -47
- package/scripts/build_github_pages_site.tsx +0 -65
- package/scripts/check-playwright-coverage.ts +0 -159
- package/scripts/check_agent_conversations.js +0 -72
- package/scripts/check_agent_status.js +0 -156
- package/scripts/check_auto_enhancement_status.ts +0 -215
- package/scripts/check_auto_test_schemas.ts +0 -43
- package/scripts/check_claude_sync.sh +0 -35
- package/scripts/check_raw_fragments.ts +0 -46
- package/scripts/check_remaining_eligibility.ts +0 -46
- package/scripts/check_remaining_fields.ts +0 -58
- package/scripts/check_sendgrid_credits.sh +0 -122
- package/scripts/check_sendgrid_email_logs.sh +0 -150
- package/scripts/check_snapshot_schema.ts +0 -18
- package/scripts/check_sources.ts +0 -34
- package/scripts/check_stale_snapshots.ts +0 -80
- package/scripts/cleanup-auto-test-schemas.ts +0 -80
- package/scripts/cleanup_test_schemas.ts +0 -275
- package/scripts/com.neotoma.dev-servers.plist.template +0 -27
- package/scripts/com.neotoma.watch-build.plist.template +0 -27
- package/scripts/complete_submodule_setup.sh +0 -101
- package/scripts/configure_sendgrid_dns.sh +0 -162
- package/scripts/copy-env-to-worktree.js +0 -109
- package/scripts/copy_pdf_worker_wrapper.js +0 -19
- package/scripts/create_sample_parquet_files.py +0 -120
- package/scripts/create_sample_parquet_files.ts +0 -146
- package/scripts/create_sample_parquet_files_mcp.ts +0 -196
- package/scripts/create_sample_parquet_files_simple.sh +0 -132
- package/scripts/cursor-worktree-init.sh +0 -24
- package/scripts/debug-ssl.sh +0 -86
- package/scripts/debug_pdf_extraction.ts +0 -69
- package/scripts/debug_vec_knn.ts +0 -69
- package/scripts/dev-proxy.js +0 -406
- package/scripts/dev-serve.js +0 -349
- package/scripts/disable-dns.sh +0 -47
- package/scripts/doctor.ts +0 -97
- package/scripts/export_schema_snapshots.ts +0 -253
- package/scripts/fix-ssl-cert.sh +0 -72
- package/scripts/fix_mcp_phase1_tests.sh +0 -51
- package/scripts/fix_observation_column_names.js +0 -51
- package/scripts/fix_observation_priority_ordering.js +0 -45
- package/scripts/fix_observation_properties_to_fields.js +0 -48
- package/scripts/fix_sqlite_schema_mismatch.js +0 -75
- package/scripts/generate-dev-cert.sh +0 -69
- package/scripts/generate_pdf_fixtures.ts +0 -330
- package/scripts/generate_schema_icons.ts +0 -216
- package/scripts/get_branch_ports.js +0 -56
- package/scripts/get_mcp_token.sh +0 -47
- package/scripts/get_secrets_for_agents.js +0 -45
- package/scripts/ingest_data_dir.ts +0 -215
- package/scripts/ingest_finances_data.ts +0 -255
- package/scripts/initialize-schemas.ts +0 -350
- package/scripts/install_launchd_dev_servers.js +0 -54
- package/scripts/install_launchd_watch_build.js +0 -53
- package/scripts/instruct_agents_credential_setup.js +0 -130
- package/scripts/instruct_agents_env_check.js +0 -99
- package/scripts/instruct_agents_run_tests_until_passing.js +0 -128
- package/scripts/kill_port.js +0 -174
- package/scripts/linters/sync_agent_instructions_pre_commit.sh +0 -34
- package/scripts/manage_error_debugging.sh +0 -228
- package/scripts/manually_queue_enhancements.ts +0 -156
- package/scripts/merge-dev.js +0 -319
- package/scripts/migrate_auto_enhanced_fields.ts +0 -83
- package/scripts/migrate_env_to_secrets.js +0 -69
- package/scripts/migrate_plans.ts +0 -870
- package/scripts/monitor_and_fix_snapshots.ts +0 -165
- package/scripts/move_docs_rules_to_cursor.js +0 -54
- package/scripts/move_docs_rules_to_cursor.sh +0 -24
- package/scripts/neotoma-npm-reserve/README.md +0 -8
- package/scripts/neotoma-npm-reserve/package.json +0 -10
- package/scripts/notify_agents_env_vars.js +0 -109
- package/scripts/notify_agents_setup_script.js +0 -148
- package/scripts/notify_running_agents_credentials.js +0 -177
- package/scripts/pdf_worker_polyfill.mjs +0 -27
- package/scripts/pick-port.js +0 -108
- package/scripts/postinstall.js +0 -84
- package/scripts/process_remaining_eligible.ts +0 -70
- package/scripts/prototypes/run-prototype.sh +0 -40
- package/scripts/prune-merged-branches.js +0 -115
- package/scripts/recompute_bob.ts +0 -64
- package/scripts/recompute_snapshots.ts +0 -72
- package/scripts/release_orchestrator.js +0 -1995
- package/scripts/remove_duplicate_source_fields.js +0 -61
- package/scripts/rename-branch-from-commit.js +0 -111
- package/scripts/respawn_agents_with_credentials.js +0 -358
- package/scripts/respawn_single_agent.js +0 -324
- package/scripts/run-dev-server-with-tunnel-url.sh +0 -16
- package/scripts/run-dev-task.js +0 -160
- package/scripts/run_dev_servers_launchd.sh +0 -14
- package/scripts/run_integration_tests.js +0 -523
- package/scripts/run_migrations.js +0 -55
- package/scripts/run_neotoma_mcp_stdio.sh +0 -11
- package/scripts/run_neotoma_mcp_stdio_dev_watch.sh +0 -10
- package/scripts/run_neotoma_mcp_stdio_prod.sh +0 -11
- package/scripts/run_neotoma_mcp_stdio_prod_watch.sh +0 -12
- package/scripts/run_watch_build_launchd.sh +0 -18
- package/scripts/scrape_nytimes_article.py +0 -182
- package/scripts/scrape_nytimes_simple.py +0 -152
- package/scripts/secrets_manager.js +0 -232
- package/scripts/send_agent_followup.js +0 -136
- package/scripts/setup-data-symlink.js +0 -88
- package/scripts/setup-dns.sh +0 -54
- package/scripts/setup-env-copy-hook.sh +0 -67
- package/scripts/setup-foundation-symlink.js +0 -45
- package/scripts/setup-https-tunnel.sh +0 -409
- package/scripts/setup-test-env.sh +0 -18
- package/scripts/setup_agent_credentials.sh +0 -27
- package/scripts/setup_agent_environment.sh +0 -39
- package/scripts/setup_claude_instructions.sh +0 -437
- package/scripts/setup_cloudflare_email_routing.sh +0 -158
- package/scripts/setup_shared_submodule.sh +0 -100
- package/scripts/simulate_npm_install.js +0 -70
- package/scripts/spec_compliance_patterns.js +0 -260
- package/scripts/sync-env-from-1password.sh +0 -100
- package/scripts/sync_mcp_configs.js +0 -106
- package/scripts/test-base64-store.ts +0 -53
- package/scripts/test-error-handling.ts +0 -44
- package/scripts/test-file-path-store.ts +0 -142
- package/scripts/test-raw-fragments-idempotence.ts +0 -157
- package/scripts/test-raw-fragments-insert.ts +0 -88
- package/scripts/test-store-response-structure.ts +0 -125
- package/scripts/test-store-structured-response.ts +0 -126
- package/scripts/test_agent_env_spawn.js +0 -82
- package/scripts/test_confidence.ts +0 -36
- package/scripts/test_dsnp_parquet_reading.ts +0 -72
- package/scripts/test_mcp_semantic_search.ts +0 -36
- package/scripts/test_parquet_ingestion.ts +0 -52
- package/scripts/test_raw_fragments_in_response.ts +0 -31
- package/scripts/test_sendgrid_smtp.sh +0 -45
- package/scripts/test_store_parquet_via_mcp.ts +0 -66
- package/scripts/trigger_error_debug_cli.js +0 -271
- package/scripts/unblock_agents.js +0 -208
- package/scripts/validate-coverage-map.ts +0 -187
- package/scripts/validate-doc-dependencies.js +0 -410
- package/scripts/validate_all_fu_compliance.js +0 -752
- package/scripts/validate_schema_sync.ts +0 -135
- package/scripts/validate_spec_compliance.js +0 -669
- package/scripts/watch_site.js +0 -68
- package/scripts/wipe-local-database.js +0 -191
- package/scripts/with_branch_ports.js +0 -496
- package/site_pages/.nojekyll +0 -0
- package/site_pages/FAVICON_CANDIDATES.md +0 -22
- package/site_pages/favicon-1-diamond.svg +0 -3
- package/site_pages/favicon-2-n-box.svg +0 -10
- package/site_pages/favicon-3-waves.svg +0 -3
- package/site_pages/favicon-4-n-minimal.svg +0 -3
- package/site_pages/favicon-5-bars.svg +0 -5
- package/site_pages/favicon.svg +0 -10
- package/site_pages/index.html +0 -40
- package/site_pages/robots.txt +0 -4
- package/site_pages/sitemap.xml +0 -5
- package/src/actions.ts +0 -4468
- package/src/cli/agent_instructions_scan.ts +0 -793
- package/src/cli/bootstrap.ts +0 -35
- package/src/cli/config.ts +0 -338
- package/src/cli/format.ts +0 -337
- package/src/cli/index.ts +0 -11417
- package/src/cli/init_abort.ts +0 -7
- package/src/cli/mcp_config_scan.ts +0 -1359
- package/src/cli/pack_rat.ts +0 -134
- package/src/config/record_types.ts +0 -562
- package/src/config.ts +0 -164
- package/src/crypto/agent_identity.ts +0 -46
- package/src/crypto/auth.ts +0 -110
- package/src/crypto/column_encryption.ts +0 -109
- package/src/crypto/crypto.test.ts +0 -311
- package/src/crypto/envelope.ts +0 -240
- package/src/crypto/export.ts +0 -131
- package/src/crypto/index.ts +0 -13
- package/src/crypto/key_derivation.ts +0 -176
- package/src/crypto/keys.ts +0 -85
- package/src/crypto/mcp_auth_token.ts +0 -35
- package/src/crypto/signature.ts +0 -50
- package/src/crypto/types.ts +0 -48
- package/src/db.ts +0 -66
- package/src/embeddings.ts +0 -76
- package/src/index.ts +0 -25
- package/src/mcp_ws_bridge.ts +0 -222
- package/src/middleware/encrypt_response.ts +0 -39
- package/src/normalize.ts +0 -351
- package/src/record_types.test.ts +0 -36
- package/src/reducers/index.ts +0 -5
- package/src/reducers/observation_reducer.ts +0 -458
- package/src/reducers/relationship_reducer.ts +0 -291
- package/src/repositories/db/capability_repo.ts +0 -29
- package/src/repositories/file/capability_repo.ts +0 -29
- package/src/repositories/index.ts +0 -7
- package/src/repositories/interfaces.ts +0 -112
- package/src/repositories/sqlite/__tests__/local_db_adapter.test.ts +0 -138
- package/src/repositories/sqlite/local_db_adapter.ts +0 -961
- package/src/repositories/sqlite/sqlite_client.ts +0 -378
- package/src/server.ts +0 -6157
- package/src/services/__tests__/csv_chunking.test.ts +0 -125
- package/src/services/__tests__/deletion.test.ts +0 -358
- package/src/services/__tests__/entity_semantic_search.test.ts +0 -45
- package/src/services/__tests__/local_auth.test.ts +0 -52
- package/src/services/__tests__/local_entity_embedding.test.ts +0 -108
- package/src/services/__tests__/mcp_oauth.test.ts +0 -407
- package/src/services/__tests__/oauth_key_gate.test.ts +0 -50
- package/src/services/__tests__/oauth_state.test.ts +0 -40
- package/src/services/__tests__/schema_icon_service.test.ts +0 -151
- package/src/services/auto_enhancement_processor.ts +0 -237
- package/src/services/capability_registry.ts +0 -202
- package/src/services/correction.ts +0 -87
- package/src/services/csv_chunking.ts +0 -128
- package/src/services/csv_row_extraction.ts +0 -124
- package/src/services/dashboard_stats.ts +0 -115
- package/src/services/deletion.ts +0 -482
- package/src/services/deletion_monitor.ts +0 -314
- package/src/services/encryption_service.ts +0 -110
- package/src/services/entity_merge.ts +0 -100
- package/src/services/entity_queries.ts +0 -518
- package/src/services/entity_resolution.ts +0 -367
- package/src/services/entity_semantic_search.ts +0 -64
- package/src/services/entity_snapshot_embedding.ts +0 -115
- package/src/services/field_canonicalization.ts +0 -393
- package/src/services/field_converters.ts +0 -173
- package/src/services/field_validation.ts +0 -173
- package/src/services/file_text_extraction.ts +0 -213
- package/src/services/finances_field_mapping.ts +0 -473
- package/src/services/gdpr_deletion.ts +0 -497
- package/src/services/interpretation.ts +0 -939
- package/src/services/llm_extraction.ts +0 -548
- package/src/services/local_auth.ts +0 -154
- package/src/services/local_entity_embedding.ts +0 -196
- package/src/services/mcp_auth.ts +0 -75
- package/src/services/mcp_oauth.ts +0 -1625
- package/src/services/mcp_oauth_errors.ts +0 -139
- package/src/services/oauth_key_gate.ts +0 -116
- package/src/services/oauth_state.ts +0 -70
- package/src/services/observation_identity.ts +0 -161
- package/src/services/observation_storage.ts +0 -162
- package/src/services/parquet_reader.ts +0 -375
- package/src/services/public_key_registry.ts +0 -103
- package/src/services/raw_fragments.ts +0 -217
- package/src/services/raw_storage.ts +0 -267
- package/src/services/relationships.ts +0 -495
- package/src/services/schema_definitions.ts +0 -2041
- package/src/services/schema_icon_service.ts +0 -260
- package/src/services/schema_inference.ts +0 -401
- package/src/services/schema_recommendation.ts +0 -1475
- package/src/services/schema_registry.ts +0 -1403
- package/src/services/snapshot_computation.ts +0 -92
- package/src/services/source_identity.ts +0 -22
- package/src/services/timeline_events.ts +0 -198
- package/src/shared/action_handlers/entity_handlers.ts +0 -115
- package/src/shared/action_schemas.test.ts +0 -59
- package/src/shared/action_schemas.ts +0 -317
- package/src/shared/api_client.ts +0 -86
- package/src/shared/contract_mappings.ts +0 -646
- package/src/shared/entity_display_name.ts +0 -64
- package/src/shared/local_transport.ts +0 -126
- package/src/shared/openapi_schema.ts +0 -175
- package/src/shared/openapi_types.ts +0 -2810
- package/src/shared/record_display_summary.ts +0 -133
- package/src/utils/__tests__/csv_summary.test.ts +0 -53
- package/src/utils/__tests__/lucide_icons.test.ts +0 -133
- package/src/utils/chat.test.ts +0 -42
- package/src/utils/chat.ts +0 -35
- package/src/utils/csv.test.ts +0 -41
- package/src/utils/csv.ts +0 -77
- package/src/utils/csv_summary.ts +0 -195
- package/src/utils/log_encrypt.ts +0 -144
- package/src/utils/logger.ts +0 -94
- package/src/utils/lucide_icons.ts +0 -279
- package/src/utils/property_keys.test.ts +0 -109
- package/src/utils/property_keys.ts +0 -66
- package/src/utils/property_sanitizer.test.ts +0 -105
- package/src/utils/property_sanitizer.ts +0 -135
- package/src/version_check.test.ts +0 -107
- package/src/version_check.ts +0 -58
- package/supabase/.temp/cli-latest +0 -0
- package/tailwind.config.mjs +0 -134
- package/tests/TEST_ACTION_MATRIX.md +0 -387
- package/tests/agent/mcp_instruction_behavior.test.ts +0 -72
- package/tests/agent/runner/agent_runner.ts +0 -27
- package/tests/agent/runner/claude_code_runner.ts +0 -128
- package/tests/agent/runner/cursor_cli_runner.ts +0 -7
- package/tests/cli/api_client_offline_fallback.test.ts +0 -89
- package/tests/cli/cli_admin_commands.test.ts +0 -268
- package/tests/cli/cli_api_commands.test.ts +0 -75
- package/tests/cli/cli_auth_commands.test.ts +0 -67
- package/tests/cli/cli_command_coverage_guard.test.ts +0 -50
- package/tests/cli/cli_correction_commands.test.ts +0 -277
- package/tests/cli/cli_direct_invocation_parity.test.ts +0 -46
- package/tests/cli/cli_entity_commands.test.ts +0 -324
- package/tests/cli/cli_entity_subcommands.test.ts +0 -422
- package/tests/cli/cli_infra_commands.test.ts +0 -475
- package/tests/cli/cli_mcp_commands.test.ts +0 -51
- package/tests/cli/cli_observation_commands.test.ts +0 -232
- package/tests/cli/cli_query_commands.test.ts +0 -369
- package/tests/cli/cli_relationship_commands.test.ts +0 -410
- package/tests/cli/cli_schema_commands.test.ts +0 -296
- package/tests/cli/cli_session_startup_ux.test.ts +0 -112
- package/tests/cli/cli_smoke.test.ts +0 -456
- package/tests/cli/cli_source_commands.test.ts +0 -214
- package/tests/cli/cli_stats_commands.test.ts +0 -51
- package/tests/cli/cli_store_commands.test.ts +0 -339
- package/tests/cli/cli_timeline_commands.test.ts +0 -294
- package/tests/cli/config.test.ts +0 -36
- package/tests/cli/config_api_discovery.test.ts +0 -91
- package/tests/cli/test_command_detection.test.ts +0 -128
- package/tests/cli/test_debug_tty.test.ts +0 -32
- package/tests/contract/contract_mapping.test.ts +0 -131
- package/tests/contract/contract_mcp_cli_parity.test.ts +0 -223
- package/tests/contract/openapi_schema.test.ts +0 -15
- package/tests/fixtures/README.md +0 -22
- package/tests/fixtures/agent_mcp/insurance_policy.txt +0 -5
- package/tests/fixtures/agent_mcp_cases.json +0 -137
- package/tests/fixtures/csv/sample_balances.csv +0 -7
- package/tests/fixtures/csv/sample_contacts.csv +0 -6
- package/tests/fixtures/csv/sample_crypto_transactions.csv +0 -6
- package/tests/fixtures/csv/sample_flows.csv +0 -7
- package/tests/fixtures/csv/sample_holdings.csv +0 -7
- package/tests/fixtures/csv/sample_income.csv +0 -7
- package/tests/fixtures/csv/sample_purchases.csv +0 -7
- package/tests/fixtures/csv/sample_tax_events.csv +0 -7
- package/tests/fixtures/csv/sample_transactions.csv +0 -7
- package/tests/fixtures/csv/sample_transfers.csv +0 -6
- package/tests/fixtures/expected/contact_snapshot.json +0 -19
- package/tests/fixtures/expected/transaction_snapshot.json +0 -21
- package/tests/fixtures/helpers.ts +0 -522
- package/tests/fixtures/json/account.json +0 -63
- package/tests/fixtures/json/argument.json +0 -39
- package/tests/fixtures/json/balance.json +0 -56
- package/tests/fixtures/json/belief.json +0 -44
- package/tests/fixtures/json/contact.json +0 -83
- package/tests/fixtures/json/contract.json +0 -62
- package/tests/fixtures/json/crypto_transaction.json +0 -67
- package/tests/fixtures/json/domain.json +0 -41
- package/tests/fixtures/json/emotion.json +0 -31
- package/tests/fixtures/json/fixed_cost.json +0 -75
- package/tests/fixtures/json/flow.json +0 -71
- package/tests/fixtures/json/habit.json +0 -54
- package/tests/fixtures/json/habit_completion.json +0 -31
- package/tests/fixtures/json/habit_objective.json +0 -40
- package/tests/fixtures/json/holding.json +0 -65
- package/tests/fixtures/json/income.json +0 -59
- package/tests/fixtures/json/liability.json +0 -50
- package/tests/fixtures/json/order.json +0 -62
- package/tests/fixtures/json/outcome.json +0 -56
- package/tests/fixtures/json/process.json +0 -43
- package/tests/fixtures/json/property.json +0 -52
- package/tests/fixtures/json/purchase.json +0 -66
- package/tests/fixtures/json/research.json +0 -53
- package/tests/fixtures/json/strategy.json +0 -68
- package/tests/fixtures/json/task_attachment.json +0 -62
- package/tests/fixtures/json/task_comment.json +0 -54
- package/tests/fixtures/json/task_dependency.json +0 -51
- package/tests/fixtures/json/task_story.json +0 -53
- package/tests/fixtures/json/tax_event.json +0 -60
- package/tests/fixtures/json/tax_filing.json +0 -61
- package/tests/fixtures/json/transaction.json +0 -62
- package/tests/fixtures/json/transfer.json +0 -60
- package/tests/fixtures/json/wallet.json +0 -51
- package/tests/fixtures/json/workout.json +0 -45
- package/tests/fixtures/pdf/sample-upload.txt +0 -2
- package/tests/fixtures/pdf/sample_bank_statement.md +0 -32
- package/tests/fixtures/pdf/sample_bank_statement.pdf +0 -0
- package/tests/fixtures/pdf/sample_contract.md +0 -27
- package/tests/fixtures/pdf/sample_contract.pdf +0 -0
- package/tests/fixtures/pdf/sample_exercise.md +0 -31
- package/tests/fixtures/pdf/sample_exercise.pdf +0 -0
- package/tests/fixtures/pdf/sample_holding_statement.md +0 -29
- package/tests/fixtures/pdf/sample_holding_statement.pdf +0 -0
- package/tests/fixtures/pdf/sample_invoice.md +0 -27
- package/tests/fixtures/pdf/sample_invoice.pdf +0 -108
- package/tests/fixtures/pdf/sample_meal.md +0 -28
- package/tests/fixtures/pdf/sample_meal.pdf +0 -111
- package/tests/fixtures/pdf/sample_note.md +0 -28
- package/tests/fixtures/pdf/sample_note.pdf +0 -0
- package/tests/fixtures/pdf/sample_receipt.md +0 -28
- package/tests/fixtures/pdf/sample_receipt.pdf +0 -0
- package/tests/fixtures/pdf/sample_research.md +0 -31
- package/tests/fixtures/pdf/sample_research.pdf +0 -0
- package/tests/fixtures/pdf/sample_tax_form.md +0 -38
- package/tests/fixtures/pdf/sample_tax_form.pdf +0 -0
- package/tests/fixtures/pdf/sample_transaction_receipt.md +0 -28
- package/tests/fixtures/pdf/sample_transaction_receipt.pdf +0 -0
- package/tests/fixtures/replay_graph.test.ts +0 -125
- package/tests/fixtures/sample_invoice.pdf +0 -1
- package/tests/fixtures/types.ts +0 -321
- package/tests/fixtures/validation.ts +0 -333
- package/tests/helpers/cleanup_helpers.ts +0 -550
- package/tests/helpers/create_test_parquet.ts +0 -187
- package/tests/helpers/cross_layer_helpers.ts +0 -130
- package/tests/helpers/mcp_action_helper.ts +0 -55
- package/tests/helpers/mcp_spec_validators.ts +0 -433
- package/tests/helpers/test_data_helpers.ts +0 -226
- package/tests/helpers/test_schema_helpers.ts +0 -264
- package/tests/integration/cli_to_mcp_entities.test.ts +0 -211
- package/tests/integration/cli_to_mcp_relationships.test.ts +0 -196
- package/tests/integration/cli_to_mcp_schemas.test.ts +0 -232
- package/tests/integration/cli_to_mcp_stats_snapshots.test.ts +0 -67
- package/tests/integration/cli_to_mcp_store.test.ts +0 -249
- package/tests/integration/dashboard_stats.test.ts +0 -180
- package/tests/integration/entity_queries.test.ts +0 -666
- package/tests/integration/field_converters.test.ts +0 -266
- package/tests/integration/fixture_mcp_store_replay.test.ts +0 -255
- package/tests/integration/gdpr_deletion.test.ts +0 -433
- package/tests/integration/llm_extraction.test.ts +0 -554
- package/tests/integration/mcp_actions_matrix.test.ts +0 -969
- package/tests/integration/mcp_auto_enhancement.test.ts +0 -659
- package/tests/integration/mcp_auto_schema_creation.test.ts +0 -658
- package/tests/integration/mcp_correction_variations.test.ts +0 -641
- package/tests/integration/mcp_entity_creation.test.ts +0 -333
- package/tests/integration/mcp_entity_variations.test.ts +0 -474
- package/tests/integration/mcp_graph_variations.test.ts +0 -380
- package/tests/integration/mcp_npm_check_update.test.ts +0 -54
- package/tests/integration/mcp_query_variations.test.ts +0 -392
- package/tests/integration/mcp_relationship_variations.test.ts +0 -433
- package/tests/integration/mcp_resource_variations.test.ts +0 -423
- package/tests/integration/mcp_resources.test.ts +0 -452
- package/tests/integration/mcp_schema_actions.test.ts +0 -673
- package/tests/integration/mcp_schema_variations.test.ts +0 -428
- package/tests/integration/mcp_store_parquet.test.ts +0 -466
- package/tests/integration/mcp_store_unstructured.test.ts +0 -413
- package/tests/integration/mcp_store_variations.test.ts +0 -452
- package/tests/integration/nonjson_csv_store_behavior.test.ts +0 -348
- package/tests/integration/nonjson_fixtures_mcp_replay.test.ts +0 -253
- package/tests/integration/observation_ingestion.test.ts +0 -362
- package/tests/integration/payload/payload_submission.test.ts +0 -296
- package/tests/integration/payload_compiler.test.ts +0 -347
- package/tests/integration/public_key_registry.test.ts +0 -204
- package/tests/integration/relationship_snapshots.test.ts +0 -235
- package/tests/integration/schema_recommendation_integration.test.ts +0 -418
- package/tests/integration/setup_v0.2.0_schemas.ts +0 -61
- package/tests/integration/v0.2.0_ingestion.test.ts +0 -527
- package/tests/services/auto_enhancement_converter_detection.test.ts +0 -663
- package/tests/services/auto_enhancement_processor.test.ts +0 -445
- package/tests/services/capability_registry.test.ts +0 -254
- package/tests/services/converter_detection_unit.test.ts +0 -168
- package/tests/services/encryption_service.test.ts +0 -147
- package/tests/services/entity_resolution.test.ts +0 -285
- package/tests/services/field_canonicalization.test.ts +0 -215
- package/tests/services/field_converters.test.ts +0 -211
- package/tests/services/field_validation.test.ts +0 -318
- package/tests/services/finances_field_mapping.test.ts +0 -245
- package/tests/services/interpretation.test.ts +0 -144
- package/tests/services/mcp_auth.test.ts +0 -34
- package/tests/services/observation_identity.test.ts +0 -154
- package/tests/services/payload_identity.test.ts +0 -325
- package/tests/services/payload_schema.test.ts +0 -282
- package/tests/services/raw_storage.test.ts +0 -546
- package/tests/services/schema_definitions.test.ts +0 -119
- package/tests/services/schema_recommendation.test.ts +0 -590
- package/tests/services/schema_registry_incremental.test.ts +0 -882
- package/tests/services/summary.test.ts +0 -26
- package/tests/unit/bigint_serialization.test.ts +0 -220
- package/tests/unit/observation_reducer_converters.test.ts +0 -430
- package/tests/unit/parquet_reader.test.ts +0 -155
- package/tests/unit/relationship_reducer.test.ts +0 -208
- package/tests/unit/schema_inference.test.ts +0 -358
- package/tests/unit/seo_metadata.test.ts +0 -52
- package/tsconfig.json +0 -22
- package/vite.config.ts +0 -165
- package/vitest.config.ts +0 -111
- package/vitest.global_setup.ts +0 -42
- package/vitest.setup.ts +0 -89
|
@@ -1,3400 +0,0 @@
|
|
|
1
|
-
# v0.2.3 Foundation Agent Integration Guide
|
|
2
|
-
|
|
3
|
-
**Alignment**: This guide implements [Agent Skills for Context Engineering](https://github.com/muratcankoylan/Agent-Skills-for-Context-Engineering) principles throughout.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
This guide details how foundation agents integrate with Neotoma for unified memory management following Agent Skills for Context Engineering principles. It covers:
|
|
8
|
-
|
|
9
|
-
- **Memory Systems** (Agent Skill 6): Entity tracking, knowledge graphs, semantic and episodic memory
|
|
10
|
-
- **Context Degradation Management** (Agent Skill 2): Preventing lost-in-middle, attention degradation
|
|
11
|
-
- **Context Compression** (Agent Skill 3): Entity resolution, snapshot compression, selective loading
|
|
12
|
-
- **Context Optimization** (Agent Skill 4): High-signal token curation, query-based loading
|
|
13
|
-
- **Multi-Agent Patterns** (Agent Skill 5): Orchestrator, peer-to-peer, hierarchical collaboration
|
|
14
|
-
- **Evaluation Patterns** (Agent Skills 8 & 9): Performance metrics, quality scoring, LLM-as-judge
|
|
15
|
-
|
|
16
|
-
This guide provides graceful degradation, memory storage patterns, memory retrieval patterns, and best practices aligned with Agent Skills principles.
|
|
17
|
-
|
|
18
|
-
## Integration Architecture
|
|
19
|
-
|
|
20
|
-
### Unified Memory System
|
|
21
|
-
|
|
22
|
-
Foundation agents use Neotoma for all memory (real-world entities + codebase metadata):
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
┌─────────────────────────────────────┐
|
|
26
|
-
│ Foundation Agent │
|
|
27
|
-
│ (Cursor, ChatGPT, Claude) │
|
|
28
|
-
└─────────────────┬───────────────────┘
|
|
29
|
-
│
|
|
30
|
-
│ MCP Protocol
|
|
31
|
-
│
|
|
32
|
-
┌─────────────────▼───────────────────┐
|
|
33
|
-
│ Neotoma MCP Server │
|
|
34
|
-
│ - Entity Resolution │
|
|
35
|
-
│ - Timeline Generation │
|
|
36
|
-
│ - Cross-Session Persistence │
|
|
37
|
-
└─────────────────┬───────────────────┘
|
|
38
|
-
│
|
|
39
|
-
│
|
|
40
|
-
┌─────────────────▼───────────────────┐
|
|
41
|
-
│ Neotoma Database │
|
|
42
|
-
│ - Real-World Entities │
|
|
43
|
-
│ - Codebase Metadata │
|
|
44
|
-
│ - Observations & Snapshots │
|
|
45
|
-
└─────────────────────────────────────┘
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Memory Types
|
|
49
|
-
|
|
50
|
-
| Memory Type | Entity Types | Use Case |
|
|
51
|
-
|-------------|--------------|----------|
|
|
52
|
-
| **Codebase Metadata** | feature_unit, release, codebase_entity | Track development units, releases, architecture |
|
|
53
|
-
| **Agent Activity** | agent_decision, agent_session | Track decisions, sessions, checkpoints |
|
|
54
|
-
| **Quality Tracking** | validation_result | Track test results, linter output, compliance |
|
|
55
|
-
| **Architecture** | architectural_decision | Track high-level architectural decisions |
|
|
56
|
-
| **Real-World Entities** | contact, invoice, event, etc. | Track people, companies, documents mentioned in docs |
|
|
57
|
-
|
|
58
|
-
## Graceful Degradation
|
|
59
|
-
|
|
60
|
-
Foundation agents check Neotoma availability and fall back to `.cursor/memory/` if unavailable.
|
|
61
|
-
|
|
62
|
-
### Detection Pattern
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
// neotoma_client.ts
|
|
66
|
-
export async function isNeotomaAvailable(): Promise<boolean> {
|
|
67
|
-
try {
|
|
68
|
-
const response = await fetch('http://localhost:3000/mcp/health', {
|
|
69
|
-
method: 'GET',
|
|
70
|
-
timeout: 2000
|
|
71
|
-
});
|
|
72
|
-
return response.ok;
|
|
73
|
-
} catch (error) {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### Storage Pattern
|
|
80
|
-
|
|
81
|
-
```typescript
|
|
82
|
-
// memory_service.ts
|
|
83
|
-
import { isNeotomaAvailable } from './neotoma_client';
|
|
84
|
-
import { mcpClient } from './mcp_client';
|
|
85
|
-
import { writeToLocalMemory } from './local_memory';
|
|
86
|
-
|
|
87
|
-
export async function storeFeatureUnit(featureUnit: FeatureUnit) {
|
|
88
|
-
if (await isNeotomaAvailable()) {
|
|
89
|
-
// Use Neotoma via MCP (preferred)
|
|
90
|
-
try {
|
|
91
|
-
const result = await mcpClient.submit_payload({
|
|
92
|
-
capability_id: "neotoma:store_feature_unit:v1",
|
|
93
|
-
body: featureUnit,
|
|
94
|
-
provenance: {
|
|
95
|
-
source_refs: [],
|
|
96
|
-
extracted_at: new Date().toISOString(),
|
|
97
|
-
extractor_version: "neotoma-mcp:v0.2.3"
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
console.log(`Stored Feature Unit ${featureUnit.id} in Neotoma (payload_id: ${result.payload_id})`);
|
|
101
|
-
return result;
|
|
102
|
-
} catch (error) {
|
|
103
|
-
console.error('Failed to store in Neotoma, falling back to local memory:', error);
|
|
104
|
-
return writeToLocalMemory('feature_units', featureUnit.id, featureUnit);
|
|
105
|
-
}
|
|
106
|
-
} else {
|
|
107
|
-
// Fallback to lightweight memory
|
|
108
|
-
console.log(`Neotoma unavailable, using local memory for Feature Unit ${featureUnit.id}`);
|
|
109
|
-
return writeToLocalMemory('feature_units', featureUnit.id, featureUnit);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### Retrieval Pattern
|
|
115
|
-
|
|
116
|
-
```typescript
|
|
117
|
-
export async function getFeatureUnit(id: string): Promise<FeatureUnit | null> {
|
|
118
|
-
if (await isNeotomaAvailable()) {
|
|
119
|
-
try {
|
|
120
|
-
const result = await mcpClient.retrieve_records({
|
|
121
|
-
type: 'feature_unit',
|
|
122
|
-
properties: { id }
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
if (result.records.length > 0) {
|
|
126
|
-
return result.records[0].properties as FeatureUnit;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Fall back to local memory if not found in Neotoma
|
|
130
|
-
return readFromLocalMemory('feature_units', id);
|
|
131
|
-
} catch (error) {
|
|
132
|
-
console.error('Failed to query Neotoma, falling back to local memory:', error);
|
|
133
|
-
return readFromLocalMemory('feature_units', id);
|
|
134
|
-
}
|
|
135
|
-
} else {
|
|
136
|
-
return readFromLocalMemory('feature_units', id);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## Memory Storage Patterns
|
|
142
|
-
|
|
143
|
-
### Feature Unit Creation
|
|
144
|
-
|
|
145
|
-
**When**: After `create-feature-unit` command completes
|
|
146
|
-
|
|
147
|
-
```typescript
|
|
148
|
-
import { storeFeatureUnit } from './memory_service';
|
|
149
|
-
|
|
150
|
-
async function createFeatureUnitCommand(args: CreateFeatureUnitArgs) {
|
|
151
|
-
// 1. Create Feature Unit spec
|
|
152
|
-
const spec = generateFeatureUnitSpec(args);
|
|
153
|
-
|
|
154
|
-
// 2. Write spec to file
|
|
155
|
-
writeFeatureUnitSpec(spec.id, spec);
|
|
156
|
-
|
|
157
|
-
// 3. Store in Neotoma
|
|
158
|
-
await storeFeatureUnit({
|
|
159
|
-
id: spec.id,
|
|
160
|
-
description: spec.overview,
|
|
161
|
-
status: 'planning',
|
|
162
|
-
dependencies: spec.dependencies || [],
|
|
163
|
-
risk_level: spec.risk_level,
|
|
164
|
-
created_at: new Date().toISOString(),
|
|
165
|
-
updated_at: new Date().toISOString()
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
console.log(`Feature Unit ${spec.id} created and stored in memory`);
|
|
169
|
-
}
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### Feature Unit Status Update
|
|
173
|
-
|
|
174
|
-
**When**: Status changes (in_progress, completed, deployed)
|
|
175
|
-
|
|
176
|
-
```typescript
|
|
177
|
-
async function updateFeatureUnitStatus(id: string, newStatus: string) {
|
|
178
|
-
// 1. Update spec file
|
|
179
|
-
const spec = readFeatureUnitSpec(id);
|
|
180
|
-
spec.status = newStatus;
|
|
181
|
-
spec.updated = new Date().toISOString();
|
|
182
|
-
writeFeatureUnitSpec(id, spec);
|
|
183
|
-
|
|
184
|
-
// 2. Update in Neotoma
|
|
185
|
-
await storeFeatureUnit({
|
|
186
|
-
id: spec.id,
|
|
187
|
-
description: spec.overview,
|
|
188
|
-
status: newStatus,
|
|
189
|
-
dependencies: spec.dependencies || [],
|
|
190
|
-
risk_level: spec.risk_level,
|
|
191
|
-
created_at: spec.created,
|
|
192
|
-
updated_at: spec.updated
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
console.log(`Feature Unit ${id} status updated to ${newStatus}`);
|
|
196
|
-
}
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
### Release Creation
|
|
200
|
-
|
|
201
|
-
**When**: After `create-release` command completes
|
|
202
|
-
|
|
203
|
-
```typescript
|
|
204
|
-
async function createReleaseCommand(args: CreateReleaseArgs) {
|
|
205
|
-
// 1. Create Release spec
|
|
206
|
-
const spec = generateReleaseSpec(args);
|
|
207
|
-
|
|
208
|
-
// 2. Write spec to file
|
|
209
|
-
writeReleaseSpec(spec.id, spec);
|
|
210
|
-
|
|
211
|
-
// 3. Store in Neotoma
|
|
212
|
-
await mcpClient.submit_payload({
|
|
213
|
-
capability_id: "neotoma:store_release:v1",
|
|
214
|
-
body: {
|
|
215
|
-
id: spec.id,
|
|
216
|
-
version: spec.version,
|
|
217
|
-
feature_units: spec.feature_units,
|
|
218
|
-
status: 'planning',
|
|
219
|
-
acceptance_criteria: spec.acceptance_criteria,
|
|
220
|
-
target_ship_date: spec.target_ship_date,
|
|
221
|
-
created_at: new Date().toISOString(),
|
|
222
|
-
updated_at: new Date().toISOString()
|
|
223
|
-
},
|
|
224
|
-
provenance: {
|
|
225
|
-
source_refs: [],
|
|
226
|
-
extracted_at: new Date().toISOString(),
|
|
227
|
-
extractor_version: "neotoma-mcp:v0.2.3"
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
console.log(`Release ${spec.id} created and stored in memory`);
|
|
232
|
-
}
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### Technical Decision Recording
|
|
236
|
-
|
|
237
|
-
**When**: Making architectural or technical decisions
|
|
238
|
-
|
|
239
|
-
```typescript
|
|
240
|
-
async function recordDecision(decision: string, rationale: string, context: any) {
|
|
241
|
-
await mcpClient.submit_agent_decision({
|
|
242
|
-
decision,
|
|
243
|
-
rationale,
|
|
244
|
-
context,
|
|
245
|
-
decision_type: 'technical',
|
|
246
|
-
timestamp: new Date().toISOString(),
|
|
247
|
-
agent_id: 'cursor-agent'
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
console.log(`Decision recorded: ${decision}`);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// Example usage
|
|
254
|
-
await recordDecision(
|
|
255
|
-
'Use Neotoma for all foundation agent memory',
|
|
256
|
-
'Unified memory system with entity resolution and timeline generation',
|
|
257
|
-
{
|
|
258
|
-
feature_unit: 'FU-061',
|
|
259
|
-
session_id: 'abc123',
|
|
260
|
-
task: 'Design agent memory system'
|
|
261
|
-
}
|
|
262
|
-
);
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
### Session History Recording
|
|
266
|
-
|
|
267
|
-
**When**: Session starts and ends
|
|
268
|
-
|
|
269
|
-
```typescript
|
|
270
|
-
async function startSession(sessionId: string) {
|
|
271
|
-
const session = {
|
|
272
|
-
session_id: sessionId,
|
|
273
|
-
actions: [],
|
|
274
|
-
checkpoints: [],
|
|
275
|
-
outcomes: [],
|
|
276
|
-
started_at: new Date().toISOString()
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
// Store session start (will be updated as session progresses)
|
|
280
|
-
// Note: This is typically done at session end with full history
|
|
281
|
-
|
|
282
|
-
return session;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
async function endSession(session: AgentSession) {
|
|
286
|
-
session.ended_at = new Date().toISOString();
|
|
287
|
-
session.duration = calculateDuration(session.started_at, session.ended_at);
|
|
288
|
-
|
|
289
|
-
// Store complete session
|
|
290
|
-
await mcpClient.submit_agent_session(session);
|
|
291
|
-
|
|
292
|
-
console.log(`Session ${session.session_id} completed (${session.duration}s)`);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
// Example usage
|
|
296
|
-
const session = await startSession('abc123');
|
|
297
|
-
|
|
298
|
-
// Track actions
|
|
299
|
-
session.actions.push({
|
|
300
|
-
type: 'create_feature_unit',
|
|
301
|
-
result: 'success',
|
|
302
|
-
details: { feature_unit_id: 'FU-061' },
|
|
303
|
-
timestamp: new Date().toISOString()
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
// Track checkpoints
|
|
307
|
-
session.checkpoints.push({
|
|
308
|
-
name: 'spec_complete',
|
|
309
|
-
state: { feature_unit_id: 'FU-061', status: 'planning' },
|
|
310
|
-
timestamp: new Date().toISOString()
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
// Track outcomes
|
|
314
|
-
session.outcomes.push({
|
|
315
|
-
type: 'feature_unit_created',
|
|
316
|
-
id: 'FU-061'
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
// End session
|
|
320
|
-
await endSession(session);
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
### Validation Result Recording
|
|
324
|
-
|
|
325
|
-
**When**: Running tests, linters, or validation scripts
|
|
326
|
-
|
|
327
|
-
```typescript
|
|
328
|
-
async function recordValidationResult(
|
|
329
|
-
validationType: string,
|
|
330
|
-
status: string,
|
|
331
|
-
details: any,
|
|
332
|
-
target: string
|
|
333
|
-
) {
|
|
334
|
-
await mcpClient.submit_payload({
|
|
335
|
-
capability_id: 'neotoma:submit_codebase_metadata:v1',
|
|
336
|
-
body: {
|
|
337
|
-
entity_type: 'validation_result',
|
|
338
|
-
data: {
|
|
339
|
-
validation_type: validationType,
|
|
340
|
-
status,
|
|
341
|
-
details,
|
|
342
|
-
target,
|
|
343
|
-
timestamp: new Date().toISOString()
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
console.log(`Validation result recorded: ${validationType} (${status})`);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
// Example usage after running tests
|
|
352
|
-
const testResult = runTests();
|
|
353
|
-
await recordValidationResult(
|
|
354
|
-
'test',
|
|
355
|
-
testResult.passed ? 'passed' : 'failed',
|
|
356
|
-
{
|
|
357
|
-
passed_count: testResult.passed_count,
|
|
358
|
-
failed_count: testResult.failed_count,
|
|
359
|
-
duration_ms: testResult.duration_ms
|
|
360
|
-
},
|
|
361
|
-
'FU-061'
|
|
362
|
-
);
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
## Memory Retrieval Patterns
|
|
366
|
-
|
|
367
|
-
### Querying Feature Units
|
|
368
|
-
|
|
369
|
-
```typescript
|
|
370
|
-
// Get all completed Feature Units
|
|
371
|
-
async function getCompletedFeatureUnits() {
|
|
372
|
-
const result = await mcpClient.retrieve_records({
|
|
373
|
-
type: 'feature_unit',
|
|
374
|
-
properties: { status: 'completed' },
|
|
375
|
-
limit: 100
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
return result.records.map(r => r.properties);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Get Feature Unit by ID
|
|
382
|
-
async function getFeatureUnit(id: string) {
|
|
383
|
-
const result = await mcpClient.retrieve_records({
|
|
384
|
-
type: 'feature_unit',
|
|
385
|
-
properties: { id },
|
|
386
|
-
limit: 1
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
return result.records.length > 0 ? result.records[0].properties : null;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
// Get Feature Units by dependencies
|
|
393
|
-
async function getFeatureUnitsByDependency(dependencyId: string) {
|
|
394
|
-
const result = await mcpClient.retrieve_records({
|
|
395
|
-
type: 'feature_unit',
|
|
396
|
-
search: [dependencyId],
|
|
397
|
-
search_mode: "keyword"
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
return result.entities.map(e => e.snapshot);
|
|
401
|
-
}
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
### Querying Releases
|
|
405
|
-
|
|
406
|
-
```typescript
|
|
407
|
-
// Get current release
|
|
408
|
-
async function getCurrentRelease() {
|
|
409
|
-
const result = await mcpClient.retrieve_records({
|
|
410
|
-
entity_type: 'release',
|
|
411
|
-
filters: { status: 'in_progress' },
|
|
412
|
-
order_by: 'created_at',
|
|
413
|
-
order: 'desc',
|
|
414
|
-
limit: 1
|
|
415
|
-
});
|
|
416
|
-
|
|
417
|
-
return result.entities.length > 0 ? result.entities[0].snapshot : null;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
// Get releases containing Feature Unit
|
|
421
|
-
async function getReleasesForFeatureUnit(featureUnitId: string) {
|
|
422
|
-
const result = await mcpClient.retrieve_records({
|
|
423
|
-
entity_type: 'release',
|
|
424
|
-
filters: {
|
|
425
|
-
feature_units: { contains: featureUnitId }
|
|
426
|
-
}
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
return result.entities.map(e => e.snapshot);
|
|
430
|
-
}
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
### Querying Agent Decisions
|
|
434
|
-
|
|
435
|
-
```typescript
|
|
436
|
-
// Get recent architectural decisions
|
|
437
|
-
async function getArchitecturalDecisions() {
|
|
438
|
-
const result = await mcpClient.retrieve_records({
|
|
439
|
-
entity_type: 'agent_decision',
|
|
440
|
-
filters: { decision_type: 'architectural' },
|
|
441
|
-
order_by: 'timestamp',
|
|
442
|
-
order: 'desc',
|
|
443
|
-
limit: 10
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
return result.entities.map(e => e.snapshot);
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
// Get decisions related to Feature Unit
|
|
450
|
-
async function getDecisionsForFeatureUnit(featureUnitId: string) {
|
|
451
|
-
const result = await mcpClient.retrieve_records({
|
|
452
|
-
entity_type: 'agent_decision',
|
|
453
|
-
filters: {
|
|
454
|
-
'context.feature_unit': featureUnitId
|
|
455
|
-
},
|
|
456
|
-
order_by: 'timestamp',
|
|
457
|
-
order: 'desc'
|
|
458
|
-
});
|
|
459
|
-
|
|
460
|
-
return result.entities.map(e => e.snapshot);
|
|
461
|
-
}
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
### Querying Session History
|
|
465
|
-
|
|
466
|
-
```typescript
|
|
467
|
-
// Get recent sessions
|
|
468
|
-
async function getRecentSessions(limit: number = 5) {
|
|
469
|
-
const result = await mcpClient.retrieve_records({
|
|
470
|
-
type: "agent_session",
|
|
471
|
-
limit,
|
|
472
|
-
order_by: 'started_at',
|
|
473
|
-
order: 'desc'
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
return result.sessions.map(s => s.snapshot);
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
// Get specific session
|
|
480
|
-
async function getSession(sessionId: string) {
|
|
481
|
-
const result = await mcpClient.retrieve_records({
|
|
482
|
-
type: "agent_session",
|
|
483
|
-
session_id: sessionId
|
|
484
|
-
});
|
|
485
|
-
|
|
486
|
-
return result.sessions.length > 0 ? result.sessions[0].snapshot : null;
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
// Restore previous session checkpoint
|
|
490
|
-
async function restorePreviousCheckpoint() {
|
|
491
|
-
const sessions = await getRecentSessions(1);
|
|
492
|
-
|
|
493
|
-
if (sessions.length > 0) {
|
|
494
|
-
const lastSession = sessions[0];
|
|
495
|
-
const lastCheckpoint = lastSession.checkpoints[lastSession.checkpoints.length - 1];
|
|
496
|
-
|
|
497
|
-
if (lastCheckpoint) {
|
|
498
|
-
console.log(`Restoring checkpoint: ${lastCheckpoint.name}`);
|
|
499
|
-
return lastCheckpoint.state;
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
return null;
|
|
504
|
-
}
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
### Querying Entity Timeline
|
|
508
|
-
|
|
509
|
-
```typescript
|
|
510
|
-
// Get Feature Unit timeline
|
|
511
|
-
async function getFeatureUnitTimeline(featureUnitId: string) {
|
|
512
|
-
const result = await mcpClient.query_entity_timeline({
|
|
513
|
-
entity_id: featureUnitId,
|
|
514
|
-
start_date: '2025-01-01',
|
|
515
|
-
end_date: new Date().toISOString().split('T')[0]
|
|
516
|
-
});
|
|
517
|
-
|
|
518
|
-
return result.events;
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
// Print timeline
|
|
522
|
-
async function printFeatureUnitHistory(featureUnitId: string) {
|
|
523
|
-
const events = await getFeatureUnitTimeline(featureUnitId);
|
|
524
|
-
|
|
525
|
-
console.log(`\n=== Feature Unit ${featureUnitId} Timeline ===\n`);
|
|
526
|
-
|
|
527
|
-
for (const event of events) {
|
|
528
|
-
console.log(`${event.timestamp}: ${event.description}`);
|
|
529
|
-
if (event.details) {
|
|
530
|
-
console.log(` Details: ${JSON.stringify(event.details)}`);
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
```
|
|
535
|
-
|
|
536
|
-
## Cross-Session Continuity
|
|
537
|
-
|
|
538
|
-
### Session Restoration
|
|
539
|
-
|
|
540
|
-
```typescript
|
|
541
|
-
async function continueFromPreviousSession() {
|
|
542
|
-
console.log('Checking for previous session...');
|
|
543
|
-
|
|
544
|
-
// Get last session
|
|
545
|
-
const sessions = await getRecentSessions(1);
|
|
546
|
-
|
|
547
|
-
if (sessions.length === 0) {
|
|
548
|
-
console.log('No previous session found, starting fresh');
|
|
549
|
-
return null;
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
const lastSession = sessions[0];
|
|
553
|
-
console.log(`Found previous session: ${lastSession.session_id}`);
|
|
554
|
-
console.log(`Last action: ${lastSession.actions[lastSession.actions.length - 1]?.type}`);
|
|
555
|
-
|
|
556
|
-
// Check if session has checkpoints
|
|
557
|
-
if (lastSession.checkpoints.length > 0) {
|
|
558
|
-
const lastCheckpoint = lastSession.checkpoints[lastSession.checkpoints.length - 1];
|
|
559
|
-
console.log(`Last checkpoint: ${lastCheckpoint.name}`);
|
|
560
|
-
|
|
561
|
-
// Restore checkpoint state
|
|
562
|
-
return lastCheckpoint.state;
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
return null;
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
// Example usage in agent startup
|
|
569
|
-
const restoredState = await continueFromPreviousSession();
|
|
570
|
-
|
|
571
|
-
if (restoredState) {
|
|
572
|
-
console.log('Restored state:', restoredState);
|
|
573
|
-
// Continue work from checkpoint
|
|
574
|
-
} else {
|
|
575
|
-
console.log('Starting new work');
|
|
576
|
-
// Start fresh
|
|
577
|
-
}
|
|
578
|
-
```
|
|
579
|
-
|
|
580
|
-
### Context Loading
|
|
581
|
-
|
|
582
|
-
```typescript
|
|
583
|
-
async function loadWorkContext(featureUnitId: string) {
|
|
584
|
-
console.log(`Loading context for Feature Unit ${featureUnitId}...`);
|
|
585
|
-
|
|
586
|
-
// Load Feature Unit
|
|
587
|
-
const featureUnit = await getFeatureUnit(featureUnitId);
|
|
588
|
-
|
|
589
|
-
if (!featureUnit) {
|
|
590
|
-
console.log(`Feature Unit ${featureUnitId} not found`);
|
|
591
|
-
return null;
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
// Load related decisions
|
|
595
|
-
const decisions = await getDecisionsForFeatureUnit(featureUnitId);
|
|
596
|
-
|
|
597
|
-
// Load validation history
|
|
598
|
-
const validations = await mcpClient.query_codebase_entities({
|
|
599
|
-
entity_type: 'validation_result',
|
|
600
|
-
filters: { target: featureUnitId },
|
|
601
|
-
order_by: 'timestamp',
|
|
602
|
-
order: 'desc',
|
|
603
|
-
limit: 5
|
|
604
|
-
});
|
|
605
|
-
|
|
606
|
-
// Load timeline
|
|
607
|
-
const timeline = await getFeatureUnitTimeline(featureUnitId);
|
|
608
|
-
|
|
609
|
-
return {
|
|
610
|
-
feature_unit: featureUnit,
|
|
611
|
-
decisions: decisions.map(d => ({
|
|
612
|
-
decision: d.decision,
|
|
613
|
-
rationale: d.rationale,
|
|
614
|
-
timestamp: d.timestamp
|
|
615
|
-
})),
|
|
616
|
-
validations: validations.entities.map(v => ({
|
|
617
|
-
type: v.snapshot.validation_type,
|
|
618
|
-
status: v.snapshot.status,
|
|
619
|
-
timestamp: v.snapshot.timestamp
|
|
620
|
-
})),
|
|
621
|
-
timeline: timeline.map(e => ({
|
|
622
|
-
timestamp: e.timestamp,
|
|
623
|
-
description: e.description
|
|
624
|
-
}))
|
|
625
|
-
};
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
// Example usage
|
|
629
|
-
const context = await loadWorkContext('FU-061');
|
|
630
|
-
console.log('Loaded context:', context);
|
|
631
|
-
```
|
|
632
|
-
|
|
633
|
-
## Context Degradation Management
|
|
634
|
-
|
|
635
|
-
**Agent Skills Reference**: [context-degradation](https://github.com/muratcankoylan/Agent-Skills-for-Context-Engineering/blob/main/skills/context-degradation) skill
|
|
636
|
-
|
|
637
|
-
### Problem: Lost-in-the-Middle and Attention Scarcity
|
|
638
|
-
|
|
639
|
-
As agent sessions grow longer and context windows fill up, information in the middle of the context can be lost due to:
|
|
640
|
-
- **Lost-in-the-middle phenomenon**: LLMs pay less attention to content in the middle of long contexts (U-shaped attention curve)
|
|
641
|
-
- **U-shaped attention curves**: Attention is highest at the beginning and end, lower in the middle
|
|
642
|
-
- **Attention scarcity**: Context windows are limited by attention mechanics, not just token capacity
|
|
643
|
-
|
|
644
|
-
### Solution: Query-Based Memory Instead of Context Loading
|
|
645
|
-
|
|
646
|
-
Neotoma addresses context degradation by providing **persistent, queryable memory** outside the context window:
|
|
647
|
-
|
|
648
|
-
**Traditional Approach (Context Degradation Risk):**
|
|
649
|
-
```typescript
|
|
650
|
-
// BAD: Load all Feature Units into context
|
|
651
|
-
const allFeatureUnits = loadAllFeatureUnitsFromMemory();
|
|
652
|
-
// Context window fills up, middle content gets lost
|
|
653
|
-
```
|
|
654
|
-
|
|
655
|
-
**Neotoma Approach (No Context Degradation):**
|
|
656
|
-
```typescript
|
|
657
|
-
// GOOD: Query only what's needed
|
|
658
|
-
const featureUnit = await mcpClient.query_codebase_entities({
|
|
659
|
-
entity_type: 'feature_unit',
|
|
660
|
-
filters: { id: 'FU-061' },
|
|
661
|
-
limit: 1
|
|
662
|
-
});
|
|
663
|
-
// Only relevant entity loaded, context window preserved
|
|
664
|
-
```
|
|
665
|
-
|
|
666
|
-
### Benefits
|
|
667
|
-
|
|
668
|
-
1. **Selective Loading**: Agents query only relevant entities, not entire memory
|
|
669
|
-
2. **No Context Window Limits**: Memory persists outside context, unlimited size
|
|
670
|
-
3. **Targeted Queries**: Filter by entity type, status, relationships, timestamps
|
|
671
|
-
4. **Progressive Disclosure**: Load foundation → load specific → load related
|
|
672
|
-
5. **Timeline Queries**: Get chronological events without loading all history
|
|
673
|
-
|
|
674
|
-
### Patterns for Context Optimization
|
|
675
|
-
|
|
676
|
-
**Agent Skills Principle**: Curate the smallest possible set of **high-signal tokens** that maximize desired outcomes.
|
|
677
|
-
|
|
678
|
-
#### Pattern 1: Query on Demand
|
|
679
|
-
|
|
680
|
-
```typescript
|
|
681
|
-
// Instead of loading all Feature Units
|
|
682
|
-
async function getFeatureUnitContext(id: string) {
|
|
683
|
-
// Query only the specific Feature Unit
|
|
684
|
-
const result = await mcpClient.retrieve_records({
|
|
685
|
-
entity_type: 'feature_unit',
|
|
686
|
-
filters: { id },
|
|
687
|
-
limit: 1
|
|
688
|
-
});
|
|
689
|
-
|
|
690
|
-
// Query related entities only if needed
|
|
691
|
-
if (result.entities.length > 0) {
|
|
692
|
-
const fu = result.entities[0].snapshot;
|
|
693
|
-
|
|
694
|
-
// Query related decisions only if needed
|
|
695
|
-
const decisions = await mcpClient.query_codebase_entities({
|
|
696
|
-
entity_type: 'agent_decision',
|
|
697
|
-
filters: { 'context.feature_unit': id },
|
|
698
|
-
limit: 5 // Limit to recent decisions
|
|
699
|
-
});
|
|
700
|
-
|
|
701
|
-
return {
|
|
702
|
-
feature_unit: fu,
|
|
703
|
-
recent_decisions: decisions.entities.map(e => e.snapshot)
|
|
704
|
-
};
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
return null;
|
|
708
|
-
}
|
|
709
|
-
```
|
|
710
|
-
|
|
711
|
-
#### Pattern 2: Progressive Disclosure
|
|
712
|
-
|
|
713
|
-
```typescript
|
|
714
|
-
// Load foundation first, then specific, then related
|
|
715
|
-
async function loadWorkContext(featureUnitId: string) {
|
|
716
|
-
// Phase 1: Load foundation (Feature Unit)
|
|
717
|
-
const featureUnit = await getFeatureUnit(featureUnitId);
|
|
718
|
-
|
|
719
|
-
// Phase 2: Load specific (recent decisions)
|
|
720
|
-
const decisions = await getDecisionsForFeatureUnit(featureUnitId, { limit: 3 });
|
|
721
|
-
|
|
722
|
-
// Phase 3: Load related (validation results)
|
|
723
|
-
const validations = await getValidationsForFeatureUnit(featureUnitId, { limit: 2 });
|
|
724
|
-
|
|
725
|
-
// Only load what's needed, when needed
|
|
726
|
-
return { featureUnit, decisions, validations };
|
|
727
|
-
}
|
|
728
|
-
```
|
|
729
|
-
|
|
730
|
-
#### Pattern 3: Timeline Queries Instead of Full History
|
|
731
|
-
|
|
732
|
-
```typescript
|
|
733
|
-
// Instead of loading all events
|
|
734
|
-
async function getRecentTimeline(entityId: string, days: number = 7) {
|
|
735
|
-
const endDate = new Date();
|
|
736
|
-
const startDate = new Date();
|
|
737
|
-
startDate.setDate(startDate.getDate() - days);
|
|
738
|
-
|
|
739
|
-
// Query only recent timeline events
|
|
740
|
-
const timeline = await mcpClient.list_timeline_events({
|
|
741
|
-
entity_id: entityId,
|
|
742
|
-
start_date: startDate.toISOString().split('T')[0],
|
|
743
|
-
end_date: endDate.toISOString().split('T')[0]
|
|
744
|
-
});
|
|
745
|
-
|
|
746
|
-
// Return only recent events (not full history)
|
|
747
|
-
return timeline.events.slice(-10); // Last 10 events
|
|
748
|
-
}
|
|
749
|
-
```
|
|
750
|
-
|
|
751
|
-
#### Pattern 4: Filtered Queries
|
|
752
|
-
|
|
753
|
-
```typescript
|
|
754
|
-
// Query only completed Feature Units
|
|
755
|
-
const completedFUs = await mcpClient.query_codebase_entities({
|
|
756
|
-
entity_type: 'feature_unit',
|
|
757
|
-
filters: { status: 'completed' },
|
|
758
|
-
limit: 5, // Limit results
|
|
759
|
-
order_by: 'updated_at',
|
|
760
|
-
order: 'desc'
|
|
761
|
-
});
|
|
762
|
-
|
|
763
|
-
// Query only architectural decisions
|
|
764
|
-
const archDecisions = await mcpClient.query_codebase_entities({
|
|
765
|
-
entity_type: 'architectural_decision',
|
|
766
|
-
filters: {
|
|
767
|
-
status: 'accepted',
|
|
768
|
-
decision: { contains: 'storage' } // Filter by keyword
|
|
769
|
-
},
|
|
770
|
-
limit: 3
|
|
771
|
-
});
|
|
772
|
-
```
|
|
773
|
-
|
|
774
|
-
### Context Budget Management
|
|
775
|
-
|
|
776
|
-
**Agent Skills Principle**: Attention budget must be allocated across all context to prevent attention scarcity.
|
|
777
|
-
|
|
778
|
-
**Recommended Context Budget Allocation:**
|
|
779
|
-
|
|
780
|
-
1. **Foundation Context (20%)**: Core Feature Unit or Release being worked on (high-signal foundation)
|
|
781
|
-
2. **Related Context (30%)**: Recent decisions, validations, related entities (high-signal context)
|
|
782
|
-
3. **Task Context (40%)**: Current task instructions, code, files (current work)
|
|
783
|
-
4. **Reserve (10%)**: Buffer for new information and tool outputs
|
|
784
|
-
|
|
785
|
-
**Example:**
|
|
786
|
-
```typescript
|
|
787
|
-
async function optimizeContextForTask(featureUnitId: string) {
|
|
788
|
-
// 20%: Foundation
|
|
789
|
-
const featureUnit = await getFeatureUnit(featureUnitId);
|
|
790
|
-
|
|
791
|
-
// 30%: Related (limited to recent)
|
|
792
|
-
const recentDecisions = await getDecisionsForFeatureUnit(featureUnitId, { limit: 2 });
|
|
793
|
-
const recentValidations = await getValidationsForFeatureUnit(featureUnitId, { limit: 1 });
|
|
794
|
-
|
|
795
|
-
// 40%: Task context (provided by agent)
|
|
796
|
-
// 10%: Reserve
|
|
797
|
-
|
|
798
|
-
return {
|
|
799
|
-
foundation: featureUnit,
|
|
800
|
-
related: { decisions: recentDecisions, validations: recentValidations }
|
|
801
|
-
};
|
|
802
|
-
}
|
|
803
|
-
```
|
|
804
|
-
|
|
805
|
-
### Avoiding Context Degradation
|
|
806
|
-
|
|
807
|
-
**DO:**
|
|
808
|
-
- ✅ Query specific entities by ID
|
|
809
|
-
- ✅ Use filters to narrow results
|
|
810
|
-
- ✅ Limit query results (use `limit` parameter)
|
|
811
|
-
- ✅ Query on demand, not pre-load everything
|
|
812
|
-
- ✅ Use timeline queries for recent events only
|
|
813
|
-
- ✅ Progressive disclosure (load foundation → specific → related)
|
|
814
|
-
|
|
815
|
-
**DON'T:**
|
|
816
|
-
- ❌ Load all Feature Units into context
|
|
817
|
-
- ❌ Query without filters
|
|
818
|
-
- ❌ Load full history when only recent events needed
|
|
819
|
-
- ❌ Pre-load all related entities
|
|
820
|
-
- ❌ Include entire memory in context
|
|
821
|
-
|
|
822
|
-
### Additional Context Degradation Types
|
|
823
|
-
|
|
824
|
-
Beyond lost-in-the-middle, context degradation includes:
|
|
825
|
-
|
|
826
|
-
#### Context Poisoning
|
|
827
|
-
|
|
828
|
-
**Problem**: Irrelevant or incorrect information corrupts agent reasoning
|
|
829
|
-
|
|
830
|
-
**Example**:
|
|
831
|
-
```typescript
|
|
832
|
-
// Bad: Loading unrelated entities
|
|
833
|
-
const context = {
|
|
834
|
-
currentTask: await getFeatureUnit('FU-061'),
|
|
835
|
-
allFeatureUnits: await getAllFeatureUnits(), // 50 unrelated FUs
|
|
836
|
-
allDecisions: await getAllDecisions() // 100 unrelated decisions
|
|
837
|
-
};
|
|
838
|
-
// Agent confused by irrelevant information
|
|
839
|
-
```
|
|
840
|
-
|
|
841
|
-
**Solution**: Query only directly related entities
|
|
842
|
-
```typescript
|
|
843
|
-
// Good: Load only related entities
|
|
844
|
-
const context = {
|
|
845
|
-
currentTask: await getFeatureUnit('FU-061'),
|
|
846
|
-
relatedDecisions: await getDecisionsForFeatureUnit('FU-061', 3),
|
|
847
|
-
dependencies: await getFeatureUnitsByIds(currentTask.dependencies)
|
|
848
|
-
};
|
|
849
|
-
// Only relevant information, no poisoning
|
|
850
|
-
```
|
|
851
|
-
|
|
852
|
-
#### Context Distraction
|
|
853
|
-
|
|
854
|
-
**Problem**: Relevant but not immediately necessary information distracts from current task
|
|
855
|
-
|
|
856
|
-
**Example**:
|
|
857
|
-
```typescript
|
|
858
|
-
// Bad: Loading full history when only current state needed
|
|
859
|
-
const context = {
|
|
860
|
-
featureUnit: await getFeatureUnit('FU-061'),
|
|
861
|
-
fullTimeline: await getFullTimeline('FU-061'), // 100 events
|
|
862
|
-
allValidations: await getAllValidations('FU-061') // 20 validation runs
|
|
863
|
-
};
|
|
864
|
-
// Agent distracted by historical details
|
|
865
|
-
```
|
|
866
|
-
|
|
867
|
-
**Solution**: Load current state, query history on demand
|
|
868
|
-
```typescript
|
|
869
|
-
// Good: Load current state only
|
|
870
|
-
const context = {
|
|
871
|
-
featureUnit: await getFeatureUnit('FU-061'), // Current state only
|
|
872
|
-
recentEvents: await getRecentTimeline('FU-061', 7) // Last 7 days
|
|
873
|
-
};
|
|
874
|
-
// Focused on current task, history available if needed
|
|
875
|
-
```
|
|
876
|
-
|
|
877
|
-
#### Context Clash
|
|
878
|
-
|
|
879
|
-
**Problem**: Conflicting information in context (e.g., old status vs. new status)
|
|
880
|
-
|
|
881
|
-
**Example**:
|
|
882
|
-
```typescript
|
|
883
|
-
// Bad: Loading both old and new versions
|
|
884
|
-
const context = {
|
|
885
|
-
featureUnit: await getFeatureUnit('FU-061'), // Current: status = 'completed'
|
|
886
|
-
oldSnapshot: historicalSnapshots['FU-061'], // Old: status = 'planning'
|
|
887
|
-
timeline: await getTimeline('FU-061') // Shows both statuses
|
|
888
|
-
};
|
|
889
|
-
// Agent confused by conflicting statuses
|
|
890
|
-
```
|
|
891
|
-
|
|
892
|
-
**Solution**: Use snapshots (current state), query timeline only when needed
|
|
893
|
-
```typescript
|
|
894
|
-
// Good: Load current snapshot only
|
|
895
|
-
const context = {
|
|
896
|
-
featureUnit: await getFeatureUnit('FU-061') // Current snapshot (completed)
|
|
897
|
-
};
|
|
898
|
-
// Single source of truth, no conflicting information
|
|
899
|
-
|
|
900
|
-
// If history needed, query explicitly
|
|
901
|
-
if (needHistory) {
|
|
902
|
-
const timeline = await getTimeline('FU-061');
|
|
903
|
-
// Timeline shows progression, not conflicting states
|
|
904
|
-
}
|
|
905
|
-
```
|
|
906
|
-
|
|
907
|
-
### Preventing Context Degradation
|
|
908
|
-
|
|
909
|
-
| Degradation Type | Prevention Strategy | Neotoma Mechanism |
|
|
910
|
-
|------------------|---------------------|-------------------|
|
|
911
|
-
| Lost-in-the-middle | Query-based loading | Load only relevant entities via filtered queries |
|
|
912
|
-
| Context poisoning | Filtered queries | Use `filters` parameter to exclude irrelevant entities |
|
|
913
|
-
| Context distraction | Current state focus | Use snapshots (current state) instead of full history |
|
|
914
|
-
| Context clash | Single source of truth | Snapshots provide current state, timeline shows progression |
|
|
915
|
-
| Attention scarcity | Context budget | 20/30/40/10 allocation prevents overload |
|
|
916
|
-
|
|
917
|
-
### Comparison: With vs. Without Neotoma
|
|
918
|
-
|
|
919
|
-
**Without Neotoma (Context Degradation Risk):**
|
|
920
|
-
```typescript
|
|
921
|
-
// Load all memory into context
|
|
922
|
-
const allMemory = {
|
|
923
|
-
featureUnits: loadAllFeatureUnits(), // 50+ entities
|
|
924
|
-
releases: loadAllReleases(), // 20+ entities
|
|
925
|
-
decisions: loadAllDecisions(), // 100+ entities
|
|
926
|
-
sessions: loadAllSessions() // 200+ entities
|
|
927
|
-
};
|
|
928
|
-
// Context window: 200K tokens
|
|
929
|
-
// Risk: Lost-in-the-middle, attention degradation, poisoning, distraction, clash
|
|
930
|
-
```
|
|
931
|
-
|
|
932
|
-
**With Neotoma (No Context Degradation):**
|
|
933
|
-
```typescript
|
|
934
|
-
// Query only what's needed
|
|
935
|
-
const currentFU = await queryFeatureUnit('FU-061'); // 1 entity (current state)
|
|
936
|
-
const recentDecisions = await queryDecisions('FU-061', 3); // 3 related entities
|
|
937
|
-
const timeline = await queryTimeline('FU-061', 7); // 10 recent events
|
|
938
|
-
// Context window: 5K tokens
|
|
939
|
-
// Benefit: No degradation, focused attention, no poisoning/distraction/clash
|
|
940
|
-
```
|
|
941
|
-
|
|
942
|
-
## Context Compression
|
|
943
|
-
|
|
944
|
-
**Agent Skills Reference**: [context-compression](https://github.com/muratcankoylan/Agent-Skills-for-Context-Engineering/blob/main/skills/context-compression) skill
|
|
945
|
-
|
|
946
|
-
### Problem: Token Usage and Information Density
|
|
947
|
-
|
|
948
|
-
As agent sessions grow longer, context windows fill with:
|
|
949
|
-
- **Redundant information**: Same entities referenced multiple times
|
|
950
|
-
- **Full history**: All observations instead of current state
|
|
951
|
-
- **Duplicate data**: Multiple representations of same facts
|
|
952
|
-
- **Verbose context**: Unnecessary details for current task
|
|
953
|
-
|
|
954
|
-
Context compression reduces token usage while preserving information density through summarization, deduplication, and progressive disclosure.
|
|
955
|
-
|
|
956
|
-
### Solution: Compression Through Entity Resolution and Snapshots
|
|
957
|
-
|
|
958
|
-
Neotoma compresses context through multiple mechanisms:
|
|
959
|
-
|
|
960
|
-
1. **Entity Resolution (Deduplication)**: Multiple observations about same entity resolve to single entity
|
|
961
|
-
2. **Snapshot Compression**: Current state instead of full observation history
|
|
962
|
-
3. **Timeline Summarization**: Recent events only, not full history
|
|
963
|
-
4. **Selective Loading**: Query only relevant entities, not entire memory
|
|
964
|
-
5. **Checkpoint Restoration**: Restore compressed state instead of full history
|
|
965
|
-
|
|
966
|
-
### Compression Mechanisms
|
|
967
|
-
|
|
968
|
-
#### 1. Entity Resolution (Automatic Deduplication)
|
|
969
|
-
|
|
970
|
-
**Problem**: Same entity referenced multiple times in context
|
|
971
|
-
```typescript
|
|
972
|
-
// Without compression: Multiple references
|
|
973
|
-
const context = {
|
|
974
|
-
featureUnit1: { id: 'FU-061', status: 'completed' },
|
|
975
|
-
featureUnit2: { id: 'FU-061', status: 'completed' }, // Duplicate
|
|
976
|
-
featureUnit3: { id: 'FU-061', status: 'completed' } // Duplicate
|
|
977
|
-
};
|
|
978
|
-
// 3x token usage for same entity
|
|
979
|
-
```
|
|
980
|
-
|
|
981
|
-
**Solution**: Entity resolution unifies duplicates
|
|
982
|
-
```typescript
|
|
983
|
-
// With Neotoma: Single resolved entity
|
|
984
|
-
const featureUnit = await mcpClient.query_codebase_entities({
|
|
985
|
-
entity_type: 'feature_unit',
|
|
986
|
-
filters: { id: 'FU-061' },
|
|
987
|
-
limit: 1
|
|
988
|
-
});
|
|
989
|
-
// 1x token usage, entity resolution handles duplicates
|
|
990
|
-
```
|
|
991
|
-
|
|
992
|
-
**Compression Ratio**: 3:1 (3 references → 1 entity)
|
|
993
|
-
|
|
994
|
-
#### 2. Snapshot Compression (Current State vs. Full History)
|
|
995
|
-
|
|
996
|
-
**Problem**: Full observation history is verbose
|
|
997
|
-
```typescript
|
|
998
|
-
// Without compression: Full history
|
|
999
|
-
const featureUnitHistory = {
|
|
1000
|
-
observations: [
|
|
1001
|
-
{ timestamp: '2025-12-01', status: 'planning' },
|
|
1002
|
-
{ timestamp: '2025-12-05', status: 'in_progress' },
|
|
1003
|
-
{ timestamp: '2025-12-10', status: 'in_progress' },
|
|
1004
|
-
{ timestamp: '2025-12-15', status: 'completed' },
|
|
1005
|
-
{ timestamp: '2025-12-20', status: 'deployed' }
|
|
1006
|
-
]
|
|
1007
|
-
};
|
|
1008
|
-
// 5 observations, ~500 tokens
|
|
1009
|
-
```
|
|
1010
|
-
|
|
1011
|
-
**Solution**: Snapshot provides current state only
|
|
1012
|
-
```typescript
|
|
1013
|
-
// With Neotoma: Current snapshot
|
|
1014
|
-
const featureUnit = await mcpClient.query_codebase_entities({
|
|
1015
|
-
entity_type: 'feature_unit',
|
|
1016
|
-
filters: { id: 'FU-061' }
|
|
1017
|
-
});
|
|
1018
|
-
|
|
1019
|
-
const snapshot = featureUnit.entities[0].snapshot;
|
|
1020
|
-
// { id: 'FU-061', status: 'deployed', ... }
|
|
1021
|
-
// 1 snapshot, ~100 tokens
|
|
1022
|
-
```
|
|
1023
|
-
|
|
1024
|
-
**Compression Ratio**: 5:1 (5 observations → 1 snapshot)
|
|
1025
|
-
|
|
1026
|
-
#### 3. Timeline Summarization (Recent Events Only)
|
|
1027
|
-
|
|
1028
|
-
**Problem**: Full timeline history is large
|
|
1029
|
-
```typescript
|
|
1030
|
-
// Without compression: Full timeline
|
|
1031
|
-
const fullTimeline = {
|
|
1032
|
-
events: [
|
|
1033
|
-
{ date: '2025-01-01', event: 'Created' },
|
|
1034
|
-
{ date: '2025-02-01', event: 'Updated' },
|
|
1035
|
-
// ... 100 more events
|
|
1036
|
-
{ date: '2025-12-31', event: 'Deployed' }
|
|
1037
|
-
]
|
|
1038
|
-
};
|
|
1039
|
-
// 102 events, ~10K tokens
|
|
1040
|
-
```
|
|
1041
|
-
|
|
1042
|
-
**Solution**: Query recent events only
|
|
1043
|
-
```typescript
|
|
1044
|
-
// With Neotoma: Recent timeline
|
|
1045
|
-
const recentTimeline = await mcpClient.query_entity_timeline({
|
|
1046
|
-
entity_id: 'FU-061',
|
|
1047
|
-
start_date: '2025-12-01', // Last 30 days only
|
|
1048
|
-
end_date: '2025-12-31'
|
|
1049
|
-
});
|
|
1050
|
-
// 5 events, ~500 tokens
|
|
1051
|
-
```
|
|
1052
|
-
|
|
1053
|
-
**Compression Ratio**: 20:1 (102 events → 5 recent events)
|
|
1054
|
-
|
|
1055
|
-
#### 4. Selective Loading (Query-Based Compression)
|
|
1056
|
-
|
|
1057
|
-
**Problem**: Loading all entities fills context
|
|
1058
|
-
```typescript
|
|
1059
|
-
// Without compression: Load everything
|
|
1060
|
-
const allMemory = {
|
|
1061
|
-
featureUnits: loadAllFeatureUnits(), // 50 entities
|
|
1062
|
-
releases: loadAllReleases(), // 20 entities
|
|
1063
|
-
decisions: loadAllDecisions(), // 100 entities
|
|
1064
|
-
sessions: loadAllSessions() // 200 entities
|
|
1065
|
-
};
|
|
1066
|
-
// 370 entities, ~200K tokens
|
|
1067
|
-
```
|
|
1068
|
-
|
|
1069
|
-
**Solution**: Query only what's needed
|
|
1070
|
-
```typescript
|
|
1071
|
-
// With Neotoma: Selective loading
|
|
1072
|
-
const currentFU = await queryFeatureUnit('FU-061'); // 1 entity
|
|
1073
|
-
const relatedDecisions = await queryDecisions('FU-061', 3); // 3 entities
|
|
1074
|
-
// 4 entities, ~2K tokens
|
|
1075
|
-
```
|
|
1076
|
-
|
|
1077
|
-
**Compression Ratio**: 92:1 (370 entities → 4 relevant entities)
|
|
1078
|
-
|
|
1079
|
-
#### 5. Checkpoint Restoration (Compressed State)
|
|
1080
|
-
|
|
1081
|
-
**Problem**: Restoring full session history is verbose
|
|
1082
|
-
```typescript
|
|
1083
|
-
// Without compression: Full session history
|
|
1084
|
-
const sessionHistory = {
|
|
1085
|
-
session_id: 'abc123',
|
|
1086
|
-
actions: [
|
|
1087
|
-
{ type: 'create_feature_unit', result: 'success', ... },
|
|
1088
|
-
{ type: 'run_tests', result: 'passed', ... },
|
|
1089
|
-
// ... 50 more actions
|
|
1090
|
-
],
|
|
1091
|
-
checkpoints: [
|
|
1092
|
-
{ name: 'spec_complete', state: { ...full_state... } },
|
|
1093
|
-
{ name: 'tests_passing', state: { ...full_state... } },
|
|
1094
|
-
// ... 10 more checkpoints
|
|
1095
|
-
]
|
|
1096
|
-
};
|
|
1097
|
-
// Full history, ~50K tokens
|
|
1098
|
-
```
|
|
1099
|
-
|
|
1100
|
-
**Solution**: Restore from checkpoint (compressed state)
|
|
1101
|
-
```typescript
|
|
1102
|
-
// With Neotoma: Checkpoint restoration
|
|
1103
|
-
const session = await mcpClient.query_agent_history({
|
|
1104
|
-
session_id: 'abc123'
|
|
1105
|
-
});
|
|
1106
|
-
|
|
1107
|
-
const lastCheckpoint = session.sessions[0].snapshot.checkpoints[
|
|
1108
|
-
session.sessions[0].snapshot.checkpoints.length - 1
|
|
1109
|
-
];
|
|
1110
|
-
|
|
1111
|
-
// Restore compressed checkpoint state
|
|
1112
|
-
const restoredState = lastCheckpoint.state;
|
|
1113
|
-
// Compressed state, ~2K tokens
|
|
1114
|
-
```
|
|
1115
|
-
|
|
1116
|
-
**Compression Ratio**: 25:1 (50K tokens → 2K tokens)
|
|
1117
|
-
|
|
1118
|
-
### Compression Patterns
|
|
1119
|
-
|
|
1120
|
-
#### Pattern 1: Entity-Based Compression
|
|
1121
|
-
|
|
1122
|
-
```typescript
|
|
1123
|
-
// Compress by querying single entity instead of multiple references
|
|
1124
|
-
async function getCompressedFeatureUnitContext(id: string) {
|
|
1125
|
-
// Single query returns resolved entity (deduplicated)
|
|
1126
|
-
const result = await mcpClient.retrieve_records({
|
|
1127
|
-
entity_type: 'feature_unit',
|
|
1128
|
-
filters: { id },
|
|
1129
|
-
limit: 1
|
|
1130
|
-
});
|
|
1131
|
-
|
|
1132
|
-
// Snapshot provides current state (compressed from full history)
|
|
1133
|
-
return result.entities[0].snapshot;
|
|
1134
|
-
}
|
|
1135
|
-
```
|
|
1136
|
-
|
|
1137
|
-
#### Pattern 2: Timeline Compression
|
|
1138
|
-
|
|
1139
|
-
```typescript
|
|
1140
|
-
// Compress timeline to recent events only
|
|
1141
|
-
async function getCompressedTimeline(entityId: string, days: number = 7) {
|
|
1142
|
-
const endDate = new Date();
|
|
1143
|
-
const startDate = new Date();
|
|
1144
|
-
startDate.setDate(startDate.getDate() - days);
|
|
1145
|
-
|
|
1146
|
-
// Query only recent events (compressed from full history)
|
|
1147
|
-
const timeline = await mcpClient.list_timeline_events({
|
|
1148
|
-
entity_id: entityId,
|
|
1149
|
-
start_date: startDate.toISOString().split('T')[0],
|
|
1150
|
-
end_date: endDate.toISOString().split('T')[0]
|
|
1151
|
-
});
|
|
1152
|
-
|
|
1153
|
-
// Return only last N events (further compression)
|
|
1154
|
-
return timeline.events.slice(-10);
|
|
1155
|
-
}
|
|
1156
|
-
```
|
|
1157
|
-
|
|
1158
|
-
#### Pattern 3: Relationship Compression
|
|
1159
|
-
|
|
1160
|
-
```typescript
|
|
1161
|
-
// Compress by querying relationships instead of loading all entities
|
|
1162
|
-
async function getCompressedRelationships(featureUnitId: string) {
|
|
1163
|
-
// Query only related entities (compressed from all entities)
|
|
1164
|
-
const relatedDecisions = await mcpClient.query_codebase_entities({
|
|
1165
|
-
entity_type: 'agent_decision',
|
|
1166
|
-
filters: { 'context.feature_unit': featureUnitId },
|
|
1167
|
-
limit: 3 // Limit to recent (compression)
|
|
1168
|
-
});
|
|
1169
|
-
|
|
1170
|
-
// Return only essential relationship data
|
|
1171
|
-
return relatedDecisions.entities.map(e => ({
|
|
1172
|
-
decision: e.snapshot.decision,
|
|
1173
|
-
timestamp: e.snapshot.timestamp
|
|
1174
|
-
// Compressed: only essential fields, not full snapshot
|
|
1175
|
-
}));
|
|
1176
|
-
}
|
|
1177
|
-
```
|
|
1178
|
-
|
|
1179
|
-
#### Pattern 4: Checkpoint Compression
|
|
1180
|
-
|
|
1181
|
-
```typescript
|
|
1182
|
-
// Compress session restoration via checkpoints
|
|
1183
|
-
async function restoreCompressedCheckpoint(sessionId: string, checkpointName: string) {
|
|
1184
|
-
const session = await mcpClient.query_agent_history({
|
|
1185
|
-
session_id: sessionId
|
|
1186
|
-
});
|
|
1187
|
-
|
|
1188
|
-
// Find specific checkpoint (compressed state)
|
|
1189
|
-
const checkpoint = session.sessions[0].snapshot.checkpoints.find(
|
|
1190
|
-
cp => cp.name === checkpointName
|
|
1191
|
-
);
|
|
1192
|
-
|
|
1193
|
-
// Return compressed checkpoint state
|
|
1194
|
-
return checkpoint?.state || null;
|
|
1195
|
-
}
|
|
1196
|
-
```
|
|
1197
|
-
|
|
1198
|
-
### Compression Metrics
|
|
1199
|
-
|
|
1200
|
-
**Typical Compression Ratios:**
|
|
1201
|
-
|
|
1202
|
-
| Compression Type | Without Neotoma | With Neotoma | Ratio |
|
|
1203
|
-
|------------------|-----------------|--------------|-------|
|
|
1204
|
-
| Entity Resolution | 3 references | 1 entity | 3:1 |
|
|
1205
|
-
| Snapshot Compression | 5 observations | 1 snapshot | 5:1 |
|
|
1206
|
-
| Timeline Summarization | 102 events | 5 recent events | 20:1 |
|
|
1207
|
-
| Selective Loading | 370 entities | 4 relevant entities | 92:1 |
|
|
1208
|
-
| Checkpoint Restoration | 50K tokens | 2K tokens | 25:1 |
|
|
1209
|
-
|
|
1210
|
-
**Combined Compression**: Up to 100:1 reduction in context size
|
|
1211
|
-
|
|
1212
|
-
### Best Practices for Compression
|
|
1213
|
-
|
|
1214
|
-
**DO:**
|
|
1215
|
-
- ✅ Use entity resolution (query by ID, not load all)
|
|
1216
|
-
- ✅ Use snapshots (current state, not full history)
|
|
1217
|
-
- ✅ Query recent timeline only (limit date range)
|
|
1218
|
-
- ✅ Use selective loading (filters and limits)
|
|
1219
|
-
- ✅ Restore from checkpoints (compressed state)
|
|
1220
|
-
- ✅ Query relationships on demand (not pre-load)
|
|
1221
|
-
|
|
1222
|
-
**DON'T:**
|
|
1223
|
-
- ❌ Load all entities into context
|
|
1224
|
-
- ❌ Include full observation history
|
|
1225
|
-
- ❌ Query full timeline without date limits
|
|
1226
|
-
- ❌ Pre-load all related entities
|
|
1227
|
-
- ❌ Restore full session history
|
|
1228
|
-
- ❌ Include duplicate entity references
|
|
1229
|
-
|
|
1230
|
-
### Compression Example: Before vs. After
|
|
1231
|
-
|
|
1232
|
-
**Before (No Compression):**
|
|
1233
|
-
```typescript
|
|
1234
|
-
// Load everything
|
|
1235
|
-
const context = {
|
|
1236
|
-
allFeatureUnits: loadAllFeatureUnits(), // 50 entities, 50K tokens
|
|
1237
|
-
allReleases: loadAllReleases(), // 20 entities, 20K tokens
|
|
1238
|
-
allDecisions: loadAllDecisions(), // 100 entities, 100K tokens
|
|
1239
|
-
fullTimeline: loadFullTimeline('FU-061'), // 102 events, 10K tokens
|
|
1240
|
-
fullSessionHistory: loadFullSession('abc123') // 50 actions, 50K tokens
|
|
1241
|
-
};
|
|
1242
|
-
// Total: ~230K tokens
|
|
1243
|
-
```
|
|
1244
|
-
|
|
1245
|
-
**After (With Neotoma Compression):**
|
|
1246
|
-
```typescript
|
|
1247
|
-
// Query only what's needed
|
|
1248
|
-
const context = {
|
|
1249
|
-
featureUnit: await queryFeatureUnit('FU-061'), // 1 entity, 1K tokens
|
|
1250
|
-
recentDecisions: await queryDecisions('FU-061', 3), // 3 entities, 3K tokens
|
|
1251
|
-
recentTimeline: await queryTimeline('FU-061', 7), // 5 events, 500 tokens
|
|
1252
|
-
checkpoint: await restoreCheckpoint('abc123', 'spec_complete') // 1 checkpoint, 2K tokens
|
|
1253
|
-
};
|
|
1254
|
-
// Total: ~6.5K tokens
|
|
1255
|
-
// Compression: 35:1 ratio
|
|
1256
|
-
```
|
|
1257
|
-
|
|
1258
|
-
## Best Practices
|
|
1259
|
-
|
|
1260
|
-
### 1. Always Check Neotoma Availability
|
|
1261
|
-
|
|
1262
|
-
```typescript
|
|
1263
|
-
// Good
|
|
1264
|
-
if (await isNeotomaAvailable()) {
|
|
1265
|
-
await mcpClient.submit_payload({
|
|
1266
|
-
capability_id: "neotoma:store_feature_unit:v1",
|
|
1267
|
-
body: featureUnit,
|
|
1268
|
-
provenance: {
|
|
1269
|
-
source_refs: [],
|
|
1270
|
-
extracted_at: new Date().toISOString(),
|
|
1271
|
-
extractor_version: "neotoma-mcp:v0.2.3"
|
|
1272
|
-
}
|
|
1273
|
-
});
|
|
1274
|
-
} else {
|
|
1275
|
-
await writeToLocalMemory('feature_units', featureUnit.id, featureUnit);
|
|
1276
|
-
}
|
|
1277
|
-
|
|
1278
|
-
// Bad (no fallback)
|
|
1279
|
-
await mcpClient.submit_payload({
|
|
1280
|
-
capability_id: "neotoma:store_feature_unit:v1",
|
|
1281
|
-
body: featureUnit,
|
|
1282
|
-
provenance: {
|
|
1283
|
-
source_refs: [],
|
|
1284
|
-
extracted_at: new Date().toISOString(),
|
|
1285
|
-
extractor_version: "neotoma-mcp:v0.2.3"
|
|
1286
|
-
}
|
|
1287
|
-
}); // May fail if Neotoma unavailable
|
|
1288
|
-
```
|
|
1289
|
-
|
|
1290
|
-
### 2. Use Timestamps Consistently
|
|
1291
|
-
|
|
1292
|
-
```typescript
|
|
1293
|
-
// Good
|
|
1294
|
-
const now = new Date().toISOString();
|
|
1295
|
-
await mcpClient.submit_feature_unit({
|
|
1296
|
-
id: 'FU-061',
|
|
1297
|
-
created_at: now,
|
|
1298
|
-
updated_at: now
|
|
1299
|
-
});
|
|
1300
|
-
|
|
1301
|
-
// Bad (missing timestamps)
|
|
1302
|
-
await mcpClient.submit_feature_unit({
|
|
1303
|
-
id: 'FU-061'
|
|
1304
|
-
// Missing created_at and updated_at
|
|
1305
|
-
});
|
|
1306
|
-
```
|
|
1307
|
-
|
|
1308
|
-
### 3. Provide Context in Decisions
|
|
1309
|
-
|
|
1310
|
-
```typescript
|
|
1311
|
-
// Good
|
|
1312
|
-
await mcpClient.submit_agent_decision({
|
|
1313
|
-
decision: 'Use content-addressed storage',
|
|
1314
|
-
rationale: 'Enables deduplication',
|
|
1315
|
-
context: {
|
|
1316
|
-
feature_unit: 'FU-061',
|
|
1317
|
-
session_id: 'abc123',
|
|
1318
|
-
task: 'Design storage layer'
|
|
1319
|
-
},
|
|
1320
|
-
decision_type: 'technical',
|
|
1321
|
-
timestamp: new Date().toISOString()
|
|
1322
|
-
});
|
|
1323
|
-
|
|
1324
|
-
// Bad (no context)
|
|
1325
|
-
await mcpClient.submit_agent_decision({
|
|
1326
|
-
decision: 'Use content-addressed storage',
|
|
1327
|
-
rationale: 'Enables deduplication',
|
|
1328
|
-
timestamp: new Date().toISOString()
|
|
1329
|
-
// Missing context
|
|
1330
|
-
});
|
|
1331
|
-
```
|
|
1332
|
-
|
|
1333
|
-
### 4. Track Session History
|
|
1334
|
-
|
|
1335
|
-
```typescript
|
|
1336
|
-
// Good
|
|
1337
|
-
const session = {
|
|
1338
|
-
session_id: generateSessionId(),
|
|
1339
|
-
actions: [
|
|
1340
|
-
{ type: 'create_feature_unit', result: 'success' },
|
|
1341
|
-
{ type: 'run_tests', result: 'passed' }
|
|
1342
|
-
],
|
|
1343
|
-
checkpoints: [
|
|
1344
|
-
{ name: 'spec_complete', timestamp: new Date().toISOString() }
|
|
1345
|
-
],
|
|
1346
|
-
outcomes: [
|
|
1347
|
-
{ type: 'feature_unit_created', id: 'FU-061' }
|
|
1348
|
-
],
|
|
1349
|
-
started_at: sessionStart,
|
|
1350
|
-
ended_at: new Date().toISOString()
|
|
1351
|
-
};
|
|
1352
|
-
await mcpClient.submit_agent_session(session);
|
|
1353
|
-
|
|
1354
|
-
// Bad (minimal tracking)
|
|
1355
|
-
const session = {
|
|
1356
|
-
session_id: generateSessionId(),
|
|
1357
|
-
actions: [{ type: 'work', result: 'success' }],
|
|
1358
|
-
started_at: sessionStart
|
|
1359
|
-
};
|
|
1360
|
-
await mcpClient.submit_agent_session(session);
|
|
1361
|
-
```
|
|
1362
|
-
|
|
1363
|
-
### 5. Use Entity Resolution
|
|
1364
|
-
|
|
1365
|
-
```typescript
|
|
1366
|
-
// Good (entity resolution by ID)
|
|
1367
|
-
await mcpClient.submit_feature_unit({
|
|
1368
|
-
id: 'FU-061', // Same ID resolves to same entity
|
|
1369
|
-
status: 'completed',
|
|
1370
|
-
updated_at: new Date().toISOString()
|
|
1371
|
-
});
|
|
1372
|
-
|
|
1373
|
-
// Bad (no stable ID)
|
|
1374
|
-
await mcpClient.submit_feature_unit({
|
|
1375
|
-
id: generateRandomId(), // New ID creates duplicate entity
|
|
1376
|
-
status: 'completed'
|
|
1377
|
-
});
|
|
1378
|
-
```
|
|
1379
|
-
|
|
1380
|
-
### 6. Query Before Creating
|
|
1381
|
-
|
|
1382
|
-
```typescript
|
|
1383
|
-
// Good (check if exists first)
|
|
1384
|
-
const existing = await getFeatureUnit('FU-061');
|
|
1385
|
-
if (!existing) {
|
|
1386
|
-
await mcpClient.submit_feature_unit({
|
|
1387
|
-
id: 'FU-061',
|
|
1388
|
-
description: 'Add sources table',
|
|
1389
|
-
status: 'planning',
|
|
1390
|
-
created_at: new Date().toISOString(),
|
|
1391
|
-
updated_at: new Date().toISOString()
|
|
1392
|
-
});
|
|
1393
|
-
}
|
|
1394
|
-
|
|
1395
|
-
// Bad (always create)
|
|
1396
|
-
await mcpClient.submit_feature_unit({
|
|
1397
|
-
id: 'FU-061',
|
|
1398
|
-
// ...
|
|
1399
|
-
}); // May create duplicate observations
|
|
1400
|
-
```
|
|
1401
|
-
|
|
1402
|
-
### 7. Handle Errors Gracefully
|
|
1403
|
-
|
|
1404
|
-
```typescript
|
|
1405
|
-
// Good
|
|
1406
|
-
try {
|
|
1407
|
-
await mcpClient.submit_payload({
|
|
1408
|
-
capability_id: "neotoma:store_feature_unit:v1",
|
|
1409
|
-
body: featureUnit,
|
|
1410
|
-
provenance: {
|
|
1411
|
-
source_refs: [],
|
|
1412
|
-
extracted_at: new Date().toISOString(),
|
|
1413
|
-
extractor_version: "neotoma-mcp:v0.2.3"
|
|
1414
|
-
}
|
|
1415
|
-
});
|
|
1416
|
-
} catch (error) {
|
|
1417
|
-
console.error('Failed to store Feature Unit:', error);
|
|
1418
|
-
// Fallback to local memory
|
|
1419
|
-
await writeToLocalMemory('feature_units', featureUnit.id, featureUnit);
|
|
1420
|
-
}
|
|
1421
|
-
|
|
1422
|
-
// Bad (no error handling)
|
|
1423
|
-
await mcpClient.submit_payload({
|
|
1424
|
-
capability_id: "neotoma:store_feature_unit:v1",
|
|
1425
|
-
body: featureUnit,
|
|
1426
|
-
provenance: {
|
|
1427
|
-
source_refs: [],
|
|
1428
|
-
extracted_at: new Date().toISOString(),
|
|
1429
|
-
extractor_version: "neotoma-mcp:v0.2.3"
|
|
1430
|
-
}
|
|
1431
|
-
}); // May crash agent
|
|
1432
|
-
```
|
|
1433
|
-
|
|
1434
|
-
### 8. Follow Entity Naming Conventions
|
|
1435
|
-
|
|
1436
|
-
**Feature Units**: Use `FU-\d+` pattern (e.g., "FU-061", "FU-062")
|
|
1437
|
-
```typescript
|
|
1438
|
-
// Good
|
|
1439
|
-
await mcpClient.submit_feature_unit({
|
|
1440
|
-
id: 'FU-061', // Matches pattern FU-\d+
|
|
1441
|
-
// ...
|
|
1442
|
-
});
|
|
1443
|
-
|
|
1444
|
-
// Bad
|
|
1445
|
-
await mcpClient.submit_feature_unit({
|
|
1446
|
-
id: 'feature-unit-61', // Doesn't match pattern
|
|
1447
|
-
// ...
|
|
1448
|
-
});
|
|
1449
|
-
```
|
|
1450
|
-
|
|
1451
|
-
**Releases**: Use `v\d+\.\d+\.\d+` pattern (e.g., "v0.2.3", "v1.0.0")
|
|
1452
|
-
```typescript
|
|
1453
|
-
// Good
|
|
1454
|
-
await mcpClient.submit_payload({
|
|
1455
|
-
capability_id: "neotoma:store_release:v1",
|
|
1456
|
-
body: {
|
|
1457
|
-
id: 'v0.2.3', // Matches pattern v\d+\.\d+\.\d+
|
|
1458
|
-
version: '0.2.3',
|
|
1459
|
-
// ...
|
|
1460
|
-
});
|
|
1461
|
-
|
|
1462
|
-
// Bad
|
|
1463
|
-
await mcpClient.submit_payload({
|
|
1464
|
-
capability_id: "neotoma:store_release:v1",
|
|
1465
|
-
body: {
|
|
1466
|
-
id: 'release-0.2.3', // Doesn't match pattern
|
|
1467
|
-
// ...
|
|
1468
|
-
});
|
|
1469
|
-
```
|
|
1470
|
-
|
|
1471
|
-
**Session IDs**: Use descriptive, unique identifiers (min 5 chars)
|
|
1472
|
-
```typescript
|
|
1473
|
-
// Good
|
|
1474
|
-
const sessionId = `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
1475
|
-
|
|
1476
|
-
// Bad
|
|
1477
|
-
const sessionId = 'abc'; // Too short (min 5 chars)
|
|
1478
|
-
```
|
|
1479
|
-
|
|
1480
|
-
### 9. Optimize Timeline Queries
|
|
1481
|
-
|
|
1482
|
-
**Use Date Ranges**: Query only relevant time periods
|
|
1483
|
-
```typescript
|
|
1484
|
-
// Good (optimized: last 7 days only)
|
|
1485
|
-
const timeline = await mcpClient.query_entity_timeline({
|
|
1486
|
-
entity_id: 'FU-061',
|
|
1487
|
-
start_date: '2025-12-24', // Last 7 days
|
|
1488
|
-
end_date: '2025-12-31'
|
|
1489
|
-
});
|
|
1490
|
-
|
|
1491
|
-
// Bad (no date range: full history)
|
|
1492
|
-
const timeline = await mcpClient.query_entity_timeline({
|
|
1493
|
-
entity_id: 'FU-061'
|
|
1494
|
-
// No date range = loads full history
|
|
1495
|
-
});
|
|
1496
|
-
```
|
|
1497
|
-
|
|
1498
|
-
**Limit Event Types**: Filter by event types when possible
|
|
1499
|
-
```typescript
|
|
1500
|
-
// Good (filtered: only created/updated events)
|
|
1501
|
-
const timeline = await mcpClient.query_entity_timeline({
|
|
1502
|
-
entity_id: 'FU-061',
|
|
1503
|
-
event_types: ['created', 'updated']
|
|
1504
|
-
});
|
|
1505
|
-
|
|
1506
|
-
// Bad (all event types)
|
|
1507
|
-
const timeline = await mcpClient.query_entity_timeline({
|
|
1508
|
-
entity_id: 'FU-061'
|
|
1509
|
-
// All event types = more data
|
|
1510
|
-
});
|
|
1511
|
-
```
|
|
1512
|
-
|
|
1513
|
-
**Use Recent Events Only**: Slice results to most recent
|
|
1514
|
-
```typescript
|
|
1515
|
-
// Good (recent events only)
|
|
1516
|
-
const timeline = await mcpClient.query_entity_timeline({
|
|
1517
|
-
entity_id: 'FU-061',
|
|
1518
|
-
start_date: '2025-12-24',
|
|
1519
|
-
end_date: '2025-12-31'
|
|
1520
|
-
});
|
|
1521
|
-
const recentEvents = timeline.events.slice(-10); // Last 10 events
|
|
1522
|
-
|
|
1523
|
-
// Bad (all events)
|
|
1524
|
-
const timeline = await mcpClient.query_entity_timeline({
|
|
1525
|
-
entity_id: 'FU-061'
|
|
1526
|
-
});
|
|
1527
|
-
// Uses all events, not just recent
|
|
1528
|
-
```
|
|
1529
|
-
|
|
1530
|
-
## Integration Checklist
|
|
1531
|
-
|
|
1532
|
-
- [ ] MCP client initialized
|
|
1533
|
-
- [ ] Neotoma availability check implemented
|
|
1534
|
-
- [ ] Graceful degradation to `.cursor/memory/` implemented
|
|
1535
|
-
- [ ] Feature Unit storage implemented
|
|
1536
|
-
- [ ] Release storage implemented
|
|
1537
|
-
- [ ] Decision recording implemented
|
|
1538
|
-
- [ ] Session history tracking implemented
|
|
1539
|
-
- [ ] Validation result recording implemented
|
|
1540
|
-
- [ ] Entity query patterns implemented
|
|
1541
|
-
- [ ] Timeline query patterns implemented
|
|
1542
|
-
- [ ] Cross-session continuity implemented
|
|
1543
|
-
- [ ] Error handling implemented
|
|
1544
|
-
- [ ] Timestamps in ISO 8601 format
|
|
1545
|
-
- [ ] Context provided in decisions
|
|
1546
|
-
- [ ] Entity IDs stable and consistent
|
|
1547
|
-
|
|
1548
|
-
## Testing Integration
|
|
1549
|
-
|
|
1550
|
-
### Unit Tests
|
|
1551
|
-
|
|
1552
|
-
```typescript
|
|
1553
|
-
// test/memory_service.test.ts
|
|
1554
|
-
describe('Memory Service', () => {
|
|
1555
|
-
it('should store Feature Unit in Neotoma when available', async () => {
|
|
1556
|
-
mockNeotomaAvailable(true);
|
|
1557
|
-
|
|
1558
|
-
const featureUnit = {
|
|
1559
|
-
id: 'FU-061',
|
|
1560
|
-
description: 'Test FU',
|
|
1561
|
-
status: 'planning',
|
|
1562
|
-
created_at: new Date().toISOString(),
|
|
1563
|
-
updated_at: new Date().toISOString()
|
|
1564
|
-
};
|
|
1565
|
-
|
|
1566
|
-
const result = await storeFeatureUnit(featureUnit);
|
|
1567
|
-
|
|
1568
|
-
expect(result.entity_id).toBeDefined();
|
|
1569
|
-
expect(mcpClient.submit_feature_unit).toHaveBeenCalledWith(featureUnit);
|
|
1570
|
-
});
|
|
1571
|
-
|
|
1572
|
-
it('should fallback to local memory when Neotoma unavailable', async () => {
|
|
1573
|
-
mockNeotomaAvailable(false);
|
|
1574
|
-
|
|
1575
|
-
const featureUnit = {
|
|
1576
|
-
id: 'FU-061',
|
|
1577
|
-
description: 'Test FU',
|
|
1578
|
-
status: 'planning',
|
|
1579
|
-
created_at: new Date().toISOString(),
|
|
1580
|
-
updated_at: new Date().toISOString()
|
|
1581
|
-
};
|
|
1582
|
-
|
|
1583
|
-
const result = await storeFeatureUnit(featureUnit);
|
|
1584
|
-
|
|
1585
|
-
expect(writeToLocalMemory).toHaveBeenCalledWith('feature_units', 'FU-061', featureUnit);
|
|
1586
|
-
});
|
|
1587
|
-
});
|
|
1588
|
-
```
|
|
1589
|
-
|
|
1590
|
-
### Integration Tests
|
|
1591
|
-
|
|
1592
|
-
```typescript
|
|
1593
|
-
// test/neotoma_integration.test.ts
|
|
1594
|
-
describe('Neotoma Integration', () => {
|
|
1595
|
-
it('should store and retrieve Feature Unit', async () => {
|
|
1596
|
-
const featureUnit = {
|
|
1597
|
-
id: 'FU-TEST-001',
|
|
1598
|
-
description: 'Test Feature Unit',
|
|
1599
|
-
status: 'planning',
|
|
1600
|
-
created_at: new Date().toISOString(),
|
|
1601
|
-
updated_at: new Date().toISOString()
|
|
1602
|
-
};
|
|
1603
|
-
|
|
1604
|
-
// Store
|
|
1605
|
-
await storeFeatureUnit(featureUnit);
|
|
1606
|
-
|
|
1607
|
-
// Retrieve
|
|
1608
|
-
const retrieved = await getFeatureUnit('FU-TEST-001');
|
|
1609
|
-
|
|
1610
|
-
expect(retrieved).toBeDefined();
|
|
1611
|
-
expect(retrieved.id).toBe('FU-TEST-001');
|
|
1612
|
-
expect(retrieved.description).toBe('Test Feature Unit');
|
|
1613
|
-
});
|
|
1614
|
-
|
|
1615
|
-
it('should generate timeline for Feature Unit', async () => {
|
|
1616
|
-
const featureUnit = {
|
|
1617
|
-
id: 'FU-TEST-002',
|
|
1618
|
-
description: 'Test Feature Unit',
|
|
1619
|
-
status: 'planning',
|
|
1620
|
-
created_at: new Date().toISOString(),
|
|
1621
|
-
updated_at: new Date().toISOString()
|
|
1622
|
-
};
|
|
1623
|
-
|
|
1624
|
-
// Store
|
|
1625
|
-
await storeFeatureUnit(featureUnit);
|
|
1626
|
-
|
|
1627
|
-
// Update status
|
|
1628
|
-
featureUnit.status = 'completed';
|
|
1629
|
-
featureUnit.updated_at = new Date().toISOString();
|
|
1630
|
-
await storeFeatureUnit(featureUnit);
|
|
1631
|
-
|
|
1632
|
-
// Query timeline
|
|
1633
|
-
const timeline = await getFeatureUnitTimeline('FU-TEST-002');
|
|
1634
|
-
|
|
1635
|
-
expect(timeline.length).toBeGreaterThan(0);
|
|
1636
|
-
expect(timeline.some(e => e.description.includes('created'))).toBe(true);
|
|
1637
|
-
expect(timeline.some(e => e.description.includes('completed'))).toBe(true);
|
|
1638
|
-
});
|
|
1639
|
-
});
|
|
1640
|
-
```
|
|
1641
|
-
|
|
1642
|
-
## Performance Considerations
|
|
1643
|
-
|
|
1644
|
-
### Batch Operations
|
|
1645
|
-
|
|
1646
|
-
```typescript
|
|
1647
|
-
// Good (batch queries)
|
|
1648
|
-
const featureUnitIds = ['FU-061', 'FU-062', 'FU-063'];
|
|
1649
|
-
const result = await mcpClient.query_codebase_entities({
|
|
1650
|
-
entity_type: 'feature_unit',
|
|
1651
|
-
filters: {
|
|
1652
|
-
id: { in: featureUnitIds }
|
|
1653
|
-
}
|
|
1654
|
-
});
|
|
1655
|
-
|
|
1656
|
-
// Bad (individual queries)
|
|
1657
|
-
const featureUnits = [];
|
|
1658
|
-
for (const id of featureUnitIds) {
|
|
1659
|
-
const fu = await getFeatureUnit(id);
|
|
1660
|
-
featureUnits.push(fu);
|
|
1661
|
-
}
|
|
1662
|
-
```
|
|
1663
|
-
|
|
1664
|
-
### Caching
|
|
1665
|
-
|
|
1666
|
-
```typescript
|
|
1667
|
-
// Cache frequently accessed entities
|
|
1668
|
-
const entityCache = new Map<string, any>();
|
|
1669
|
-
|
|
1670
|
-
async function getCachedFeatureUnit(id: string) {
|
|
1671
|
-
if (entityCache.has(id)) {
|
|
1672
|
-
return entityCache.get(id);
|
|
1673
|
-
}
|
|
1674
|
-
|
|
1675
|
-
const featureUnit = await getFeatureUnit(id);
|
|
1676
|
-
|
|
1677
|
-
if (featureUnit) {
|
|
1678
|
-
entityCache.set(id, featureUnit);
|
|
1679
|
-
}
|
|
1680
|
-
|
|
1681
|
-
return featureUnit;
|
|
1682
|
-
}
|
|
1683
|
-
```
|
|
1684
|
-
|
|
1685
|
-
## Multi-Agent Patterns
|
|
1686
|
-
|
|
1687
|
-
**Agent Skills Reference**: [multi-agent-patterns](https://github.com/muratcankoylan/Agent-Skills-for-Context-Engineering/blob/main/skills/multi-agent-patterns) skill
|
|
1688
|
-
|
|
1689
|
-
### Overview
|
|
1690
|
-
|
|
1691
|
-
Neotoma's unified memory system enables multiple agents to collaborate effectively through shared memory access. Multiple agents can simultaneously read and write to the same memory, with entity resolution ensuring consistency and timeline queries providing coordination context.
|
|
1692
|
-
|
|
1693
|
-
This section implements Agent Skills multi-agent patterns: orchestrator (supervisor delegates to specialists), peer-to-peer (agents collaborate as equals), and hierarchical (multi-tier organization).
|
|
1694
|
-
|
|
1695
|
-
### Shared Memory Architecture
|
|
1696
|
-
|
|
1697
|
-
```
|
|
1698
|
-
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
|
1699
|
-
│ Agent A │ │ Agent B │ │ Agent C │
|
|
1700
|
-
│ (Cursor) │ │ (ChatGPT) │ │ (Claude) │
|
|
1701
|
-
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
|
|
1702
|
-
│ │ │
|
|
1703
|
-
│ MCP Protocol │ MCP Protocol │
|
|
1704
|
-
│ │ │
|
|
1705
|
-
└────────────────┼────────────────┘
|
|
1706
|
-
│
|
|
1707
|
-
▼
|
|
1708
|
-
┌──────────────────┐
|
|
1709
|
-
│ Neotoma MCP │
|
|
1710
|
-
│ Unified Memory │
|
|
1711
|
-
└──────────────────┘
|
|
1712
|
-
```
|
|
1713
|
-
|
|
1714
|
-
### Pattern 1: Orchestrator Pattern
|
|
1715
|
-
|
|
1716
|
-
**Description**: A supervisor agent delegates tasks to specialist agents, all using Neotoma for coordination.
|
|
1717
|
-
|
|
1718
|
-
**Implementation**:
|
|
1719
|
-
|
|
1720
|
-
```typescript
|
|
1721
|
-
// Orchestrator agent creates tasks
|
|
1722
|
-
async function orchestratorCreateTask(taskDescription: string) {
|
|
1723
|
-
// Orchestrator records decision
|
|
1724
|
-
const decision = await mcpClient.submit_agent_decision({
|
|
1725
|
-
decision: `Delegate task: ${taskDescription}`,
|
|
1726
|
-
rationale: 'Task requires specialist expertise',
|
|
1727
|
-
context: {
|
|
1728
|
-
task: taskDescription,
|
|
1729
|
-
orchestrator: 'main-agent',
|
|
1730
|
-
specialists_needed: ['specialist-a', 'specialist-b']
|
|
1731
|
-
},
|
|
1732
|
-
decision_type: 'process',
|
|
1733
|
-
timestamp: new Date().toISOString(),
|
|
1734
|
-
agent_id: 'orchestrator-agent'
|
|
1735
|
-
});
|
|
1736
|
-
|
|
1737
|
-
// Orchestrator creates Feature Unit for task
|
|
1738
|
-
await mcpClient.submit_feature_unit({
|
|
1739
|
-
id: generateFeatureUnitId(),
|
|
1740
|
-
description: taskDescription,
|
|
1741
|
-
status: 'planning',
|
|
1742
|
-
created_at: new Date().toISOString(),
|
|
1743
|
-
updated_at: new Date().toISOString()
|
|
1744
|
-
});
|
|
1745
|
-
|
|
1746
|
-
return decision;
|
|
1747
|
-
}
|
|
1748
|
-
|
|
1749
|
-
// Specialist agent picks up task
|
|
1750
|
-
async function specialistPickUpTask(agentId: string) {
|
|
1751
|
-
// Query for tasks needing work
|
|
1752
|
-
const tasks = await mcpClient.query_codebase_entities({
|
|
1753
|
-
entity_type: 'feature_unit',
|
|
1754
|
-
filters: { status: 'planning' },
|
|
1755
|
-
limit: 5
|
|
1756
|
-
});
|
|
1757
|
-
|
|
1758
|
-
// Pick first available task
|
|
1759
|
-
const task = tasks.entities[0];
|
|
1760
|
-
|
|
1761
|
-
// Record that specialist is starting work
|
|
1762
|
-
await mcpClient.submit_feature_unit({
|
|
1763
|
-
...task.snapshot,
|
|
1764
|
-
status: 'in_progress',
|
|
1765
|
-
updated_at: new Date().toISOString()
|
|
1766
|
-
});
|
|
1767
|
-
|
|
1768
|
-
// Start session
|
|
1769
|
-
const session = await mcpClient.submit_agent_session({
|
|
1770
|
-
session_id: generateSessionId(),
|
|
1771
|
-
actions: [{
|
|
1772
|
-
type: 'start_task',
|
|
1773
|
-
result: 'success',
|
|
1774
|
-
details: { task_id: task.snapshot.id }
|
|
1775
|
-
}],
|
|
1776
|
-
started_at: new Date().toISOString()
|
|
1777
|
-
});
|
|
1778
|
-
|
|
1779
|
-
return { task, session };
|
|
1780
|
-
}
|
|
1781
|
-
|
|
1782
|
-
// Specialist completes and reports back
|
|
1783
|
-
async function specialistCompleteTask(taskId: string, sessionId: string) {
|
|
1784
|
-
// Update task status
|
|
1785
|
-
await mcpClient.submit_feature_unit({
|
|
1786
|
-
id: taskId,
|
|
1787
|
-
status: 'completed',
|
|
1788
|
-
updated_at: new Date().toISOString()
|
|
1789
|
-
});
|
|
1790
|
-
|
|
1791
|
-
// Record session completion
|
|
1792
|
-
await mcpClient.submit_agent_session({
|
|
1793
|
-
session_id: sessionId,
|
|
1794
|
-
actions: [
|
|
1795
|
-
{ type: 'start_task', result: 'success' },
|
|
1796
|
-
{ type: 'complete_task', result: 'success' }
|
|
1797
|
-
],
|
|
1798
|
-
outcomes: [
|
|
1799
|
-
{ type: 'feature_unit_completed', id: taskId }
|
|
1800
|
-
],
|
|
1801
|
-
ended_at: new Date().toISOString()
|
|
1802
|
-
});
|
|
1803
|
-
|
|
1804
|
-
console.log(`Specialist completed task ${taskId}`);
|
|
1805
|
-
}
|
|
1806
|
-
|
|
1807
|
-
// Orchestrator monitors progress
|
|
1808
|
-
async function orchestratorMonitorProgress() {
|
|
1809
|
-
// Query all in-progress tasks
|
|
1810
|
-
const inProgress = await mcpClient.query_codebase_entities({
|
|
1811
|
-
entity_type: 'feature_unit',
|
|
1812
|
-
filters: { status: 'in_progress' }
|
|
1813
|
-
});
|
|
1814
|
-
|
|
1815
|
-
console.log(`${inProgress.entities.length} tasks in progress`);
|
|
1816
|
-
|
|
1817
|
-
// Query recent sessions to see which specialists are active
|
|
1818
|
-
const sessions = await mcpClient.query_agent_history({
|
|
1819
|
-
limit: 10,
|
|
1820
|
-
order_by: 'started_at',
|
|
1821
|
-
order: 'desc'
|
|
1822
|
-
});
|
|
1823
|
-
|
|
1824
|
-
return {
|
|
1825
|
-
in_progress: inProgress.entities,
|
|
1826
|
-
active_sessions: sessions.sessions
|
|
1827
|
-
};
|
|
1828
|
-
}
|
|
1829
|
-
```
|
|
1830
|
-
|
|
1831
|
-
**Use Case**: Complex feature development with specialized agents (frontend specialist, backend specialist, testing specialist).
|
|
1832
|
-
|
|
1833
|
-
### Pattern 2: Peer-to-Peer Pattern
|
|
1834
|
-
|
|
1835
|
-
**Description**: Agents collaborate as equals, sharing information through Neotoma without a central coordinator.
|
|
1836
|
-
|
|
1837
|
-
**Implementation**:
|
|
1838
|
-
|
|
1839
|
-
```typescript
|
|
1840
|
-
// Agent A shares discovery
|
|
1841
|
-
async function agentShareDiscovery(agentId: string, discovery: string) {
|
|
1842
|
-
await mcpClient.submit_agent_decision({
|
|
1843
|
-
decision: discovery,
|
|
1844
|
-
rationale: 'Discovered during investigation',
|
|
1845
|
-
context: {
|
|
1846
|
-
agent_id: agentId,
|
|
1847
|
-
shared_with: 'all-agents',
|
|
1848
|
-
discovery_type: 'architectural_insight'
|
|
1849
|
-
},
|
|
1850
|
-
decision_type: 'technical',
|
|
1851
|
-
timestamp: new Date().toISOString(),
|
|
1852
|
-
agent_id: agentId
|
|
1853
|
-
});
|
|
1854
|
-
|
|
1855
|
-
console.log(`Agent ${agentId} shared discovery: ${discovery}`);
|
|
1856
|
-
}
|
|
1857
|
-
|
|
1858
|
-
// Agent B queries discoveries from peers
|
|
1859
|
-
async function agentQueryPeerDiscoveries() {
|
|
1860
|
-
const discoveries = await mcpClient.query_codebase_entities({
|
|
1861
|
-
entity_type: 'agent_decision',
|
|
1862
|
-
filters: {
|
|
1863
|
-
'context.shared_with': 'all-agents'
|
|
1864
|
-
},
|
|
1865
|
-
order_by: 'timestamp',
|
|
1866
|
-
order: 'desc',
|
|
1867
|
-
limit: 10
|
|
1868
|
-
});
|
|
1869
|
-
|
|
1870
|
-
console.log(`Found ${discoveries.entities.length} peer discoveries`);
|
|
1871
|
-
|
|
1872
|
-
return discoveries.entities.map(e => ({
|
|
1873
|
-
decision: e.snapshot.decision,
|
|
1874
|
-
agent: e.snapshot.agent_id,
|
|
1875
|
-
timestamp: e.snapshot.timestamp
|
|
1876
|
-
}));
|
|
1877
|
-
}
|
|
1878
|
-
|
|
1879
|
-
// Agent C builds on peer discovery
|
|
1880
|
-
async function agentBuildOnPeerDiscovery(priorDecisionId: string, agentId: string) {
|
|
1881
|
-
// Query the prior decision
|
|
1882
|
-
const priorDecisions = await mcpClient.query_codebase_entities({
|
|
1883
|
-
entity_type: 'agent_decision',
|
|
1884
|
-
filters: { id: priorDecisionId },
|
|
1885
|
-
limit: 1
|
|
1886
|
-
});
|
|
1887
|
-
|
|
1888
|
-
const priorDecision = priorDecisions.entities[0].snapshot;
|
|
1889
|
-
|
|
1890
|
-
// Build on it with new decision
|
|
1891
|
-
await mcpClient.submit_agent_decision({
|
|
1892
|
-
decision: `Building on: ${priorDecision.decision}`,
|
|
1893
|
-
rationale: 'Extending peer discovery with implementation details',
|
|
1894
|
-
context: {
|
|
1895
|
-
agent_id: agentId,
|
|
1896
|
-
builds_on: priorDecisionId,
|
|
1897
|
-
prior_agent: priorDecision.agent_id
|
|
1898
|
-
},
|
|
1899
|
-
decision_type: 'technical',
|
|
1900
|
-
timestamp: new Date().toISOString(),
|
|
1901
|
-
agent_id: agentId
|
|
1902
|
-
});
|
|
1903
|
-
|
|
1904
|
-
console.log(`Agent ${agentId} built on discovery from ${priorDecision.agent_id}`);
|
|
1905
|
-
}
|
|
1906
|
-
```
|
|
1907
|
-
|
|
1908
|
-
**Use Case**: Research tasks where multiple agents explore different approaches and share findings.
|
|
1909
|
-
|
|
1910
|
-
### Pattern 3: Hierarchical Pattern
|
|
1911
|
-
|
|
1912
|
-
**Description**: Multi-tier agent organization with supervisors, managers, and workers.
|
|
1913
|
-
|
|
1914
|
-
**Implementation**:
|
|
1915
|
-
|
|
1916
|
-
```typescript
|
|
1917
|
-
// Supervisor agent creates release plan
|
|
1918
|
-
async function supervisorCreateReleasePlan(releaseId: string, featureUnits: string[]) {
|
|
1919
|
-
await mcpClient.submit_payload({
|
|
1920
|
-
capability_id: "neotoma:store_release:v1",
|
|
1921
|
-
body: {
|
|
1922
|
-
id: releaseId,
|
|
1923
|
-
version: releaseId.replace('v', ''),
|
|
1924
|
-
feature_units: featureUnits,
|
|
1925
|
-
status: 'planning',
|
|
1926
|
-
acceptance_criteria: [
|
|
1927
|
-
'All Feature Units completed',
|
|
1928
|
-
'All validations passing',
|
|
1929
|
-
'Integration tests passing'
|
|
1930
|
-
],
|
|
1931
|
-
created_at: new Date().toISOString(),
|
|
1932
|
-
updated_at: new Date().toISOString()
|
|
1933
|
-
});
|
|
1934
|
-
|
|
1935
|
-
// Record decision
|
|
1936
|
-
await mcpClient.submit_agent_decision({
|
|
1937
|
-
decision: `Create release ${releaseId} with ${featureUnits.length} Feature Units`,
|
|
1938
|
-
rationale: 'Release scoped based on dependencies and priority',
|
|
1939
|
-
context: {
|
|
1940
|
-
role: 'supervisor',
|
|
1941
|
-
release_id: releaseId,
|
|
1942
|
-
delegation: 'managers will assign to workers'
|
|
1943
|
-
},
|
|
1944
|
-
decision_type: 'strategic',
|
|
1945
|
-
timestamp: new Date().toISOString(),
|
|
1946
|
-
agent_id: 'supervisor-agent'
|
|
1947
|
-
});
|
|
1948
|
-
|
|
1949
|
-
console.log(`Supervisor created release plan: ${releaseId}`);
|
|
1950
|
-
}
|
|
1951
|
-
|
|
1952
|
-
// Manager agent assigns Feature Units to workers
|
|
1953
|
-
async function managerAssignFeatureUnits(managerId: string) {
|
|
1954
|
-
// Query unassigned Feature Units
|
|
1955
|
-
const unassigned = await mcpClient.query_codebase_entities({
|
|
1956
|
-
entity_type: 'feature_unit',
|
|
1957
|
-
filters: { status: 'planning' },
|
|
1958
|
-
limit: 5
|
|
1959
|
-
});
|
|
1960
|
-
|
|
1961
|
-
// Assign to workers (record decisions)
|
|
1962
|
-
for (const fu of unassigned.entities) {
|
|
1963
|
-
await mcpClient.submit_agent_decision({
|
|
1964
|
-
decision: `Assign ${fu.snapshot.id} to worker`,
|
|
1965
|
-
rationale: 'Worker capacity available',
|
|
1966
|
-
context: {
|
|
1967
|
-
role: 'manager',
|
|
1968
|
-
manager_id: managerId,
|
|
1969
|
-
feature_unit: fu.snapshot.id,
|
|
1970
|
-
assigned_to: 'worker-1'
|
|
1971
|
-
},
|
|
1972
|
-
decision_type: 'process',
|
|
1973
|
-
timestamp: new Date().toISOString(),
|
|
1974
|
-
agent_id: managerId
|
|
1975
|
-
});
|
|
1976
|
-
}
|
|
1977
|
-
|
|
1978
|
-
console.log(`Manager ${managerId} assigned ${unassigned.entities.length} tasks`);
|
|
1979
|
-
}
|
|
1980
|
-
|
|
1981
|
-
// Worker agent executes Feature Unit
|
|
1982
|
-
async function workerExecuteFeatureUnit(workerId: string, featureUnitId: string) {
|
|
1983
|
-
// Update status to in_progress
|
|
1984
|
-
await mcpClient.submit_feature_unit({
|
|
1985
|
-
id: featureUnitId,
|
|
1986
|
-
status: 'in_progress',
|
|
1987
|
-
updated_at: new Date().toISOString()
|
|
1988
|
-
});
|
|
1989
|
-
|
|
1990
|
-
// Execute work (placeholder)
|
|
1991
|
-
const result = await executeWork(featureUnitId);
|
|
1992
|
-
|
|
1993
|
-
// Update status to completed
|
|
1994
|
-
await mcpClient.submit_feature_unit({
|
|
1995
|
-
id: featureUnitId,
|
|
1996
|
-
status: 'completed',
|
|
1997
|
-
updated_at: new Date().toISOString()
|
|
1998
|
-
});
|
|
1999
|
-
|
|
2000
|
-
// Report completion
|
|
2001
|
-
await mcpClient.submit_agent_session({
|
|
2002
|
-
session_id: generateSessionId(),
|
|
2003
|
-
actions: [
|
|
2004
|
-
{ type: 'execute_feature_unit', result: 'success' }
|
|
2005
|
-
],
|
|
2006
|
-
outcomes: [
|
|
2007
|
-
{ type: 'feature_unit_completed', id: featureUnitId }
|
|
2008
|
-
],
|
|
2009
|
-
started_at: result.started_at,
|
|
2010
|
-
ended_at: new Date().toISOString()
|
|
2011
|
-
});
|
|
2012
|
-
|
|
2013
|
-
console.log(`Worker ${workerId} completed ${featureUnitId}`);
|
|
2014
|
-
}
|
|
2015
|
-
|
|
2016
|
-
// Supervisor monitors overall progress
|
|
2017
|
-
async function supervisorMonitorRelease(releaseId: string) {
|
|
2018
|
-
// Get release
|
|
2019
|
-
const release = await mcpClient.query_codebase_entities({
|
|
2020
|
-
entity_type: 'release',
|
|
2021
|
-
filters: { id: releaseId },
|
|
2022
|
-
limit: 1
|
|
2023
|
-
});
|
|
2024
|
-
|
|
2025
|
-
const releaseData = release.entities[0].snapshot;
|
|
2026
|
-
|
|
2027
|
-
// Check status of all Feature Units
|
|
2028
|
-
const featureUnitStatuses = await Promise.all(
|
|
2029
|
-
releaseData.feature_units.map(async (fuId: string) => {
|
|
2030
|
-
const fu = await getFeatureUnit(fuId);
|
|
2031
|
-
return { id: fuId, status: fu?.status };
|
|
2032
|
-
})
|
|
2033
|
-
);
|
|
2034
|
-
|
|
2035
|
-
const completed = featureUnitStatuses.filter(fu => fu.status === 'completed').length;
|
|
2036
|
-
const total = featureUnitStatuses.length;
|
|
2037
|
-
|
|
2038
|
-
console.log(`Release ${releaseId}: ${completed}/${total} Feature Units completed`);
|
|
2039
|
-
|
|
2040
|
-
return {
|
|
2041
|
-
release_id: releaseId,
|
|
2042
|
-
progress: {
|
|
2043
|
-
completed,
|
|
2044
|
-
total,
|
|
2045
|
-
percentage: (completed / total) * 100
|
|
2046
|
-
},
|
|
2047
|
-
feature_units: featureUnitStatuses
|
|
2048
|
-
};
|
|
2049
|
-
}
|
|
2050
|
-
```
|
|
2051
|
-
|
|
2052
|
-
**Use Case**: Large release development with supervisor (planning), managers (coordination), workers (execution).
|
|
2053
|
-
|
|
2054
|
-
### Pattern 4: Collaborative Problem-Solving
|
|
2055
|
-
|
|
2056
|
-
**Description**: Multiple agents work on the same problem, contributing observations and decisions.
|
|
2057
|
-
|
|
2058
|
-
**Implementation**:
|
|
2059
|
-
|
|
2060
|
-
```typescript
|
|
2061
|
-
// Multiple agents analyze the same Feature Unit
|
|
2062
|
-
async function agentContributeAnalysis(
|
|
2063
|
-
agentId: string,
|
|
2064
|
-
featureUnitId: string,
|
|
2065
|
-
analysis: string
|
|
2066
|
-
) {
|
|
2067
|
-
await mcpClient.submit_agent_decision({
|
|
2068
|
-
decision: analysis,
|
|
2069
|
-
rationale: 'Analysis contribution from agent',
|
|
2070
|
-
context: {
|
|
2071
|
-
agent_id: agentId,
|
|
2072
|
-
feature_unit: featureUnitId,
|
|
2073
|
-
contribution_type: 'analysis'
|
|
2074
|
-
},
|
|
2075
|
-
decision_type: 'technical',
|
|
2076
|
-
timestamp: new Date().toISOString(),
|
|
2077
|
-
agent_id: agentId
|
|
2078
|
-
});
|
|
2079
|
-
}
|
|
2080
|
-
|
|
2081
|
-
// Aggregate all agent analyses
|
|
2082
|
-
async function aggregateAgentAnalyses(featureUnitId: string) {
|
|
2083
|
-
const analyses = await mcpClient.query_codebase_entities({
|
|
2084
|
-
entity_type: 'agent_decision',
|
|
2085
|
-
filters: {
|
|
2086
|
-
'context.feature_unit': featureUnitId,
|
|
2087
|
-
'context.contribution_type': 'analysis'
|
|
2088
|
-
},
|
|
2089
|
-
order_by: 'timestamp',
|
|
2090
|
-
order: 'asc'
|
|
2091
|
-
});
|
|
2092
|
-
|
|
2093
|
-
return {
|
|
2094
|
-
feature_unit_id: featureUnitId,
|
|
2095
|
-
total_analyses: analyses.entities.length,
|
|
2096
|
-
agents_contributed: new Set(analyses.entities.map(e => e.snapshot.agent_id)).size,
|
|
2097
|
-
analyses: analyses.entities.map(e => ({
|
|
2098
|
-
agent: e.snapshot.agent_id,
|
|
2099
|
-
analysis: e.snapshot.decision,
|
|
2100
|
-
timestamp: e.snapshot.timestamp
|
|
2101
|
-
}))
|
|
2102
|
-
};
|
|
2103
|
-
}
|
|
2104
|
-
```
|
|
2105
|
-
|
|
2106
|
-
**Use Case**: Complex problem requiring multiple perspectives or expertise areas.
|
|
2107
|
-
|
|
2108
|
-
### Agent Coordination Patterns
|
|
2109
|
-
|
|
2110
|
-
#### Pattern: Work Queue
|
|
2111
|
-
|
|
2112
|
-
Agents pull tasks from shared queue:
|
|
2113
|
-
|
|
2114
|
-
```typescript
|
|
2115
|
-
async function pullNextTask(agentId: string) {
|
|
2116
|
-
// Query available tasks
|
|
2117
|
-
const tasks = await mcpClient.query_codebase_entities({
|
|
2118
|
-
entity_type: 'feature_unit',
|
|
2119
|
-
filters: { status: 'planning' },
|
|
2120
|
-
limit: 1
|
|
2121
|
-
});
|
|
2122
|
-
|
|
2123
|
-
if (tasks.entities.length === 0) {
|
|
2124
|
-
return null;
|
|
2125
|
-
}
|
|
2126
|
-
|
|
2127
|
-
const task = tasks.entities[0];
|
|
2128
|
-
|
|
2129
|
-
// Claim task by updating status
|
|
2130
|
-
await mcpClient.submit_feature_unit({
|
|
2131
|
-
...task.snapshot,
|
|
2132
|
-
status: 'in_progress',
|
|
2133
|
-
updated_at: new Date().toISOString()
|
|
2134
|
-
});
|
|
2135
|
-
|
|
2136
|
-
// Record session start
|
|
2137
|
-
await mcpClient.submit_agent_session({
|
|
2138
|
-
session_id: generateSessionId(),
|
|
2139
|
-
actions: [{
|
|
2140
|
-
type: 'claim_task',
|
|
2141
|
-
result: 'success',
|
|
2142
|
-
details: { task_id: task.snapshot.id, agent_id: agentId }
|
|
2143
|
-
}],
|
|
2144
|
-
started_at: new Date().toISOString()
|
|
2145
|
-
});
|
|
2146
|
-
|
|
2147
|
-
return task.snapshot;
|
|
2148
|
-
}
|
|
2149
|
-
```
|
|
2150
|
-
|
|
2151
|
-
#### Pattern: Consensus Building
|
|
2152
|
-
|
|
2153
|
-
Multiple agents vote or provide input on decisions:
|
|
2154
|
-
|
|
2155
|
-
```typescript
|
|
2156
|
-
async function agentVoteOnDecision(
|
|
2157
|
-
agentId: string,
|
|
2158
|
-
proposedDecision: string,
|
|
2159
|
-
vote: 'approve' | 'reject' | 'abstain',
|
|
2160
|
-
reason: string
|
|
2161
|
-
) {
|
|
2162
|
-
await mcpClient.submit_agent_decision({
|
|
2163
|
-
decision: `Vote: ${vote} on "${proposedDecision}"`,
|
|
2164
|
-
rationale: reason,
|
|
2165
|
-
context: {
|
|
2166
|
-
agent_id: agentId,
|
|
2167
|
-
vote_type: vote,
|
|
2168
|
-
proposed_decision: proposedDecision
|
|
2169
|
-
},
|
|
2170
|
-
decision_type: 'process',
|
|
2171
|
-
timestamp: new Date().toISOString(),
|
|
2172
|
-
agent_id: agentId
|
|
2173
|
-
});
|
|
2174
|
-
}
|
|
2175
|
-
|
|
2176
|
-
async function tallyVotes(proposedDecision: string) {
|
|
2177
|
-
const votes = await mcpClient.query_codebase_entities({
|
|
2178
|
-
entity_type: 'agent_decision',
|
|
2179
|
-
filters: {
|
|
2180
|
-
'context.proposed_decision': proposedDecision
|
|
2181
|
-
}
|
|
2182
|
-
});
|
|
2183
|
-
|
|
2184
|
-
const tally = {
|
|
2185
|
-
approve: votes.entities.filter(e => e.snapshot.context?.vote_type === 'approve').length,
|
|
2186
|
-
reject: votes.entities.filter(e => e.snapshot.context?.vote_type === 'reject').length,
|
|
2187
|
-
abstain: votes.entities.filter(e => e.snapshot.context?.vote_type === 'abstain').length
|
|
2188
|
-
};
|
|
2189
|
-
|
|
2190
|
-
return {
|
|
2191
|
-
proposed_decision: proposedDecision,
|
|
2192
|
-
votes: tally,
|
|
2193
|
-
total_votes: tally.approve + tally.reject + tally.abstain,
|
|
2194
|
-
decision: tally.approve > tally.reject ? 'approved' : 'rejected'
|
|
2195
|
-
};
|
|
2196
|
-
}
|
|
2197
|
-
```
|
|
2198
|
-
|
|
2199
|
-
#### Pattern: Status Broadcasting
|
|
2200
|
-
|
|
2201
|
-
Agents broadcast status for coordination:
|
|
2202
|
-
|
|
2203
|
-
```typescript
|
|
2204
|
-
async function broadcastAgentStatus(agentId: string, status: string, details: any) {
|
|
2205
|
-
await mcpClient.submit_agent_decision({
|
|
2206
|
-
decision: `Agent status: ${status}`,
|
|
2207
|
-
rationale: 'Status broadcast for coordination',
|
|
2208
|
-
context: {
|
|
2209
|
-
agent_id: agentId,
|
|
2210
|
-
status,
|
|
2211
|
-
broadcast_type: 'status_update',
|
|
2212
|
-
...details
|
|
2213
|
-
},
|
|
2214
|
-
decision_type: 'process',
|
|
2215
|
-
timestamp: new Date().toISOString(),
|
|
2216
|
-
agent_id: agentId
|
|
2217
|
-
});
|
|
2218
|
-
}
|
|
2219
|
-
|
|
2220
|
-
async function queryAgentStatuses() {
|
|
2221
|
-
const statuses = await mcpClient.query_codebase_entities({
|
|
2222
|
-
entity_type: 'agent_decision',
|
|
2223
|
-
filters: {
|
|
2224
|
-
'context.broadcast_type': 'status_update'
|
|
2225
|
-
},
|
|
2226
|
-
order_by: 'timestamp',
|
|
2227
|
-
order: 'desc',
|
|
2228
|
-
limit: 20
|
|
2229
|
-
});
|
|
2230
|
-
|
|
2231
|
-
return statuses.entities.map(e => ({
|
|
2232
|
-
agent: e.snapshot.agent_id,
|
|
2233
|
-
status: e.snapshot.context?.status,
|
|
2234
|
-
timestamp: e.snapshot.timestamp
|
|
2235
|
-
}));
|
|
2236
|
-
}
|
|
2237
|
-
```
|
|
2238
|
-
|
|
2239
|
-
### Multi-Agent Best Practices
|
|
2240
|
-
|
|
2241
|
-
**DO:**
|
|
2242
|
-
- ✅ Use entity resolution for coordination (same entity across agents)
|
|
2243
|
-
- ✅ Query before updating to avoid conflicts
|
|
2244
|
-
- ✅ Record decisions for transparency
|
|
2245
|
-
- ✅ Use agent_id consistently
|
|
2246
|
-
- ✅ Leverage timeline queries for coordination context
|
|
2247
|
-
- ✅ Use checkpoints for handoffs between agents
|
|
2248
|
-
|
|
2249
|
-
**DON'T:**
|
|
2250
|
-
- ❌ Update entities without querying first
|
|
2251
|
-
- ❌ Assume exclusive access to entities
|
|
2252
|
-
- ❌ Skip recording agent decisions
|
|
2253
|
-
- ❌ Use inconsistent agent IDs
|
|
2254
|
-
- ❌ Ignore context from other agents
|
|
2255
|
-
|
|
2256
|
-
### Conflict Resolution
|
|
2257
|
-
|
|
2258
|
-
When multiple agents update the same entity:
|
|
2259
|
-
|
|
2260
|
-
```typescript
|
|
2261
|
-
async function updateWithConflictDetection(entityType: string, entityId: string, updates: any) {
|
|
2262
|
-
// Query current state
|
|
2263
|
-
const current = await mcpClient.query_codebase_entities({
|
|
2264
|
-
entity_type: entityType,
|
|
2265
|
-
filters: { id: entityId },
|
|
2266
|
-
limit: 1
|
|
2267
|
-
});
|
|
2268
|
-
|
|
2269
|
-
if (current.entities.length === 0) {
|
|
2270
|
-
throw new Error(`Entity ${entityId} not found`);
|
|
2271
|
-
}
|
|
2272
|
-
|
|
2273
|
-
const currentSnapshot = current.entities[0].snapshot;
|
|
2274
|
-
|
|
2275
|
-
// Check if entity was updated since we last saw it
|
|
2276
|
-
if (currentSnapshot.updated_at !== updates.expected_updated_at) {
|
|
2277
|
-
console.warn('Conflict detected: entity was updated by another agent');
|
|
2278
|
-
|
|
2279
|
-
// Query who updated it
|
|
2280
|
-
const timeline = await mcpClient.list_timeline_events({
|
|
2281
|
-
entity_id: entityId,
|
|
2282
|
-
start_date: updates.expected_updated_at.split('T')[0],
|
|
2283
|
-
end_date: new Date().toISOString().split('T')[0]
|
|
2284
|
-
});
|
|
2285
|
-
|
|
2286
|
-
console.log('Recent updates:', timeline.events);
|
|
2287
|
-
|
|
2288
|
-
// Decision: merge or abort
|
|
2289
|
-
// For now, proceed with update (last write wins)
|
|
2290
|
-
}
|
|
2291
|
-
|
|
2292
|
-
// Submit update
|
|
2293
|
-
await mcpClient.submit_feature_unit({
|
|
2294
|
-
...currentSnapshot,
|
|
2295
|
-
...updates,
|
|
2296
|
-
updated_at: new Date().toISOString()
|
|
2297
|
-
});
|
|
2298
|
-
}
|
|
2299
|
-
```
|
|
2300
|
-
|
|
2301
|
-
## Evaluation Patterns
|
|
2302
|
-
|
|
2303
|
-
**Agent Skills Reference**: [evaluation](https://github.com/muratcankoylan/Agent-Skills-for-Context-Engineering/blob/main/skills/evaluation) and [advanced-evaluation](https://github.com/muratcankoylan/Agent-Skills-for-Context-Engineering/blob/main/skills/advanced-evaluation) skills
|
|
2304
|
-
|
|
2305
|
-
### Overview
|
|
2306
|
-
|
|
2307
|
-
Neotoma enables comprehensive evaluation of agent performance through structured tracking of:
|
|
2308
|
-
- **Agent Performance Metrics**: Task completion rates, validation pass rates, session outcomes
|
|
2309
|
-
- **Quality Scoring**: Validation results, test coverage, compliance checks
|
|
2310
|
-
- **Benchmark Tasks**: Feature Unit completion, release readiness, acceptance criteria
|
|
2311
|
-
- **Historical Analysis**: Agent effectiveness over time, improvement tracking
|
|
2312
|
-
- **LLM-as-Judge Patterns**: Agent decisions evaluated against quality criteria
|
|
2313
|
-
|
|
2314
|
-
This section implements Agent Skills evaluation principles: test frameworks, performance metrics, quality measurement, and LLM-as-judge techniques (direct scoring, pairwise comparison, rubric generation, bias mitigation).
|
|
2315
|
-
|
|
2316
|
-
### Agent Performance Metrics
|
|
2317
|
-
|
|
2318
|
-
#### Task Completion Rate
|
|
2319
|
-
|
|
2320
|
-
Track how many tasks agents complete successfully:
|
|
2321
|
-
|
|
2322
|
-
```typescript
|
|
2323
|
-
async function calculateTaskCompletionRate(agentId: string, startDate: Date, endDate: Date) {
|
|
2324
|
-
// Query all sessions for agent
|
|
2325
|
-
const sessions = await mcpClient.query_codebase_entities({
|
|
2326
|
-
entity_type: 'agent_session',
|
|
2327
|
-
filters: {
|
|
2328
|
-
'actions.agent_id': agentId,
|
|
2329
|
-
started_at: {
|
|
2330
|
-
gte: startDate.toISOString(),
|
|
2331
|
-
lte: endDate.toISOString()
|
|
2332
|
-
}
|
|
2333
|
-
}
|
|
2334
|
-
});
|
|
2335
|
-
|
|
2336
|
-
// Calculate completion rate
|
|
2337
|
-
const totalTasks = sessions.entities.reduce((sum, s) => sum + s.snapshot.actions.length, 0);
|
|
2338
|
-
const successfulTasks = sessions.entities.reduce((sum, s) => {
|
|
2339
|
-
return sum + s.snapshot.actions.filter(a => a.result === 'success').length;
|
|
2340
|
-
}, 0);
|
|
2341
|
-
|
|
2342
|
-
return {
|
|
2343
|
-
total_tasks: totalTasks,
|
|
2344
|
-
successful_tasks: successfulTasks,
|
|
2345
|
-
completion_rate: totalTasks > 0 ? (successfulTasks / totalTasks) * 100 : 0
|
|
2346
|
-
};
|
|
2347
|
-
}
|
|
2348
|
-
```
|
|
2349
|
-
|
|
2350
|
-
#### Validation Pass Rate
|
|
2351
|
-
|
|
2352
|
-
Track validation results over time:
|
|
2353
|
-
|
|
2354
|
-
```typescript
|
|
2355
|
-
async function calculateValidationPassRate(target: string, startDate: Date, endDate: Date) {
|
|
2356
|
-
// Query validation results
|
|
2357
|
-
const validations = await mcpClient.query_codebase_entities({
|
|
2358
|
-
entity_type: 'validation_result',
|
|
2359
|
-
filters: {
|
|
2360
|
-
target: target,
|
|
2361
|
-
timestamp: {
|
|
2362
|
-
gte: startDate.toISOString(),
|
|
2363
|
-
lte: endDate.toISOString()
|
|
2364
|
-
}
|
|
2365
|
-
}
|
|
2366
|
-
});
|
|
2367
|
-
|
|
2368
|
-
// Calculate pass rate
|
|
2369
|
-
const total = validations.entities.length;
|
|
2370
|
-
const passed = validations.entities.filter(v => v.snapshot.status === 'passed').length;
|
|
2371
|
-
const failed = validations.entities.filter(v => v.snapshot.status === 'failed').length;
|
|
2372
|
-
|
|
2373
|
-
return {
|
|
2374
|
-
total_validations: total,
|
|
2375
|
-
passed: passed,
|
|
2376
|
-
failed: failed,
|
|
2377
|
-
pass_rate: total > 0 ? (passed / total) * 100 : 0,
|
|
2378
|
-
fail_rate: total > 0 ? (failed / total) * 100 : 0
|
|
2379
|
-
};
|
|
2380
|
-
}
|
|
2381
|
-
```
|
|
2382
|
-
|
|
2383
|
-
#### Session Success Metrics
|
|
2384
|
-
|
|
2385
|
-
Track session-level outcomes:
|
|
2386
|
-
|
|
2387
|
-
```typescript
|
|
2388
|
-
async function calculateSessionMetrics(startDate: Date, endDate: Date) {
|
|
2389
|
-
const sessions = await mcpClient.query_codebase_entities({
|
|
2390
|
-
entity_type: 'agent_session',
|
|
2391
|
-
filters: {
|
|
2392
|
-
started_at: {
|
|
2393
|
-
gte: startDate.toISOString(),
|
|
2394
|
-
lte: endDate.toISOString()
|
|
2395
|
-
}
|
|
2396
|
-
}
|
|
2397
|
-
});
|
|
2398
|
-
|
|
2399
|
-
const metrics = {
|
|
2400
|
-
total_sessions: sessions.entities.length,
|
|
2401
|
-
sessions_with_outcomes: sessions.entities.filter(s =>
|
|
2402
|
-
s.snapshot.outcomes && s.snapshot.outcomes.length > 0
|
|
2403
|
-
).length,
|
|
2404
|
-
average_duration: sessions.entities.reduce((sum, s) =>
|
|
2405
|
-
sum + (s.snapshot.duration || 0), 0
|
|
2406
|
-
) / sessions.entities.length,
|
|
2407
|
-
average_actions_per_session: sessions.entities.reduce((sum, s) =>
|
|
2408
|
-
sum + s.snapshot.actions.length, 0
|
|
2409
|
-
) / sessions.entities.length,
|
|
2410
|
-
checkpoint_usage_rate: sessions.entities.filter(s =>
|
|
2411
|
-
s.snapshot.checkpoints && s.snapshot.checkpoints.length > 0
|
|
2412
|
-
).length / sessions.entities.length
|
|
2413
|
-
};
|
|
2414
|
-
|
|
2415
|
-
return metrics;
|
|
2416
|
-
}
|
|
2417
|
-
```
|
|
2418
|
-
|
|
2419
|
-
### Quality Scoring
|
|
2420
|
-
|
|
2421
|
-
#### Feature Unit Quality Score
|
|
2422
|
-
|
|
2423
|
-
Score Feature Units based on validation results:
|
|
2424
|
-
|
|
2425
|
-
```typescript
|
|
2426
|
-
async function calculateFeatureUnitQualityScore(featureUnitId: string) {
|
|
2427
|
-
// Get Feature Unit
|
|
2428
|
-
const featureUnit = await getFeatureUnit(featureUnitId);
|
|
2429
|
-
|
|
2430
|
-
// Get all validation results
|
|
2431
|
-
const validations = await mcpClient.query_codebase_entities({
|
|
2432
|
-
entity_type: 'validation_result',
|
|
2433
|
-
filters: { target: featureUnitId }
|
|
2434
|
-
});
|
|
2435
|
-
|
|
2436
|
-
// Calculate quality score
|
|
2437
|
-
const validationTypes = ['lint', 'test', 'security', 'compliance'];
|
|
2438
|
-
const scores = validationTypes.map(type => {
|
|
2439
|
-
const typeValidations = validations.entities.filter(v =>
|
|
2440
|
-
v.snapshot.validation_type === type
|
|
2441
|
-
);
|
|
2442
|
-
|
|
2443
|
-
if (typeValidations.length === 0) return null;
|
|
2444
|
-
|
|
2445
|
-
const latest = typeValidations.sort((a, b) =>
|
|
2446
|
-
new Date(b.snapshot.timestamp).getTime() - new Date(a.snapshot.timestamp).getTime()
|
|
2447
|
-
)[0];
|
|
2448
|
-
|
|
2449
|
-
return {
|
|
2450
|
-
type,
|
|
2451
|
-
status: latest.snapshot.status,
|
|
2452
|
-
score: latest.snapshot.status === 'passed' ? 100 :
|
|
2453
|
-
latest.snapshot.status === 'warning' ? 75 : 0
|
|
2454
|
-
};
|
|
2455
|
-
}).filter(s => s !== null);
|
|
2456
|
-
|
|
2457
|
-
const averageScore = scores.reduce((sum, s) => sum + s.score, 0) / scores.length;
|
|
2458
|
-
|
|
2459
|
-
return {
|
|
2460
|
-
feature_unit_id: featureUnitId,
|
|
2461
|
-
quality_score: averageScore,
|
|
2462
|
-
validation_scores: scores,
|
|
2463
|
-
status: featureUnit?.status
|
|
2464
|
-
};
|
|
2465
|
-
}
|
|
2466
|
-
```
|
|
2467
|
-
|
|
2468
|
-
#### Release Readiness Score
|
|
2469
|
-
|
|
2470
|
-
Score release readiness based on acceptance criteria and Feature Unit quality:
|
|
2471
|
-
|
|
2472
|
-
```typescript
|
|
2473
|
-
async function calculateReleaseReadinessScore(releaseId: string) {
|
|
2474
|
-
// Get release
|
|
2475
|
-
const release = await mcpClient.query_codebase_entities({
|
|
2476
|
-
entity_type: 'release',
|
|
2477
|
-
filters: { id: releaseId },
|
|
2478
|
-
limit: 1
|
|
2479
|
-
});
|
|
2480
|
-
|
|
2481
|
-
if (release.entities.length === 0) return null;
|
|
2482
|
-
|
|
2483
|
-
const releaseData = release.entities[0].snapshot;
|
|
2484
|
-
|
|
2485
|
-
// Get Feature Unit quality scores
|
|
2486
|
-
const featureUnitScores = await Promise.all(
|
|
2487
|
-
releaseData.feature_units.map(async (fuId: string) => {
|
|
2488
|
-
return await calculateFeatureUnitQualityScore(fuId);
|
|
2489
|
-
})
|
|
2490
|
-
);
|
|
2491
|
-
|
|
2492
|
-
// Calculate readiness score
|
|
2493
|
-
const avgFeatureUnitScore = featureUnitScores.reduce((sum, s) =>
|
|
2494
|
-
sum + (s?.quality_score || 0), 0
|
|
2495
|
-
) / featureUnitScores.length;
|
|
2496
|
-
|
|
2497
|
-
// Check acceptance criteria validation
|
|
2498
|
-
const acceptanceValidations = await mcpClient.query_codebase_entities({
|
|
2499
|
-
entity_type: 'validation_result',
|
|
2500
|
-
filters: {
|
|
2501
|
-
target: releaseId,
|
|
2502
|
-
validation_type: 'acceptance_criteria'
|
|
2503
|
-
}
|
|
2504
|
-
});
|
|
2505
|
-
|
|
2506
|
-
const acceptanceScore = acceptanceValidations.entities.length > 0 ?
|
|
2507
|
-
acceptanceValidations.entities.filter(v => v.snapshot.status === 'passed').length /
|
|
2508
|
-
acceptanceValidations.entities.length * 100 : 0;
|
|
2509
|
-
|
|
2510
|
-
return {
|
|
2511
|
-
release_id: releaseId,
|
|
2512
|
-
readiness_score: (avgFeatureUnitScore * 0.7) + (acceptanceScore * 0.3),
|
|
2513
|
-
feature_unit_scores: featureUnitScores,
|
|
2514
|
-
acceptance_criteria_score: acceptanceScore,
|
|
2515
|
-
status: releaseData.status
|
|
2516
|
-
};
|
|
2517
|
-
}
|
|
2518
|
-
```
|
|
2519
|
-
|
|
2520
|
-
### Benchmark Tasks
|
|
2521
|
-
|
|
2522
|
-
#### Feature Unit Completion Benchmark
|
|
2523
|
-
|
|
2524
|
-
Track Feature Unit completion time and quality:
|
|
2525
|
-
|
|
2526
|
-
```typescript
|
|
2527
|
-
async function benchmarkFeatureUnitCompletion(featureUnitId: string) {
|
|
2528
|
-
// Get Feature Unit timeline
|
|
2529
|
-
const timeline = await mcpClient.list_timeline_events({
|
|
2530
|
-
entity_id: featureUnitId
|
|
2531
|
-
});
|
|
2532
|
-
|
|
2533
|
-
// Find key events
|
|
2534
|
-
const created = timeline.events.find(e => e.event_type === 'created');
|
|
2535
|
-
const completed = timeline.events.find(e =>
|
|
2536
|
-
e.description.includes('completed') || e.description.includes('deployed')
|
|
2537
|
-
);
|
|
2538
|
-
|
|
2539
|
-
if (!created || !completed) return null;
|
|
2540
|
-
|
|
2541
|
-
// Calculate duration
|
|
2542
|
-
const duration = new Date(completed.timestamp).getTime() -
|
|
2543
|
-
new Date(created.timestamp).getTime();
|
|
2544
|
-
const durationDays = duration / (1000 * 60 * 60 * 24);
|
|
2545
|
-
|
|
2546
|
-
// Get quality score
|
|
2547
|
-
const qualityScore = await calculateFeatureUnitQualityScore(featureUnitId);
|
|
2548
|
-
|
|
2549
|
-
return {
|
|
2550
|
-
feature_unit_id: featureUnitId,
|
|
2551
|
-
duration_days: durationDays,
|
|
2552
|
-
quality_score: qualityScore?.quality_score || 0,
|
|
2553
|
-
status: completed.description,
|
|
2554
|
-
benchmark: {
|
|
2555
|
-
fast: durationDays < 7,
|
|
2556
|
-
high_quality: (qualityScore?.quality_score || 0) >= 90,
|
|
2557
|
-
on_time: durationDays <= 14
|
|
2558
|
-
}
|
|
2559
|
-
};
|
|
2560
|
-
}
|
|
2561
|
-
```
|
|
2562
|
-
|
|
2563
|
-
#### Agent Decision Quality Benchmark
|
|
2564
|
-
|
|
2565
|
-
Evaluate agent decision quality over time:
|
|
2566
|
-
|
|
2567
|
-
```typescript
|
|
2568
|
-
async function benchmarkAgentDecisionQuality(agentId: string, days: number = 30) {
|
|
2569
|
-
const startDate = new Date();
|
|
2570
|
-
startDate.setDate(startDate.getDate() - days);
|
|
2571
|
-
|
|
2572
|
-
// Query agent decisions
|
|
2573
|
-
const decisions = await mcpClient.query_codebase_entities({
|
|
2574
|
-
entity_type: 'agent_decision',
|
|
2575
|
-
filters: {
|
|
2576
|
-
agent_id: agentId,
|
|
2577
|
-
timestamp: {
|
|
2578
|
-
gte: startDate.toISOString()
|
|
2579
|
-
}
|
|
2580
|
-
},
|
|
2581
|
-
order_by: 'timestamp',
|
|
2582
|
-
order: 'desc'
|
|
2583
|
-
});
|
|
2584
|
-
|
|
2585
|
-
// Analyze decision quality
|
|
2586
|
-
const metrics = {
|
|
2587
|
-
total_decisions: decisions.entities.length,
|
|
2588
|
-
architectural_decisions: decisions.entities.filter(d =>
|
|
2589
|
-
d.snapshot.decision_type === 'architectural'
|
|
2590
|
-
).length,
|
|
2591
|
-
technical_decisions: decisions.entities.filter(d =>
|
|
2592
|
-
d.snapshot.decision_type === 'technical'
|
|
2593
|
-
).length,
|
|
2594
|
-
decisions_with_rationale: decisions.entities.filter(d =>
|
|
2595
|
-
d.snapshot.rationale && d.snapshot.rationale.length > 50
|
|
2596
|
-
).length,
|
|
2597
|
-
decisions_with_context: decisions.entities.filter(d =>
|
|
2598
|
-
d.snapshot.context && Object.keys(d.snapshot.context).length > 0
|
|
2599
|
-
).length
|
|
2600
|
-
};
|
|
2601
|
-
|
|
2602
|
-
// Calculate quality score
|
|
2603
|
-
const qualityScore = (
|
|
2604
|
-
(metrics.decisions_with_rationale / metrics.total_decisions) * 0.5 +
|
|
2605
|
-
(metrics.decisions_with_context / metrics.total_decisions) * 0.5
|
|
2606
|
-
) * 100;
|
|
2607
|
-
|
|
2608
|
-
return {
|
|
2609
|
-
agent_id: agentId,
|
|
2610
|
-
period_days: days,
|
|
2611
|
-
metrics,
|
|
2612
|
-
quality_score: qualityScore
|
|
2613
|
-
};
|
|
2614
|
-
}
|
|
2615
|
-
```
|
|
2616
|
-
|
|
2617
|
-
### Historical Analysis
|
|
2618
|
-
|
|
2619
|
-
#### Agent Effectiveness Over Time
|
|
2620
|
-
|
|
2621
|
-
Track agent performance trends:
|
|
2622
|
-
|
|
2623
|
-
```typescript
|
|
2624
|
-
async function analyzeAgentEffectivenessOverTime(agentId: string, months: number = 3) {
|
|
2625
|
-
const startDate = new Date();
|
|
2626
|
-
startDate.setMonth(startDate.getMonth() - months);
|
|
2627
|
-
|
|
2628
|
-
// Get monthly metrics
|
|
2629
|
-
const monthlyMetrics = [];
|
|
2630
|
-
|
|
2631
|
-
for (let i = 0; i < months; i++) {
|
|
2632
|
-
const monthStart = new Date(startDate);
|
|
2633
|
-
monthStart.setMonth(monthStart.getMonth() + i);
|
|
2634
|
-
const monthEnd = new Date(monthStart);
|
|
2635
|
-
monthEnd.setMonth(monthEnd.getMonth() + 1);
|
|
2636
|
-
|
|
2637
|
-
const taskMetrics = await calculateTaskCompletionRate(agentId, monthStart, monthEnd);
|
|
2638
|
-
const sessionMetrics = await calculateSessionMetrics(monthStart, monthEnd);
|
|
2639
|
-
|
|
2640
|
-
monthlyMetrics.push({
|
|
2641
|
-
month: monthStart.toISOString().substring(0, 7),
|
|
2642
|
-
task_completion_rate: taskMetrics.completion_rate,
|
|
2643
|
-
average_session_duration: sessionMetrics.average_duration,
|
|
2644
|
-
actions_per_session: sessionMetrics.average_actions_per_session
|
|
2645
|
-
});
|
|
2646
|
-
}
|
|
2647
|
-
|
|
2648
|
-
// Calculate trends
|
|
2649
|
-
const completionTrend = monthlyMetrics.map(m => m.task_completion_rate);
|
|
2650
|
-
const improving = completionTrend[completionTrend.length - 1] > completionTrend[0];
|
|
2651
|
-
|
|
2652
|
-
return {
|
|
2653
|
-
agent_id: agentId,
|
|
2654
|
-
period_months: months,
|
|
2655
|
-
monthly_metrics: monthlyMetrics,
|
|
2656
|
-
trend: {
|
|
2657
|
-
improving,
|
|
2658
|
-
completion_rate_change: completionTrend[completionTrend.length - 1] - completionTrend[0]
|
|
2659
|
-
}
|
|
2660
|
-
};
|
|
2661
|
-
}
|
|
2662
|
-
```
|
|
2663
|
-
|
|
2664
|
-
### LLM-as-Judge Patterns
|
|
2665
|
-
|
|
2666
|
-
#### Decision Evaluation
|
|
2667
|
-
|
|
2668
|
-
Use validation results to evaluate agent decisions:
|
|
2669
|
-
|
|
2670
|
-
```typescript
|
|
2671
|
-
async function evaluateAgentDecision(decisionId: string) {
|
|
2672
|
-
// Get decision
|
|
2673
|
-
const decisions = await mcpClient.query_codebase_entities({
|
|
2674
|
-
entity_type: 'agent_decision',
|
|
2675
|
-
filters: { id: decisionId },
|
|
2676
|
-
limit: 1
|
|
2677
|
-
});
|
|
2678
|
-
|
|
2679
|
-
if (decisions.entities.length === 0) return null;
|
|
2680
|
-
|
|
2681
|
-
const decision = decisions.entities[0].snapshot;
|
|
2682
|
-
|
|
2683
|
-
// Get related validation results (LLM-as-judge)
|
|
2684
|
-
const validations = await mcpClient.query_codebase_entities({
|
|
2685
|
-
entity_type: 'validation_result',
|
|
2686
|
-
filters: {
|
|
2687
|
-
'details.decision_id': decisionId,
|
|
2688
|
-
validation_type: 'custom'
|
|
2689
|
-
}
|
|
2690
|
-
});
|
|
2691
|
-
|
|
2692
|
-
// Evaluate decision quality
|
|
2693
|
-
const evaluation = {
|
|
2694
|
-
decision_id: decisionId,
|
|
2695
|
-
decision: decision.decision,
|
|
2696
|
-
has_rationale: decision.rationale && decision.rationale.length > 50,
|
|
2697
|
-
has_context: decision.context && Object.keys(decision.context).length > 0,
|
|
2698
|
-
has_alternatives: decision.alternatives && decision.alternatives.length > 0,
|
|
2699
|
-
llm_judge_score: validations.entities.length > 0 ?
|
|
2700
|
-
validations.entities.filter(v => v.snapshot.status === 'passed').length /
|
|
2701
|
-
validations.entities.length * 100 : null,
|
|
2702
|
-
quality_score: (
|
|
2703
|
-
(decision.rationale && decision.rationale.length > 50 ? 1 : 0) * 0.3 +
|
|
2704
|
-
(decision.context && Object.keys(decision.context).length > 0 ? 1 : 0) * 0.3 +
|
|
2705
|
-
(decision.alternatives && decision.alternatives.length > 0 ? 1 : 0) * 0.4
|
|
2706
|
-
) * 100
|
|
2707
|
-
};
|
|
2708
|
-
|
|
2709
|
-
return evaluation;
|
|
2710
|
-
}
|
|
2711
|
-
```
|
|
2712
|
-
|
|
2713
|
-
#### Feature Unit Quality Evaluation
|
|
2714
|
-
|
|
2715
|
-
Evaluate Feature Unit quality using multiple criteria:
|
|
2716
|
-
|
|
2717
|
-
```typescript
|
|
2718
|
-
async function evaluateFeatureUnitQuality(featureUnitId: string) {
|
|
2719
|
-
// Get Feature Unit
|
|
2720
|
-
const featureUnit = await getFeatureUnit(featureUnitId);
|
|
2721
|
-
|
|
2722
|
-
// Get all related data
|
|
2723
|
-
const [validations, decisions, timeline] = await Promise.all([
|
|
2724
|
-
mcpClient.query_codebase_entities({
|
|
2725
|
-
entity_type: 'validation_result',
|
|
2726
|
-
filters: { target: featureUnitId }
|
|
2727
|
-
}),
|
|
2728
|
-
mcpClient.query_codebase_entities({
|
|
2729
|
-
entity_type: 'agent_decision',
|
|
2730
|
-
filters: { 'context.feature_unit': featureUnitId }
|
|
2731
|
-
}),
|
|
2732
|
-
mcpClient.query_entity_timeline({
|
|
2733
|
-
entity_id: featureUnitId
|
|
2734
|
-
})
|
|
2735
|
-
]);
|
|
2736
|
-
|
|
2737
|
-
// Calculate quality metrics
|
|
2738
|
-
const validationScore = validations.entities.length > 0 ?
|
|
2739
|
-
validations.entities.filter(v => v.snapshot.status === 'passed').length /
|
|
2740
|
-
validations.entities.length * 100 : 0;
|
|
2741
|
-
|
|
2742
|
-
const decisionQuality = decisions.entities.length > 0 ?
|
|
2743
|
-
decisions.entities.filter(d =>
|
|
2744
|
-
d.snapshot.rationale && d.snapshot.rationale.length > 50
|
|
2745
|
-
).length / decisions.entities.length * 100 : 0;
|
|
2746
|
-
|
|
2747
|
-
const timelineCompleteness = timeline.events.length >= 3 ? 100 :
|
|
2748
|
-
(timeline.events.length / 3) * 100;
|
|
2749
|
-
|
|
2750
|
-
// Overall quality score
|
|
2751
|
-
const overallScore = (
|
|
2752
|
-
validationScore * 0.5 +
|
|
2753
|
-
decisionQuality * 0.3 +
|
|
2754
|
-
timelineCompleteness * 0.2
|
|
2755
|
-
);
|
|
2756
|
-
|
|
2757
|
-
return {
|
|
2758
|
-
feature_unit_id: featureUnitId,
|
|
2759
|
-
overall_quality_score: overallScore,
|
|
2760
|
-
validation_score: validationScore,
|
|
2761
|
-
decision_quality_score: decisionQuality,
|
|
2762
|
-
timeline_completeness_score: timelineCompleteness,
|
|
2763
|
-
status: featureUnit?.status
|
|
2764
|
-
};
|
|
2765
|
-
}
|
|
2766
|
-
```
|
|
2767
|
-
|
|
2768
|
-
### Evaluation Dashboard Queries
|
|
2769
|
-
|
|
2770
|
-
#### Performance Dashboard
|
|
2771
|
-
|
|
2772
|
-
Query all performance metrics for dashboard:
|
|
2773
|
-
|
|
2774
|
-
```typescript
|
|
2775
|
-
async function getPerformanceDashboard(startDate: Date, endDate: Date) {
|
|
2776
|
-
const [taskMetrics, sessionMetrics, validationMetrics] = await Promise.all([
|
|
2777
|
-
calculateTaskCompletionRate('all', startDate, endDate),
|
|
2778
|
-
calculateSessionMetrics(startDate, endDate),
|
|
2779
|
-
calculateValidationPassRate('all', startDate, endDate)
|
|
2780
|
-
]);
|
|
2781
|
-
|
|
2782
|
-
return {
|
|
2783
|
-
period: {
|
|
2784
|
-
start: startDate.toISOString(),
|
|
2785
|
-
end: endDate.toISOString()
|
|
2786
|
-
},
|
|
2787
|
-
task_completion: taskMetrics,
|
|
2788
|
-
session_metrics: sessionMetrics,
|
|
2789
|
-
validation_metrics: validationMetrics,
|
|
2790
|
-
overall_health: (
|
|
2791
|
-
taskMetrics.completion_rate * 0.4 +
|
|
2792
|
-
validationMetrics.pass_rate * 0.4 +
|
|
2793
|
-
(sessionMetrics.checkpoint_usage_rate * 100) * 0.2
|
|
2794
|
-
)
|
|
2795
|
-
};
|
|
2796
|
-
}
|
|
2797
|
-
```
|
|
2798
|
-
|
|
2799
|
-
### Advanced Evaluation Patterns
|
|
2800
|
-
|
|
2801
|
-
#### Pairwise Comparison
|
|
2802
|
-
|
|
2803
|
-
**Purpose**: Compare two outputs to determine which is better
|
|
2804
|
-
|
|
2805
|
-
**Implementation**:
|
|
2806
|
-
|
|
2807
|
-
```typescript
|
|
2808
|
-
async function pairwiseCompareFeatureUnits(fuId1: string, fuId2: string, criteria: string[]) {
|
|
2809
|
-
// Get both Feature Units with full context
|
|
2810
|
-
const [fu1, fu2] = await Promise.all([
|
|
2811
|
-
loadWorkContext(fuId1),
|
|
2812
|
-
loadWorkContext(fuId2)
|
|
2813
|
-
]);
|
|
2814
|
-
|
|
2815
|
-
// Compare on each criterion
|
|
2816
|
-
const comparisons = criteria.map(criterion => {
|
|
2817
|
-
let score1 = 0, score2 = 0;
|
|
2818
|
-
|
|
2819
|
-
switch (criterion) {
|
|
2820
|
-
case 'test_coverage':
|
|
2821
|
-
score1 = fu1.validations.filter(v =>
|
|
2822
|
-
v.type === 'test' && v.status === 'passed'
|
|
2823
|
-
).length;
|
|
2824
|
-
score2 = fu2.validations.filter(v =>
|
|
2825
|
-
v.type === 'test' && v.status === 'passed'
|
|
2826
|
-
).length;
|
|
2827
|
-
break;
|
|
2828
|
-
|
|
2829
|
-
case 'decision_quality':
|
|
2830
|
-
score1 = fu1.decisions.filter(d =>
|
|
2831
|
-
d.rationale && d.rationale.length > 50
|
|
2832
|
-
).length;
|
|
2833
|
-
score2 = fu2.decisions.filter(d =>
|
|
2834
|
-
d.rationale && d.rationale.length > 50
|
|
2835
|
-
).length;
|
|
2836
|
-
break;
|
|
2837
|
-
|
|
2838
|
-
case 'completion_speed':
|
|
2839
|
-
score1 = calculateCompletionSpeed(fu1.timeline);
|
|
2840
|
-
score2 = calculateCompletionSpeed(fu2.timeline);
|
|
2841
|
-
break;
|
|
2842
|
-
}
|
|
2843
|
-
|
|
2844
|
-
return {
|
|
2845
|
-
criterion,
|
|
2846
|
-
fu1_score: score1,
|
|
2847
|
-
fu2_score: score2,
|
|
2848
|
-
winner: score1 > score2 ? fuId1 : score2 > score1 ? fuId2 : 'tie'
|
|
2849
|
-
};
|
|
2850
|
-
});
|
|
2851
|
-
|
|
2852
|
-
// Overall winner (majority vote across criteria)
|
|
2853
|
-
const fu1Wins = comparisons.filter(c => c.winner === fuId1).length;
|
|
2854
|
-
const fu2Wins = comparisons.filter(c => c.winner === fuId2).length;
|
|
2855
|
-
|
|
2856
|
-
return {
|
|
2857
|
-
fu1: fuId1,
|
|
2858
|
-
fu2: fuId2,
|
|
2859
|
-
criteria: comparisons,
|
|
2860
|
-
overall_winner: fu1Wins > fu2Wins ? fuId1 : fu2Wins > fu1Wins ? fuId2 : 'tie',
|
|
2861
|
-
confidence: Math.abs(fu1Wins - fu2Wins) / criteria.length
|
|
2862
|
-
};
|
|
2863
|
-
}
|
|
2864
|
-
|
|
2865
|
-
// Mitigate position bias with swapped comparison
|
|
2866
|
-
async function pairwiseCompareWithBiasMitigation(fuId1: string, fuId2: string, criteria: string[]) {
|
|
2867
|
-
// Run comparison in both orders
|
|
2868
|
-
const comparison1 = await pairwiseCompareFeatureUnits(fuId1, fuId2, criteria);
|
|
2869
|
-
const comparison2 = await pairwiseCompareFeatureUnits(fuId2, fuId1, criteria);
|
|
2870
|
-
|
|
2871
|
-
// If results differ, position bias detected
|
|
2872
|
-
if (comparison1.overall_winner !== comparison2.overall_winner) {
|
|
2873
|
-
console.warn('Position bias detected in pairwise comparison');
|
|
2874
|
-
return { overall_winner: 'tie', position_bias_detected: true };
|
|
2875
|
-
}
|
|
2876
|
-
|
|
2877
|
-
return { ...comparison1, position_bias_detected: false };
|
|
2878
|
-
}
|
|
2879
|
-
```
|
|
2880
|
-
|
|
2881
|
-
#### Rubric Generation
|
|
2882
|
-
|
|
2883
|
-
**Purpose**: Generate domain-specific evaluation rubrics
|
|
2884
|
-
|
|
2885
|
-
**Implementation**:
|
|
2886
|
-
|
|
2887
|
-
```typescript
|
|
2888
|
-
interface EvaluationRubric {
|
|
2889
|
-
name: string;
|
|
2890
|
-
criteria: Array<{
|
|
2891
|
-
name: string;
|
|
2892
|
-
weight: number;
|
|
2893
|
-
levels: Array<{
|
|
2894
|
-
score: number;
|
|
2895
|
-
description: string;
|
|
2896
|
-
indicators: string[];
|
|
2897
|
-
}>;
|
|
2898
|
-
}>;
|
|
2899
|
-
}
|
|
2900
|
-
|
|
2901
|
-
async function generateFeatureUnitRubric(): Promise<EvaluationRubric> {
|
|
2902
|
-
// Analyze historical Feature Units to generate rubric
|
|
2903
|
-
const historicalFUs = await mcpClient.query_codebase_entities({
|
|
2904
|
-
entity_type: 'feature_unit',
|
|
2905
|
-
filters: { status: 'completed' },
|
|
2906
|
-
limit: 20
|
|
2907
|
-
});
|
|
2908
|
-
|
|
2909
|
-
// Analyze patterns
|
|
2910
|
-
const avgValidations = historicalFUs.entities.reduce((sum, fu) => {
|
|
2911
|
-
// Query validations for this FU
|
|
2912
|
-
return sum + 1; // Placeholder
|
|
2913
|
-
}, 0) / historicalFUs.entities.length;
|
|
2914
|
-
|
|
2915
|
-
// Generate rubric
|
|
2916
|
-
return {
|
|
2917
|
-
name: 'Feature Unit Quality Rubric',
|
|
2918
|
-
criteria: [
|
|
2919
|
-
{
|
|
2920
|
-
name: 'Test Coverage',
|
|
2921
|
-
weight: 0.3,
|
|
2922
|
-
levels: [
|
|
2923
|
-
{
|
|
2924
|
-
score: 100,
|
|
2925
|
-
description: 'Comprehensive test coverage',
|
|
2926
|
-
indicators: ['All tests passing', 'Unit + integration tests', 'Edge cases covered']
|
|
2927
|
-
},
|
|
2928
|
-
{
|
|
2929
|
-
score: 75,
|
|
2930
|
-
description: 'Good test coverage',
|
|
2931
|
-
indicators: ['Most tests passing', 'Unit tests present', 'Core functionality tested']
|
|
2932
|
-
},
|
|
2933
|
-
{
|
|
2934
|
-
score: 50,
|
|
2935
|
-
description: 'Basic test coverage',
|
|
2936
|
-
indicators: ['Some tests passing', 'Basic unit tests only']
|
|
2937
|
-
},
|
|
2938
|
-
{
|
|
2939
|
-
score: 0,
|
|
2940
|
-
description: 'No test coverage',
|
|
2941
|
-
indicators: ['No tests', 'Tests failing']
|
|
2942
|
-
}
|
|
2943
|
-
]
|
|
2944
|
-
},
|
|
2945
|
-
{
|
|
2946
|
-
name: 'Decision Quality',
|
|
2947
|
-
weight: 0.3,
|
|
2948
|
-
levels: [
|
|
2949
|
-
{
|
|
2950
|
-
score: 100,
|
|
2951
|
-
description: 'Excellent decision documentation',
|
|
2952
|
-
indicators: ['Rationale >100 chars', 'Context provided', 'Alternatives considered']
|
|
2953
|
-
},
|
|
2954
|
-
{
|
|
2955
|
-
score: 75,
|
|
2956
|
-
description: 'Good decision documentation',
|
|
2957
|
-
indicators: ['Rationale >50 chars', 'Context provided']
|
|
2958
|
-
},
|
|
2959
|
-
{
|
|
2960
|
-
score: 50,
|
|
2961
|
-
description: 'Basic decision documentation',
|
|
2962
|
-
indicators: ['Rationale present', 'Minimal context']
|
|
2963
|
-
},
|
|
2964
|
-
{
|
|
2965
|
-
score: 0,
|
|
2966
|
-
description: 'No decision documentation',
|
|
2967
|
-
indicators: ['No decisions recorded']
|
|
2968
|
-
}
|
|
2969
|
-
]
|
|
2970
|
-
},
|
|
2971
|
-
{
|
|
2972
|
-
name: 'Timeline Completeness',
|
|
2973
|
-
weight: 0.2,
|
|
2974
|
-
levels: [
|
|
2975
|
-
{
|
|
2976
|
-
score: 100,
|
|
2977
|
-
description: 'Complete timeline',
|
|
2978
|
-
indicators: ['Created event', 'Status updates', 'Completion event', '5+ events']
|
|
2979
|
-
},
|
|
2980
|
-
{
|
|
2981
|
-
score: 75,
|
|
2982
|
-
description: 'Good timeline',
|
|
2983
|
-
indicators: ['Created event', 'Completion event', '3+ events']
|
|
2984
|
-
},
|
|
2985
|
-
{
|
|
2986
|
-
score: 50,
|
|
2987
|
-
description: 'Basic timeline',
|
|
2988
|
-
indicators: ['Created event', 'Completion event']
|
|
2989
|
-
},
|
|
2990
|
-
{
|
|
2991
|
-
score: 0,
|
|
2992
|
-
description: 'Incomplete timeline',
|
|
2993
|
-
indicators: ['Missing key events']
|
|
2994
|
-
}
|
|
2995
|
-
]
|
|
2996
|
-
},
|
|
2997
|
-
{
|
|
2998
|
-
name: 'Validation Completeness',
|
|
2999
|
-
weight: 0.2,
|
|
3000
|
-
levels: [
|
|
3001
|
-
{
|
|
3002
|
-
score: 100,
|
|
3003
|
-
description: 'All validation types',
|
|
3004
|
-
indicators: ['Lint passed', 'Tests passed', 'Security passed', 'Compliance passed']
|
|
3005
|
-
},
|
|
3006
|
-
{
|
|
3007
|
-
score: 75,
|
|
3008
|
-
description: 'Core validations',
|
|
3009
|
-
indicators: ['Lint passed', 'Tests passed']
|
|
3010
|
-
},
|
|
3011
|
-
{
|
|
3012
|
-
score: 50,
|
|
3013
|
-
description: 'Basic validation',
|
|
3014
|
-
indicators: ['Tests passed']
|
|
3015
|
-
},
|
|
3016
|
-
{
|
|
3017
|
-
score: 0,
|
|
3018
|
-
description: 'No validation',
|
|
3019
|
-
indicators: ['No validations run']
|
|
3020
|
-
}
|
|
3021
|
-
]
|
|
3022
|
-
}
|
|
3023
|
-
]
|
|
3024
|
-
};
|
|
3025
|
-
}
|
|
3026
|
-
|
|
3027
|
-
// Apply rubric to Feature Unit
|
|
3028
|
-
async function evaluateFeatureUnitWithRubric(
|
|
3029
|
-
featureUnitId: string,
|
|
3030
|
-
rubric: EvaluationRubric
|
|
3031
|
-
): Promise<{ overall_score: number; criterion_scores: any[] }> {
|
|
3032
|
-
// Get Feature Unit with full context
|
|
3033
|
-
const context = await loadWorkContext(featureUnitId);
|
|
3034
|
-
|
|
3035
|
-
// Evaluate each criterion
|
|
3036
|
-
const criterionScores = rubric.criteria.map(criterion => {
|
|
3037
|
-
let score = 0;
|
|
3038
|
-
|
|
3039
|
-
switch (criterion.name) {
|
|
3040
|
-
case 'Test Coverage':
|
|
3041
|
-
const testValidations = context.validations.filter(v => v.type === 'test');
|
|
3042
|
-
const testsPassed = testValidations.filter(v => v.status === 'passed').length;
|
|
3043
|
-
score = testsPassed >= 2 ? 100 : testsPassed === 1 ? 75 : 0;
|
|
3044
|
-
break;
|
|
3045
|
-
|
|
3046
|
-
case 'Decision Quality':
|
|
3047
|
-
const qualityDecisions = context.decisions.filter(d =>
|
|
3048
|
-
d.rationale && d.rationale.length > 50
|
|
3049
|
-
).length;
|
|
3050
|
-
score = qualityDecisions >= 3 ? 100 : qualityDecisions >= 2 ? 75 : qualityDecisions >= 1 ? 50 : 0;
|
|
3051
|
-
break;
|
|
3052
|
-
|
|
3053
|
-
case 'Timeline Completeness':
|
|
3054
|
-
const eventCount = context.timeline.length;
|
|
3055
|
-
score = eventCount >= 5 ? 100 : eventCount >= 3 ? 75 : eventCount >= 2 ? 50 : 0;
|
|
3056
|
-
break;
|
|
3057
|
-
|
|
3058
|
-
case 'Validation Completeness':
|
|
3059
|
-
const validationTypes = new Set(context.validations.map(v => v.type));
|
|
3060
|
-
score = validationTypes.size >= 4 ? 100 : validationTypes.size >= 2 ? 75 : validationTypes.size >= 1 ? 50 : 0;
|
|
3061
|
-
break;
|
|
3062
|
-
}
|
|
3063
|
-
|
|
3064
|
-
return {
|
|
3065
|
-
criterion: criterion.name,
|
|
3066
|
-
weight: criterion.weight,
|
|
3067
|
-
score,
|
|
3068
|
-
weighted_score: score * criterion.weight
|
|
3069
|
-
};
|
|
3070
|
-
});
|
|
3071
|
-
|
|
3072
|
-
// Calculate overall score
|
|
3073
|
-
const overallScore = criterionScores.reduce((sum, c) => sum + c.weighted_score, 0);
|
|
3074
|
-
|
|
3075
|
-
return {
|
|
3076
|
-
overall_score: overallScore,
|
|
3077
|
-
criterion_scores: criterionScores
|
|
3078
|
-
};
|
|
3079
|
-
}
|
|
3080
|
-
```
|
|
3081
|
-
|
|
3082
|
-
#### Bias Mitigation
|
|
3083
|
-
|
|
3084
|
-
**Purpose**: Reduce bias in evaluation (position bias, verbosity bias, etc.)
|
|
3085
|
-
|
|
3086
|
-
**Implementation**:
|
|
3087
|
-
|
|
3088
|
-
```typescript
|
|
3089
|
-
// Position Bias Mitigation
|
|
3090
|
-
async function evaluateWithPositionBiasMitigation(
|
|
3091
|
-
entities: string[],
|
|
3092
|
-
evaluationFunction: (entity: string) => Promise<number>
|
|
3093
|
-
) {
|
|
3094
|
-
// Evaluate in original order
|
|
3095
|
-
const scores1 = [];
|
|
3096
|
-
for (const entity of entities) {
|
|
3097
|
-
scores1.push(await evaluationFunction(entity));
|
|
3098
|
-
}
|
|
3099
|
-
|
|
3100
|
-
// Evaluate in reversed order
|
|
3101
|
-
const reversed = [...entities].reverse();
|
|
3102
|
-
const scores2 = [];
|
|
3103
|
-
for (const entity of reversed) {
|
|
3104
|
-
scores2.push(await evaluationFunction(entity));
|
|
3105
|
-
}
|
|
3106
|
-
|
|
3107
|
-
// Average scores from both orders
|
|
3108
|
-
const finalScores = entities.map((entity, idx) => {
|
|
3109
|
-
const reverseIdx = entities.length - 1 - idx;
|
|
3110
|
-
return {
|
|
3111
|
-
entity,
|
|
3112
|
-
score: (scores1[idx] + scores2[reverseIdx]) / 2,
|
|
3113
|
-
position_bias: Math.abs(scores1[idx] - scores2[reverseIdx])
|
|
3114
|
-
};
|
|
3115
|
-
});
|
|
3116
|
-
|
|
3117
|
-
return finalScores;
|
|
3118
|
-
}
|
|
3119
|
-
|
|
3120
|
-
// Verbosity Bias Mitigation
|
|
3121
|
-
async function evaluateWithVerbosityControl(
|
|
3122
|
-
decision: any,
|
|
3123
|
-
maxRationaleLength: number = 200
|
|
3124
|
-
) {
|
|
3125
|
-
// Truncate verbose rationale for fair comparison
|
|
3126
|
-
const truncatedRationale = decision.rationale.substring(0, maxRationaleLength);
|
|
3127
|
-
|
|
3128
|
-
// Evaluate based on content, not length
|
|
3129
|
-
const contentScore = (
|
|
3130
|
-
(truncatedRationale.includes('because') ? 1 : 0) * 0.3 +
|
|
3131
|
-
(truncatedRationale.includes('enables') || truncatedRationale.includes('provides') ? 1 : 0) * 0.3 +
|
|
3132
|
-
(decision.alternatives && decision.alternatives.length > 0 ? 1 : 0) * 0.4
|
|
3133
|
-
) * 100;
|
|
3134
|
-
|
|
3135
|
-
return {
|
|
3136
|
-
decision_id: decision.id,
|
|
3137
|
-
content_score: contentScore,
|
|
3138
|
-
verbosity_controlled: decision.rationale.length > maxRationaleLength
|
|
3139
|
-
};
|
|
3140
|
-
}
|
|
3141
|
-
|
|
3142
|
-
// Reference-Based Evaluation
|
|
3143
|
-
async function evaluateAgainstReference(
|
|
3144
|
-
entityId: string,
|
|
3145
|
-
referenceId: string,
|
|
3146
|
-
criteria: string[]
|
|
3147
|
-
) {
|
|
3148
|
-
// Get entity and reference
|
|
3149
|
-
const [entity, reference] = await Promise.all([
|
|
3150
|
-
loadWorkContext(entityId),
|
|
3151
|
-
loadWorkContext(referenceId)
|
|
3152
|
-
]);
|
|
3153
|
-
|
|
3154
|
-
// Compare against reference on each criterion
|
|
3155
|
-
const scores = criteria.map(criterion => {
|
|
3156
|
-
const entityValue = getCriterionValue(entity, criterion);
|
|
3157
|
-
const referenceValue = getCriterionValue(reference, criterion);
|
|
3158
|
-
|
|
3159
|
-
// Calculate similarity score
|
|
3160
|
-
const similarity = calculateSimilarity(entityValue, referenceValue);
|
|
3161
|
-
|
|
3162
|
-
return {
|
|
3163
|
-
criterion,
|
|
3164
|
-
entity_value: entityValue,
|
|
3165
|
-
reference_value: referenceValue,
|
|
3166
|
-
similarity_score: similarity
|
|
3167
|
-
};
|
|
3168
|
-
});
|
|
3169
|
-
|
|
3170
|
-
const avgSimilarity = scores.reduce((sum, s) => sum + s.similarity_score, 0) / scores.length;
|
|
3171
|
-
|
|
3172
|
-
return {
|
|
3173
|
-
entity_id: entityId,
|
|
3174
|
-
reference_id: referenceId,
|
|
3175
|
-
similarity_to_reference: avgSimilarity,
|
|
3176
|
-
criterion_scores: scores
|
|
3177
|
-
};
|
|
3178
|
-
}
|
|
3179
|
-
|
|
3180
|
-
function getCriterionValue(context: any, criterion: string): number {
|
|
3181
|
-
switch (criterion) {
|
|
3182
|
-
case 'test_coverage':
|
|
3183
|
-
return context.validations.filter(v => v.type === 'test' && v.status === 'passed').length;
|
|
3184
|
-
case 'decision_quality':
|
|
3185
|
-
return context.decisions.filter(d => d.rationale && d.rationale.length > 50).length;
|
|
3186
|
-
case 'timeline_completeness':
|
|
3187
|
-
return context.timeline.length;
|
|
3188
|
-
default:
|
|
3189
|
-
return 0;
|
|
3190
|
-
}
|
|
3191
|
-
}
|
|
3192
|
-
|
|
3193
|
-
function calculateSimilarity(value1: number, value2: number): number {
|
|
3194
|
-
if (value2 === 0) return value1 === 0 ? 1.0 : 0.0;
|
|
3195
|
-
const ratio = Math.min(value1, value2) / Math.max(value1, value2);
|
|
3196
|
-
return ratio * 100;
|
|
3197
|
-
}
|
|
3198
|
-
```
|
|
3199
|
-
|
|
3200
|
-
#### LLM-as-Judge with Rubric
|
|
3201
|
-
|
|
3202
|
-
**Purpose**: Use LLM to evaluate against generated rubric
|
|
3203
|
-
|
|
3204
|
-
**Implementation**:
|
|
3205
|
-
|
|
3206
|
-
```typescript
|
|
3207
|
-
async function llmJudgeWithRubric(
|
|
3208
|
-
featureUnitId: string,
|
|
3209
|
-
rubric: EvaluationRubric
|
|
3210
|
-
): Promise<any> {
|
|
3211
|
-
// Get Feature Unit context
|
|
3212
|
-
const context = await loadWorkContext(featureUnitId);
|
|
3213
|
-
|
|
3214
|
-
// For each criterion, find matching level
|
|
3215
|
-
const evaluations = rubric.criteria.map(criterion => {
|
|
3216
|
-
// Get actual values for criterion
|
|
3217
|
-
const actualValue = getCriterionValue(context, criterion.name.toLowerCase().replace(' ', '_'));
|
|
3218
|
-
|
|
3219
|
-
// Find matching level in rubric
|
|
3220
|
-
let matchedLevel = criterion.levels[criterion.levels.length - 1]; // Default to lowest
|
|
3221
|
-
|
|
3222
|
-
for (const level of criterion.levels) {
|
|
3223
|
-
if (actualValue >= getRequiredValueForLevel(level)) {
|
|
3224
|
-
matchedLevel = level;
|
|
3225
|
-
break;
|
|
3226
|
-
}
|
|
3227
|
-
}
|
|
3228
|
-
|
|
3229
|
-
return {
|
|
3230
|
-
criterion: criterion.name,
|
|
3231
|
-
weight: criterion.weight,
|
|
3232
|
-
actual_value: actualValue,
|
|
3233
|
-
score: matchedLevel.score,
|
|
3234
|
-
level_description: matchedLevel.description,
|
|
3235
|
-
indicators_met: matchedLevel.indicators,
|
|
3236
|
-
weighted_score: matchedLevel.score * criterion.weight
|
|
3237
|
-
};
|
|
3238
|
-
});
|
|
3239
|
-
|
|
3240
|
-
const overallScore = evaluations.reduce((sum, e) => sum + e.weighted_score, 0);
|
|
3241
|
-
|
|
3242
|
-
// Store evaluation as validation result
|
|
3243
|
-
await mcpClient.submit_payload({
|
|
3244
|
-
capability_id: 'neotoma:submit_codebase_metadata:v1',
|
|
3245
|
-
body: {
|
|
3246
|
-
entity_type: 'validation_result',
|
|
3247
|
-
data: {
|
|
3248
|
-
validation_type: 'acceptance_criteria',
|
|
3249
|
-
status: overallScore >= 80 ? 'passed' : overallScore >= 60 ? 'warning' : 'failed',
|
|
3250
|
-
details: {
|
|
3251
|
-
overall_score: overallScore,
|
|
3252
|
-
criterion_evaluations: evaluations,
|
|
3253
|
-
rubric_name: rubric.name
|
|
3254
|
-
},
|
|
3255
|
-
target: featureUnitId,
|
|
3256
|
-
timestamp: new Date().toISOString()
|
|
3257
|
-
}
|
|
3258
|
-
}
|
|
3259
|
-
});
|
|
3260
|
-
|
|
3261
|
-
return {
|
|
3262
|
-
feature_unit_id: featureUnitId,
|
|
3263
|
-
overall_score: overallScore,
|
|
3264
|
-
evaluations,
|
|
3265
|
-
rubric: rubric.name
|
|
3266
|
-
};
|
|
3267
|
-
}
|
|
3268
|
-
|
|
3269
|
-
function getRequiredValueForLevel(level: any): number {
|
|
3270
|
-
// Map level score to required value (simplified)
|
|
3271
|
-
return level.score >= 100 ? 3 : level.score >= 75 ? 2 : level.score >= 50 ? 1 : 0;
|
|
3272
|
-
}
|
|
3273
|
-
```
|
|
3274
|
-
|
|
3275
|
-
#### Multi-Criteria Evaluation with Weights
|
|
3276
|
-
|
|
3277
|
-
**Purpose**: Evaluate using multiple weighted criteria
|
|
3278
|
-
|
|
3279
|
-
**Implementation**:
|
|
3280
|
-
|
|
3281
|
-
```typescript
|
|
3282
|
-
interface WeightedCriteria {
|
|
3283
|
-
[key: string]: {
|
|
3284
|
-
weight: number;
|
|
3285
|
-
threshold: number;
|
|
3286
|
-
};
|
|
3287
|
-
}
|
|
3288
|
-
|
|
3289
|
-
async function multiCriteriaEvaluation(
|
|
3290
|
-
featureUnitId: string,
|
|
3291
|
-
criteria: WeightedCriteria
|
|
3292
|
-
): Promise<any> {
|
|
3293
|
-
const context = await loadWorkContext(featureUnitId);
|
|
3294
|
-
|
|
3295
|
-
const scores = Object.entries(criteria).map(([name, config]) => {
|
|
3296
|
-
let rawScore = 0;
|
|
3297
|
-
|
|
3298
|
-
switch (name) {
|
|
3299
|
-
case 'test_coverage':
|
|
3300
|
-
const passedTests = context.validations.filter(v =>
|
|
3301
|
-
v.type === 'test' && v.status === 'passed'
|
|
3302
|
-
).length;
|
|
3303
|
-
rawScore = Math.min(passedTests / 2, 1) * 100; // Normalized to 0-100
|
|
3304
|
-
break;
|
|
3305
|
-
|
|
3306
|
-
case 'decision_quality':
|
|
3307
|
-
const qualityDecisions = context.decisions.filter(d =>
|
|
3308
|
-
d.rationale && d.rationale.length > 50
|
|
3309
|
-
).length;
|
|
3310
|
-
rawScore = Math.min(qualityDecisions / 3, 1) * 100;
|
|
3311
|
-
break;
|
|
3312
|
-
|
|
3313
|
-
case 'timeline_completeness':
|
|
3314
|
-
rawScore = Math.min(context.timeline.length / 5, 1) * 100;
|
|
3315
|
-
break;
|
|
3316
|
-
|
|
3317
|
-
case 'validation_completeness':
|
|
3318
|
-
const validationTypes = new Set(context.validations.map(v => v.type));
|
|
3319
|
-
rawScore = (validationTypes.size / 4) * 100;
|
|
3320
|
-
break;
|
|
3321
|
-
}
|
|
3322
|
-
|
|
3323
|
-
return {
|
|
3324
|
-
criterion: name,
|
|
3325
|
-
raw_score: rawScore,
|
|
3326
|
-
weight: config.weight,
|
|
3327
|
-
threshold: config.threshold,
|
|
3328
|
-
weighted_score: rawScore * config.weight,
|
|
3329
|
-
meets_threshold: rawScore >= config.threshold
|
|
3330
|
-
};
|
|
3331
|
-
});
|
|
3332
|
-
|
|
3333
|
-
const overallScore = scores.reduce((sum, s) => sum + s.weighted_score, 0);
|
|
3334
|
-
const allThresholdsMet = scores.every(s => s.meets_threshold);
|
|
3335
|
-
|
|
3336
|
-
return {
|
|
3337
|
-
feature_unit_id: featureUnitId,
|
|
3338
|
-
overall_score: overallScore,
|
|
3339
|
-
all_thresholds_met: allThresholdsMet,
|
|
3340
|
-
criterion_scores: scores,
|
|
3341
|
-
status: allThresholdsMet && overallScore >= 80 ? 'passed' : 'failed'
|
|
3342
|
-
};
|
|
3343
|
-
}
|
|
3344
|
-
|
|
3345
|
-
// Example usage
|
|
3346
|
-
const criteria = {
|
|
3347
|
-
test_coverage: { weight: 0.3, threshold: 80 },
|
|
3348
|
-
decision_quality: { weight: 0.3, threshold: 75 },
|
|
3349
|
-
timeline_completeness: { weight: 0.2, threshold: 60 },
|
|
3350
|
-
validation_completeness: { weight: 0.2, threshold: 50 }
|
|
3351
|
-
};
|
|
3352
|
-
|
|
3353
|
-
const evaluation = await multiCriteriaEvaluation('FU-061', criteria);
|
|
3354
|
-
console.log(`Overall score: ${evaluation.overall_score}`);
|
|
3355
|
-
console.log(`Thresholds met: ${evaluation.all_thresholds_met}`);
|
|
3356
|
-
```
|
|
3357
|
-
|
|
3358
|
-
### Advanced Evaluation Best Practices
|
|
3359
|
-
|
|
3360
|
-
**DO:**
|
|
3361
|
-
- ✅ Run pairwise comparisons in both orders (position bias mitigation)
|
|
3362
|
-
- ✅ Generate rubrics from historical data
|
|
3363
|
-
- ✅ Use multi-criteria evaluation with weights
|
|
3364
|
-
- ✅ Store evaluation results as validation_result entities
|
|
3365
|
-
- ✅ Control for verbosity bias in text comparisons
|
|
3366
|
-
- ✅ Use reference entities for baseline comparison
|
|
3367
|
-
|
|
3368
|
-
**DON'T:**
|
|
3369
|
-
- ❌ Rely on single-order pairwise comparison
|
|
3370
|
-
- ❌ Use hardcoded rubrics without domain analysis
|
|
3371
|
-
- ❌ Evaluate on single criterion
|
|
3372
|
-
- ❌ Ignore position bias
|
|
3373
|
-
- ❌ Let verbosity inflate scores
|
|
3374
|
-
- ❌ Evaluate without baselines
|
|
3375
|
-
|
|
3376
|
-
### Best Practices for Evaluation
|
|
3377
|
-
|
|
3378
|
-
**DO:**
|
|
3379
|
-
- ✅ Track validation results for all Feature Units
|
|
3380
|
-
- ✅ Record session outcomes consistently
|
|
3381
|
-
- ✅ Use timeline queries for historical analysis
|
|
3382
|
-
- ✅ Calculate quality scores based on multiple criteria
|
|
3383
|
-
- ✅ Benchmark against previous performance
|
|
3384
|
-
- ✅ Track trends over time
|
|
3385
|
-
|
|
3386
|
-
**DON'T:**
|
|
3387
|
-
- ❌ Evaluate without historical context
|
|
3388
|
-
- ❌ Use single metric for quality assessment
|
|
3389
|
-
- ❌ Ignore validation failures
|
|
3390
|
-
- ❌ Skip session outcome tracking
|
|
3391
|
-
- ❌ Evaluate without baseline comparison
|
|
3392
|
-
|
|
3393
|
-
## Support
|
|
3394
|
-
|
|
3395
|
-
For integration issues:
|
|
3396
|
-
- Check Neotoma MCP server is running
|
|
3397
|
-
- Review MCP client configuration
|
|
3398
|
-
- Test MCP actions manually
|
|
3399
|
-
- Consult `docs/releases/v0.2.3/mcp_actions.md`
|
|
3400
|
-
- Check migration guide for data migration
|