marvisx-cli 0.3.8b3__tar.gz → 0.3.8b6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (658) hide show
  1. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/PKG-INFO +1 -1
  2. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/config.py +57 -0
  3. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/server.py +4 -0
  4. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/graph.py +5 -4
  5. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/graph_ux.py +62 -1
  6. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/search.py +8 -0
  7. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/graph.py +50 -0
  8. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/jobs.py +72 -0
  9. marvisx_cli-0.3.8b6/core/api/services/brain/llm/claude_cli.py +201 -0
  10. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/factory.py +13 -0
  11. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/memory_ops.py +15 -4
  12. marvisx_cli-0.3.8b6/core/api/services/brain/temporal_recency.py +195 -0
  13. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/embedding_service.py +392 -2
  14. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/graph_service.py +123 -5
  15. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/embedding_router.py +4 -0
  16. marvisx_cli-0.3.8b6/core/api/tests/test_graph_freshness_flag.py +136 -0
  17. marvisx_cli-0.3.8b6/core/api/tests/test_graph_neighbors_denoise.py +167 -0
  18. marvisx_cli-0.3.8b6/core/api/tests/test_graph_summary.py +32 -0
  19. marvisx_cli-0.3.8b6/core/api/tests/test_kg_claims_builder.py +171 -0
  20. marvisx_cli-0.3.8b6/core/api/tests/test_kg_claims_wire.py +128 -0
  21. marvisx_cli-0.3.8b6/core/api/tests/test_kg_trust_write_path.py +143 -0
  22. marvisx_cli-0.3.8b6/core/api/tests/test_migration_149.py +121 -0
  23. marvisx_cli-0.3.8b6/core/api/tests/test_populate_decay_flag.py +67 -0
  24. marvisx_cli-0.3.8b6/core/api/tests/test_session_brief_temporal.py +82 -0
  25. marvisx_cli-0.3.8b6/core/api/tests/test_temporal_recency.py +148 -0
  26. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/graph.py +419 -0
  27. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/projects.py +42 -0
  28. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/search.py +89 -7
  29. marvisx_cli-0.3.8b6/core/cli/_onboarding.py +250 -0
  30. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/guides/marvis-way.md +23 -0
  31. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_doctor.py +53 -3
  32. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_init.py +6 -0
  33. marvisx_cli-0.3.8b6/core/cli/marvis_task.py +206 -0
  34. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_project_nodes.py +115 -6
  35. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/PKG-INFO +1 -1
  36. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/SOURCES.txt +16 -0
  37. marvisx_cli-0.3.8b6/migrations/149_kg_trust_columns.sql +43 -0
  38. marvisx_cli-0.3.8b6/migrations/149_kg_trust_columns_down.sql +17 -0
  39. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/pyproject.toml +1 -1
  40. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/LICENSE +0 -0
  41. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/MANIFEST.in +0 -0
  42. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/README.md +0 -0
  43. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/__init__.py +0 -0
  44. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/agents/__init__.py +0 -0
  45. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/agents/session_health.py +0 -0
  46. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/agents/session_manager.py +0 -0
  47. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/bin/marvisx-state-hook.py +0 -0
  48. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/db.py +0 -0
  49. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/dependencies/__init__.py +0 -0
  50. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/dependencies/tenant.py +0 -0
  51. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/main.py +0 -0
  52. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/__init__.py +0 -0
  53. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/_adapter.py +0 -0
  54. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/__init__.py +0 -0
  55. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/brain.py +0 -0
  56. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/handoffs.py +0 -0
  57. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/ingest.py +0 -0
  58. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/learnings.py +0 -0
  59. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/projects.py +0 -0
  60. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/pull_requests.py +0 -0
  61. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/safety.py +0 -0
  62. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/search.py +0 -0
  63. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/tasks.py +0 -0
  64. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/workflow_playbooks/brainstorm.md +0 -0
  65. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/workflow_playbooks/compound.md +0 -0
  66. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/workflow_playbooks/plan.md +0 -0
  67. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/mcp/tools/workflows.py +0 -0
  68. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/middleware/__init__.py +0 -0
  69. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/middleware/tool_call_audit.py +0 -0
  70. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/__init__.py +0 -0
  71. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/auth.py +0 -0
  72. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/brain.py +0 -0
  73. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/common.py +0 -0
  74. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/costs.py +0 -0
  75. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/graph.py +0 -0
  76. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/graph_cosmo.py +0 -0
  77. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/graph_pr_impact.py +0 -0
  78. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/inbox.py +0 -0
  79. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/ingest_keys.py +0 -0
  80. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/kg.py +0 -0
  81. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/llm_config.py +0 -0
  82. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/monitoring.py +0 -0
  83. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/projects.py +0 -0
  84. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/sessions.py +0 -0
  85. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/tasks.py +0 -0
  86. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/teams.py +0 -0
  87. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/models/users.py +0 -0
  88. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/observability/__init__.py +0 -0
  89. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/observability/tracing.py +0 -0
  90. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/paths.py +0 -0
  91. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/rate_limit.py +0 -0
  92. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/rbac.py +0 -0
  93. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/__init__.py +0 -0
  94. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/_adapter.py +0 -0
  95. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/admin_pr_impact.py +0 -0
  96. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/admin_settings.py +0 -0
  97. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/agent.py +0 -0
  98. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/agent_tokens.py +0 -0
  99. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/app_settings.py +0 -0
  100. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/audit.py +0 -0
  101. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/auth.py +0 -0
  102. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/bench.py +0 -0
  103. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/brain.py +0 -0
  104. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/brain_directions.py +0 -0
  105. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/ci_checks.py +0 -0
  106. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/comments.py +0 -0
  107. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/costs.py +0 -0
  108. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/docs_coverage.py +0 -0
  109. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/docs_governance.py +0 -0
  110. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/documents.py +0 -0
  111. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/files.py +0 -0
  112. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/finder.py +0 -0
  113. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/handoffs.py +0 -0
  114. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/inbox.py +0 -0
  115. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/ingest_api_keys.py +0 -0
  116. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/ingest_triage.py +0 -0
  117. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/judge.py +0 -0
  118. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/kg.py +0 -0
  119. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/learnings.py +0 -0
  120. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/llm_config.py +0 -0
  121. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/monitoring.py +0 -0
  122. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/notifications.py +0 -0
  123. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/pr_impact.py +0 -0
  124. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/projects.py +0 -0
  125. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/pull_requests.py +0 -0
  126. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/push.py +0 -0
  127. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/raci.py +0 -0
  128. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/search.py +0 -0
  129. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/sessions.py +0 -0
  130. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/settings.py +0 -0
  131. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/share_repo.py +0 -0
  132. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/status_updates.py +0 -0
  133. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/tags.py +0 -0
  134. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/tasks.py +0 -0
  135. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/teams.py +0 -0
  136. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/terminal.py +0 -0
  137. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/users.py +0 -0
  138. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/routers/webhooks.py +0 -0
  139. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/runtime_settings.py +0 -0
  140. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/security.py +0 -0
  141. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/__init__.py +0 -0
  142. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/_fts.py +0 -0
  143. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/audit.py +0 -0
  144. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/auto_approval.py +0 -0
  145. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/__init__.py +0 -0
  146. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/baseline.py +0 -0
  147. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/capabilities.py +0 -0
  148. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/cascade_rollup.py +0 -0
  149. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/compound_bridge.py +0 -0
  150. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/cycle.py +0 -0
  151. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/cycle_snapshot.py +0 -0
  152. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/digest_collector.py +0 -0
  153. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/direction.py +0 -0
  154. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/drift.py +0 -0
  155. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/drift_router.py +0 -0
  156. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/edge_metrics.py +0 -0
  157. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/events_reader.py +0 -0
  158. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/findings.py +0 -0
  159. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/findings_reader.py +0 -0
  160. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/journal.py +0 -0
  161. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/knowledge_forms.py +0 -0
  162. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/__init__.py +0 -0
  163. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/_runner.py +0 -0
  164. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/base.py +0 -0
  165. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/cache.py +0 -0
  166. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/constants.py +0 -0
  167. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/direction_alignment.py +0 -0
  168. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/finding_reasoning.py +0 -0
  169. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/finding_summary.py +0 -0
  170. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/grounding.py +0 -0
  171. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/journal_polish.py +0 -0
  172. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/local_gateway.py +0 -0
  173. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/parsers.py +0 -0
  174. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/llm/router_glue.py +0 -0
  175. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/models.py +0 -0
  176. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/owner_hint.py +0 -0
  177. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/recap.py +0 -0
  178. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/__init__.py +0 -0
  179. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/_signals.py +0 -0
  180. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
  181. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
  182. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
  183. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
  184. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
  185. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
  186. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
  187. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
  188. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/runs_reader.py +0 -0
  189. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/scope.py +0 -0
  190. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/__init__.py +0 -0
  191. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/base.py +0 -0
  192. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/git_kg.py +0 -0
  193. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/handoffs.py +0 -0
  194. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/ingestor.py +0 -0
  195. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/learnings.py +0 -0
  196. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/sources/pir_tasks.py +0 -0
  197. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/warehouse_consolidate.py +0 -0
  198. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/watermarks.py +0 -0
  199. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/brain/ws_emitter.py +0 -0
  200. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/cc_tasks_reader.py +0 -0
  201. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/chunking.py +0 -0
  202. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ci_service.py +0 -0
  203. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/claude_metrics.py +0 -0
  204. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/codex_metrics.py +0 -0
  205. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/conversation_reader.py +0 -0
  206. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/cost_service.py +0 -0
  207. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/crypto.py +0 -0
  208. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/__init__.py +0 -0
  209. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/confidence.py +0 -0
  210. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/config.py +0 -0
  211. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/enrichment.py +0 -0
  212. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
  213. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/hard_gates.py +0 -0
  214. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
  215. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/dream_cycle.py +0 -0
  216. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/embedding_backends/__init__.py +0 -0
  217. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/embedding_internal.py +0 -0
  218. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/event_dispatcher.py +0 -0
  219. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/events.py +0 -0
  220. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/git_ops.py +0 -0
  221. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/graph_cosmo_service.py +0 -0
  222. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/graph_ranker.py +0 -0
  223. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/grounding/__init__.py +0 -0
  224. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/grounding/citations.py +0 -0
  225. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/grounding/verifier.py +0 -0
  226. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox.py +0 -0
  227. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_digest.py +0 -0
  228. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_digest_deep_research.py +0 -0
  229. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_digest_jobs.py +0 -0
  230. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_gmail_sync.py +0 -0
  231. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_llm_classifier.py +0 -0
  232. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_source_identity.py +0 -0
  233. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_sources.py +0 -0
  234. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_taxonomy.py +0 -0
  235. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_tldr.py +0 -0
  236. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/inbox_triage.py +0 -0
  237. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/__init__.py +0 -0
  238. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/api_key_auth.py +0 -0
  239. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/auto_approve.py +0 -0
  240. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/classifier.py +0 -0
  241. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/confidence.py +0 -0
  242. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/dispatch.py +0 -0
  243. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/events.py +0 -0
  244. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/ignore_patterns.py +0 -0
  245. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/image_probe.py +0 -0
  246. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/ingress.py +0 -0
  247. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/insert_saga.py +0 -0
  248. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/__init__.py +0 -0
  249. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
  250. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/base.py +0 -0
  251. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/byok_provider.py +0 -0
  252. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/classification_context.py +0 -0
  253. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/config_store.py +0 -0
  254. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/factory.py +0 -0
  255. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/kg_enricher.py +0 -0
  256. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/local_gateway.py +0 -0
  257. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/local_vllm.py +0 -0
  258. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/llm/openai_nano.py +0 -0
  259. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/lock_advisory.py +0 -0
  260. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parser_router.py +0 -0
  261. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/__init__.py +0 -0
  262. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/docling_parser.py +0 -0
  263. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
  264. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/docx_parser.py +0 -0
  265. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
  266. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
  267. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/image_parser.py +0 -0
  268. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
  269. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
  270. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
  271. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/pdf_types.py +0 -0
  272. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
  273. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
  274. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
  275. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
  276. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/preflight.py +0 -0
  277. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/routing_policy.py +0 -0
  278. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/serializers/__init__.py +0 -0
  279. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
  280. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/skip_log.py +0 -0
  281. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/ingest/watcher.py +0 -0
  282. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/__init__.py +0 -0
  283. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/audit.py +0 -0
  284. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/communities.py +0 -0
  285. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/community_summary.py +0 -0
  286. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/graph_lane.py +0 -0
  287. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/hybrid_search.py +0 -0
  288. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/lens.py +0 -0
  289. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/pr_impact.py +0 -0
  290. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/queries.py +0 -0
  291. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/ranking.py +0 -0
  292. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg/rrf.py +0 -0
  293. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/kg_watcher_control.py +0 -0
  294. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/local_llm/__init__.py +0 -0
  295. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/local_llm/async_client.py +0 -0
  296. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/local_llm/client.py +0 -0
  297. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/local_llm/url_validator.py +0 -0
  298. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/metrics_collector.py +0 -0
  299. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/metrics_providers.py +0 -0
  300. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/model_registry.py +0 -0
  301. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/model_router.py +0 -0
  302. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/n8n_client.py +0 -0
  303. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/newsletter_llm_gateway.py +0 -0
  304. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/notification_service.py +0 -0
  305. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/openai_responses.py +0 -0
  306. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/opencode_metrics.py +0 -0
  307. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/opencode_sessions.py +0 -0
  308. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pii_redactor.py +0 -0
  309. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
  310. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/differ.py +0 -0
  311. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/dispatcher.py +0 -0
  312. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/gc.py +0 -0
  313. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/languages.py +0 -0
  314. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/parser.py +0 -0
  315. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_impact_pipeline/writer.py +0 -0
  316. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/pr_service.py +0 -0
  317. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/project_paths.py +0 -0
  318. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/project_status_updates.py +0 -0
  319. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/providers.py +0 -0
  320. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/push_service.py +0 -0
  321. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/reminder_service.py +0 -0
  322. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/runas.py +0 -0
  323. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/salience_service.py +0 -0
  324. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/security_collector.py +0 -0
  325. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/session_catalog.py +0 -0
  326. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/session_metrics_service.py +0 -0
  327. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/session_ops.py +0 -0
  328. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/session_state.py +0 -0
  329. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/share_links.py +0 -0
  330. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/task_transitions.py +0 -0
  331. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/temporal_tiebreak.py +0 -0
  332. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/temporal_write.py +0 -0
  333. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/terminal_metrics.py +0 -0
  334. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/terminal_metrics_dump.py +0 -0
  335. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/tmux.py +0 -0
  336. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/webhook_service.py +0 -0
  337. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/services/workspace_sync.py +0 -0
  338. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/templates/__init__.py +0 -0
  339. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/templates/markdown_share.py +0 -0
  340. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/terminal.py +0 -0
  341. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/__init__.py +0 -0
  342. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
  343. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_audit_permissions.py +0 -0
  344. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_backfill_session_conversations.py +0 -0
  345. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
  346. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_claude_metrics.py +0 -0
  347. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_codex_metrics.py +0 -0
  348. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_config_env_aliases.py +0 -0
  349. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_finder_paths.py +0 -0
  350. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_git_ops_merge.py +0 -0
  351. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_graph_freshness.py +0 -0
  352. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_learnings_check_search.py +0 -0
  353. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_learnings_create_pre148.py +0 -0
  354. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_metrics_providers.py +0 -0
  355. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_migration_087.py +0 -0
  356. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_migration_088.py +0 -0
  357. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_migration_089.py +0 -0
  358. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_openai_responses.py +0 -0
  359. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_opencode_metrics.py +0 -0
  360. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_opencode_sessions.py +0 -0
  361. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_pr_workflow_e2e.py +0 -0
  362. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_projects_handoffs.py +0 -0
  363. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_providers.py +0 -0
  364. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_require_scope_empty_deny.py +0 -0
  365. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_safety_bridge.py +0 -0
  366. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_catalog.py +0 -0
  367. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_conversations.py +0 -0
  368. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_metrics_service.py +0 -0
  369. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_resume_paths.py +0 -0
  370. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_session_theme_mode_migration.py +0 -0
  371. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_sessions_rbac.py +0 -0
  372. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_share_edit.py +0 -0
  373. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_share_repo.py +0 -0
  374. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_terminal_session_manager.py +0 -0
  375. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_terminal_upload.py +0 -0
  376. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_tmux.py +0 -0
  377. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_workspace_sync.py +0 -0
  378. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
  379. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/__init__.py +0 -0
  380. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/_context.py +0 -0
  381. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/_errors.py +0 -0
  382. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/_roles.py +0 -0
  383. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/audit.py +0 -0
  384. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/brain.py +0 -0
  385. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/costs.py +0 -0
  386. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/handoffs.py +0 -0
  387. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/ingest_triage.py +0 -0
  388. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/learnings.py +0 -0
  389. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/pull_requests.py +0 -0
  390. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/use_cases/tasks.py +0 -0
  391. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/api/visibility.py +0 -0
  392. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/README.md +0 -0
  393. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/__init__.py +0 -0
  394. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_brain_opportunistic.py +0 -0
  395. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_brain_schedule.py +0 -0
  396. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_index_source.py +0 -0
  397. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_runtime_ctx.py +0 -0
  398. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_transmute.py +0 -0
  399. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/_update_check.py +0 -0
  400. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/guides/__init__.py +0 -0
  401. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_account.py +0 -0
  402. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_brain.py +0 -0
  403. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_feedback.py +0 -0
  404. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_governance.py +0 -0
  405. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_guide.py +0 -0
  406. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_hooks.py +0 -0
  407. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_mcp.py +0 -0
  408. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_runtime.py +0 -0
  409. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/cli/marvis_telemetry.py +0 -0
  410. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/platform/__init__.py +0 -0
  411. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/_drift_check.py +0 -0
  412. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/_frontmatter.py +0 -0
  413. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/_graph_writer.py +0 -0
  414. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/ast_parser.py +0 -0
  415. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/__init__.py +0 -0
  416. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/_config.sh +0 -0
  417. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
  418. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
  419. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
  420. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
  421. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
  422. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/config.json +0 -0
  423. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
  424. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
  425. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/quality-gate.sh +0 -0
  426. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/safety_bridge.py +0 -0
  427. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/install_hooks/secret-scan.sh +0 -0
  428. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/migrate_spike_node_ids.py +0 -0
  429. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_artifacts.py +0 -0
  430. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_cross_project.py +0 -0
  431. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_inbox_nodes.py +0 -0
  432. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_pr_impact.py +0 -0
  433. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/populate_touch_counter.py +0 -0
  434. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/reparse_failed.py +0 -0
  435. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/scripts/safety_bridge.py +0 -0
  436. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/__init__.py +0 -0
  437. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/client.py +0 -0
  438. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/entitlements.py +0 -0
  439. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/rollup.py +0 -0
  440. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/schema.py +0 -0
  441. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/telemetry/sender.py +0 -0
  442. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/__init__.py +0 -0
  443. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/byok_vault.py +0 -0
  444. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/defaults.py +0 -0
  445. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/state.py +0 -0
  446. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/steps.py +0 -0
  447. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/core/wizard/validation.py +0 -0
  448. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/dependency_links.txt +0 -0
  449. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/entry_points.txt +0 -0
  450. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/requires.txt +0 -0
  451. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/marvisx_cli.egg-info/top_level.txt +0 -0
  452. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/001_initial.sql +0 -0
  453. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/002_tasks.sql +0 -0
  454. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/003_session_management.sql +0 -0
  455. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/004_projects_comments.sql +0 -0
  456. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/005_session_intelligence.sql +0 -0
  457. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/006_settings.sql +0 -0
  458. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/007_task_scoring.sql +0 -0
  459. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/008_cost_tracking.sql +0 -0
  460. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/009_session_card_metrics.sql +0 -0
  461. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/010_monitoring.sql +0 -0
  462. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/012_agent_api.sql +0 -0
  463. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/013_session_complete.sql +0 -0
  464. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/015_pull_requests.sql +0 -0
  465. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/015_pull_requests_down.sql +0 -0
  466. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/016_users_raci.sql +0 -0
  467. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/017_task_cost_entries.sql +0 -0
  468. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/018_agents.sql +0 -0
  469. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/018_agents_down.sql +0 -0
  470. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/019_review_feedback.sql +0 -0
  471. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/020_pr_commit_sha.sql +0 -0
  472. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/021_webhook_events.sql +0 -0
  473. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/022_devx_agent_managed.sql +0 -0
  474. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/022_devx_agent_managed_down.sql +0 -0
  475. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/023_devx_p1_gate.sql +0 -0
  476. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/023_devx_p1_gate_down.sql +0 -0
  477. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/024_chat_messages.sql +0 -0
  478. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/024_pr_conversation_id.sql +0 -0
  479. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/024_task_indexes.sql +0 -0
  480. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/024_task_indexes_down.sql +0 -0
  481. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/025_audit_log.sql +0 -0
  482. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/026_agent_tokens.sql +0 -0
  483. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/027_teams_auth_phase_b.sql +0 -0
  484. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/028_learnings.sql +0 -0
  485. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/029_team_roles.sql +0 -0
  486. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/030_finder_pins.sql +0 -0
  487. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/031_pr_deploy_status.sql +0 -0
  488. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/032_task_reminders.sql +0 -0
  489. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/033_events_retry_count.sql +0 -0
  490. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/033_session_owner.sql +0 -0
  491. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/034_notifications.sql +0 -0
  492. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/035_shared_links.sql +0 -0
  493. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/036_session_index_upgrade.sql +0 -0
  494. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/037_pr_approval.sql +0 -0
  495. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/038_pr_submitted_by.sql +0 -0
  496. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/039_push_subscriptions.sql +0 -0
  497. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/040_semantic_search.sql +0 -0
  498. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/041_workspaces.sql +0 -0
  499. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/042_oidc_providers.sql +0 -0
  500. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/043_ci_checks.sql +0 -0
  501. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/044_agent_metrics.sql +0 -0
  502. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/045_documents_doc_type.sql +0 -0
  503. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/046_salience.sql +0 -0
  504. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/047_seed_missing_agents.sql +0 -0
  505. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/048_fix_agent_paths_roles.sql +0 -0
  506. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
  507. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/050_session_provider.sql +0 -0
  508. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/051_session_launch_profile.sql +0 -0
  509. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/052_session_theme_mode.sql +0 -0
  510. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/052_task_kind.sql +0 -0
  511. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/053_inbox_items.sql +0 -0
  512. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/054_inbox_triage_contract.sql +0 -0
  513. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/055_inbox_topic_treatment.sql +0 -0
  514. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/056_inbox_treatment_read_save.sql +0 -0
  515. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/057_session_theme_mode_backfill.sql +0 -0
  516. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
  517. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
  518. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/060_newsletter.sql +0 -0
  519. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/061_inbox_redesign.sql +0 -0
  520. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
  521. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/063_task_completion_mode.sql +0 -0
  522. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/064_judge_mode_setting.sql +0 -0
  523. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/065_knowledge_graph_spike.sql +0 -0
  524. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/066_digest_ranking_inputs.sql +0 -0
  525. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/066_kg_artifact_nodes.sql +0 -0
  526. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/067_inbox_digest_selections.sql +0 -0
  527. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/067_kg_temporal.sql +0 -0
  528. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/068_inbox_digest_app_settings.sql +0 -0
  529. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/068_kg_touch_counter.sql +0 -0
  530. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/069_kg_doc_types.sql +0 -0
  531. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
  532. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
  533. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
  534. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/073_kg_cross_project.sql +0 -0
  535. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/073_kg_cross_project_down.sql +0 -0
  536. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/074_kg_infra_types.sql +0 -0
  537. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/074_kg_infra_types_down.sql +0 -0
  538. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/075_kg_file_state_recovery.sql +0 -0
  539. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/075_kg_file_state_recovery_down.sql +0 -0
  540. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/076_kg_watcher_state.sql +0 -0
  541. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/076_kg_watcher_state_down.sql +0 -0
  542. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/077_kg_doc_types_extend.sql +0 -0
  543. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/077_kg_doc_types_extend_down.sql +0 -0
  544. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/078_kg_fts5.sql +0 -0
  545. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/078_kg_fts5_down.sql +0 -0
  546. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/079_kg_missing_indexes.sql +0 -0
  547. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/079_kg_missing_indexes_down.sql +0 -0
  548. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/080_kg_fts5_extended.sql +0 -0
  549. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/080_kg_fts5_extended_down.sql +0 -0
  550. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/081_kg_lens_indexes.sql +0 -0
  551. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/081_kg_lens_indexes_down.sql +0 -0
  552. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/082_kg_pins.sql +0 -0
  553. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/082_kg_pins_down.sql +0 -0
  554. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/083_kg_graph_nodes_degree.sql +0 -0
  555. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
  556. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
  557. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
  558. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/085_kg_edge_resolves_to.sql +0 -0
  559. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
  560. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/086_project_status_updates_feed.sql +0 -0
  561. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/086_project_status_updates_feed_down.sql +0 -0
  562. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/087_session_metrics_dual.sql +0 -0
  563. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/087_session_metrics_dual_down.sql +0 -0
  564. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/088_rename_context_pct_legacy.sql +0 -0
  565. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
  566. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
  567. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
  568. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/090_kg_inbox_node_type.sql +0 -0
  569. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/090_kg_inbox_node_type_down.sql +0 -0
  570. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/091_kg_inbox_node_type_check.sql +0 -0
  571. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
  572. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/092_sessions_activity_state_ts.sql +0 -0
  573. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
  574. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/093_sessions_activity_state_column.sql +0 -0
  575. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/093_sessions_activity_state_column_down.sql +0 -0
  576. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/094_ingest_pending.sql +0 -0
  577. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/094_ingest_pending_down.sql +0 -0
  578. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/095_kg_intent_first.sql +0 -0
  579. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/095_kg_intent_first_down.sql +0 -0
  580. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
  581. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
  582. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/097_ingest_change_history.sql +0 -0
  583. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/097_ingest_change_history_down.sql +0 -0
  584. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/098_kg_node_type_business.sql +0 -0
  585. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/098_kg_node_type_business_down.sql +0 -0
  586. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/099_kg_edges_restore_weight.sql +0 -0
  587. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
  588. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/100_kg_enriched_at.sql +0 -0
  589. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/100_kg_enriched_at_down.sql +0 -0
  590. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
  591. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
  592. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/102_promote_llm_costs.sql +0 -0
  593. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/102_promote_llm_costs_down.sql +0 -0
  594. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/103_ingest_skipped_log.sql +0 -0
  595. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/103_ingest_skipped_log_down.sql +0 -0
  596. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/120_docs_governance.sql +0 -0
  597. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/120_docs_governance_down.sql +0 -0
  598. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/121_notification_event_fk_cleanup.sql +0 -0
  599. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
  600. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/122_docs_drift_history.sql +0 -0
  601. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/122_docs_drift_history_down.sql +0 -0
  602. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/123_ingest_parser_waiting_status.sql +0 -0
  603. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
  604. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/124_heypocket_recordings.sql +0 -0
  605. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/124_heypocket_recordings_down.sql +0 -0
  606. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/125_kg_node_type_record.sql +0 -0
  607. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/125_kg_node_type_record_down.sql +0 -0
  608. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
  609. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
  610. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/127_brain_v1_substrate.sql +0 -0
  611. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/127_brain_v1_substrate_down.sql +0 -0
  612. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/128_brain_drift_signals.sql +0 -0
  613. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/128_brain_drift_signals_down.sql +0 -0
  614. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/129_brain_memory_operations.sql +0 -0
  615. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/129_brain_memory_operations_down.sql +0 -0
  616. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/130_brain_findings.sql +0 -0
  617. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/130_brain_findings_down.sql +0 -0
  618. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/132_kg_pr_modifies.sql +0 -0
  619. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/132_kg_pr_modifies_down.sql +0 -0
  620. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
  621. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
  622. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/134_brain_journal_narrative_polished.sql +0 -0
  623. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
  624. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/135_kg_edges_provider.sql +0 -0
  625. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/136_documents_fts.sql +0 -0
  626. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/137_promote_llm_costs.sql +0 -0
  627. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/137_promote_llm_costs_down.sql +0 -0
  628. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/138_ingest_api_keys.sql +0 -0
  629. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/138_ingest_api_keys_down.sql +0 -0
  630. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/139_ingest_pending_ingress.sql +0 -0
  631. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/139_ingest_pending_ingress_down.sql +0 -0
  632. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/140_ingest_idempotency_quota.sql +0 -0
  633. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
  634. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/141_ingest_pending_metadata.sql +0 -0
  635. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/141_ingest_pending_metadata_down.sql +0 -0
  636. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/142_llm_function_config.sql +0 -0
  637. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/142_llm_function_config_down.sql +0 -0
  638. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/143_kg_code_embeddings.sql +0 -0
  639. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/143_kg_code_embeddings_down.sql +0 -0
  640. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/144_notifications_pending_sync_index.sql +0 -0
  641. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/145_audit_log_immutable.sql +0 -0
  642. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/145_audit_log_immutable_down.sql +0 -0
  643. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/146_drop_kg_backup_tables.sql +0 -0
  644. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/146_drop_kg_backup_tables_down.sql +0 -0
  645. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/147_chunks.sql +0 -0
  646. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/147_chunks_down.sql +0 -0
  647. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/148_bitemporal_learnings.sql +0 -0
  648. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/148_bitemporal_learnings_down.sql +0 -0
  649. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/migrations/__init__.py +0 -0
  650. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/context.md +0 -0
  651. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/docs/brainstorms/YYYY-MM-DD-example-brainstorm.md +0 -0
  652. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/docs/plans/YYYY-MM-DD-example-plan.md +0 -0
  653. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/docs/solutions/YYYY-MM-DD-example-solution.md +0 -0
  654. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/input/README.md +0 -0
  655. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/memory/handoff.md +0 -0
  656. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/output/README.md +0 -0
  657. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/projects/_template/project.yaml +0 -0
  658. {marvisx_cli-0.3.8b3 → marvisx_cli-0.3.8b6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: marvisx-cli
3
- Version: 0.3.8b3
3
+ Version: 0.3.8b6
4
4
  Summary: MarvisX OSS — agent-native company-brain CLI runtime (init, status, brief, triage)
5
5
  Author: MarvisX maintainers
6
6
  License: BSL-1.1
@@ -125,6 +125,13 @@ class Settings(BaseSettings):
125
125
  default=86400, alias="BRAIN_WAREHOUSE_CONSOLIDATION_INTERVAL_SECONDS"
126
126
  )
127
127
 
128
+ # KG temporal recency pass (Fase D producer): proposes re-verifying aging,
129
+ # never-verified live nodes. Gated by temporal_memory_enabled (no separate
130
+ # enable flag — the flag IS the gate). Daily cadence guard.
131
+ brain_temporal_recency_interval_seconds: int = Field(
132
+ default=86400, alias="BRAIN_TEMPORAL_RECENCY_INTERVAL_SECONDS"
133
+ )
134
+
128
135
  # GitHub Webhook
129
136
  github_webhook_secret: str = ""
130
137
 
@@ -475,6 +482,47 @@ class Settings(BaseSettings):
475
482
  default=False, alias="MARVIS_TEMPORAL_MEMORY"
476
483
  )
477
484
 
485
+ # answer-ready claims (DEFAULT OFF). When False every reasoning-tool read is
486
+ # byte-identical to today (no `claims` key). When True, project_impact/
487
+ # graph_impact append a `claims[]` block: server-computed, relation-typed
488
+ # counts with provenance — the agent reports the value instead of re-counting
489
+ # raw edges (faithfulness). Separate from temporal_memory so grounding can be
490
+ # enabled without the freshness surface. See plan 2026-06-08-feat-answer-ready-claims.
491
+ kg_claims_enabled: bool = Field(
492
+ default=False, alias="MARVIS_KG_CLAIMS"
493
+ )
494
+
495
+ # Memory-freshness v2a Phase 1 (B-fix, DEFAULT OFF). The documents_fts
496
+ # INSERT/UPDATE triggers (migration 136) write file_path into the content
497
+ # column, so every doc written AFTER the one-time migration backfill has NO
498
+ # body in the lexical lane (prod 2026-06-09: 100% of recent docs degraded
499
+ # → the BM25 lane sees OLD bodies but never NEW ones — a direct stale-
500
+ # retrieval mechanism). When True, every documents upsert path additionally
501
+ # overwrites the trigger-degraded FTS row with the real title+body
502
+ # (refresh_documents_fts_row). When False the refresh helper is a no-op and
503
+ # behavior is byte-identical to today. The one-shot backfill script
504
+ # (scripts/backfill_documents_fts.py) repairs historical rows; in prod the
505
+ # flag must flip ON at backfill time and stay on, otherwise the next doc
506
+ # update re-degrades its row. See plan
507
+ # 2026-06-09-feat-memory-freshness-v2a-retrieval.
508
+ fts_bodies_enabled: bool = Field(
509
+ default=False, alias="MARVIS_FTS_BODIES"
510
+ )
511
+
512
+ # Memory-freshness v2a Phase 2 (A-span, DEFAULT OFF). When False the search
513
+ # read path never touches the chunks/vec_chunks sidecars and the response is
514
+ # byte-identical to today (no span_* fields populated). When True (and
515
+ # MARVIS_CHUNKING populated the sidecars), the semantic lane max-pools
516
+ # chunk-KNN hits into the doc ranking and each file-backed hit carries the
517
+ # winning chunk's span expanded to line boundaries ±12 lines (span_text /
518
+ # span_path / span_line_start / span_line_end) so the agent can answer FROM
519
+ # the search result without a follow-up Read. Write-side chunking stays
520
+ # gated by MARVIS_CHUNKING (env, read per-call). See plan
521
+ # 2026-06-09-feat-memory-freshness-v2a-retrieval.
522
+ search_spans_enabled: bool = Field(
523
+ default=False, alias="MARVIS_SEARCH_SPANS"
524
+ )
525
+
478
526
  # Track 2 #3c — community summaries in the brief (GraphRAG global-search,
479
527
  # DEFAULT OFF). When False the brief is byte-identical to today: the
480
528
  # communities/community_summary modules are a flag-gated library + seam,
@@ -517,6 +565,15 @@ class Settings(BaseSettings):
517
565
  brain_llm_polish_enabled: bool = Field(
518
566
  default=True, alias="BRAIN_LLM_POLISH_ENABLED"
519
567
  )
568
+ # P1: pick the Brain LLM backend. "gateway" (default, unchanged) = the HTTP
569
+ # Mac-gateway client (requires BRAIN_LLM_GATEWAY_API_KEY). "claude_cli" = run
570
+ # `claude -p` headless on the user's Claude Code subscription (NO API key) —
571
+ # see core/api/services/brain/llm/claude_cli.py.
572
+ brain_llm_provider: Literal["gateway", "claude_cli"] = Field(
573
+ default="gateway", alias="BRAIN_LLM_PROVIDER"
574
+ )
575
+ # Path/name of the `claude` binary for the claude_cli provider.
576
+ marvis_claude_bin: str = Field(default="claude", alias="MARVIS_CLAUDE_BIN")
520
577
  brain_llm_journal_polish_enabled: bool = Field(
521
578
  default=True, alias="BRAIN_LLM_JOURNAL_POLISH_ENABLED"
522
579
  )
@@ -46,6 +46,10 @@ _INSTRUCTIONS = (
46
46
  "Before answering an orchestration or planning task, confirm you actually called the relevant "
47
47
  "tool (session_brief / project_impact / graph_impact) AND that your answer addresses the task "
48
48
  "as asked — do not reply from raw files or pivot to an unrelated skill.\n"
49
+ "When you state a number from the knowledge graph (a count, in-degree, how many dependents), "
50
+ "quote it from the tool result's `summary` block and cite it inline — e.g. \"148 edges from 11 "
51
+ "sources [graph_neighbors summary]\". Do NOT re-count a returned list by hand, and do NOT state a "
52
+ "count that no tool result supports.\n"
49
53
  )
50
54
 
51
55
  mcp = FastMCP("marvis", instructions=_INSTRUCTIONS)
@@ -124,9 +124,10 @@ def register(mcp) -> None:
124
124
  as_of: Annotated[str, Field(pattern=_AS_OF_PATTERN, max_length=32)] | None = None,
125
125
  ) -> dict[str, Any]:
126
126
  """1-hop: chi tocca / dipende direttamente da un nodo. Funziona su codice ('py:function:...') E su progetti ('project:artifact:<slug>').
127
- ORCHESTRAZIONE: per i vicini diretti di un PROGETTO (chi dipende da X) passa node_id='project:artifact:<slug>' con edge_types=['depends_on']. Codice: caller/callee 1-hop di una function.
128
- QUANDO USARLO: vicinato diretto senza il bundle completo; caller inattesi; time-travel as_of; rank=suspect_write per bug write-through-read. Per il blast radius transitivo usa graph_impact / project_impact.
129
- RESTITUISCE: list of {node_id, relation, direction, rank_score?, freshness} cap 200."""
127
+ CHI DIPENDE DA X (in UNA call): graph_neighbors(node_id, direction='incoming', rank='degree') → i dipendenti diretti ordinati per grado + un blocco `summary` GIA' aggregato. E' il tool ovvio per 'chi cita / dipende da X' NON fare N micro-query (project_impact e' il primo passo, non N).
128
+ ORCHESTRAZIONE: per i vicini diretti di un PROGETTO passa node_id='project:artifact:<slug>' con edge_types=['depends_on']. Codice: caller/callee 1-hop di una function.
129
+ QUANDO USARLO: vicinato diretto; caller inattesi; time-travel as_of; rank=suspect_write per bug write-through-read. Per il blast radius transitivo usa graph_impact / project_impact.
130
+ RESTITUISCE: {neighbors:[{node_id, relation, direction, rank_score?}], summary:{total, distinct_nodes, by_relation, by_direction} (CITA questi numeri, non ricontare la lista), freshness} cap 200."""
130
131
  try:
131
132
  async with acquire_db() as db:
132
133
  # Node proxy hardcodes limit=200 (the surface exposes no limit param).
@@ -205,7 +206,7 @@ def register(mcp) -> None:
205
206
  """Portfolio blast radius: 'se pauso / chiudo / de-prioritizzo questo PROGETTO, quali altri progetti si bloccano?'. Il tool di prima classe per l'orchestrazione cross-progetto — distinto dal grafo-codice.
206
207
  Risolve 'project:artifact:<slug>' e fa l'impact BFS sui soli edge progetto->progetto (depends_on / mentions / refers_to). La response porta il segnale freshness (indexed_sha vs HEAD) per non fidarsi di un indice stantio.
207
208
  QUANDO USARLO: prima di pausare/chiudere/de-prioritizzare un progetto; sequenziare un portafoglio (cosa sblocca cosa); capire le dipendenze cross-progetto di una decisione.
208
- RESTITUISCE: {direct_dependents[], transitive_list[], rank_score, freshness}."""
209
+ RESTITUISCE: {direct_dependents[], transitive_list[], rank_score, freshness}. Col flag MARVIS_KG_CLAIMS anche claims[]: quanti progetti dipendono DAVVERO da questo (kind=dependents_depends_on) vs quanti lo nominano soltanto (kind=mentioned_by), gia' contati server-side con provenienza e freschezza — riporta quei numeri, non ri-contare le liste."""
209
210
  try:
210
211
  async with acquire_db() as db:
211
212
  result = await graph_uc.graph_impact(
@@ -13,7 +13,38 @@ from __future__ import annotations
13
13
  from datetime import datetime
14
14
  from typing import Literal
15
15
 
16
- from pydantic import BaseModel, ConfigDict, Field
16
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
17
+
18
+ # ---------------------------------------------------------------------------
19
+ # answer-ready claims (behind MARVIS_KG_CLAIMS) — server-computed, relation-typed
20
+ # ---------------------------------------------------------------------------
21
+
22
+ class KGClaim(BaseModel):
23
+ """A server-computed claim about a KG node: the value is counted by the DB,
24
+ not by the agent. The agent reports it (and the relation) instead of
25
+ re-counting raw edges — this is the faithfulness fix.
26
+
27
+ `kind` names the relation explicitly (e.g. `dependents_depends_on` = real
28
+ dependency, `mentioned_by` = associative, NOT a dependency). `sources` is a
29
+ capped sample of the provenance; `sources_total` is the full count.
30
+ """
31
+ model_config = ConfigDict(extra="forbid")
32
+
33
+ kind: str = Field(..., description="dependents_depends_on | dependents_imports | dependents_calls | mentioned_by")
34
+ subject: str = Field(..., description="node_id the claim is about")
35
+ value: int = Field(..., ge=0, description="server-computed count (the number to report)")
36
+ sources: list[str] = Field(default_factory=list, description="capped sample of source node ids (provenance)")
37
+ sources_total: int = Field(..., ge=0, description="full provenance count before capping")
38
+ as_of: str | None = Field(None, description="last observation (last_seen_at) of the subject")
39
+ verified: str | None = Field(None, description="last Brain re-confirmation (last_verified_at), or null")
40
+ needs_review: bool = Field(False, description="subject is stale per the read-time freshness budget")
41
+
42
+ @model_validator(mode="after")
43
+ def _sources_within_total(self) -> "KGClaim":
44
+ if self.sources_total < len(self.sources):
45
+ raise ValueError("sources_total must be >= len(sources)")
46
+ return self
47
+
17
48
 
18
49
  # ---------------------------------------------------------------------------
19
50
  # Shared type alias (validated at model-field level via annotation)
@@ -47,6 +78,36 @@ class PinOut(BaseModel):
47
78
  is_stale: bool = False # True if node was soft-deleted after pinning (belt-and-braces)
48
79
 
49
80
 
81
+ # ---------------------------------------------------------------------------
82
+ # Fase D — KG trust write-path request bodies (behind MARVIS_TEMPORAL_MEMORY).
83
+ # The apply actions an agent performs after Triage approves a Brain proposal.
84
+ # ---------------------------------------------------------------------------
85
+
86
+ class VerifyNodeIn(BaseModel):
87
+ """Request body for POST /graph/nodes/verify — stamp last_verified_at = now."""
88
+ node_id: str = Field(
89
+ ...,
90
+ min_length=6,
91
+ max_length=256,
92
+ pattern=r"^[a-z]+:[a-z]+:.+$",
93
+ description="Node ID to mark re-verified (REINFORCE apply)",
94
+ )
95
+
96
+
97
+ class SupersedeEdgeIn(BaseModel):
98
+ """Request body for POST /graph/edges/supersede — soft-invalidate an edge."""
99
+ source_id: str = Field(..., min_length=6, max_length=256, pattern=r"^[a-z]+:[a-z]+:.+$")
100
+ target_id: str = Field(..., min_length=6, max_length=256, pattern=r"^[a-z]+:[a-z]+:.+$")
101
+ relation: str = Field(
102
+ ..., min_length=2, max_length=32,
103
+ description="Edge relation of the triple to supersede (e.g. depends_on)",
104
+ )
105
+ superseded_by: str | None = Field(
106
+ None, max_length=256,
107
+ description="Optional audit pointer to the replacing edge",
108
+ )
109
+
110
+
50
111
  # ---------------------------------------------------------------------------
51
112
  # Landing bundle
52
113
  # ---------------------------------------------------------------------------
@@ -26,6 +26,14 @@ class SearchHit(BaseModel):
26
26
  edge_path: list[str] | None = None
27
27
  edge_path_summary: str | None = None
28
28
  rrf_score: float | None = None
29
+ # Memory-freshness v2a Phase 2 (A-span, MARVIS_SEARCH_SPANS): the winning
30
+ # chunk's text expanded to line boundaries ±12 lines, so the agent answers
31
+ # FROM the result without a follow-up Read. None when the flag is off, the
32
+ # hit is row-backed (task/learning/inbox), or the source file is gone.
33
+ span_text: str | None = None
34
+ span_path: str | None = None
35
+ span_line_start: int | None = None
36
+ span_line_end: int | None = None
29
37
 
30
38
 
31
39
  class SearchResponse(BaseModel):
@@ -79,6 +79,8 @@ from core.api.models.graph_ux import (
79
79
  PinIn,
80
80
  PinOut,
81
81
  ResolveOut,
82
+ SupersedeEdgeIn,
83
+ VerifyNodeIn,
82
84
  )
83
85
  from core.api.models.graph_cosmo import GraphCosmoOut
84
86
  from core.api.rate_limit import limiter
@@ -701,6 +703,54 @@ async def delete_graph_pin(
701
703
  return result
702
704
 
703
705
 
706
+ # --- KG trust write-path (Fase D, behind MARVIS_TEMPORAL_MEMORY) ---
707
+
708
+ @router.post("/nodes/verify", response_model=dict, summary="Mark a KG node re-verified")
709
+ @limiter.limit("60/minute")
710
+ async def mark_node_verified(
711
+ body: VerifyNodeIn,
712
+ request: Request,
713
+ user: UserInfo = Depends(get_current_user_or_agent),
714
+ db: aiosqlite.Connection = Depends(get_write_db),
715
+ ) -> dict:
716
+ """Stamp graph_nodes.last_verified_at = now (REINFORCE apply).
717
+
718
+ The action an agent performs after Triage approves a Brain recency proposal.
719
+ Inert (422) when MARVIS_TEMPORAL_MEMORY is off. 404 if the node is missing.
720
+ """
721
+ ctx = CallerContext.from_user_info(user, is_human_session=False)
722
+ try:
723
+ return await uc.mark_node_verified(ctx, db, node_id=body.node_id)
724
+ except ServiceError as e:
725
+ raise to_http_legacy(e)
726
+
727
+
728
+ @router.post("/edges/supersede", response_model=dict, summary="Soft-invalidate a KG edge")
729
+ @limiter.limit("60/minute")
730
+ async def mark_edge_superseded(
731
+ body: SupersedeEdgeIn,
732
+ request: Request,
733
+ user: UserInfo = Depends(get_current_user_or_agent),
734
+ db: aiosqlite.Connection = Depends(get_write_db),
735
+ ) -> dict:
736
+ """Set graph_edges.valid_until = now (+ optional superseded_by) on a triple.
737
+
738
+ SUPERSEDE / CONTRADICTION apply. Soft, never deletes. Inert (422) when the
739
+ flag is off. 404 if the triple is absent.
740
+ """
741
+ ctx = CallerContext.from_user_info(user, is_human_session=False)
742
+ try:
743
+ return await uc.mark_edge_superseded(
744
+ ctx, db,
745
+ source_id=body.source_id,
746
+ target_id=body.target_id,
747
+ relation=body.relation,
748
+ superseded_by=body.superseded_by,
749
+ )
750
+ except ServiceError as e:
751
+ raise to_http_legacy(e)
752
+
753
+
704
754
  # --- Resolve file path → node_id ---
705
755
 
706
756
  @router.get("/resolve", response_model=ResolveOut, summary="Resolve file path to KG node")
@@ -237,6 +237,40 @@ async def _warehouse_consolidation_due(
237
237
  return elapsed >= interval_seconds
238
238
 
239
239
 
240
+ async def _temporal_recency_due(
241
+ *, workspace_id: str, now: datetime, interval_seconds: int
242
+ ) -> bool:
243
+ """Daily cadence guard for the KG temporal recency pass (Fase D).
244
+
245
+ Derives "last run" from the newest persisted recency proposal — these are
246
+ `operation_type='reinforce'` ops whose proposed_write target_type is 'none'
247
+ (M1 reinforce uses 'kg_edge_metric', so this filter isolates the recency
248
+ pass). Idempotent regardless (operation_id collision dedups within a cycle),
249
+ so a missing/unparseable timestamp falls back to "due".
250
+ """
251
+ if interval_seconds <= 0:
252
+ return True
253
+ async with acquire_db() as db:
254
+ row = await (
255
+ await db.execute(
256
+ "SELECT MAX(detected_at) FROM brain_memory_operations"
257
+ " WHERE operation_type = 'reinforce'"
258
+ " AND proposed_write_target_type = 'none'",
259
+ )
260
+ ).fetchone()
261
+ last_raw = row[0] if row else None
262
+ if not last_raw:
263
+ return True
264
+ try:
265
+ last_dt = datetime.fromisoformat(str(last_raw).replace("Z", "+00:00"))
266
+ except ValueError:
267
+ return True
268
+ if last_dt.tzinfo is None:
269
+ last_dt = last_dt.replace(tzinfo=timezone.utc)
270
+ elapsed = (now.astimezone(timezone.utc) - last_dt.astimezone(timezone.utc)).total_seconds()
271
+ return elapsed >= interval_seconds
272
+
273
+
240
274
  def _cycle_window_from_key(
241
275
  cycle_key: str, *, cutoff_hour_utc: int
242
276
  ) -> tuple[datetime, datetime]:
@@ -563,6 +597,44 @@ async def _execute_cycle(
563
597
  SourceFailure(source_system="warehouse_consolidation", error=str(exc))
564
598
  )
565
599
 
600
+ # Phase 4c — KG temporal recency (Fase D producer). Ships DORMANT: gated
601
+ # on temporal_memory_enabled (the MARVIS_TEMPORAL_MEMORY flag IS the gate;
602
+ # default off → skipped). When on, a daily cadence guard bounds re-emission.
603
+ # PROPOSALS only — never auto-applied. Isolated try/except so it can NEVER
604
+ # crash the cycle.
605
+ if app_settings.temporal_memory_enabled:
606
+ try:
607
+ from core.api.services.brain.temporal_recency import (
608
+ run_temporal_recency,
609
+ )
610
+
611
+ if await _temporal_recency_due(
612
+ workspace_id=workspace_id,
613
+ now=now,
614
+ interval_seconds=app_settings.brain_temporal_recency_interval_seconds,
615
+ ):
616
+ tr_summary = await run_temporal_recency(
617
+ run_id=run_id,
618
+ cycle_key=cycle_key,
619
+ workspace_id=workspace_id,
620
+ now=now,
621
+ )
622
+ logger.info(
623
+ "brain.jobs: temporal recency run_id=%s summary=%s",
624
+ run_id,
625
+ tr_summary,
626
+ )
627
+ else:
628
+ logger.info(
629
+ "brain.jobs: temporal recency skipped (cadence guard) run_id=%s",
630
+ run_id,
631
+ )
632
+ except Exception as exc: # noqa: BLE001 — phase-level isolation
633
+ logger.exception("brain.jobs: temporal recency failed")
634
+ failures.append(
635
+ SourceFailure(source_system="temporal_recency", error=str(exc))
636
+ )
637
+
566
638
  # Phase 5 — Learn Findings (sub-04). Final L5 phase of the cycle.
567
639
  # Consumes digest events + journal entries + drift signals + memory
568
640
  # operations of the current run_id (NEVER re-reads substrate).
@@ -0,0 +1,201 @@
1
+ # v1.0.0 - 2026-06-09 - P1: claude -p (Claude Code headless) provider for the Brain.
2
+ """Brain LLM backend that runs `claude -p` (Claude Code headless) as a subprocess.
3
+
4
+ The brain runs on the user's Claude Code **subscription** — zero API key. Selected
5
+ with `BRAIN_LLM_PROVIDER=claude_cli`; the default `gateway` path is unchanged.
6
+
7
+ Same `BrainLLMService` contract as `LocalGatewayBrainService` (call_polish / call_json
8
+ / aclose + model / grounding_strict). Only the transport differs: instead of an HTTP
9
+ chat.completion, we exec `claude -p --output-format json`, write the user prompt to
10
+ **stdin**, and read the single-result envelope. Verified flags/schema against the
11
+ installed binary (2026-06-09): envelope `{result: str, is_error: bool, …}`.
12
+
13
+ CRITICAL: `claude -p` is an AGENT by default (loads the Claude Code system prompt,
14
+ may use tools). For pure generation we pass `--allowedTools ""` (no tools),
15
+ `--system-prompt <brain>` (replace, not append) + `--exclude-dynamic-system-prompt-sections`
16
+ (strip the agentic preamble). Everything fails SOFT: any error/timeout/non-zero
17
+ exit/malformed JSON → PolishResult.failed (or None for call_json) → the brain
18
+ degrades to its deterministic baseline, never a crash.
19
+ """
20
+ from __future__ import annotations
21
+
22
+ import asyncio
23
+ import json
24
+ import logging
25
+ import os
26
+ import shutil
27
+ from contextlib import suppress
28
+ from typing import Any
29
+
30
+ from core.api.services.brain.llm.base import PolishPurpose, PolishResult
31
+ from core.api.services.brain.llm.direction_alignment import (
32
+ classify_direction_alignment_impl,
33
+ )
34
+ from core.api.services.brain.llm.local_gateway import _project_polished_fields
35
+ from core.api.services.brain.llm.parsers import ParseError, parse_json_or_raise
36
+
37
+ logger = logging.getLogger(__name__)
38
+
39
+
40
+ class ClaudeCliBrainService:
41
+ """Brain polish via `claude -p` headless on the local Claude Code subscription."""
42
+
43
+ def __init__(
44
+ self,
45
+ *,
46
+ model: str,
47
+ binary: str = "claude",
48
+ timeout_seconds: int = 60,
49
+ semaphore_size: int = 1,
50
+ grounding_strict: bool = False,
51
+ ) -> None:
52
+ self._model = model or ""
53
+ self._binary = binary or "claude"
54
+ self._timeout_seconds = max(5, int(timeout_seconds))
55
+ # Subprocess is heavy (CLI boot per call); keep concurrency low.
56
+ self._semaphore = asyncio.Semaphore(max(1, int(semaphore_size)))
57
+ self._grounding_strict = grounding_strict
58
+
59
+ @property
60
+ def model(self) -> str:
61
+ return self._model
62
+
63
+ @property
64
+ def grounding_strict(self) -> bool:
65
+ return self._grounding_strict
66
+
67
+ async def aclose(self) -> None:
68
+ # No persistent client/process to release.
69
+ return None
70
+
71
+ # ----------------------------------------------------------------- #
72
+ # subprocess transport #
73
+ # ----------------------------------------------------------------- #
74
+
75
+ async def _run(self, *, system_prompt: str, user_prompt: str) -> tuple[str | None, str]:
76
+ """Run `claude -p` once. Returns (content, "") on success, (None, reason) on
77
+ any failure. `content` is the assistant text (the envelope's `result`)."""
78
+ if not os.path.isabs(self._binary) and shutil.which(self._binary) is None:
79
+ return (None, "claude_not_on_path")
80
+
81
+ argv = [
82
+ self._binary,
83
+ "-p",
84
+ "--output-format", "json",
85
+ "--allowedTools", "", # no tools → pure generation, no agent loop
86
+ "--exclude-dynamic-system-prompt-sections", # drop the Claude Code agentic preamble
87
+ "--system-prompt", system_prompt,
88
+ ]
89
+ if self._model:
90
+ argv += ["--model", self._model]
91
+
92
+ async with self._semaphore:
93
+ try:
94
+ proc = await asyncio.create_subprocess_exec(
95
+ *argv,
96
+ stdin=asyncio.subprocess.PIPE,
97
+ stdout=asyncio.subprocess.PIPE,
98
+ stderr=asyncio.subprocess.PIPE,
99
+ )
100
+ except Exception as exc: # binary missing / exec error
101
+ return (None, f"spawn_failed:{exc}")
102
+ try:
103
+ out, err = await asyncio.wait_for(
104
+ proc.communicate(user_prompt.encode("utf-8")),
105
+ timeout=self._timeout_seconds,
106
+ )
107
+ except asyncio.TimeoutError:
108
+ proc.kill()
109
+ with suppress(Exception):
110
+ await proc.wait()
111
+ return (None, "timeout")
112
+ except Exception as exc:
113
+ return (None, f"communicate_failed:{exc}")
114
+
115
+ if proc.returncode != 0:
116
+ tail = err.decode("utf-8", "replace")[:200] if err else ""
117
+ return (None, f"exit_{proc.returncode}:{tail}")
118
+
119
+ try:
120
+ env = json.loads(out.decode("utf-8"))
121
+ except Exception:
122
+ return (None, "envelope_not_json")
123
+ if not isinstance(env, dict):
124
+ return (None, "envelope_not_object")
125
+ if env.get("is_error"):
126
+ return (None, f"claude_error:{str(env.get('result'))[:200]}")
127
+
128
+ content = env.get("result")
129
+ if not isinstance(content, str) or not content.strip():
130
+ # Tolerant of schema drift: fall back to the first non-empty string field.
131
+ content = next(
132
+ (v for v in env.values() if isinstance(v, str) and v.strip()), ""
133
+ )
134
+ if not content:
135
+ return (None, "empty_result")
136
+ return (content, "")
137
+
138
+ # ----------------------------------------------------------------- #
139
+ # BrainLLMService contract #
140
+ # ----------------------------------------------------------------- #
141
+
142
+ async def call_polish(
143
+ self,
144
+ *,
145
+ purpose: PolishPurpose,
146
+ system_prompt: str,
147
+ user_prompt: str,
148
+ max_tokens: int,
149
+ idempotency_key: str | None = None,
150
+ ) -> PolishResult:
151
+ """Issue the polish call. Never raises — returns PolishResult.failed on errors.
152
+ Shares the content→PolishResult projection with the gateway provider."""
153
+ content, reason = await self._run(system_prompt=system_prompt, user_prompt=user_prompt)
154
+ if content is None:
155
+ logger.warning("brain_claude_cli_polish_failed purpose=%s reason=%s", purpose, reason)
156
+ return PolishResult.failed(purpose=purpose, reason=reason, model=self._model)
157
+ try:
158
+ parsed = parse_json_or_raise(content)
159
+ except ParseError as exc:
160
+ return PolishResult.failed(
161
+ purpose=purpose, reason=f"json_parse_failed:{exc}", model=self._model
162
+ )
163
+ polished, cited = _project_polished_fields(purpose=purpose, parsed=parsed)
164
+ if not polished:
165
+ return PolishResult.failed(
166
+ purpose=purpose, reason="polished_fields_missing", model=self._model
167
+ )
168
+ return PolishResult(
169
+ success=True,
170
+ purpose=purpose,
171
+ polished=polished,
172
+ cited_evidence_refs=cited,
173
+ model=self._model,
174
+ )
175
+
176
+ async def call_json(
177
+ self,
178
+ *,
179
+ model: str,
180
+ system_prompt: str,
181
+ user_prompt: str,
182
+ max_tokens: int,
183
+ temperature: float,
184
+ idempotency_key: str | None = None,
185
+ ) -> dict[str, Any] | None:
186
+ """Generic JSON-object call (DR8 classifier). The per-call `model` is a
187
+ gateway model id with no Claude equivalent, so the configured Claude model
188
+ (`self._model`) is used. None on any failure — caller falls back."""
189
+ content, reason = await self._run(system_prompt=system_prompt, user_prompt=user_prompt)
190
+ if content is None:
191
+ logger.warning("brain_claude_cli_json_failed reason=%s", reason)
192
+ return None
193
+ try:
194
+ return parse_json_or_raise(content)
195
+ except ParseError as exc:
196
+ logger.warning("brain_claude_cli_json_parse_failed reason=%s", str(exc))
197
+ return None
198
+
199
+ async def classify_direction_alignment(self, payload: dict[str, Any]) -> dict[str, Any] | None:
200
+ """DR8 classifier surface — same impl the gateway provider uses."""
201
+ return await classify_direction_alignment_impl(llm_surface=self, payload=payload)
@@ -93,6 +93,19 @@ def get_brain_llm_service() -> BrainLLMService:
93
93
  _brain_llm_service = _NoOpBrainLLMService()
94
94
  return _brain_llm_service
95
95
 
96
+ # P1: claude -p provider runs on the Claude Code subscription — NO api key.
97
+ if getattr(settings, "brain_llm_provider", "gateway") == "claude_cli":
98
+ from core.api.services.brain.llm.claude_cli import ClaudeCliBrainService
99
+
100
+ _brain_llm_service = ClaudeCliBrainService(
101
+ binary=getattr(settings, "marvis_claude_bin", "claude") or "claude",
102
+ model=settings.brain_llm_model,
103
+ timeout_seconds=settings.brain_llm_polish_timeout_seconds,
104
+ semaphore_size=settings.brain_llm_semaphore_size,
105
+ grounding_strict=settings.brain_llm_grounding_strict,
106
+ )
107
+ return _brain_llm_service
108
+
96
109
  brain_key = _secret_text(settings.brain_llm_gateway_api_key)
97
110
  global_key = _secret_text(settings.llm_gateway_api_key)
98
111
 
@@ -1519,10 +1519,21 @@ def _next_action_for(op: MemoryOperation) -> ApplyNextAction:
1519
1519
  target_type = pw.target_type # type: ignore[union-attr]
1520
1520
 
1521
1521
  if op.operation_type == "reinforce":
1522
- tool = None
1523
- rationale = "reinforce produces edge metric evidence only; v2 may write to graph_edge_metrics."
1524
- if hasattr(pw, "edge_id"):
1525
- args = {"edge_id": pw.edge_id, "metric_kind": pw.metric_kind, "delta": pw.delta}
1522
+ if target_type == "none":
1523
+ # Fase D temporal recency: bump the node's last_verified_at via the
1524
+ # write-path tool (proposed_write is `none`; the node id rides in
1525
+ # source_ref). Guidance-only: the operator/agent runs the tool.
1526
+ tool = "mcp__marvis__mark_kg_verified"
1527
+ args = {"node_id": op.source_ref}
1528
+ rationale = (
1529
+ "Temporal recency: this live node is aging and never verified. "
1530
+ "Approve → mark_kg_verified stamps last_verified_at so it reads fresh."
1531
+ )
1532
+ else:
1533
+ tool = None
1534
+ rationale = "reinforce produces edge metric evidence only; v2 may write to graph_edge_metrics."
1535
+ if hasattr(pw, "edge_id"):
1536
+ args = {"edge_id": pw.edge_id, "metric_kind": pw.metric_kind, "delta": pw.delta}
1526
1537
  elif op.operation_type == "cascade_rollup":
1527
1538
  tool = None
1528
1539
  rationale = "Cascade rollup is apply-guidance-only. Operator appends body to parent context.md."