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.
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/PKG-INFO +1 -1
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/pyproject.toml +1 -1
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/advisor.py +9 -9
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/system_prompts.py +91 -19
- dialectical_framework-1.6.7/src/dialectical_framework/agents/advisor/tools/sync.py +32 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/inspect_node.py +14 -2
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/action_extraction.py +3 -2
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/control_statements_check.py +74 -11
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/dialectical_context.py +167 -15
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/positive_ac_re_apex_derivation.py +1 -1
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/scoring_scales.py +10 -5
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/statement_classification.py +138 -53
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/synthesis_generation.py +5 -1
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/transformation_generation.py +4 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/assessable_entity.py +1 -1
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/estimation.py +26 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/perspective.py +11 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/settings.py +10 -2
- dialectical_framework-1.6.6/src/dialectical_framework/agents/advisor/tools/sync.py +0 -20
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/LICENSE +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/PATENTS +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/README.md +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/anchor.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/deepen.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/explore.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/ingest.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/advisor/tools/scoped.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/agent_context.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/analyst.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/anchor_theses.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/edit_perspective.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/expand_polarities.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/find_polarities.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/introduce_polarity.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/skills/surface_theses.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/system_prompts.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/tools/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/analyst/tools/place_statement.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/apps.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/conversation_facilitator.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/execution_report.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/explorer.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/skills/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/skills/build_wheels.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/skills/explore_transformations.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/skills/generate_synthesis.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/system_prompts.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/create_nexus.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/expand_nexus.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/generate_synthesis.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/explorer/tools/present_exploration.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/add_input.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/create_dx_input.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/digest_input.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/discard.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/get_schema.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/present_analysis.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/query_graph.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/read_digest.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/orchestrator/tools/read_input.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/reasonable_concern.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/agents/stream_events.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/ac_re_taxonomy.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/add_input.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/ai_dto/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/ai_dto/statement_dto.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/ai_dto/statements_deck_dto.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/antithesis_classification.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/antithesis_extraction.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/antithetical_thesis_detection.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/aspect_classification.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/aspect_generation.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_balanced.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_criteria.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_desirable.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_feasible.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_estimator_realistic.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/causality_normalizer.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality/estimator_resolver.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/causality_estimation.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/create_dx_input.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/create_nexus.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/diagonal_oppositions_check.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/discard.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/display_text_edit.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/expand_nexus.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/perspective_combination.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/perspective_validation.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/source_digest.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/statement_deduplication.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/statement_headline.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/statement_placement.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/thesis_extraction.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/concerns/transformation_audit.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/dialectical_reasoning.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/enums/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/enums/causality_preset.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/enums/di.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/events/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/events/graph_event.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/events/graph_event_bus.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/exceptions/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/exceptions/node_errors.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/exceptions/resolver_errors.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/composite_input_resolver.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/dialexity_input_resolver.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/estimation_manager.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/mixins/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/mixins/incremental_build_mixin.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/mixins/intent_mixin.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/mixins/persistable_mixin.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/base_node.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/case.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/cycle.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/ideas.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/input.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/nexus.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/polarity.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/rationale.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/statement.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/synthesis.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/transformation.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/transition.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/nodes/wheel.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationship_manager.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/action_reflection_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/belongs_to_cycle_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/belongs_to_nexus_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/changed_to_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/contradiction_of_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/critiques_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/distilled_to_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/estimates_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/explains_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/has_input_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/has_statement_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/has_wheel_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/immutable_structure.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/is_source_of_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/is_target_of_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/negative_side_of_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/opposite_direction_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/opposite_of_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/polarity_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/positive_side_of_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/provides_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/relationships/synthesis_of_relationship.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/rendering.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/case_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/cycle_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/input_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/nexus_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/node_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/perspective_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/polarity_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/schema_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/statement_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/transformation_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/repositories/wheel_repository.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/scope_context.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/verbatim_input_resolver.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/wheel_segment.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/graph/wheel_segment_polar_pair.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/protocols/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/protocols/has_config.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/protocols/input_resolver.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/__init__.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/bedrock_provider.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/concurrency.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/dc_replace.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/decompose_probability_uniformly.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/edge_context.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/effect_logger.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/input_context.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/order_transitions.py +0 -0
- {dialectical_framework-1.6.6 → dialectical_framework-1.6.7}/src/dialectical_framework/utils/sequence_generation.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
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
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
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
|
|
553
|
-
blurred structure, failed validation) and
|
|
554
|
-
suppressed — count lines note what was
|
|
555
|
-
the
|
|
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
|
-
|
|
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 =
|
|
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"
|
|
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.
|
|
115
|
-
6.
|
|
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- (
|
|
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
|
|
175
|
-
f"
|
|
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
|
|
178
|
-
f"
|
|
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
|
|
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
|
|
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
|
)
|