dialectical-framework 2.0.3__tar.gz → 2.0.5__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-2.0.3 → dialectical_framework-2.0.5}/PKG-INFO +1 -1
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/pyproject.toml +1 -1
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/consultant/consultant.py +17 -25
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/tetrad_candidates.py +7 -2
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/transformation_generation.py +13 -2
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/transformation_sketch.py +32 -12
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/view_sketch.py +8 -38
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/dialectical_reasoning.py +38 -5
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/settings.py +15 -0
- dialectical_framework-2.0.5/src/dialectical_framework/settings_context.py +104 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/edge_context.py +33 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/LICENSE +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/PATENTS +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/README.md +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/advisor.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/build_policy.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/migration.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/reply_hygiene.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/system_prompts.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/tools/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/tools/anchor.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/tools/deepen.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/tools/explore.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/tools/ingest.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/tools/note.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/tools/record_decision.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/tools/scoped.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/advisor/tools/sync.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/agent_context.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/analyst.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/skills/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/skills/anchor_theses.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/skills/edit_perspective.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/skills/expand_polarities.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/skills/find_polarities.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/skills/introduce_polarity.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/skills/sketch_tetrad.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/skills/surface_theses.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/system_prompts.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/tools/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/analyst/tools/place_statement.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/app_spec.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/apps.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/consultant/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/conversation_facilitator.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/execution_report.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/explorer.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/skills/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/skills/build_wheels.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/skills/explore_transformations.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/skills/generate_synthesis.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/system_prompts.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/tools/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/tools/create_nexus.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/tools/expand_nexus.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/tools/generate_synthesis.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/explorer/tools/present_exploration.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/add_input.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/audit_feasibility.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/create_dx_input.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/digest_input.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/discard.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/get_schema.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/inspect_node.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/present_analysis.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/query_graph.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/read_digest.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/orchestrator/tools/read_input.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/reasonable_concern.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/stream_events.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/toolsets.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/turn_timing.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/ac_re_taxonomy.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/action_extraction.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/add_input.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/ai_dto/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/ai_dto/statement_dto.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/ai_dto/statements_deck_dto.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/antithesis_classification.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/antithesis_extraction.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/antithetical_thesis_detection.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/aspect_classification.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/aspect_generation.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/build_status.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality/causality_estimator.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality/causality_estimator_balanced.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality/causality_estimator_criteria.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality/causality_estimator_desirable.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality/causality_estimator_feasible.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality/causality_estimator_realistic.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality/causality_normalizer.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality/estimator_resolver.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/causality_estimation.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/control_statements_check.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/create_dx_input.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/create_nexus.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/decision_coherence_check.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/decision_confirmation_check.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/diagonal_oppositions_check.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/dialectical_context.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/discard.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/display_text_edit.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/expand_nexus.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/perspective_combination.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/perspective_validation.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/positive_ac_re_apex_derivation.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/record_decision.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/scoring_scales.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/source_digest.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/statement_classification.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/statement_deduplication.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/statement_headline.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/statement_placement.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/synthesis_generation.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/tetrad_grounding.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/tetrad_sketch.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/thesis_extraction.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/concerns/transformation_audit.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/enums/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/enums/causality_preset.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/enums/di.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/events/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/events/graph_event.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/events/graph_event_bus.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/events/progress_event.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/exceptions/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/exceptions/node_errors.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/exceptions/resolver_errors.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/composite_input_resolver.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/dialexity_input_resolver.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/estimation_manager.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/mixins/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/mixins/incremental_build_mixin.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/mixins/intent_mixin.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/mixins/persistable_mixin.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/assessable_entity.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/base_node.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/case.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/cycle.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/decision.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/estimation.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/ideas.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/input.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/nexus.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/note.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/perspective.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/polarity.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/rationale.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/statement.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/synthesis.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/transformation.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/transition.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/nodes/wheel.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationship_manager.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/action_reflection_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/belongs_to_cycle_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/belongs_to_nexus_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/changed_to_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/contradiction_of_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/critiques_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/distilled_to_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/estimates_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/explains_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/grounded_in_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/has_input_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/has_statement_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/has_wheel_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/immutable_structure.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/is_source_of_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/is_target_of_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/negative_side_of_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/opposite_direction_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/opposite_of_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/polarity_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/positive_side_of_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/provides_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/relationships/synthesis_of_relationship.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/rendering.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/case_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/cycle_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/decision_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/input_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/nexus_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/node_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/note_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/perspective_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/polarity_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/schema_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/statement_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/transformation_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/repositories/wheel_repository.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/scope_context.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/verbatim_input_resolver.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/views.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/wheel_segment.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/graph/wheel_segment_polar_pair.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/protocols/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/protocols/has_config.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/protocols/input_resolver.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/py.typed +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/__init__.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/async_drain.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/bedrock_provider.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/call_census.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/chunking.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/concurrency.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/dc_replace.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/decompose_probability_uniformly.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/effect_logger.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/input_context.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/order_transitions.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/progress.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/retry_accounting.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/sequence_generation.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/thinking_compat.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/use_brain.py +0 -0
- {dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/utils/utterance.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: dialectical-framework
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.5
|
|
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 = "2.0.
|
|
3
|
+
version = "2.0.5"
|
|
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"
|
|
@@ -324,12 +324,7 @@ class Consultant:
|
|
|
324
324
|
if messages:
|
|
325
325
|
self._conversation.load_messages(messages)
|
|
326
326
|
parts = [p for p in (preamble, method_prompt(include_decision)) if p]
|
|
327
|
-
|
|
328
|
-
# static half of its request (`exploration_view`): appending keeps the
|
|
329
|
-
# head a PREFIX of it, so the chat turns' cached prefix is readable by
|
|
330
|
-
# the sketch turns instead of each paying for its own.
|
|
331
|
-
self._system_prompt = "\n\n".join(parts)
|
|
332
|
-
self._conversation.set_system_prompt(self._system_prompt)
|
|
327
|
+
self._conversation.set_system_prompt("\n\n".join(parts))
|
|
333
328
|
|
|
334
329
|
async def chat(self, user_message: str) -> str:
|
|
335
330
|
result = await self._conversation.submit(ChatResponse, user_message)
|
|
@@ -367,8 +362,7 @@ class Consultant:
|
|
|
367
362
|
view shows what has been ESTABLISHED, and where `focus` asks for
|
|
368
363
|
structure not yet worked out ("a perspective for the thesis you
|
|
369
364
|
named") the turn builds it by the method first
|
|
370
|
-
(`concerns/view_sketch.py
|
|
371
|
-
prompt, the focus is the turn). What it built is
|
|
365
|
+
(`concerns/view_sketch.py::view_sketch_prompt`). What it built is
|
|
372
366
|
kept in `messages` as the consultant's own words, so the next turn can
|
|
373
367
|
be asked about a corner it just drew.
|
|
374
368
|
|
|
@@ -386,8 +380,7 @@ class Consultant:
|
|
|
386
380
|
"""
|
|
387
381
|
from dialectical_framework.concerns.view_sketch import (
|
|
388
382
|
ViewSketchDto, exploration_view_from_sketch, history_ask,
|
|
389
|
-
history_text, perspective_from_sketch,
|
|
390
|
-
view_sketch_instructions)
|
|
383
|
+
history_text, perspective_from_sketch, view_sketch_prompt)
|
|
391
384
|
|
|
392
385
|
import asyncio
|
|
393
386
|
import dataclasses
|
|
@@ -397,19 +390,19 @@ class Consultant:
|
|
|
397
390
|
|
|
398
391
|
level = self._conversation._thinking_kwargs().get("thinking")
|
|
399
392
|
history = self._conversation._messages
|
|
400
|
-
# The request
|
|
401
|
-
#
|
|
402
|
-
#
|
|
403
|
-
#
|
|
404
|
-
#
|
|
405
|
-
#
|
|
406
|
-
#
|
|
407
|
-
#
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
393
|
+
# The WHOLE request is the turn's user message, its "Answer with ONE
|
|
394
|
+
# JSON object" included — by measurement, not habit. For one day
|
|
395
|
+
# (2026-10-06) the static instructions rode on the system prompt so the
|
|
396
|
+
# cache would cover them (~$0.007 a card) and only "What to show: ..."
|
|
397
|
+
# was the turn. First cards did not notice; a RETRY did: its history
|
|
398
|
+
# already holds "Show me: ..." and the previous drawing in PROSE, and with
|
|
399
|
+
# a bare focus as the last user turn the model answered in prose too —
|
|
400
|
+
# 1.75 parse retries a retry card, 4.75 view-turn calls instead of 3,
|
|
401
|
+
# 33 s instead of 20 (`tests/e2e/probe_view_turn_retry_calls.py`, 8
|
|
402
|
+
# utterances; the first app had measured the same 4.6 calls and +17 s).
|
|
403
|
+
# The request->prose pair `history_ask` keeps OUT of the history is the
|
|
404
|
+
# same trap; the long request as the last turn is what holds the format.
|
|
405
|
+
request = view_sketch_prompt(focus, self._conversation.settings.component_length)
|
|
413
406
|
|
|
414
407
|
async def draw() -> ViewSketchDto:
|
|
415
408
|
# Each draw works on a COPY of the history: the turns run in
|
|
@@ -417,8 +410,7 @@ class Consultant:
|
|
|
417
410
|
# read. What the view leaves behind is appended once, below.
|
|
418
411
|
sketch_turn = ConversationFacilitator(format_mode="json", thinking=level)
|
|
419
412
|
sketch_turn._messages = list(history)
|
|
420
|
-
sketch_turn.
|
|
421
|
-
return await sketch_turn.submit(ViewSketchDto, ask)
|
|
413
|
+
return await sketch_turn.submit(ViewSketchDto, request)
|
|
422
414
|
|
|
423
415
|
n = clamp_attempts(attempts)
|
|
424
416
|
# Fully parallel, deliberately. On a COLD cache all N draws write the
|
|
@@ -129,8 +129,13 @@ async def judge_sketches(
|
|
|
129
129
|
it picked by position and ties;
|
|
130
130
|
- one call per draft with both statements in it (the same lean prompt):
|
|
131
131
|
73% against 90%, the same winner as this judge in 23/40 — stable with
|
|
132
|
-
itself, but measuring something else
|
|
133
|
-
|
|
132
|
+
itself, but measuring something else;
|
|
133
|
+
- THIS prompt with each reasoning field capped at one short sentence
|
|
134
|
+
(the score is written before the reasoning, so the cap looked free):
|
|
135
|
+
output 534 -> 181 tokens a call, but 78% against 90%, scores +0.05, the
|
|
136
|
+
same winner as this judge in 29/40. The reasoning is not dead weight.
|
|
137
|
+
A cheaper judge has to be measured against this one on that probe first;
|
|
138
|
+
the owner closed the cost question at this point (2026-10-06).
|
|
134
139
|
"""
|
|
135
140
|
|
|
136
141
|
async def one(tension: Any) -> Optional[SketchVerdict]:
|
|
@@ -248,7 +248,17 @@ class ReSideCompletionDto(BaseModel):
|
|
|
248
248
|
description="Proactiveness category for Re+"
|
|
249
249
|
)
|
|
250
250
|
|
|
251
|
-
# Re- fields
|
|
251
|
+
# Re- fields. The weak position of the staged generator, measured
|
|
252
|
+
# 2026-10-06 (`tests/e2e/probe_staged_endpoints.py`, 102 Transformations on
|
|
253
|
+
# 17 one-tension wheels, read with the theory-faithful `TransitionVerdict`):
|
|
254
|
+
# Re- valid 42% against Ac- 71% (the corrected auditor, 2026-10-07), and it
|
|
255
|
+
# is the LANDING that fails (58% land in T-; 20% valid on T->A edges). The prompt asked for "the
|
|
256
|
+
# reflection without the action", which the writer read as "keep watching,
|
|
257
|
+
# do nothing" — and wherever A is the passive pole, doing nothing is A's
|
|
258
|
+
# trap, not T's. Two `re_minus_from` / `re_minus_into` fields ahead of these
|
|
259
|
+
# (the one-shot's fix) moved it within noise and were reverted; the
|
|
260
|
+
# landing is now named in `_generate_re_side`'s Re- instruction instead.
|
|
261
|
+
# See docs/dev-notes/one-shot-transformation.md.
|
|
252
262
|
re_minus_headline: str = Field(description="Re- headline (component length)")
|
|
253
263
|
re_minus_statement: str = Field(description="Re- statement (fuller than the headline)")
|
|
254
264
|
re_minus_explanation: str = Field(
|
|
@@ -641,7 +651,8 @@ Given their action, what reflection does it trigger that leads to growth?
|
|
|
641
651
|
|
|
642
652
|
What happens when their action IS taken in, but nothing you do grounds that reflection?
|
|
643
653
|
- What Re+ ITSELF degenerates into when Ac+ is absent — an overextension of the reflection, not the absence of one
|
|
644
|
-
-
|
|
654
|
+
- Where it LANDS is what makes it Re-: it ends in the A- line of <reflection_perspective> — YOUR OWN trap. It starts from that block's T+ line (the other side's strength); you need not name the start, but the landing must be your trap
|
|
655
|
+
- The common miss: "keep watching and do nothing". When the other side is the passive one, doing nothing just leaves THEIR trap in place (the block's T- line) — that is not Re-. Re- is your reflecting, overdone, carrying YOU into your own trap
|
|
645
656
|
- NOT the same failure as Ac-: Ac- is your action left unreflected, Re- is your reflection left unacted
|
|
646
657
|
- Your Ac+ must CONTRADICT Re- (your positive action opposes this regression)
|
|
647
658
|
- Usually lower insight than Re+
|
|
@@ -32,9 +32,10 @@ state, scored 11/17 on the third-trap auditor where a call that skipped the
|
|
|
32
32
|
poles and stated the theory loosely scored 0/17 (`one-shot-transformation.md`,
|
|
33
33
|
arms 1 and 2; the auditor is saturated by the either/or instruction, so read
|
|
34
34
|
that as compliance). The endpoint half of the minus definitions was added
|
|
35
|
-
afterwards and, stated in text alone, did NOT land:
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
afterwards and, stated in text alone, did NOT land: valid Ac- / Re- in 30% /
|
|
36
|
+
26% of drafts by the theory-faithful auditor (`probe_transition_rescore.py`;
|
|
37
|
+
the app's stricter auditor read 14-30%). What lands the ends is the DTO, not
|
|
38
|
+
the sentence: the writer names where
|
|
38
39
|
each minus line starts and lands before writing it (`TransformationSketchDto`
|
|
39
40
|
says why and by how much). That probe is the gate for any change to the
|
|
40
41
|
definition text or those fields. Arm 1 is not evidence against the endpoints:
|
|
@@ -143,15 +144,27 @@ class TransformationSketchDto(BaseModel):
|
|
|
143
144
|
|
|
144
145
|
`ac_minus_from` / `ac_minus_into` (and the Re- pair) come BEFORE their
|
|
145
146
|
line on purpose, and they are the measured fix, not decoration. Stating the
|
|
146
|
-
ends in the definition does not make the writer use them: the
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
(`tests/e2e/probe_transformation_sketch.py`,
|
|
153
|
-
2026-10-06
|
|
154
|
-
|
|
147
|
+
ends in the definition does not make the writer use them: with the text
|
|
148
|
+
alone a valid Ac- (lands in A-, is the action degenerated, the action
|
|
149
|
+
causing the landing) came back in 32% of drafts and a valid Re- in 30%, because "the
|
|
150
|
+
action without the reflection" reads like the tetrad's own "T+ without A+
|
|
151
|
+
yields T-" and the line lands on T's OWN trap. Making the writer name the
|
|
152
|
+
start and the landing first moved them to 62% / 64% (paired +30 / +34, both
|
|
153
|
+
clearing noise), S- unchanged (third failure 75% / 75%; crossed pairwise 57-56 over 113 decided pairs) (`tests/e2e/probe_transformation_sketch.py`,
|
|
154
|
+
25 tetrads x 2 reps, 2026-10-06, re-read by `probe_transition_rescore.py`
|
|
155
|
+
with the auditor two blind theory panels agree with on 54/60 clear cases;
|
|
156
|
+
the app's stricter auditor had read 22/18% -> 60/58%). A host may
|
|
157
|
+
ignore the four scaffold fields; their job is done by the time the line is
|
|
158
|
+
written.
|
|
159
|
+
|
|
160
|
+
The price, measured: the ends rose and the makeup reads dip a little — a
|
|
161
|
+
line written to land on its trap can stop reading as the operation
|
|
162
|
+
overdone. "Re- is the reflection itself" 94% -> 88% (within noise) in the
|
|
163
|
+
first run, "Ac- is the action itself" 100% -> 93% (-7, clears) in the
|
|
164
|
+
second (2026-10-07, 100 pairs); the first app's pill saw Re- 98% -> 80% in
|
|
165
|
+
its own voice. Against +30 / +34 on validity it is a good trade; if a
|
|
166
|
+
host's makeup read keeps falling, measure it on this probe, do not drop the
|
|
167
|
+
fields by eye.
|
|
155
168
|
|
|
156
169
|
Hosts SUBCLASS it to add their own person-facing fields after these, so
|
|
157
170
|
the derivation and the words that rest on it stay one call: the first
|
|
@@ -270,6 +283,13 @@ class TransformationSketch(ReasonableConcern[TransformationSketchDto], SettingsA
|
|
|
270
283
|
class: it subclasses `TransformationSketchDto` and embeds
|
|
271
284
|
`TRANSFORMATION_BUILD_PROCEDURE` in its own system prompt, so the theory
|
|
272
285
|
is still the framework's and the voice is the host's.
|
|
286
|
+
|
|
287
|
+
A host that writes person-facing text from the result in a SECOND call
|
|
288
|
+
must tell that call the lines are meaning only, not wording to reuse:
|
|
289
|
+
otherwise it echoes them, and the lines are written to the theory's
|
|
290
|
+
shape, not to a person. Measured by the first app on its card text
|
|
291
|
+
(19–21 points lost until its writer said so; the record is in that app's
|
|
292
|
+
repo).
|
|
273
293
|
"""
|
|
274
294
|
|
|
275
295
|
def __init__(self) -> None:
|
|
@@ -186,22 +186,8 @@ For each pair:
|
|
|
186
186
|
3. Re-read both aspects against step 1 for two distinct failures. (a) Wrong parent: if one is really the OTHER parent developed, rewrite it from its own parent. (b) {PLUS_RESTATEMENT_CHECK}"""
|
|
187
187
|
|
|
188
188
|
|
|
189
|
-
def
|
|
190
|
-
"""The
|
|
191
|
-
|
|
192
|
-
Split from the instructions so the Consultant can send this alone as the
|
|
193
|
-
turn's user message and carry the static half on the system prompt, where
|
|
194
|
-
the provider's cache breakpoint already sits (`view_sketch_instructions`).
|
|
195
|
-
"""
|
|
196
|
-
return (
|
|
197
|
-
f"What to show: {focus}"
|
|
198
|
-
if focus and focus.strip()
|
|
199
|
-
else "What to show: the tensions this conversation has worked out so far."
|
|
200
|
-
)
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
def view_sketch_instructions(max_words: int) -> str:
|
|
204
|
-
"""The STATIC half of the view turn's request — everything but the focus.
|
|
189
|
+
def view_sketch_prompt(focus: Optional[str], max_words: int) -> str:
|
|
190
|
+
"""The structured turn's request, over the consultant's own conversation.
|
|
205
191
|
|
|
206
192
|
Two instructions in one, because the ask is one or the other and the model
|
|
207
193
|
knows which: render what is ESTABLISHED (a tension already named and taken
|
|
@@ -217,20 +203,15 @@ def view_sketch_instructions(max_words: int) -> str:
|
|
|
217
203
|
(docs/dev-notes/antithesis-selection.md, 2026-10-02). The thesis is asked
|
|
218
204
|
for as a STANCE (`THESIS_IS_A_STANCE`): on 20 questions the turn echoed the
|
|
219
205
|
question as T in 6 before the ask was here (the alsotrue app repo, docs/lab-notes-entry.md).
|
|
220
|
-
|
|
221
|
-
Static because every word of it is fixed per deployment (`max_words` comes
|
|
222
|
-
from settings), which is what lets the Consultant append it to its system
|
|
223
|
-
prompt: as a user message it sat after the history and was re-prefilled at
|
|
224
|
-
full rate on every draw — ~1.2k tokens x N per card, measured 2026-10-06.
|
|
225
|
-
On the system prompt it rides inside the cached prefix. This is a cache
|
|
226
|
-
placement, not a content change; the one thing it does move is WHERE the
|
|
227
|
-
focus line sits, from just under the opening paragraph to the end of the
|
|
228
|
-
turn (`tests/e2e/probe_view_turn_ask.py` is the instrument if that is ever
|
|
229
|
-
suspected of mattering).
|
|
230
206
|
"""
|
|
207
|
+
focus_line = (
|
|
208
|
+
f"What to show: {focus}\n\n"
|
|
209
|
+
if focus and focus.strip()
|
|
210
|
+
else "What to show: the tensions this conversation has worked out so far.\n\n"
|
|
211
|
+
)
|
|
231
212
|
return f"""Draw the structure of this conversation as dialectical tetrads. Answer with ONE JSON object in the requested schema and nothing else — no prose. Earlier drawings in this conversation are recorded in prose; that is their record, not the format of this answer.
|
|
232
213
|
|
|
233
|
-
{ASPECT_DEFINITIONS}
|
|
214
|
+
{focus_line}{ASPECT_DEFINITIONS}
|
|
234
215
|
|
|
235
216
|
Rules for what goes in the view:
|
|
236
217
|
- Show what this conversation has ESTABLISHED: a tension you named and the person took up is drawn as you both have it, in their terms. Do not re-derive what is already on the table.
|
|
@@ -247,17 +228,6 @@ Rules for what goes in the view:
|
|
|
247
228
|
Write every position in the person's own terms, {max_words} words or fewer each."""
|
|
248
229
|
|
|
249
230
|
|
|
250
|
-
def view_sketch_prompt(focus: Optional[str], max_words: int) -> str:
|
|
251
|
-
"""The whole request as ONE user message: the instructions and the focus.
|
|
252
|
-
|
|
253
|
-
The shape for a caller with no system prompt of its own to append to — the
|
|
254
|
-
probes and the harness. The Consultant sends the two halves apart
|
|
255
|
-
(`view_sketch_instructions` on the system prompt, `view_sketch_focus` as
|
|
256
|
-
the turn), which is the same words in a different place.
|
|
257
|
-
"""
|
|
258
|
-
return f"{view_sketch_instructions(max_words)}\n\n{view_sketch_focus(focus)}"
|
|
259
|
-
|
|
260
|
-
|
|
261
231
|
# --- The view shaping (pure) ----------------------------------------------
|
|
262
232
|
|
|
263
233
|
|
|
@@ -13,9 +13,30 @@ from dialectical_framework.graph.composite_input_resolver import CompositeInputR
|
|
|
13
13
|
from dialectical_framework.agents.execution_report import ExecutionReport
|
|
14
14
|
from dialectical_framework.events.graph_event_bus import GraphEventBus
|
|
15
15
|
from dialectical_framework.graph.scope_context import get_current_sid
|
|
16
|
+
from dialectical_framework.settings_context import (get_base_settings,
|
|
17
|
+
get_current_settings,
|
|
18
|
+
set_base_settings)
|
|
16
19
|
from dialectical_framework.utils import progress
|
|
17
20
|
|
|
18
21
|
|
|
22
|
+
class _PerRequestSettings(providers.Callable):
|
|
23
|
+
"""`settings` resolved per request (`settings_context`), and NOT overridable.
|
|
24
|
+
|
|
25
|
+
An override would replace this provider with one fixed object and silently
|
|
26
|
+
put the whole process back on a single settings slot — every concurrent
|
|
27
|
+
request answering on whichever settings were set last. That was the only
|
|
28
|
+
per-user mechanism before 2026-10-07 and is the defect this exists to end,
|
|
29
|
+
so it fails loudly and names the replacement.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def override(self, provider): # noqa: D102 - see the class docstring
|
|
33
|
+
raise RuntimeError(
|
|
34
|
+
"container.settings cannot be overridden: it is resolved per request. "
|
|
35
|
+
"Wrap the calls in `with using_settings(settings):` "
|
|
36
|
+
"(dialectical_framework.settings_context) instead."
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
19
40
|
class DialecticalReasoning(containers.DeclarativeContainer):
|
|
20
41
|
"""
|
|
21
42
|
Main DI container for the Dialectical Reasoning Framework.
|
|
@@ -29,9 +50,16 @@ class DialecticalReasoning(containers.DeclarativeContainer):
|
|
|
29
50
|
|
|
30
51
|
@classmethod
|
|
31
52
|
def setup(cls, settings: Settings) -> 'DialecticalReasoning':
|
|
32
|
-
"""Create
|
|
53
|
+
"""Create the container with the process's BASE settings.
|
|
54
|
+
|
|
55
|
+
The base is what every read sees outside a `using_settings(...)` scope,
|
|
56
|
+
and the only source of the read-once fields (graph connection, provider
|
|
57
|
+
timeout, effect log). Per-person settings in a server are
|
|
58
|
+
`using_settings` around each request, never another `setup()` and never
|
|
59
|
+
an override (`settings_context`).
|
|
60
|
+
"""
|
|
33
61
|
container = cls()
|
|
34
|
-
|
|
62
|
+
set_base_settings(settings)
|
|
35
63
|
ExecutionReport.set_event_bus(container.event_bus())
|
|
36
64
|
# Same bus object, different channel (`sid:progress`). Wired separately
|
|
37
65
|
# because progress is not a graph mutation — see `utils/progress.py`.
|
|
@@ -41,8 +69,10 @@ class DialecticalReasoning(containers.DeclarativeContainer):
|
|
|
41
69
|
ExecutionReport.set_effect_logger(EffectLogger(settings.effect_log_dir))
|
|
42
70
|
return container
|
|
43
71
|
|
|
44
|
-
#
|
|
45
|
-
settings =
|
|
72
|
+
# Per request: the innermost `using_settings(...)`, else the base (`settings_context`).
|
|
73
|
+
settings = _PerRequestSettings(get_current_settings)
|
|
74
|
+
# The base alone, for what is built ONCE per process (the graph connection).
|
|
75
|
+
base_settings = providers.Callable(get_base_settings)
|
|
46
76
|
|
|
47
77
|
@staticmethod
|
|
48
78
|
def _create_graph_db(settings: Settings) -> Union[Memgraph, Neo4j]:
|
|
@@ -228,9 +258,12 @@ class DialecticalReasoning(containers.DeclarativeContainer):
|
|
|
228
258
|
)
|
|
229
259
|
|
|
230
260
|
# Graph database (Memgraph or Neo4j) for graph-native dialectical structures
|
|
261
|
+
# Built from the BASE, never the per-request settings: the connection is one
|
|
262
|
+
# Singleton per process, so whichever request first resolved it would
|
|
263
|
+
# otherwise decide the database for everyone.
|
|
231
264
|
graph_db: providers.Singleton[Union[Memgraph, Neo4j]] = providers.Singleton(
|
|
232
265
|
_create_graph_db,
|
|
233
|
-
settings=
|
|
266
|
+
settings=base_settings
|
|
234
267
|
)
|
|
235
268
|
|
|
236
269
|
# -- Content Resolution --
|
{dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/settings.py
RENAMED
|
@@ -30,6 +30,21 @@ def _env_thinking_level() -> dict[str, Optional[str]]:
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class Settings(BaseModel):
|
|
33
|
+
"""Framework configuration, in TWO TIERS by when a field is read.
|
|
34
|
+
|
|
35
|
+
Per request (read at call time, so `with using_settings(...)` from
|
|
36
|
+
`dialectical_framework.settings_context` scopes them to one asyncio context):
|
|
37
|
+
`ai_model`, `reasoning_model`, and everything read through
|
|
38
|
+
`SettingsAware.settings` — word limits, the thinking level, the Advisor's
|
|
39
|
+
floors and caps, the audit switches.
|
|
40
|
+
|
|
41
|
+
Per process (read once, from the base `DialecticalReasoning.setup()` installs;
|
|
42
|
+
a value inside `using_settings` has no effect): `graph_db_*` (the connection is
|
|
43
|
+
a Singleton), `llm_connect_timeout_s` (the provider is registered once),
|
|
44
|
+
`effect_log_dir` (installed in `setup`). `DIALEXITY_MAX_CONCURRENT_LLM_CALLS`
|
|
45
|
+
is not a field at all: an env var behind one process-wide semaphore.
|
|
46
|
+
"""
|
|
47
|
+
|
|
33
48
|
model_config = ConfigDict(
|
|
34
49
|
arbitrary_types_allowed=True,
|
|
35
50
|
)
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings per request: a ContextVar over a process base, the way `sid` works.
|
|
3
|
+
|
|
4
|
+
WHY
|
|
5
|
+
===
|
|
6
|
+
The container's `settings` used to be ONE slot (`providers.Dependency`, filled by
|
|
7
|
+
`DialecticalReasoning.setup`). A host serving many people from one process could
|
|
8
|
+
only change a person's settings with `container.settings.override(...)`, which
|
|
9
|
+
swaps the slot for EVERY call in flight: two concurrent requests answered on each
|
|
10
|
+
other's model, thinking level, word limits. The first app met it with a
|
|
11
|
+
process-wide lock around every framework call, one card at a time (handoff from
|
|
12
|
+
alsotrue-app, 2026-10-06).
|
|
13
|
+
|
|
14
|
+
Now `settings` resolves through `get_current_settings()` on every read: the
|
|
15
|
+
innermost `using_settings(...)` of the current asyncio context, else the base
|
|
16
|
+
`setup()` installed. Every `Provide[DI.settings]` and every `SettingsAware.settings`
|
|
17
|
+
read goes through it unchanged.
|
|
18
|
+
|
|
19
|
+
from dialectical_framework.settings_context import using_settings
|
|
20
|
+
|
|
21
|
+
with using_settings(base.model_copy(update={"ai_model": person_model})):
|
|
22
|
+
reply = await consultant.chat(text) # this request, this model
|
|
23
|
+
|
|
24
|
+
`create_task` / `gather` copy the context, so the framework's own fan-out (best-of-N
|
|
25
|
+
draws, the coherence judge, the off-turn weave) runs on the settings of the turn
|
|
26
|
+
that started it. Composes with `scope(sid)`; the two stay separate on purpose
|
|
27
|
+
(`scope` is whose data, this is how to reason).
|
|
28
|
+
|
|
29
|
+
TWO TIERS, as the code already treats them (see `Settings`):
|
|
30
|
+
- read at call time, per request: `ai_model`, `reasoning_model`, everything read
|
|
31
|
+
through `SettingsAware.settings` (word limits, thinking level, the Advisor's
|
|
32
|
+
floors and caps, the audit switches);
|
|
33
|
+
- read ONCE per process, from the base only: `graph_db_*` (the connection is a
|
|
34
|
+
Singleton), `llm_connect_timeout_s` (the provider is registered once),
|
|
35
|
+
`effect_log_dir` (installed in `setup`). A value for these inside
|
|
36
|
+
`using_settings` has no effect, by construction, not by accident.
|
|
37
|
+
|
|
38
|
+
`container.settings.override(...)` RAISES: it would replace this provider with one
|
|
39
|
+
fixed object and silently put the whole process back on a single settings slot.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
from __future__ import annotations
|
|
43
|
+
|
|
44
|
+
import contextvars
|
|
45
|
+
from typing import TYPE_CHECKING, Optional
|
|
46
|
+
|
|
47
|
+
if TYPE_CHECKING:
|
|
48
|
+
from dialectical_framework.settings import Settings
|
|
49
|
+
|
|
50
|
+
_base: Optional["Settings"] = None
|
|
51
|
+
_current: contextvars.ContextVar[Optional["Settings"]] = contextvars.ContextVar(
|
|
52
|
+
"current_settings", default=None
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def set_base_settings(settings: Settings) -> None:
|
|
57
|
+
"""The process default, installed by `DialecticalReasoning.setup()`. A later
|
|
58
|
+
`setup()` replaces it, as a second container always replaced the first."""
|
|
59
|
+
global _base
|
|
60
|
+
_base = settings
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def get_base_settings() -> Settings:
|
|
64
|
+
"""The process base. Raises when nothing called `setup()` — an unconfigured
|
|
65
|
+
process must fail loudly, not run on a default nobody chose."""
|
|
66
|
+
if _base is None:
|
|
67
|
+
raise RuntimeError(
|
|
68
|
+
"No settings installed: call DialecticalReasoning.setup(settings) "
|
|
69
|
+
"once per process before using the framework."
|
|
70
|
+
)
|
|
71
|
+
return _base
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def get_current_settings() -> Settings:
|
|
75
|
+
"""The innermost `using_settings` of this context, else the base. The DI
|
|
76
|
+
container's `settings` provider calls this on every resolution."""
|
|
77
|
+
return _current.get() or get_base_settings()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class _SettingsContextManager:
|
|
81
|
+
def __init__(self, settings: Settings) -> None:
|
|
82
|
+
self._settings = settings
|
|
83
|
+
self._token: Optional[contextvars.Token] = None
|
|
84
|
+
|
|
85
|
+
def __enter__(self) -> Settings:
|
|
86
|
+
self._token = _current.set(self._settings)
|
|
87
|
+
return self._settings
|
|
88
|
+
|
|
89
|
+
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
|
|
90
|
+
if self._token is not None:
|
|
91
|
+
_current.reset(self._token)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def using_settings(settings: Settings) -> _SettingsContextManager:
|
|
95
|
+
"""Run framework calls inside this context on `settings` (HOST LAYER).
|
|
96
|
+
|
|
97
|
+
Async-safe: each asyncio task sees only what was set in its own context;
|
|
98
|
+
tasks created inside inherit it; code outside sees the base. Nesting: the
|
|
99
|
+
innermost wins and the outer is restored on exit. An explicit
|
|
100
|
+
`use_brain(ai_model=...)` still wins over both. Build the value from the base
|
|
101
|
+
(`get_base_settings().model_copy(update=...)`) so per-request choices do not
|
|
102
|
+
drop the deployment's own values.
|
|
103
|
+
"""
|
|
104
|
+
return _SettingsContextManager(settings)
|
|
@@ -104,9 +104,42 @@ def build_edge_context(source_segment: WheelSegment, target_segment: WheelSegmen
|
|
|
104
104
|
if target_t_minus:
|
|
105
105
|
parts.append(f"A-: {target_t_minus[0].prompt_text}")
|
|
106
106
|
|
|
107
|
+
if _crosses_tensions(source_segment, target_segment):
|
|
108
|
+
parts.append(CROSS_TENSION_NOTE)
|
|
109
|
+
|
|
107
110
|
return "\n".join(parts)
|
|
108
111
|
|
|
109
112
|
|
|
113
|
+
#: Said whenever the two segments belong to DIFFERENT tensions — every edge of a
|
|
114
|
+
#: wheel with two or more tensions. The labels above are relative ("A" is just the
|
|
115
|
+
#: target), and at N >= 2 the writer read that "A" as T's own antithesis: on ten
|
|
116
|
+
#: two-tension wheels a third of the staged Ac+ (28% / 35%, two generations) turned
|
|
117
|
+
#: T's trap into T's OWN tension's strength instead of this target's, while a
|
|
118
|
+
#: one-shot prompt carrying this sentence did so in 4% / 18%
|
|
119
|
+
#: (`tests/e2e/probe_n2_one_shot_edge.py`, 2026-10-06). On a one-tension wheel the
|
|
120
|
+
#: target IS the other side of T's tension, so nothing is said there.
|
|
121
|
+
CROSS_TENSION_NOTE = (
|
|
122
|
+
"(T and A above come from TWO DIFFERENT tensions: do not read A as the other "
|
|
123
|
+
"side of T's own tension — a move that ends in T's own opposite has not "
|
|
124
|
+
"reached this A.)"
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _crosses_tensions(source_segment: WheelSegment, target_segment: WheelSegment) -> bool:
|
|
129
|
+
"""True when the target is NOT the other side of the source's own tension.
|
|
130
|
+
|
|
131
|
+
By the statements, not the perspectives: two readings of one polarity are
|
|
132
|
+
different perspectives over the SAME tension, and their edge is not a
|
|
133
|
+
crossing. Unknown (a missing statement) reads as not crossing — the note is
|
|
134
|
+
an aid, and saying nothing is the old behaviour.
|
|
135
|
+
"""
|
|
136
|
+
own_other = source_segment.opposite.t.get()
|
|
137
|
+
target_t = target_segment.t.get()
|
|
138
|
+
if not own_other or not target_t:
|
|
139
|
+
return False
|
|
140
|
+
return own_other[0].hash != target_t[0].hash
|
|
141
|
+
|
|
142
|
+
|
|
110
143
|
def build_coarser_context(parents: list[CoarserTransformation]) -> Optional[str]:
|
|
111
144
|
"""
|
|
112
145
|
Build hierarchical refinement context from coarser parent Transformations.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dialectical_framework-2.0.3 → dialectical_framework-2.0.5}/src/dialectical_framework/agents/apps.py
RENAMED
|
File without changes
|
|
File without changes
|