dialectical-framework 1.6.6__tar.gz → 1.6.7__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 (194) hide show
  1. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/PKG-INFO +1 -1
  2. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/pyproject.toml +1 -1
  3. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/advisor.py +9 -9
  4. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/system_prompts.py +91 -19
  5. dialectical_framework-1.6.7/src/dialectical_framework/agents/advisor/tools/sync.py +32 -0
  6. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/inspect_node.py +14 -2
  7. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/action_extraction.py +3 -2
  8. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/control_statements_check.py +74 -11
  9. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/dialectical_context.py +167 -15
  10. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/positive_ac_re_apex_derivation.py +1 -1
  11. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/scoring_scales.py +10 -5
  12. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/statement_classification.py +138 -53
  13. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/synthesis_generation.py +5 -1
  14. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/transformation_generation.py +4 -0
  15. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/assessable_entity.py +1 -1
  16. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/estimation.py +26 -0
  17. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/perspective.py +11 -0
  18. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/settings.py +10 -2
  19. dialectical_framework-1.6.6/src/dialectical_framework/agents/advisor/tools/sync.py +0 -20
  20. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/LICENSE +0 -0
  21. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/PATENTS +0 -0
  22. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/README.md +0 -0
  23. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/__init__.py +0 -0
  24. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/__init__.py +0 -0
  25. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/__init__.py +0 -0
  26. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/__init__.py +0 -0
  27. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/anchor.py +0 -0
  28. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/deepen.py +0 -0
  29. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/explore.py +0 -0
  30. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/ingest.py +0 -0
  31. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/scoped.py +0 -0
  32. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/agent_context.py +0 -0
  33. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/__init__.py +0 -0
  34. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/analyst.py +0 -0
  35. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/__init__.py +0 -0
  36. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/anchor_theses.py +0 -0
  37. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/edit_perspective.py +0 -0
  38. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/expand_polarities.py +0 -0
  39. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/find_polarities.py +0 -0
  40. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/introduce_polarity.py +0 -0
  41. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/surface_theses.py +0 -0
  42. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/system_prompts.py +0 -0
  43. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/tools/__init__.py +0 -0
  44. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/tools/place_statement.py +0 -0
  45. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/apps.py +0 -0
  46. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/conversation_facilitator.py +0 -0
  47. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/execution_report.py +0 -0
  48. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/__init__.py +0 -0
  49. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/explorer.py +0 -0
  50. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/skills/__init__.py +0 -0
  51. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/skills/build_wheels.py +0 -0
  52. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/skills/explore_transformations.py +0 -0
  53. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/skills/generate_synthesis.py +0 -0
  54. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/system_prompts.py +0 -0
  55. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/__init__.py +0 -0
  56. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/create_nexus.py +0 -0
  57. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/expand_nexus.py +0 -0
  58. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/generate_synthesis.py +0 -0
  59. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/present_exploration.py +0 -0
  60. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/__init__.py +0 -0
  61. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/__init__.py +0 -0
  62. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/add_input.py +0 -0
  63. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/create_dx_input.py +0 -0
  64. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/digest_input.py +0 -0
  65. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/discard.py +0 -0
  66. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/get_schema.py +0 -0
  67. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/present_analysis.py +0 -0
  68. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/query_graph.py +0 -0
  69. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/read_digest.py +0 -0
  70. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/read_input.py +0 -0
  71. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/reasonable_concern.py +0 -0
  72. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/stream_events.py +0 -0
  73. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/__init__.py +0 -0
  74. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/ac_re_taxonomy.py +0 -0
  75. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/add_input.py +0 -0
  76. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/ai_dto/__init__.py +0 -0
  77. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/ai_dto/statement_dto.py +0 -0
  78. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/ai_dto/statements_deck_dto.py +0 -0
  79. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/antithesis_classification.py +0 -0
  80. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/antithesis_extraction.py +0 -0
  81. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/antithetical_thesis_detection.py +0 -0
  82. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/aspect_classification.py +0 -0
  83. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/aspect_generation.py +0 -0
  84. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/__init__.py +0 -0
  85. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator.py +0 -0
  86. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_balanced.py +0 -0
  87. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_criteria.py +0 -0
  88. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_desirable.py +0 -0
  89. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_feasible.py +0 -0
  90. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_realistic.py +0 -0
  91. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_normalizer.py +0 -0
  92. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/estimator_resolver.py +0 -0
  93. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality_estimation.py +0 -0
  94. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/create_dx_input.py +0 -0
  95. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/create_nexus.py +0 -0
  96. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/diagonal_oppositions_check.py +0 -0
  97. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/discard.py +0 -0
  98. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/display_text_edit.py +0 -0
  99. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/expand_nexus.py +0 -0
  100. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/perspective_combination.py +0 -0
  101. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/perspective_validation.py +0 -0
  102. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/source_digest.py +0 -0
  103. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/statement_deduplication.py +0 -0
  104. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/statement_headline.py +0 -0
  105. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/statement_placement.py +0 -0
  106. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/thesis_extraction.py +0 -0
  107. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/transformation_audit.py +0 -0
  108. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/dialectical_reasoning.py +0 -0
  109. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/enums/__init__.py +0 -0
  110. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/enums/causality_preset.py +0 -0
  111. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/enums/di.py +0 -0
  112. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/events/__init__.py +0 -0
  113. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/events/graph_event.py +0 -0
  114. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/events/graph_event_bus.py +0 -0
  115. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/exceptions/__init__.py +0 -0
  116. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/exceptions/node_errors.py +0 -0
  117. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/exceptions/resolver_errors.py +0 -0
  118. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/__init__.py +0 -0
  119. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/composite_input_resolver.py +0 -0
  120. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/dialexity_input_resolver.py +0 -0
  121. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/estimation_manager.py +0 -0
  122. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/mixins/__init__.py +0 -0
  123. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/mixins/incremental_build_mixin.py +0 -0
  124. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/mixins/intent_mixin.py +0 -0
  125. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/mixins/persistable_mixin.py +0 -0
  126. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/__init__.py +0 -0
  127. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/base_node.py +0 -0
  128. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/case.py +0 -0
  129. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/cycle.py +0 -0
  130. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/ideas.py +0 -0
  131. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/input.py +0 -0
  132. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/nexus.py +0 -0
  133. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/polarity.py +0 -0
  134. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/rationale.py +0 -0
  135. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/statement.py +0 -0
  136. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/synthesis.py +0 -0
  137. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/transformation.py +0 -0
  138. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/transition.py +0 -0
  139. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/wheel.py +0 -0
  140. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationship_manager.py +0 -0
  141. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/__init__.py +0 -0
  142. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/action_reflection_relationship.py +0 -0
  143. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/belongs_to_cycle_relationship.py +0 -0
  144. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/belongs_to_nexus_relationship.py +0 -0
  145. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/changed_to_relationship.py +0 -0
  146. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/contradiction_of_relationship.py +0 -0
  147. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/critiques_relationship.py +0 -0
  148. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/distilled_to_relationship.py +0 -0
  149. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/estimates_relationship.py +0 -0
  150. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/explains_relationship.py +0 -0
  151. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/has_input_relationship.py +0 -0
  152. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/has_statement_relationship.py +0 -0
  153. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/has_wheel_relationship.py +0 -0
  154. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/immutable_structure.py +0 -0
  155. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/is_source_of_relationship.py +0 -0
  156. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/is_target_of_relationship.py +0 -0
  157. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/negative_side_of_relationship.py +0 -0
  158. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/opposite_direction_relationship.py +0 -0
  159. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/opposite_of_relationship.py +0 -0
  160. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/polarity_relationship.py +0 -0
  161. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/positive_side_of_relationship.py +0 -0
  162. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/provides_relationship.py +0 -0
  163. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/synthesis_of_relationship.py +0 -0
  164. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/rendering.py +0 -0
  165. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/__init__.py +0 -0
  166. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/case_repository.py +0 -0
  167. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/cycle_repository.py +0 -0
  168. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/input_repository.py +0 -0
  169. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/nexus_repository.py +0 -0
  170. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/node_repository.py +0 -0
  171. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/perspective_repository.py +0 -0
  172. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/polarity_repository.py +0 -0
  173. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/schema_repository.py +0 -0
  174. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/statement_repository.py +0 -0
  175. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/transformation_repository.py +0 -0
  176. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/wheel_repository.py +0 -0
  177. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/scope_context.py +0 -0
  178. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/verbatim_input_resolver.py +0 -0
  179. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/wheel_segment.py +0 -0
  180. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/wheel_segment_polar_pair.py +0 -0
  181. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/protocols/__init__.py +0 -0
  182. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/protocols/has_config.py +0 -0
  183. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/protocols/input_resolver.py +0 -0
  184. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/__init__.py +0 -0
  185. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/bedrock_provider.py +0 -0
  186. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/concurrency.py +0 -0
  187. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/dc_replace.py +0 -0
  188. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/decompose_probability_uniformly.py +0 -0
  189. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/edge_context.py +0 -0
  190. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/effect_logger.py +0 -0
  191. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/input_context.py +0 -0
  192. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/order_transitions.py +0 -0
  193. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/sequence_generation.py +0 -0
  194. {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/use_brain.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dialectical-framework
3
- Version: 1.6.6
3
+ Version: 1.6.7
4
4
  Summary: A dialectical framework for augmented intelligence. AI reasoning powered with dialectics supports humans in: system optimization (psychology, engineering, business, politics, etc.); dispute resolution (mediation, conflicts, negotiations, etc.); decision-making (dilemmas, challenging situations, win-win, etc.).
5
5
  License: MIT
6
6
  Keywords: dialectics,dialectical-reasoning,synthesis,thesis-antithesis,ai,artificial-intelligence,llm,reasoning-framework,philosophy,logic,argumentation,conflict-resolution,decision-making,critical-thinking,semantic-graph,mirascope,pydantic,perspectives,polarity-reasoning
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "dialectical-framework"
3
- version = "1.6.6"
3
+ version = "1.6.7"
4
4
  description = "A dialectical framework for augmented intelligence. AI reasoning powered with dialectics supports humans in: system optimization (psychology, engineering, business, politics, etc.); dispute resolution (mediation, conflicts, negotiations, etc.); decision-making (dilemmas, challenging situations, win-win, etc.)."
5
5
  authors = ["Evaldas Taroza <evaldas@dialexity.com>"]
6
6
  readme = "README.md"
@@ -17,8 +17,8 @@ from typing import AsyncGenerator, Optional
17
17
 
18
18
  from pydantic import BaseModel, Field
19
19
 
20
- from dialectical_framework.agents.advisor.system_prompts import (
21
- SYSTEM_PROMPT, system_prompt)
20
+ from dialectical_framework.agents.advisor.system_prompts import \
21
+ system_prompt
22
22
  from dialectical_framework.agents.agent_context import agent_scope
23
23
  from dialectical_framework.agents.conversation_facilitator import \
24
24
  ConversationFacilitator
@@ -144,13 +144,13 @@ class Advisor:
144
144
  dialectical_context
145
145
  or "No prior understanding — this is a fresh conversation."
146
146
  )
147
- if self._nexus_hash:
148
- engine = system_prompt(
149
- tool_names=[t.__name__ for t in self._tools],
150
- scoped_nexus_hash=self._nexus_hash,
151
- )
152
- else:
153
- engine = SYSTEM_PROMPT
147
+ # Rendered at construction (not the import-time SYSTEM_PROMPT
148
+ # constant) so settings-derived prompt values (max_wheel_layer)
149
+ # reflect the live DI configuration.
150
+ engine = system_prompt(
151
+ tool_names=[t.__name__ for t in self._tools],
152
+ scoped_nexus_hash=self._nexus_hash,
153
+ )
154
154
  parts.append(engine.replace("{dialectical_context}", context_text))
155
155
 
156
156
  return "\n\n".join(parts)
@@ -34,6 +34,51 @@ def _ladder_lines(scale: dict[str, float], annotations: dict[float, str]) -> str
34
34
  return "\n".join(lines)
35
35
 
36
36
 
37
+ def _resolve_max_wheel_layer() -> int:
38
+ """The live settings.max_wheel_layer, falling back to the Pydantic field
39
+ default when DI isn't wired (e.g. the import-time SYSTEM_PROMPT render).
40
+ """
41
+ from dialectical_framework.settings import Settings
42
+
43
+ try:
44
+ from dialectical_framework.protocols.has_config import SettingsAware
45
+
46
+ value = SettingsAware().settings.max_wheel_layer
47
+ if isinstance(value, int) and value >= 1:
48
+ return value
49
+ except Exception:
50
+ pass
51
+ return Settings.model_fields["max_wheel_layer"].default
52
+
53
+
54
+ def _nexus_evolution(cap: int) -> str:
55
+ """Render the explore doc's 'How a nexus evolves' ladder from the live
56
+ wheel-layer cap (settings.max_wheel_layer), so the prompt's nexus-size
57
+ guidance never drifts from what PerspectiveCombination actually builds.
58
+ """
59
+ lines = [
60
+ " How a nexus evolves:",
61
+ " - 1 perspective: a single self-referential wheel. Already generates",
62
+ " transformations and synthesis — useful even alone.",
63
+ ]
64
+ if cap >= 2:
65
+ lines += [
66
+ " - 2 perspectives: the causal question emerges (which thesis enables which?).",
67
+ " Produces multiple wheels (arrangements), each with its own pathways.",
68
+ ]
69
+ if cap >= 3:
70
+ span = f"3-{cap}" if cap > 3 else "3"
71
+ lines += [
72
+ f" - {span} perspectives: richer causal chains, more transformation variety,",
73
+ " deeper synthesis. The sweet spot for insight.",
74
+ ]
75
+ lines.append(
76
+ f" - >{cap}: combinatorial explosion — arrangements aren't built beyond"
77
+ f" {cap} perspectives; start a new nexus for more tensions."
78
+ )
79
+ return "\n".join(lines)
80
+
81
+
37
82
  _ROLE = """## Role
38
83
 
39
84
  You are in conversation with someone navigating a decision, tension, or
@@ -277,14 +322,7 @@ _TOOL_DOCS: dict[str, str] = {
277
322
  and sibling nexuses on one theme fragment the pathways. Create separate
278
323
  nexuses only for genuinely distinct themes.
279
324
 
280
- How a nexus evolves:
281
- - 1 perspective: a single self-referential wheel. Already generates
282
- transformations and synthesis — useful even alone.
283
- - 2 perspectives: the causal question emerges (which thesis enables which?).
284
- Produces multiple wheels (arrangements), each with its own pathways.
285
- - 3-4 perspectives: richer causal chains, more transformation variety,
286
- deeper synthesis. The sweet spot for insight.
287
- - >4: combinatorial explosion — cap at 4, start a new nexus for more tensions.
325
+ {nexus_evolution}
288
326
 
289
327
  Grouping principle: prefer perspectives from different polarities (different
290
328
  T-A oppositions) — transformations between them represent genuine synthesis
@@ -314,11 +352,15 @@ _TOOL_DOCS: dict[str, str] = {
314
352
  them. Deepening only adds analytical depth to existing structure — it
315
353
  never changes what the exploration contains, so no consent ceremony is
316
354
  needed. Harmless on already-developed wheels.""",
317
- "sync": """- `sync` — Re-reads the full graph state. Use when you need a fresh full
318
- picture — e.g., after multiple ingest/anchor calls, to see all perspectives
319
- with scores before deciding what to group for explore. NOT needed after every
320
- tool call (ingest/anchor/explore return their results directly), and NOT
321
- needed at conversation start — the full state is already in your context.""",
355
+ "sync": """- `sync` — Re-reads the graph state. Without arguments: the full picture —
356
+ e.g., after multiple ingest/anchor calls, to see all perspectives with
357
+ scores before deciding what to group for explore. With a `nexus_hash`:
358
+ zooms into that one exploration in full depth — the overview caps wheels
359
+ per cycle for compactness, the zoom does not. Zoom when counsel settles on
360
+ one exploration and you need arrangements the overview truncated. NOT
361
+ needed after every tool call (ingest/anchor/explore return their results
362
+ directly), and NOT needed at conversation start — the full state is
363
+ already in your context.""",
322
364
  "sync_scoped": """- `sync` — Re-reads this exploration's state. Use when you need a fresh
323
365
  picture after changes. NOT needed at conversation start — the exploration
324
366
  is already in your context.""",
@@ -485,6 +527,22 @@ Use `inspect_node` when you want to understand the reasoning behind a score,
485
527
  explain WHY a specific blindspot exists, or ground a pathway recommendation
486
528
  in the actual analytical logic rather than restating the dump.
487
529
 
530
+ **Cross-exploration correspondences.** When several explorations coexist,
531
+ some perspectives carry correspondence lines — machine-stated facts, not
532
+ suggestions: "Also woven into Nexus [[x]]" (literally the same tension in
533
+ both explorations) and "Same opposition family (...) as perspective N in
534
+ [[x]]" (both tensions anchored to the same deep-structure category). These
535
+ are your invitation to draw parallels across the person's situations —
536
+ often the most powerful counsel move available: the same structural dynamic
537
+ playing out in two arenas of their life means an insight earned in one
538
+ transfers to the other. But family-level correspondence is coarse (few
539
+ families exist, collisions are common) — before drawing the parallel, check
540
+ it holds in substance: read both tetrads and confirm the dynamics actually
541
+ mirror each other, not just the category. The family name itself (Integrity,
542
+ Fire, ...) is framework vocabulary — the How You Speak rules above govern
543
+ it like any other; by default, name what the two tensions share in the
544
+ person's own terms, not the category label.
545
+
488
546
  **Sequences are circular causality.** Both Cycle and Wheel sequences are
489
547
  closed loops — they start and end with the same element (e.g., "T1 → T2 → T1..."
490
548
  or "T1 → A2 → A1 → T2 → T1..."). The "..." indicates the circle continues.
@@ -520,6 +578,13 @@ Use these scores to prioritize what you draw on:
520
578
  - `rectangularity`: Tetrad balance (lower = better).
521
579
  <0.01 = well-balanced. 0.01–0.09 = mild imbalance, acceptable.
522
580
  >0.09 = one side overdeveloped — note the imbalance.
581
+ - `DV`: Dialectical validity — how NATURAL the tension's dynamics are
582
+ (higher = the poles genuinely complement each other and the pathologies
583
+ arise organically; lower = the framing is forced, one-sided, or held
584
+ together by coercion/ideology rather than natural dynamics). Comparative
585
+ signal, no fixed cutoff: prefer high-DV tensions when choosing what to
586
+ build counsel on, and treat a low-DV tension as a hint the framing itself
587
+ may be distorted — consider re-anchoring rather than polishing aspects.
523
588
  - `Ks` on aspects: Complementarity toward synthesis.
524
589
  T+/A+ should be >0.4 (constructive poles complement the whole).
525
590
  T-/A- should be <0.6 (destructive poles don't overpower).
@@ -549,12 +614,13 @@ Use these scores to prioritize what you draw on:
549
614
 
550
615
  **Prioritization rules:**
551
616
 
552
- The dump is pre-pruned: tensions below the quality floor (weak opposition,
553
- blurred structure, failed validation) and low-probability wheels are already
554
- suppressed — count lines note what was filtered. Everything you see passed
555
- the floor; you rank within it, you don't re-filter.
617
+ The dump is pre-pruned: tensions below the quality floors (weak opposition,
618
+ blurred structure, unnatural/distorted framing, failed validation) and
619
+ low-probability wheels are already suppressed — count lines note what was
620
+ filtered. Everything you see passed the floors; you rank within them, you
621
+ don't re-filter.
556
622
 
557
- 1. Lead with the strongest tensions (highest HS on A, best area). Softer
623
+ 1. Lead with the strongest tensions (highest HS on A, best area, best DV). Softer
558
624
  ones are still visible by design — usable, and they may resonate with
559
625
  the person's lived experience, but don't build your primary counsel
560
626
  around them.
@@ -635,7 +701,13 @@ def system_prompt(
635
701
  # Scoped variants of sync/explore have their own doc text.
636
702
  key = f"{name}_scoped" if scoped and f"{name}_scoped" in _TOOL_DOCS else name
637
703
  if key in _TOOL_DOCS:
638
- tool_docs.append(_TOOL_DOCS[key])
704
+ doc = _TOOL_DOCS[key]
705
+ if "{nexus_evolution}" in doc:
706
+ doc = doc.replace(
707
+ "{nexus_evolution}",
708
+ _nexus_evolution(_resolve_max_wheel_layer()),
709
+ )
710
+ tool_docs.append(doc)
639
711
 
640
712
  conversation_use = _CONVERSATION_USE
641
713
  if scoped and "ingest" not in names:
@@ -0,0 +1,32 @@
1
+ """
2
+ sync tool: Re-read the dialectical graph state.
3
+
4
+ Returns a structured dump of tensions, pathways, and synthesis for the
5
+ current case scope. With `nexus_hash`, zooms into one exploration and
6
+ renders it in full depth (the unscoped dump caps wheels per cycle for
7
+ compactness; the zoomed render is exempt, same as counsel-mode dumps).
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import Annotated
13
+
14
+ from mirascope import llm
15
+ from pydantic import Field
16
+
17
+ from dialectical_framework.concerns.dialectical_context import \
18
+ DialecticalContext
19
+
20
+
21
+ @llm.tool
22
+ async def sync(
23
+ nexus_hash: Annotated[
24
+ str | None,
25
+ Field(
26
+ description="Zoom into one exploration: render only this nexus, in full depth (no wheel cap). Omit for the full-case overview."
27
+ ),
28
+ ] = None,
29
+ ) -> str:
30
+ """Re-read the graph state. Without arguments: the full picture across all explorations (compact — wheels capped per cycle). With a nexus_hash: one exploration in full depth. Use the zoom when counsel centers on one exploration and the overview's capped view isn't enough."""
31
+ concern = DialecticalContext(nexus_hash=nexus_hash)
32
+ return await concern.resolve()
@@ -149,6 +149,8 @@ from pydantic import Field
149
149
 
150
150
  from dialectical_framework.agents.reasonable_concern import ReasonableConcern
151
151
  from dialectical_framework.enums.di import DI
152
+ from dialectical_framework.graph.nodes.estimation import \
153
+ DialecticalValidityEstimation
152
154
  from dialectical_framework.graph.rendering import (
153
155
  build_pp_index,
154
156
  component_alias,
@@ -215,7 +217,11 @@ def _inspect_perspective(pp: Perspective) -> str:
215
217
  # Tetrad quality metrics
216
218
  diff_t = pp.diff_t
217
219
  diff_a = pp.diff_a
218
- area = pp.area_normalized
220
+ # Raw area (= theory's SP, -2..2) — the scale every band/gate/prompt in the
221
+ # system speaks (settings min_sp, advisor bands, dialectical_context).
222
+ # area_normalized (area/2) is a UI-only hint; showing it here under a
223
+ # different scale than the Advisor's dump confused cross-surface reads.
224
+ area = pp.area
219
225
  rect = pp.rectangularity
220
226
  metrics: list[str] = []
221
227
  if diff_t is not None:
@@ -223,9 +229,15 @@ def _inspect_perspective(pp: Perspective) -> str:
223
229
  if diff_a is not None:
224
230
  metrics.append(f"diff_a={diff_a:.3f}")
225
231
  if area is not None:
226
- metrics.append(f"area_normalized={area:.3f}")
232
+ metrics.append(f"area={area:.3f}")
227
233
  if rect is not None:
228
234
  metrics.append(f"rect={rect:.4f}")
235
+ # DV (Dialectical Validity, paper's naturalness companion to SP) — read
236
+ # from the persisted estimation, annotation only.
237
+ for est, _ in pp.estimations.all():
238
+ if isinstance(est, DialecticalValidityEstimation):
239
+ metrics.append(f"DV={est.value:.3f}")
240
+ break
229
241
  if metrics:
230
242
  lines.append(f"Quality: {', '.join(metrics)}")
231
243
 
@@ -111,8 +111,9 @@ APEX
111
111
  2. Must help transition FROM T- (problem) TOWARD A+ (benefit)
112
112
  3. Must NOT simply restate A+ - it's the PATH, not the destination
113
113
  4. Should be generative: enable discovery rather than prescribe specific outcomes
114
- 5. Length: a fuller actionable form, longer than the headline
115
- 6. Choose the insight level that best matches the nature of the action
114
+ 5. Must stay subtle, not forceful: an action that imposes, coerces, or overpowers reverses its polarity from Ac+ to Ac-. Prefer enabling over forcing
115
+ 6. Length: a fuller actionable form, longer than the headline
116
+ 7. Choose the insight level that best matches the nature of the action
116
117
  """
117
118
 
118
119
 
@@ -42,7 +42,8 @@ from dialectical_framework.agents.reasonable_concern import \
42
42
  ReasonableConcern
43
43
  from dialectical_framework.agents.execution_report import ExecutionReport
44
44
  from dialectical_framework.graph.nodes.estimation import (
45
- CONCEPTUAL_COHERENCE_THRESHOLD, ConceptualCoherenceEstimation)
45
+ CONCEPTUAL_COHERENCE_THRESHOLD, ConceptualCoherenceEstimation,
46
+ DialecticalValidityEstimation)
46
47
  from dialectical_framework.graph.nodes.rationale import Rationale
47
48
  from dialectical_framework.graph.nodes.perspective import (POSITION_A_MINUS,
48
49
  POSITION_A_PLUS,
@@ -57,7 +58,16 @@ if TYPE_CHECKING:
57
58
 
58
59
 
59
60
  class CoherenceEvaluationDto(BaseModel):
60
- """Result of evaluating a single control statement."""
61
+ """Result of evaluating a single control statement (CC + DV).
62
+
63
+ DESIGN FORK (revisit if scores correlate): CC and DV are scored in the SAME
64
+ LLM call here (zero extra cost), while the paper [P1 S1.7] used separate
65
+ prompts per metric. Same-call scoring risks the model anchoring one score
66
+ on the other. If real-LLM checks against the paper's reference table
67
+ (S1.7-1/-2: Orwellian DV≈0.0 with CC as high as 0.85 on some models;
68
+ Buddhist DV≈0.9) show CC and DV tracking each other where the paper
69
+ separates them, split DV into its own call (+2 calls per perspective).
70
+ """
61
71
 
62
72
  coherence_score: float = Field(
63
73
  ge=0.0,
@@ -65,6 +75,26 @@ class CoherenceEvaluationDto(BaseModel):
65
75
  description="Logical coherence score (0.0-1.0). >= 0.7 is considered coherent.",
66
76
  )
67
77
  reasoning: str = Field(description="Brief explanation of the coherence assessment")
78
+ dialectical_validity: float = Field(
79
+ ge=0.0,
80
+ le=1.0,
81
+ description=(
82
+ "Dialectical Validity (DV, 0.0-1.0), judged INDEPENDENTLY of coherence. "
83
+ "1.0 = the statement expresses a natural, balanced, generative dialectical "
84
+ "relationship: the concepts occupy comparable semantic levels, the two "
85
+ "positive poles genuinely complement one another, and the predicted "
86
+ "pathology arises naturally from the absence of its complementary "
87
+ "counterpart. 0.0 = forced, artificial, or dialectically distorted: "
88
+ "semantically mismatched concepts, one pole arbitrarily privileged, or "
89
+ "outcomes relying on coercion, ideology, arbitrary conventions, or "
90
+ "implausible reasoning rather than natural system dynamics. Ignore "
91
+ "factual correctness; evaluate only the quality of the dialectical "
92
+ "relationship as a generative principle."
93
+ ),
94
+ )
95
+ dv_reasoning: str = Field(
96
+ description="Brief explanation of the dialectical-validity assessment"
97
+ )
68
98
 
69
99
 
70
100
  # --- Result ---
@@ -79,6 +109,7 @@ class ControlStatementsCheckResult:
79
109
  """
80
110
 
81
111
  estimation: ConceptualCoherenceEstimation
112
+ dv_estimation: DialecticalValidityEstimation
82
113
  rationale: Rationale
83
114
 
84
115
  # Control statement details for transparency
@@ -88,6 +119,9 @@ class ControlStatementsCheckResult:
88
119
  a_plus_without_t_plus_yields_a_minus_statement: str
89
120
  a_plus_without_t_plus_yields_a_minus_score: float
90
121
  a_plus_without_t_plus_yields_a_minus_reasoning: str
122
+ # DV per statement (annotation only — never gates; see DialecticalValidityEstimation)
123
+ t_plus_without_a_plus_yields_t_minus_dv: float
124
+ a_plus_without_t_plus_yields_a_minus_dv: float
91
125
 
92
126
  @property
93
127
  def is_coherent(self) -> bool:
@@ -159,29 +193,39 @@ class ControlStatementsCheck(ReasonableConcern[ControlStatementsCheckResult]):
159
193
 
160
194
  # Create estimation and rationale nodes
161
195
  avg_score = (result_1.coherence_score + result_2.coherence_score) / 2
196
+ avg_dv = (result_1.dialectical_validity + result_2.dialectical_validity) / 2
162
197
 
163
198
  estimation = ConceptualCoherenceEstimation(
164
199
  value=avg_score,
165
200
  t_plus_without_a_plus_yields_t_minus=result_1.coherence_score,
166
201
  a_plus_without_t_plus_yields_a_minus=result_2.coherence_score,
167
202
  )
203
+ dv_estimation = DialecticalValidityEstimation(
204
+ value=avg_dv,
205
+ t_plus_without_a_plus_yields_t_minus=result_1.dialectical_validity,
206
+ a_plus_without_t_plus_yields_a_minus=result_2.dialectical_validity,
207
+ )
168
208
  status = "COHERENT" if estimation.is_coherent else "NOT COHERENT"
169
209
 
170
210
  rationale_text = (
171
211
  f"Conceptual Coherence Evaluation: {status}\n\n"
172
- f"T+ without A+ yields T- (score={result_1.coherence_score:.2f}):\n"
212
+ f"T+ without A+ yields T- (CC={result_1.coherence_score:.2f}, DV={result_1.dialectical_validity:.2f}):\n"
173
213
  f" {stmt_1}\n"
174
- f" Reasoning: {result_1.reasoning}\n\n"
175
- f"A+ without T+ yields A- (score={result_2.coherence_score:.2f}):\n"
214
+ f" Reasoning: {result_1.reasoning}\n"
215
+ f" DV reasoning: {result_1.dv_reasoning}\n\n"
216
+ f"A+ without T+ yields A- (CC={result_2.coherence_score:.2f}, DV={result_2.dialectical_validity:.2f}):\n"
176
217
  f" {stmt_2}\n"
177
- f" Reasoning: {result_2.reasoning}\n\n"
178
- f"Coherence requires both scores >= {CONCEPTUAL_COHERENCE_THRESHOLD} (average: {avg_score:.2f})"
218
+ f" Reasoning: {result_2.reasoning}\n"
219
+ f" DV reasoning: {result_2.dv_reasoning}\n\n"
220
+ f"Coherence requires both CC scores >= {CONCEPTUAL_COHERENCE_THRESHOLD} (average: {avg_score:.2f}).\n"
221
+ f"DV (dialectical naturalness, avg {avg_dv:.2f}) annotates only — no threshold."
179
222
  )
180
223
  rationale = Rationale(text=rationale_text)
181
224
 
182
225
  # Only commit and attach if PP is committed
183
226
  if perspective.is_committed:
184
227
  estimation.set_target(perspective)
228
+ dv_estimation.set_target(perspective)
185
229
  rationale.set_explanation_target(perspective)
186
230
  rationale.commit()
187
231
  self._report.node_created(rationale)
@@ -190,8 +234,13 @@ class ControlStatementsCheck(ReasonableConcern[ControlStatementsCheckResult]):
190
234
  estimation.commit()
191
235
  self._report.node_created(estimation)
192
236
 
237
+ dv_estimation.set_provider(rationale)
238
+ dv_estimation.commit()
239
+ self._report.node_created(dv_estimation)
240
+
193
241
  result = ControlStatementsCheckResult(
194
242
  estimation=estimation,
243
+ dv_estimation=dv_estimation,
195
244
  rationale=rationale,
196
245
  t_plus_without_a_plus_yields_t_minus_statement=stmt_1,
197
246
  t_plus_without_a_plus_yields_t_minus_score=result_1.coherence_score,
@@ -199,6 +248,8 @@ class ControlStatementsCheck(ReasonableConcern[ControlStatementsCheckResult]):
199
248
  a_plus_without_t_plus_yields_a_minus_statement=stmt_2,
200
249
  a_plus_without_t_plus_yields_a_minus_score=result_2.coherence_score,
201
250
  a_plus_without_t_plus_yields_a_minus_reasoning=result_2.reasoning,
251
+ t_plus_without_a_plus_yields_t_minus_dv=result_1.dialectical_validity,
252
+ a_plus_without_t_plus_yields_a_minus_dv=result_2.dialectical_validity,
202
253
  )
203
254
 
204
255
  self._build_report(result)
@@ -212,19 +263,26 @@ class ControlStatementsCheck(ReasonableConcern[ControlStatementsCheckResult]):
212
263
  """Evaluate a single control statement for logical coherence."""
213
264
  context_section = f"<context>\n{text}\n</context>\n\n" if text else ""
214
265
 
215
- prompt = f"""{context_section}Rate the logical coherence of this control statement:
266
+ prompt = f"""{context_section}Rate this control statement on two independent scales:
216
267
 
217
268
  {statement}
218
269
 
219
270
  The pattern "[Positive] without [Balancing factor] yields [Negative]" tests whether
220
271
  the absence of a balancing positive aspect naturally leads to the negative/shadow aspect.
221
272
 
222
- Coherence scale:
273
+ 1. Conceptual Coherence (CC) — is the statement logically meaningful?
223
274
  - 0.9-1.0: Highly coherent, clear logical/causal relationship
224
275
  - 0.7-0.9: Coherent, reasonable logical connection
225
276
  - 0.5-0.7: Somewhat coherent, plausible but weak
226
277
  - 0.3-0.5: Weak coherence, tenuous connection
227
- - 0.0-0.3: Not coherent, no clear logical relationship"""
278
+ - 0.0-0.3: Not coherent, no clear logical relationship
279
+
280
+ 2. Dialectical Validity (DV) — is the dialectical relationship natural, judged
281
+ independently of coherence? A statement can be perfectly coherent yet dialectically
282
+ distorted (e.g. one pole arbitrarily privileged, outcomes enforced by coercion or
283
+ ideology rather than natural system dynamics). 1.0 = natural, balanced, generative;
284
+ 0.0 = forced, artificial, distorted. Ignore factual correctness; evaluate only the
285
+ quality of the dialectical relationship as a generative principle."""
228
286
 
229
287
  conversation = ConversationFacilitator()
230
288
  return await conversation.submit(
@@ -238,10 +296,15 @@ Coherence scale:
238
296
  score_2 = result.a_plus_without_t_plus_yields_a_minus_score
239
297
  avg_score = (score_1 + score_2) / 2
240
298
 
299
+ dv_1 = result.t_plus_without_a_plus_yields_t_minus_dv
300
+ dv_2 = result.a_plus_without_t_plus_yields_a_minus_dv
301
+ avg_dv = (dv_1 + dv_2) / 2
302
+
241
303
  self._report.artifacts["t_plus_without_a_plus_yields_t_minus"] = score_1
242
304
  self._report.artifacts["a_plus_without_t_plus_yields_a_minus"] = score_2
243
305
  self._report.artifacts["average"] = avg_score
244
306
  self._report.artifacts["is_coherent"] = result.is_coherent
307
+ self._report.artifacts["dialectical_validity"] = avg_dv
245
308
 
246
309
  self._report.ok = True
247
310
  status = "COHERENT" if result.is_coherent else "NOT COHERENT"
@@ -249,5 +312,5 @@ Coherence scale:
249
312
  f"Control Statements Check: {status} "
250
313
  f"(T+\\A+→T-={score_1:.2f}, "
251
314
  f"A+\\T+→A-={score_2:.2f}, "
252
- f"avg={avg_score:.2f})"
315
+ f"avg={avg_score:.2f}, DV={avg_dv:.2f})"
253
316
  )