dialectical-framework 1.5.5__tar.gz → 1.6.0__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 (188) hide show
  1. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/PKG-INFO +1 -1
  2. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/pyproject.toml +1 -1
  3. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/advisor/advisor.py +3 -0
  4. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/advisor/system_prompts.py +70 -87
  5. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/skills/expand_polarities.py +61 -39
  6. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/system_prompts.py +12 -4
  7. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/apps.py +19 -9
  8. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/skills/explore_transformations.py +1 -1
  9. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/system_prompts.py +3 -3
  10. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/action_extraction.py +5 -5
  11. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/aspect_classification.py +17 -42
  12. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/aspect_generation.py +19 -55
  13. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality/causality_estimator_balanced.py +3 -3
  14. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/control_statements_check.py +4 -5
  15. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/create_nexus.py +10 -2
  16. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/perspective_combination.py +44 -21
  17. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/positive_ac_re_apex_derivation.py +20 -15
  18. dialectical_framework-1.6.0/src/dialectical_framework/concerns/scoring_scales.py +55 -0
  19. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/statement_classification.py +150 -39
  20. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/statement_deduplication.py +9 -4
  21. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/transformation_generation.py +24 -30
  22. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/cycle.py +24 -9
  23. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/transition.py +1 -1
  24. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/settings.py +2 -0
  25. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/LICENSE +0 -0
  26. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/README.md +0 -0
  27. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/__init__.py +0 -0
  28. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/__init__.py +0 -0
  29. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/advisor/__init__.py +0 -0
  30. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/advisor/tools/__init__.py +0 -0
  31. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/advisor/tools/anchor.py +0 -0
  32. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/advisor/tools/explore.py +0 -0
  33. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/advisor/tools/ingest.py +0 -0
  34. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/advisor/tools/sync.py +0 -0
  35. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/agent_context.py +0 -0
  36. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/__init__.py +0 -0
  37. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/analyst.py +0 -0
  38. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/skills/__init__.py +0 -0
  39. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/skills/anchor_theses.py +0 -0
  40. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/skills/edit_perspective.py +0 -0
  41. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/skills/find_polarities.py +0 -0
  42. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/skills/introduce_polarity.py +0 -0
  43. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/skills/surface_theses.py +0 -0
  44. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/tools/__init__.py +0 -0
  45. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/tools/create_dx_input.py +0 -0
  46. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/analyst/tools/place_statement.py +0 -0
  47. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/conversation_facilitator.py +0 -0
  48. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/execution_report.py +0 -0
  49. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/__init__.py +0 -0
  50. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/explorer.py +0 -0
  51. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/skills/__init__.py +0 -0
  52. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/skills/build_wheels.py +0 -0
  53. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/skills/generate_synthesis.py +0 -0
  54. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/tools/__init__.py +0 -0
  55. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/tools/create_nexus.py +0 -0
  56. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/tools/expand_nexus.py +0 -0
  57. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/tools/generate_synthesis.py +0 -0
  58. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/explorer/tools/present_exploration.py +0 -0
  59. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/__init__.py +0 -0
  60. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/__init__.py +0 -0
  61. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/add_input.py +0 -0
  62. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/digest_input.py +0 -0
  63. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/discard.py +0 -0
  64. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/get_schema.py +0 -0
  65. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/inspect_node.py +0 -0
  66. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/present_analysis.py +0 -0
  67. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/query_graph.py +0 -0
  68. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/read_digest.py +0 -0
  69. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/orchestrator/tools/read_input.py +0 -0
  70. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/reasonable_concern.py +0 -0
  71. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/agents/stream_events.py +0 -0
  72. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/__init__.py +0 -0
  73. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/ac_re_taxonomy.py +0 -0
  74. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/add_input.py +0 -0
  75. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/ai_dto/__init__.py +0 -0
  76. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/ai_dto/statement_dto.py +0 -0
  77. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/ai_dto/statements_deck_dto.py +0 -0
  78. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/antithesis_classification.py +0 -0
  79. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/antithesis_extraction.py +0 -0
  80. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality/__init__.py +0 -0
  81. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality/causality_estimator.py +0 -0
  82. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality/causality_estimator_criteria.py +0 -0
  83. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality/causality_estimator_desirable.py +0 -0
  84. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality/causality_estimator_feasible.py +0 -0
  85. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality/causality_estimator_realistic.py +0 -0
  86. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality/causality_normalizer.py +0 -0
  87. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality/estimator_resolver.py +0 -0
  88. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/causality_estimation.py +0 -0
  89. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/create_dx_input.py +0 -0
  90. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/diagonal_oppositions_check.py +0 -0
  91. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/dialectical_context.py +0 -0
  92. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/discard.py +0 -0
  93. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/display_text_edit.py +0 -0
  94. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/expand_nexus.py +0 -0
  95. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/perspective_validation.py +0 -0
  96. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/source_digest.py +0 -0
  97. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/statement_placement.py +0 -0
  98. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/synthesis_generation.py +0 -0
  99. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/thesis_extraction.py +0 -0
  100. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/concerns/transformation_audit.py +0 -0
  101. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/dialectical_reasoning.py +0 -0
  102. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/enums/__init__.py +0 -0
  103. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/enums/causality_preset.py +0 -0
  104. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/enums/di.py +0 -0
  105. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/events/__init__.py +0 -0
  106. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/events/graph_event.py +0 -0
  107. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/events/graph_event_bus.py +0 -0
  108. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/exceptions/__init__.py +0 -0
  109. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/exceptions/node_errors.py +0 -0
  110. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/exceptions/resolver_errors.py +0 -0
  111. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/__init__.py +0 -0
  112. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/composite_input_resolver.py +0 -0
  113. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/dialexity_input_resolver.py +0 -0
  114. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/estimation_manager.py +0 -0
  115. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/mixins/__init__.py +0 -0
  116. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/mixins/incremental_build_mixin.py +0 -0
  117. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/mixins/intent_mixin.py +0 -0
  118. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/mixins/persistable_mixin.py +0 -0
  119. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/__init__.py +0 -0
  120. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/assessable_entity.py +0 -0
  121. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/base_node.py +0 -0
  122. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/case.py +0 -0
  123. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/estimation.py +0 -0
  124. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/ideas.py +0 -0
  125. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/input.py +0 -0
  126. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/nexus.py +0 -0
  127. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/perspective.py +0 -0
  128. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/polarity.py +0 -0
  129. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/rationale.py +0 -0
  130. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/statement.py +0 -0
  131. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/synthesis.py +0 -0
  132. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/transformation.py +0 -0
  133. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/nodes/wheel.py +0 -0
  134. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationship_manager.py +0 -0
  135. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/__init__.py +0 -0
  136. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/action_reflection_relationship.py +0 -0
  137. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/belongs_to_cycle_relationship.py +0 -0
  138. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/belongs_to_nexus_relationship.py +0 -0
  139. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/changed_to_relationship.py +0 -0
  140. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/contradiction_of_relationship.py +0 -0
  141. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/critiques_relationship.py +0 -0
  142. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/distilled_to_relationship.py +0 -0
  143. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/estimates_relationship.py +0 -0
  144. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/explains_relationship.py +0 -0
  145. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/has_input_relationship.py +0 -0
  146. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/has_statement_relationship.py +0 -0
  147. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/has_wheel_relationship.py +0 -0
  148. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/immutable_structure.py +0 -0
  149. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/is_source_of_relationship.py +0 -0
  150. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/is_target_of_relationship.py +0 -0
  151. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/negative_side_of_relationship.py +0 -0
  152. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/opposite_direction_relationship.py +0 -0
  153. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/opposite_of_relationship.py +0 -0
  154. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/polarity_relationship.py +0 -0
  155. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/positive_side_of_relationship.py +0 -0
  156. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/provides_relationship.py +0 -0
  157. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/relationships/synthesis_of_relationship.py +0 -0
  158. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/rendering.py +0 -0
  159. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/__init__.py +0 -0
  160. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/case_repository.py +0 -0
  161. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/cycle_repository.py +0 -0
  162. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/input_repository.py +0 -0
  163. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/nexus_repository.py +0 -0
  164. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/node_repository.py +0 -0
  165. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/perspective_repository.py +0 -0
  166. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/polarity_repository.py +0 -0
  167. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/schema_repository.py +0 -0
  168. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/statement_repository.py +0 -0
  169. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/transformation_repository.py +0 -0
  170. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/repositories/wheel_repository.py +0 -0
  171. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/scope_context.py +0 -0
  172. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/verbatim_input_resolver.py +0 -0
  173. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/wheel_segment.py +0 -0
  174. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/graph/wheel_segment_polar_pair.py +0 -0
  175. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/protocols/__init__.py +0 -0
  176. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/protocols/has_config.py +0 -0
  177. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/protocols/input_resolver.py +0 -0
  178. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/__init__.py +0 -0
  179. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/bedrock_provider.py +0 -0
  180. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/concurrency.py +0 -0
  181. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/dc_replace.py +0 -0
  182. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/decompose_probability_uniformly.py +0 -0
  183. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/edge_context.py +0 -0
  184. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/effect_logger.py +0 -0
  185. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/input_context.py +0 -0
  186. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/order_transitions.py +0 -0
  187. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/src/dialectical_framework/utils/sequence_generation.py +0 -0
  188. {dialectical_framework-1.5.5 → dialectical_framework-1.6.0}/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.5.5
3
+ Version: 1.6.0
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.5.5"
3
+ version = "1.6.0"
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"
@@ -116,6 +116,8 @@ def _build_tools() -> list:
116
116
  inspect_node
117
117
  from dialectical_framework.agents.orchestrator.tools.read_digest import \
118
118
  read_digest
119
+ from dialectical_framework.agents.orchestrator.tools.discard import \
120
+ discard
119
121
 
120
122
  return [
121
123
  ingest,
@@ -124,4 +126,5 @@ def _build_tools() -> list:
124
126
  sync,
125
127
  inspect_node,
126
128
  read_digest,
129
+ discard,
127
130
  ]
@@ -132,103 +132,84 @@ You now have the integration vision. Use it to:
132
132
 
133
133
  ## Internal Tools
134
134
 
135
- Six tools. Use silently — never mention them:
135
+ Seven tools. Use silently — never mention them.
136
136
 
137
137
  - `ingest` — Processes raw material (text, files, transcripts) through
138
- dialectical analysis. Discovers tensions you can't yet see. Extracts
139
- theses, finds oppositions, builds full perspectives with aspects.
140
-
141
- - `anchor` Plants a specific tension from the conversation. Two modes:
142
- with thesis + antithesis (one polarity, one perspective), or thesis only
143
- (discovers multiple possible antitheses, each producing perspectives).
144
- More precise than ingest — use when you can see at least the position.
145
-
146
- - `explore` Groups perspectives into a nexus and generates pathways.
147
- Builds causal arrangements, action-reflection transformations, and
148
- synthesis. Pass perspective hashes to explore together. Optionally pass
149
- an existing nexus hash to enrich it with new perspectives.
138
+ dialectical analysis: extracts theses, finds oppositions, builds full
139
+ perspectives with aspects. Use when raw material needs analysis and you
140
+ don't yet see the tensions — compose the `text` parameter from what they've
141
+ shared. Do NOT ingest greetings or small talk. When pre-loaded sources exist
142
+ (shown in the dump under Sources), call ingest with just an `intent` to
143
+ extract tensions from them without new text.
144
+
145
+ - `anchor` — Plants a specific tension from the conversation. More precise
146
+ than ingest; use when you can see at least the person's position. Two modes:
147
+ - Thesis + antithesis: you know both sides — creates one polarity and one
148
+ perspective (tetrad). Call again with the same T-A for an alternative
149
+ tetrad on the same opposition.
150
+ - Thesis only: anchors their position and discovers what opposes it — finds
151
+ multiple possible antitheses (each a different polarity), each expanded
152
+ into a perspective. Richer when you want the framework to reveal
153
+ opposition you haven't spotted yourself.
154
+
155
+ - `explore` — Groups perspectives into a nexus and generates pathways (causal
156
+ arrangements, action-reflection transformations, synthesis). Use once
157
+ tensions exist as perspectives. Pass the perspective hashes to explore
158
+ together; pass an existing `nexus_hash` to enrich it with new perspectives.
159
+ Call incrementally — start with 1-2 perspectives for early insight, then
160
+ enrich as new tensions emerge; each call builds only what's new, keeping
161
+ existing wheels/transformations.
162
+
163
+ How a nexus evolves:
164
+ - 1 perspective: a single self-referential wheel. Already generates
165
+ transformations and synthesis — useful even alone.
166
+ - 2 perspectives: the causal question emerges (which thesis enables which?).
167
+ Produces multiple wheels (arrangements), each with its own pathways.
168
+ - 3-4 perspectives: richer causal chains, more transformation variety,
169
+ deeper synthesis. The sweet spot for insight.
170
+ - >4: combinatorial explosion — cap at 4, start a new nexus for more tensions.
171
+
172
+ Grouping principle: prefer perspectives from different polarities (different
173
+ T-A oppositions) — transformations between them represent genuine synthesis
174
+ with opponents. Same-polarity perspectives grouped together only produce
175
+ "angle shifts" (reframing within the same opposition).
150
176
 
151
177
  - `sync` — Re-reads the full graph state. Use when you need a fresh full
152
- picture after multiple changes — e.g., to see all perspectives with
153
- scores before deciding what to group for explore.
154
-
155
- - `inspect_node`Retrieves full detail of a specific node by hash. Use when
156
- the graph dump shows a node you want to understand more deeply. Pass the
157
- short hash. Returns: full explanation text, quality scores, rationales
158
- (the reasoning behind why something was classified or scored a certain way),
159
- connected nodes, and lineage. Nodes carry rationales that explain the
160
- analytical reasoning use these to ground your counsel in specific logic
161
- rather than generic advice.
178
+ picture — e.g., after multiple ingest/anchor calls, to see all perspectives
179
+ with scores before deciding what to group for explore. NOT needed after every
180
+ tool call (ingest/anchor/explore return their results directly), and NOT
181
+ needed at conversation start the full state is already in your context.
182
+
183
+ - `discard` Silently retracts something the user rejects. Works on either a
184
+ perspective (a whole framing the tension and its aspects) or a statement
185
+ (a single claim). Pass the hash from the anchor/ingest result. Uncommitted
186
+ nodes are removed; committed ones are soft-discarded and filtered from future
187
+ reasoning. To drop a tension entirely, discard the perspective first, then
188
+ its underlying statement if it's no longer wanted (discarding a perspective
189
+ leaves its shared statements intact, and a statement still used by a live
190
+ perspective won't discard). A perspective already woven into pathways
191
+ (cycles/wheels) won't discard — re-anchor the corrected framing instead.
192
+
193
+ - `inspect_node` — Retrieves full detail of a node by hash: full explanation
194
+ text, quality scores, rationales (the reasoning behind a classification or
195
+ score), connected nodes, and lineage. Use when the dump shows a node whose
196
+ reasoning you want to understand — ground your counsel in that specific
197
+ analytical logic rather than generic advice.
162
198
 
163
199
  - `read_digest` — Retrieves the analytical digest of a source input by hash.
164
- Use when you need to understand what source material fed the analysis.
165
- The dump lists input hashes under Sources call this to read what they
166
- contain.
167
-
168
- ## When to Use Tools
169
-
170
- **ingest**: When raw material needs analysis — files, transcripts, or
171
- substantial accumulated user sharing where you don't yet see the tensions.
172
- Compose the `text` parameter from what they've shared. Do NOT ingest
173
- greetings or small talk. When pre-loaded sources exist (shown in the dump
174
- under Sources), you can call ingest with just an `intent` to extract
175
- tensions from them without new text.
176
-
177
- **anchor**: When you can see at least the person's position. Two modes:
178
- - Thesis + antithesis: you know both sides — creates one polarity and
179
- one perspective (tetrad) for it. Call again with same T-A for an
180
- alternative tetrad on the same opposition.
181
- - Thesis only: anchors their position and discovers what opposes it —
182
- finds multiple possible antitheses (each a different polarity), each
183
- expanded into a perspective. Richer exploration space when you want
184
- the framework to reveal opposition you haven't spotted yourself.
185
- More precise than ingest. Use when the tension is partially or fully clear.
186
-
187
- **explore**: Once tensions exist as perspectives (from ingest or anchor),
188
- group them and generate pathways. Pass the perspective hashes you want to
189
- explore together. To add new tensions to an existing exploration, pass
190
- the `nexus_hash`.
191
-
192
- How a nexus evolves:
193
- - 1 perspective: produces a single wheel (self-referential loop). Already
194
- generates transformations and synthesis — useful even alone.
195
- - 2 perspectives: the causal question emerges — which thesis enables which?
196
- Produces multiple wheels (arrangements). Each gets its own pathways.
197
- - 3-4 perspectives: richer causal chains, more transformation variety,
198
- deeper synthesis. This is the sweet spot for insight.
199
- - >4: combinatorial explosion — too many wheels, reasoning becomes unwieldy.
200
- Cap at 4. Start a new nexus for additional tensions.
201
-
202
- You can call explore incrementally — start with 1-2 perspectives for early
203
- insight, then enrich the nexus (pass `nexus_hash`) as new tensions emerge.
204
- Each call builds only what's new; existing wheels/transformations are kept.
205
-
206
- Grouping principle: prefer perspectives from different polarities (different
207
- T-A oppositions) — transformations between them represent genuine synthesis
208
- with opponents. Same-polarity perspectives grouped together only produce
209
- "angle shifts" (reframing within the same opposition).
210
-
211
- **sync**: When you need a fresh full picture of the graph — e.g., after
212
- multiple ingest/anchor calls you want to see all perspectives with scores
213
- before deciding what to explore together. NOT needed after every tool call —
214
- ingest/anchor/explore return their results directly. NOT needed at
215
- conversation start — the full state is already in your context above.
216
-
217
- **inspect_node**: When the graph dump shows a node whose reasoning you want
218
- to understand. Use to ground your counsel in specific analytical logic.
219
-
220
- **read_digest**: When you need context on source material — e.g., the person
221
- references something they shared earlier.
200
+ The dump lists input hashes under Sources. Use when you need context on
201
+ source material e.g., the person references something they shared earlier.
222
202
 
223
203
  **When the person rejects a framing:** If they say "that's not what I mean"
224
- or "that doesn't apply" — don't try to fix the graph. Simply stop drawing
225
- on that tension in your counsel. The graph is a resource, not a script —
226
- you can ignore parts that don't resonate. If their correction reveals a
227
- genuinely different tension, anchor it with the new framing.
204
+ or "that doesn't apply" — silently `discard` it so it stops shaping the graph.
205
+ Discard the whole perspective if they reject the tension; discard a single
206
+ statement if they reject just one claim. Don't announce it. If their correction
207
+ reveals a genuinely different tension, `anchor` the new framing. The graph
208
+ should reflect what resonates — retract what doesn't.
228
209
 
229
210
  ## Sequence
230
211
 
231
- 1. Listen, understand their position (no tools) — 1 to 3 turns
212
+ 1. Listen, understand their position (no tools) — 1 to 3 turns. Skip this if structural understanding already exists at conversation start (see "When understanding already exists").
232
213
  2. `ingest` or `anchor` → respond revealing what's hidden (the blindspot)
233
214
  3. Continue conversation, possibly `anchor` again for new tensions
234
215
  4. `explore` → respond with specific paired pathways
@@ -306,12 +287,14 @@ Use these scores to prioritize what you draw on:
306
287
  **Perspective quality:**
307
288
  - `HS` on A (antithesis): How genuine the opposition is.
308
289
  ≥0.7 = strong, real tension. 0.5–0.7 = moderate, acceptable.
290
+ 0.3–0.5 = weak — usable but note the softness.
309
291
  <0.3 = very weak opposition — barely a tension, deprioritize heavily.
310
292
  - `area`: Tetrad differentiation (sum of positive-minus-negative Ks gaps).
311
293
  ≥0.7 = excellent differentiation. 0.3–0.7 = acceptable.
312
294
  <0.3 = aspects blur together, weak structure.
313
295
  - `rectangularity`: Tetrad balance (lower = better).
314
- <0.01 = well-balanced. >0.09 = one side overdeveloped — note the imbalance.
296
+ <0.01 = well-balanced. 0.01–0.09 = mild imbalance, acceptable.
297
+ >0.09 = one side overdeveloped — note the imbalance.
315
298
  - `Ks` on aspects: Complementarity toward synthesis.
316
299
  T+/A+ should be >0.4 (constructive poles complement the whole).
317
300
  T-/A- should be <0.6 (destructive poles don't overpower).
@@ -18,27 +18,36 @@ from pydantic import Field
18
18
 
19
19
  from dialectical_framework.agents.reasonable_concern import ReasonableConcern
20
20
  from dialectical_framework.enums.di import DI
21
- from dialectical_framework.concerns.aspect_generation import (AspectGeneration,
22
- AspectResult)
23
- from dialectical_framework.concerns.statement_deduplication import \
24
- StatementDeduplication
21
+ from dialectical_framework.concerns.aspect_generation import (
22
+ AspectGeneration,
23
+ AspectResult,
24
+ )
25
+ from dialectical_framework.concerns.statement_deduplication import (
26
+ StatementDeduplication,
27
+ )
25
28
  from dialectical_framework.graph.nodes.polarity import Polarity
26
- from dialectical_framework.graph.nodes.perspective import (POSITION_A_MINUS,
27
- POSITION_A_PLUS,
28
- POSITION_T_MINUS,
29
- POSITION_T_PLUS,
30
- Perspective)
29
+ from dialectical_framework.graph.nodes.perspective import (
30
+ POSITION_A_MINUS,
31
+ POSITION_A_PLUS,
32
+ POSITION_T_MINUS,
33
+ POSITION_T_PLUS,
34
+ Perspective,
35
+ )
31
36
  from dialectical_framework.graph.relationships.polarity_relationship import (
32
- AMinusRelationship, APlusRelationship, HasPolarityRelationship,
33
- TMinusRelationship, TPlusRelationship)
34
- from dialectical_framework.graph.repositories.statement_repository import \
35
- StatementRepository
36
- from dialectical_framework.graph.repositories.input_repository import \
37
- InputRepository
38
- from dialectical_framework.graph.repositories.node_repository import \
39
- NodeRepository
40
- from dialectical_framework.graph.repositories.perspective_repository import \
41
- PerspectiveRepository
37
+ AMinusRelationship,
38
+ APlusRelationship,
39
+ HasPolarityRelationship,
40
+ TMinusRelationship,
41
+ TPlusRelationship,
42
+ )
43
+ from dialectical_framework.graph.repositories.statement_repository import (
44
+ StatementRepository,
45
+ )
46
+ from dialectical_framework.graph.repositories.input_repository import InputRepository
47
+ from dialectical_framework.graph.repositories.node_repository import NodeRepository
48
+ from dialectical_framework.graph.repositories.perspective_repository import (
49
+ PerspectiveRepository,
50
+ )
42
51
 
43
52
  if TYPE_CHECKING:
44
53
  from dialectical_framework.protocols.input_resolver import InputResolver
@@ -51,20 +60,22 @@ class ExpandPolarity(ReasonableConcern[list[Perspective]]):
51
60
  Creates Perspectives from a Polarity by generating and connecting aspects
52
61
  (T+, T-, A+, A-).
53
62
 
54
- Each call produces one NEW perspective (alternative tetrad) for the Polarity,
55
- using `not_like_these` to ensure diversity from existing ones. Call multiple
56
- times on the same Polarity to build a richer space of tetrads.
63
+ Each call produces `count` NEW perspectives (alternative tetrads) for the
64
+ Polarity, generated sequentially so each uses `not_like_these` (existing +
65
+ already-generated-this-call) to ensure diversity. Any pre-existing partial
66
+ Perspective counts toward `count`.
57
67
 
58
68
  Flow:
59
69
  1. Resolve Polarity by hash
60
70
  2. Look up existing Perspectives for this Polarity
61
- 3. If none exist, create a new Perspective
62
- 4. Complete all partial PPs by generating aspects
71
+ 3. Create new partial Perspectives so `count` are generated this call
72
+ 4. Complete all partial PPs sequentially by generating aspects
63
73
  5. Return list of completed Perspectives (existing + new)
64
74
  """
65
75
 
66
- def __init__(self, polarity_hash: str) -> None:
76
+ def __init__(self, polarity_hash: str, count: int = 1) -> None:
67
77
  self.polarity_hash = polarity_hash
78
+ self.count = max(1, count)
68
79
 
69
80
  async def resolve(self) -> list[Perspective]:
70
81
  """
@@ -86,20 +97,17 @@ class ExpandPolarity(ReasonableConcern[list[Perspective]]):
86
97
  pp_repo = PerspectiveRepository()
87
98
  existing_pps = pp_repo.find_by_polarity(polarity)
88
99
 
89
- if not existing_pps:
90
- # No PP exists - create one referencing the Polarity
91
- pp = self._create_perspective_for_polarity(polarity)
92
- existing_pps = [pp]
93
-
94
100
  complete_pps = [pp for pp in existing_pps if pp.is_complete()]
95
101
  partial_pps = [pp for pp in existing_pps if not pp.is_complete()]
96
102
 
97
- if not partial_pps:
98
- # All existing perspectives are complete create a new one
99
- pp = self._create_perspective_for_polarity(polarity)
100
- partial_pps = [pp]
103
+ # Complete any existing partials, then create additional new ones so that
104
+ # `count` fresh Perspectives are produced this call (a pre-existing partial
105
+ # counts as one of them).
106
+ additional_needed = self.count - len(partial_pps)
107
+ for _ in range(max(0, additional_needed)):
108
+ partial_pps.append(self._create_perspective_for_polarity(polarity))
101
109
 
102
- # Complete all partial PPs
110
+ # Complete all partial PPs sequentially (each sees prior results)
103
111
  completed_pps: list[Perspective] = []
104
112
 
105
113
  for pp in partial_pps:
@@ -209,7 +217,12 @@ class ExpandPolarity(ReasonableConcern[list[Perspective]]):
209
217
 
210
218
  def _perspective_final_state(self, pp: Perspective) -> dict[str, str | None]:
211
219
  """Build a dict with the final post-dedup text at each position."""
212
- positions = [POSITION_T_PLUS, POSITION_T_MINUS, POSITION_A_PLUS, POSITION_A_MINUS]
220
+ positions = [
221
+ POSITION_T_PLUS,
222
+ POSITION_T_MINUS,
223
+ POSITION_A_PLUS,
224
+ POSITION_A_MINUS,
225
+ ]
213
226
  state: dict[str, str | None] = {"hash": pp.short_hash}
214
227
  for pos in positions:
215
228
  manager = pp.get_relationship_manager_by_position(pos)
@@ -299,13 +312,22 @@ class ExpandPolarity(ReasonableConcern[list[Perspective]]):
299
312
 
300
313
  @llm.tool
301
314
  async def expand_polarities(
302
- polarity_hashes: Annotated[list[str], Field(description="Hashes of Polarities to expand into full Perspectives")],
315
+ polarity_hashes: Annotated[
316
+ list[str],
317
+ Field(description="Hashes of Polarities to expand into full Perspectives"),
318
+ ],
319
+ count: Annotated[
320
+ int,
321
+ Field(
322
+ description="Number of new Perspectives to generate per Polarity (each is diverse from prior ones)"
323
+ ),
324
+ ] = 1,
303
325
  ) -> str:
304
- """Build complete Perspectives from Polarities by generating evaluative aspects (T+, T-, A+, A-) for each. Each call generates one new Perspective per Polarity — call multiple times for alternative perspectives on the same Polarity (duplicates in a single call are ignored). The Polarities must already exist in the graph."""
326
+ """Build complete Perspectives from Polarities by generating evaluative aspects (T+, T-, A+, A-) for each. Generates `count` new Perspectives per Polarity sequentially each sees prior tetrads to ensure diversity. The Polarities must already exist in the graph."""
305
327
  import asyncio
306
328
 
307
329
  async def _expand_one(h: str) -> str:
308
- concern = ExpandPolarity(polarity_hash=h)
330
+ concern = ExpandPolarity(polarity_hash=h, count=count)
309
331
  await concern.resolve()
310
332
  return str(concern.report)
311
333
 
@@ -30,27 +30,35 @@ Choose your approach based on the user's input:
30
30
  - User provides substantial text describing a situation or dilemma
31
31
  - User says "analyze this" or provides content without specific direction
32
32
  - User wants comprehensive treatment end-to-end
33
+ - Default for pasted substantial text unless the user signals they only want to store it for later
33
34
 
34
35
  **Use `find_polarities` / `expand_polarities` when:**
35
36
  - User is working step-by-step and asks for the next step
36
37
  - User refers to specific existing theses and wants tensions found
37
38
  - User explicitly asks to expand a polarity into perspectives
39
+ - User asks to "find tetrads", "show aspects", "build T+/T-/A+/A-", or otherwise requests the four-aspect structure
40
+
41
+ **Disambiguating "perspectives", "angles", "points of view":**
42
+ These words map to DIFFERENT tools depending on what's in scope:
43
+ - Polarity in view/referenced → `expand_polarities` (build the tetrad for that polarity)
44
+ - Thesis in view/referenced → `find_polarities` (find opposing angles)
45
+ - No specific node → check what exists: unexpanded polarities → `expand_polarities`; theses without polarities → `find_polarities`
38
46
 
39
47
  **Use `add_input` when:**
40
48
  - User provides multi-sentence source material (a paragraph, article, or detailed description) to capture before analysis
41
49
  - User shares a URL to process
42
50
  - User pastes a conversation fragment or external text block
51
+ - Use only when the user wants to capture without analyzing yet ("save this", "for later", "just add this source"). If they want it understood now, use `analyze`.
43
52
  - NOT for single words, short phrases, or "add a statement X" — those go to `anchor_theses`
44
53
 
45
54
  ## How to Work
46
55
 
47
- Act on clear intent. Never ask "shall I analyze this?" just do it.
56
+ Act on clear intent for analysis actions (analyze, find/expand, anchor) — never ask "shall I analyze this?", just do it. Nexus creation is the one exception: confirm exploration direction first (see Exploration Setup).
48
57
  Always check resonance AFTER presenting results — but never before acting.
49
58
 
50
59
  - If the user describes a situation: call `analyze` or `introduce_polarity` depending on whether a clear tension is stated
51
60
  - If the user gives a single concept: call `anchor_theses` with that concept as a statement.
52
- - If the user disagrees with a generated aspect: offer `edit_perspective` with their correction, or `discard` if the whole perspective misses the mark.
53
- - If the user corrects or refines: use `edit_perspective` or `discard` immediately
61
+ - If the user disagrees with or corrects a generated aspect: use `edit_perspective` with their correction, or `discard` if the whole perspective misses the mark.
54
62
  - If the user wants to explore interactions: see "Exploration Setup" section below
55
63
  - If the user asks "what do we have?": use `present_analysis`
56
64
  - If the user works step-by-step: follow their lead with granular tools
@@ -93,7 +101,7 @@ When the user wants to explore interactions between perspectives:
93
101
  - `surface_theses` — Extract theses from inputs (requires inputs in scope).
94
102
  - `find_polarities` — Find antitheses for existing theses.
95
103
  - `introduce_polarity` — Directly introduce a known T-A tension (both sides clear).
96
- - `expand_polarities` — Expand polarities into full Perspectives (T+/T-/A+/A-).
104
+ - `expand_polarities` — Expand polarities into full Perspectives (T+/T-/A+/A-). Pass `count > 1` to generate several diverse tetrads per polarity in one call.
97
105
  - `place_statement` — Check if a statement exists in the graph already.
98
106
 
99
107
  **Steering:**
@@ -220,8 +220,10 @@ anything — people need TRANSFORMATIONAL RECIPES: what to DO and what to
220
220
  REFLECT ON simultaneously for synthesis to actually emerge.
221
221
 
222
222
  A Nexus groups related positions for exploration. Within a Nexus, Wheels
223
- arrange positions into causal cycles — sequences where one position's
224
- exaggeration causally feeds into another's blindspot, forming a loop.
223
+ arrange positions into causal cycles — a loop where each position's
224
+ exaggeration feeds the next position's constructive strength (its
225
+ overdevelopment becomes the opening the next one develops well), closing
226
+ back on itself.
225
227
 
226
228
  Transformations sit on the edges of these cycles. Each transformation is
227
229
  bipolar (like a position): it has an action direction and a reflection
@@ -271,9 +273,12 @@ can have many oppositions → many polarities. Use: "this polarity",
271
273
  (T+/T-/A+/A-). The felt push-and-pull. Use: "this tension",
272
274
  "the push-and-pull between X and Y", "this conflict", "the structural tension".
273
275
 
274
- **T+ (constructive angle of the statement)** — depending on context:
275
- "the actual goal behind this", "the driving force", "what they're really after",
276
- "the strength of this position", "the intention", "what makes this valuable".
276
+ **T+ (constructive angle of the statement)** — the position at its most
277
+ constructive: developed well enough to deliver its value while still leaving room
278
+ for what the opposition offers. That balance is exactly what separates it from T-
279
+ (the same strength pushed too far). Depending on context: "the actual goal behind
280
+ this", "the driving force", "what they're really after", "the strength of this
281
+ position", "what makes this valuable without crowding out the other side".
277
282
 
278
283
  **T- (exaggerated angle of the statement)** — VISIBLE to the position-holder
279
284
  (not a blindspot). Depending on context: "the obvious risk", "what happens
@@ -341,8 +346,11 @@ both sides contribute", "constructive co-existence", "where 1+1 > 2".
341
346
 
342
347
  ## Viewport Scope
343
348
 
344
- Messages may include context about what the user is currently viewing. This tells you their active focus. Respect it:
349
+ Messages may begin with `[User is currently viewing: ...]`. This tells you their active focus use it to resolve ambiguous requests:
345
350
 
351
+ - When the user asks for an action without specifying a target (e.g., "find tetrads", "expand", "show aspects", "find perspectives"), apply it to the node in their current view.
352
+ - If a polarity is in view and the user asks for tetrads/aspects/perspectives/angles, expand that polarity into its full structure.
353
+ - If a thesis is in view and the user asks for perspectives/angles/oppositions, find opposing viewpoints for that thesis.
346
354
  - Only operate on the node(s) in the user's viewport unless they explicitly reference something else or ask to switch.
347
355
  - Never silently pivot to other nodes outside the viewport. If you think working on a different node would help, ask first.
348
356
 
@@ -475,10 +483,12 @@ You respect them by not wasting their time with soft landings.
475
483
  """
476
484
 
477
485
  ADVANCED_APP = DEFAULT_APP + """
478
- ## Advanced Interaction (overrides Presentation Defaults above)
486
+ ## Advanced Interaction (overrides Contextual Vocabulary and Presentation Defaults above)
479
487
 
480
488
  The user understands the dialectical framework, graph model, and generative
481
- rules. Adjust interaction accordingly:
489
+ rules. The "Do NOT use a fixed translation table" guidance above is written for
490
+ non-expert users and does not apply here — use precise framework vocabulary
491
+ directly. Adjust interaction accordingly:
482
492
 
483
493
  - Always use framework vocabulary: Thesis, Antithesis, T+, T-, A+, A-,
484
494
  Polarity, Perspective, Wheel, Cycle, Transformation, Nexus, Transition.
@@ -487,5 +497,5 @@ rules. Adjust interaction accordingly:
487
497
  - Present tetrads structurally with all six positions and scores.
488
498
  - Show transformation positions explicitly: Ac, Ac+, Ac-, Re, Re+, Re-.
489
499
  - Show control statements, modality alignment, diagonal contradictions.
490
- - Suggest next steps but don't auto-execute — the user drives.
500
+ - Suggest exploration-phase next steps (nexus, wheels) rather than auto-executing — the user drives structural expansion. Analysis tools (expand, find) still follow "act on clear intent."
491
501
  """
@@ -706,7 +706,7 @@ class ExploreTransformations(ReasonableConcern[ExploreTransformationsResult]):
706
706
 
707
707
  Args:
708
708
  headline: Short headline (~7 words) - stored on Transition.instruction
709
- statement: Fuller statement (1-15 words) - stored on Transition.summary
709
+ statement: Fuller statement (longer than headline) - stored on Transition.summary
710
710
  source: The source component (e.g., T-)
711
711
  target: The target component (e.g., A+)
712
712
  explanation: Full reasoning - stored on Rationale.text (evidence/justification)
@@ -22,7 +22,8 @@ for structural combination. Your job is to guide the user through three phases:
22
22
  On first message (or when resuming):
23
23
  - Call `present_exploration` to see what's been built in this Nexus.
24
24
  - If wheels don't exist yet, call `build_wheels` to create them.
25
- - If build_wheels yields no wheels (e.g., only one position), explain that exploration needs at least two positions interacting — suggest the user adds more via the analysis thread.
25
+ - If `build_wheels` yields no wheels, this Nexus has no perspectives attached yet — suggest the user adds some via the analysis thread.
26
+ - A single perspective builds one self-referential wheel — usable, but limited to one opposition. Genuine synthesis emerges when two or more perspectives interact, so encourage adding more for richer exploration.
26
27
 
27
28
  After wheels exist — present the causality landscape:
28
29
  - Show which wheels exist and their causality scores (higher = more plausible).
@@ -76,6 +77,5 @@ Adapt depth and presentation to the persona defined in the app preamble.
76
77
  - Never rephrase Statement text. Use exact text (or display_text) from the graph — paraphrasing makes it ambiguous which node you're referring to.
77
78
  - When referencing structural nodes (Polarity, Perspective, Nexus, Cycle, Wheel, Transformation, Transition, Synthesis), always include the short hash for disambiguation.
78
79
  - If the user wants to analyze new material, suggest they return to the analysis thread.
79
- - Skill reports may contain truncated text previews. When you need to present exact node text to the user, use `inspect_node` or `present_analysis` by hash — never reconstruct or guess full text from truncated previews.
80
- - Do NOT eagerly explore all wheels or generate all syntheses. Let the user navigate and choose.
80
+ - Skill reports may contain truncated text previews. When you need to present exact node text to the user, use `inspect_node` or `present_exploration` by hash — never reconstruct or guess full text from truncated previews.
81
81
  """
@@ -63,8 +63,8 @@ Your task is to generate Ac+ candidates that represent T- → A+ transition path
63
63
  ## What is Ac+?
64
64
 
65
65
  The +/- notation is STRUCTURAL (like electrical charges), not a value judgment:
66
- - "+" aspects target beneficial states (T+ or A+)
67
- - "-" aspects target problematic states (T- or A-)
66
+ - "+" transitions target beneficial states (T+ or A+)
67
+ - "-" transitions target problematic states (T- or A-)
68
68
 
69
69
  Ac+ is an "action targeting A+" - a way of acting/behaving that helps someone escape the problematic aspects of the thesis (T-) and move toward the healthy aspects of the antithesis (A+).
70
70
 
@@ -111,7 +111,7 @@ 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: 1-15 words, actionable and memorable
114
+ 5. Length: a fuller actionable form, longer than the headline
115
115
  6. Choose the insight level that best matches the nature of the action
116
116
  """
117
117
 
@@ -120,7 +120,7 @@ class ActionCandidateDto(BaseModel):
120
120
  """A candidate Ac+ statement with coordinates."""
121
121
 
122
122
  headline: str = Field(description="Short headline (component length)")
123
- statement: str = Field(description="The Ac+ statement (1-15 words)")
123
+ statement: str = Field(description="The Ac+ statement (fuller than the headline)")
124
124
  insight_label: str = Field(
125
125
  description="Insight level: leverage/anticipation/composition/etc"
126
126
  )
@@ -270,7 +270,7 @@ The Ac+ must:
270
270
  2. Pick the specific insight label from [{levels_str}] that best fits your action
271
271
  3. Choose the appropriate action category (Coordination/Intervention/Implementation/Configuration/Governance/Stewardship)
272
272
  4. Provide a short headline (~{self.settings.component_length} words) - the essence of the action
273
- 5. Provide a fuller statement/summary (1-15 words) - actionable and memorable
273
+ 5. Provide a fuller statement/summary (up to {self.settings.transition_length} words) - actionable and memorable
274
274
  6. Provide a haiku (3 lines, 5-7-5 syllables) capturing the action's essence — easy to memorize
275
275
 
276
276
  Focus on the T- → A+ transition path, not the destination."""