dialectical-framework 2.1.0__tar.gz → 2.1.1__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.1.0 → dialectical_framework-2.1.1}/PKG-INFO +1 -1
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/pyproject.toml +1 -1
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/consultant/consultant.py +18 -3
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/tetrad_candidates.py +70 -12
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/tetrad_sketch.py +10 -2
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/view_sketch.py +38 -1
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/LICENSE +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/PATENTS +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/README.md +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/advisor.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/build_policy.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/migration.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/reply_hygiene.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/system_prompts.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/tools/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/tools/anchor.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/tools/deepen.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/tools/explore.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/tools/ingest.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/tools/note.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/tools/record_decision.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/tools/scoped.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/advisor/tools/sync.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/agent_context.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/analyst.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/skills/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/skills/anchor_theses.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/skills/edit_perspective.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/skills/expand_polarities.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/skills/find_polarities.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/skills/introduce_polarity.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/skills/sketch_tetrad.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/skills/surface_theses.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/system_prompts.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/tools/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/analyst/tools/place_statement.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/app_spec.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/apps.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/consultant/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/conversation_facilitator.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/execution_report.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/explorer.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/skills/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/skills/build_wheels.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/skills/explore_transformations.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/skills/generate_synthesis.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/system_prompts.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/tools/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/tools/create_nexus.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/tools/expand_nexus.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/tools/generate_synthesis.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/explorer/tools/present_exploration.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/add_input.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/audit_feasibility.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/create_dx_input.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/digest_input.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/discard.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/get_schema.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/inspect_node.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/present_analysis.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/query_graph.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/read_digest.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/orchestrator/tools/read_input.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/reasonable_concern.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/stream_events.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/toolsets.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/turn_timing.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/ac_re_taxonomy.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/action_extraction.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/add_input.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/ai_dto/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/ai_dto/statement_dto.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/ai_dto/statements_deck_dto.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/antithesis_classification.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/antithesis_extraction.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/antithetical_thesis_detection.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/aspect_classification.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/aspect_generation.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/build_status.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality/causality_estimator.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality/causality_estimator_balanced.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality/causality_estimator_criteria.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality/causality_estimator_desirable.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality/causality_estimator_feasible.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality/causality_estimator_realistic.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality/causality_normalizer.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality/estimator_resolver.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/causality_estimation.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/control_statements_check.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/create_dx_input.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/create_nexus.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/decision_coherence_check.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/decision_confirmation_check.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/diagonal_oppositions_check.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/dialectical_context.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/discard.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/display_text_edit.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/expand_nexus.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/perspective_combination.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/perspective_validation.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/positive_ac_re_apex_derivation.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/record_decision.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/scoring_scales.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/source_digest.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/statement_classification.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/statement_deduplication.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/statement_headline.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/statement_placement.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/synthesis_generation.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/tetrad_grounding.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/thesis_extraction.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/transformation_audit.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/transformation_generation.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/concerns/transformation_sketch.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/dialectical_reasoning.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/enums/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/enums/causality_preset.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/enums/di.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/events/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/events/graph_event.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/events/graph_event_bus.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/events/progress_event.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/exceptions/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/exceptions/node_errors.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/exceptions/provider_errors.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/exceptions/resolver_errors.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/composite_input_resolver.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/dialexity_input_resolver.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/estimation_manager.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/mixins/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/mixins/incremental_build_mixin.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/mixins/intent_mixin.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/mixins/persistable_mixin.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/assessable_entity.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/base_node.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/case.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/cycle.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/decision.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/estimation.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/ideas.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/input.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/nexus.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/note.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/perspective.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/polarity.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/rationale.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/statement.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/synthesis.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/transformation.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/transition.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/nodes/wheel.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationship_manager.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/action_reflection_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/belongs_to_cycle_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/belongs_to_nexus_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/changed_to_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/contradiction_of_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/critiques_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/distilled_to_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/estimates_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/explains_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/grounded_in_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/has_input_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/has_statement_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/has_wheel_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/immutable_structure.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/is_source_of_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/is_target_of_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/negative_side_of_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/opposite_direction_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/opposite_of_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/polarity_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/positive_side_of_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/provides_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/relationships/synthesis_of_relationship.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/rendering.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/case_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/cycle_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/decision_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/input_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/nexus_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/node_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/note_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/perspective_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/polarity_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/schema_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/statement_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/transformation_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/repositories/wheel_repository.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/scope_context.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/verbatim_input_resolver.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/views.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/wheel_segment.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/graph/wheel_segment_polar_pair.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/protocols/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/protocols/has_config.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/protocols/input_resolver.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/py.typed +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/settings.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/settings_context.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/__init__.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/async_drain.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/bedrock_provider.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/call_census.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/chunking.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/concurrency.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/dc_replace.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/decompose_probability_uniformly.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/edge_context.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/effect_logger.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/format_compat.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/input_context.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/order_transitions.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/progress.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/retry_accounting.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/sequence_generation.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/thinking_compat.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/utils/use_brain.py +0 -0
- {dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/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.1.
|
|
3
|
+
Version: 2.1.1
|
|
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.1.
|
|
3
|
+
version = "2.1.1"
|
|
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"
|
|
@@ -425,11 +425,13 @@ class Consultant:
|
|
|
425
425
|
"""
|
|
426
426
|
from dialectical_framework.concerns.view_sketch import (
|
|
427
427
|
ViewSketchDto, exploration_view_from_sketch, history_ask,
|
|
428
|
-
history_text, perspective_from_sketch,
|
|
428
|
+
history_text, judge_context, perspective_from_sketch,
|
|
429
|
+
view_sketch_prompt)
|
|
429
430
|
|
|
430
431
|
import asyncio
|
|
431
432
|
import dataclasses
|
|
432
433
|
|
|
434
|
+
from dialectical_framework.agents.advisor.migration import person_turns
|
|
433
435
|
from dialectical_framework.concerns.tetrad_candidates import (
|
|
434
436
|
clamp_attempts, ranking, select_sketch)
|
|
435
437
|
|
|
@@ -459,7 +461,6 @@ class Consultant:
|
|
|
459
461
|
sketch_turn._messages = list(history)
|
|
460
462
|
return await sketch_turn.submit(ViewSketchDto, request)
|
|
461
463
|
|
|
462
|
-
n = clamp_attempts(attempts)
|
|
463
464
|
# Fully parallel, deliberately. On a COLD cache all N draws write the
|
|
464
465
|
# ~12k system head instead of one writing and the rest reading (~$0.06
|
|
465
466
|
# a card at list prices, 2026-10-06), and the fix would be to await the
|
|
@@ -470,6 +471,13 @@ class Consultant:
|
|
|
470
471
|
# (`utils/bedrock_provider.py::_CACHE_TTL`) attacks the same cost
|
|
471
472
|
# without the latency, which is the trade taken. Revisit only with a
|
|
472
473
|
# measured cold-start rate.
|
|
474
|
+
n = clamp_attempts(attempts)
|
|
475
|
+
# The SAME request N times, by measurement: N identical requests draw
|
|
476
|
+
# the same opposition N times, reworded (the first app, 52/52 cards),
|
|
477
|
+
# and asking draw 2..N for a different one made the spares differ and
|
|
478
|
+
# the winner worse (CC 19/40 against 27/40, 2026-10-13,
|
|
479
|
+
# `tests/e2e/probe_view_turn_ask.py`) — so this is a coherence re-roll,
|
|
480
|
+
# and a host's "another" served from `runners_up` is a rewording.
|
|
473
481
|
drawn = await asyncio.gather(*(draw() for _ in range(n)), return_exceptions=True)
|
|
474
482
|
sketches = [d for d in drawn if not isinstance(d, BaseException)]
|
|
475
483
|
failures = [d for d in drawn if isinstance(d, BaseException)]
|
|
@@ -503,13 +511,20 @@ class Consultant:
|
|
|
503
511
|
# screen shows is that first tension. The judged draws that lost come
|
|
504
512
|
# back too, best first, as `runners_up` — a host's "again"/"another"
|
|
505
513
|
# can serve one without a new call (the module's stated intent).
|
|
514
|
+
# The judge reads the PERSON's turns as its context (`judge_context`):
|
|
515
|
+
# it never sees T or A, and called blind — as it was here until
|
|
516
|
+
# 2026-10-13, while the build and the persisted path passed their
|
|
517
|
+
# material — it scored the four aspects against nothing.
|
|
506
518
|
runners_up: list[PerspectiveView] = []
|
|
507
519
|
if len(sketches) > 1:
|
|
508
520
|
firsts = [s.tensions[0] if s.tensions else None for s in sketches]
|
|
509
521
|
judgeable = [i for i, t in enumerate(firsts) if t is not None and all(
|
|
510
522
|
(getattr(t, k) or "").strip() for k in ("thesis", "antithesis", "t_plus", "t_minus", "a_plus", "a_minus"))]
|
|
511
523
|
if len(judgeable) > 1:
|
|
512
|
-
_best, verdicts = await select_sketch(
|
|
524
|
+
_best, verdicts = await select_sketch(
|
|
525
|
+
[firsts[i] for i in judgeable],
|
|
526
|
+
context=judge_context(person_turns(history)),
|
|
527
|
+
)
|
|
513
528
|
order = ranking(verdicts)
|
|
514
529
|
sketch = sketches[judgeable[order[0]]]
|
|
515
530
|
runners_up = [perspective_from_sketch(firsts[judgeable[i]]) for i in order[1:]]
|
|
@@ -12,6 +12,22 @@ parallel, the two control statements judged for each, the best kept. The
|
|
|
12
12
|
runners-up are returned, not thrown away — a person's "another" can be one of
|
|
13
13
|
them without a new call.
|
|
14
14
|
|
|
15
|
+
The N draws are N identical requests, and they draw the SAME opposition N
|
|
16
|
+
times, reworded (the first app's handoff, 2026-10-13: 52/52 cards, the chosen
|
|
17
|
+
A at 0.79 similarity to its spares, a served runner-up "the same tension
|
|
18
|
+
re-worded" in 8/8 retries) — a coherence re-roll, which is what the figures
|
|
19
|
+
above measure, not a choice between tensions. Asking draw 2..N for a
|
|
20
|
+
DIFFERENT opposition was tried and rejected the same day on a pre-registered
|
|
21
|
+
A/B (`tests/e2e/probe_view_turn_ask.py`, pinned, 40 utterances): the spares
|
|
22
|
+
became different positions (75/80) and the winner lost — CC 19/40 against
|
|
23
|
+
27/40, positions 34 against 37, 1.26x the seconds. Temperature is not a
|
|
24
|
+
lever either: both one-shot writers think, and a thinking call takes the
|
|
25
|
+
provider's default. The rejected ask and the record:
|
|
26
|
+
`docs/dev-notes/antithesis-selection.md`, "Best-of-3 drew the same tetrad
|
|
27
|
+
three times". What the handoff found beside it is kept: the ranking reads
|
|
28
|
+
dialectical validity after the pass floor (`ranking`), and the view turn's
|
|
29
|
+
judge reads the person's words (`view_sketch.judge_context`).
|
|
30
|
+
|
|
15
31
|
What this must NOT become: a loop that optimises against the judge. The judge
|
|
16
32
|
never sees the thesis or antithesis — it scores the four aspects' coherence
|
|
17
33
|
and passes a MIRROR antithesis more readily than a genuine position — so a
|
|
@@ -75,17 +91,41 @@ def clamp_attempts(attempts: Optional[int], default: Optional[int] = None) -> in
|
|
|
75
91
|
|
|
76
92
|
@dataclass(frozen=True)
|
|
77
93
|
class SketchVerdict:
|
|
78
|
-
"""The two control statements'
|
|
94
|
+
"""The two control statements' scores for one sketch: coherence (CC) on
|
|
95
|
+
both, and dialectical validity (DV) on both where the judge gave it.
|
|
96
|
+
|
|
97
|
+
DV is scored in the SAME call as CC (`CoherenceEvaluationDto`), so carrying
|
|
98
|
+
it costs nothing; until 2026-10-13 it was computed on every draft and
|
|
99
|
+
dropped here, and the ranking read coherence alone (the first app's
|
|
100
|
+
handoff). `None` on the DV fields means the judge did not say — a verdict
|
|
101
|
+
built from CC alone — and such a verdict ranks BELOW any with a DV, never
|
|
102
|
+
as a zero (a zero is a claim).
|
|
103
|
+
"""
|
|
79
104
|
|
|
80
105
|
t_plus_without_a_plus: float
|
|
81
106
|
a_plus_without_t_plus: float
|
|
82
107
|
reasoning: str = ""
|
|
108
|
+
t_plus_without_a_plus_dv: Optional[float] = None
|
|
109
|
+
a_plus_without_t_plus_dv: Optional[float] = None
|
|
83
110
|
|
|
84
111
|
@property
|
|
85
112
|
def floor(self) -> float:
|
|
86
113
|
"""The weaker statement — what the pass/fail rule reads."""
|
|
87
114
|
return min(self.t_plus_without_a_plus, self.a_plus_without_t_plus)
|
|
88
115
|
|
|
116
|
+
@property
|
|
117
|
+
def mean(self) -> float:
|
|
118
|
+
return (self.t_plus_without_a_plus + self.a_plus_without_t_plus) / 2
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
def dialectical_validity(self) -> Optional[float]:
|
|
122
|
+
"""The mean DV of the two statements — whether the relationship is a
|
|
123
|
+
natural, generative one rather than a forced pairing. `None` when the
|
|
124
|
+
judge gave none."""
|
|
125
|
+
if self.t_plus_without_a_plus_dv is None or self.a_plus_without_t_plus_dv is None:
|
|
126
|
+
return None
|
|
127
|
+
return (self.t_plus_without_a_plus_dv + self.a_plus_without_t_plus_dv) / 2
|
|
128
|
+
|
|
89
129
|
@property
|
|
90
130
|
def passes(self) -> bool:
|
|
91
131
|
return self.floor >= CONCEPTUAL_COHERENCE_THRESHOLD
|
|
@@ -153,6 +193,8 @@ async def judge_sketches(
|
|
|
153
193
|
t_plus_without_a_plus=first.coherence_score,
|
|
154
194
|
a_plus_without_t_plus=second.coherence_score,
|
|
155
195
|
reasoning=f"{first.reasoning} / {second.reasoning}".strip(" /"),
|
|
196
|
+
t_plus_without_a_plus_dv=first.dialectical_validity,
|
|
197
|
+
a_plus_without_t_plus_dv=second.dialectical_validity,
|
|
156
198
|
)
|
|
157
199
|
except Exception as exc: # noqa: BLE001 — degrade to "unjudged"
|
|
158
200
|
logger.warning("Judging a sketch failed; it sorts last: %s", exc)
|
|
@@ -167,10 +209,11 @@ async def select_sketch(
|
|
|
167
209
|
"""Judge every candidate (gathered) and return the index of the best plus
|
|
168
210
|
all verdicts (None where judging failed).
|
|
169
211
|
|
|
170
|
-
Ranking: the weaker control statement first (the pass rule),
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
212
|
+
Ranking (`ranking`): the weaker control statement first (the pass rule),
|
|
213
|
+
then dialectical validity, then the mean coherence, then the earlier draw
|
|
214
|
+
— a deterministic tie-break, not a preference. A candidate whose judging
|
|
215
|
+
failed sorts last; if every judging failed the first draw is kept, which
|
|
216
|
+
is exactly what `attempts=1` would have done.
|
|
174
217
|
|
|
175
218
|
ONE candidate is never judged: there is nothing to select among, so
|
|
176
219
|
`attempts=1` costs no extra call.
|
|
@@ -183,15 +226,30 @@ async def select_sketch(
|
|
|
183
226
|
|
|
184
227
|
|
|
185
228
|
def ranking(verdicts: Sequence[Optional[SketchVerdict]]) -> list[int]:
|
|
186
|
-
"""Candidate indices best first
|
|
187
|
-
|
|
188
|
-
`[0]` is the winner; the rest are the runners-up in order.
|
|
229
|
+
"""Candidate indices best first: the weaker control statement, then
|
|
230
|
+
dialectical validity, then the mean coherence, then the earlier draw;
|
|
231
|
+
unjudged last. `[0]` is the winner; the rest are the runners-up in order.
|
|
232
|
+
|
|
233
|
+
Why the floor stays FIRST: it is the pass rule, and every best-of-N figure
|
|
234
|
+
on record (CC 36/40 on the view turn, 30/40 on the build, 26/46 on
|
|
235
|
+
documents) is a keep-any-passing-draw figure — a term ahead of it would
|
|
236
|
+
trade those for an unmeasured one. Why DV comes next, ahead of the mean:
|
|
237
|
+
DV is the paper's acceptance term beside SP (the Advisor's quality floor
|
|
238
|
+
already reads it), and it answers the question the choice is about — of
|
|
239
|
+
two draws that both hold, which is the LIVE tension rather than the
|
|
240
|
+
forced pairing — where the mean is only the other statement's score,
|
|
241
|
+
already above the floor. On the archive DV tracks CC at 0.96, so this
|
|
242
|
+
moves few selections — the draws of one request are rewordings of one
|
|
243
|
+
tension. A verdict with no DV sorts
|
|
244
|
+
below any with one (`-1.0` exists only to lose this term, like
|
|
245
|
+
`explorer._causality_probability`), never as a zero.
|
|
246
|
+
"""
|
|
189
247
|
|
|
190
|
-
def key(index: int) -> tuple[int, float, float, int]:
|
|
248
|
+
def key(index: int) -> tuple[int, float, float, float, int]:
|
|
191
249
|
verdict = verdicts[index]
|
|
192
250
|
if verdict is None:
|
|
193
|
-
return (0, 0.0, 0.0, -index)
|
|
194
|
-
|
|
195
|
-
return (1, verdict.floor, mean, -index)
|
|
251
|
+
return (0, 0.0, 0.0, 0.0, -index)
|
|
252
|
+
dv = verdict.dialectical_validity
|
|
253
|
+
return (1, verdict.floor, -1.0 if dv is None else dv, verdict.mean, -index)
|
|
196
254
|
|
|
197
255
|
return sorted(range(len(verdicts)), key=key, reverse=True)
|
|
@@ -128,8 +128,10 @@ class TetradSketch(ReasonableConcern[ViewSketchPerspectiveDto], SettingsAware):
|
|
|
128
128
|
attempts: Optional[int] = None,
|
|
129
129
|
) -> ViewSketchPerspectiveDto:
|
|
130
130
|
"""One tension, whole. With `attempts` > 1 (`clamp_attempts`, max 3) the
|
|
131
|
-
call is drawn that many times IN PARALLEL
|
|
132
|
-
|
|
131
|
+
call is drawn that many times IN PARALLEL — the SAME request each
|
|
132
|
+
time: asking later draws for a different opposition was measured and
|
|
133
|
+
rejected on the view turn (`view_sketch_prompt`'s docstring) — and
|
|
134
|
+
the framework's own coherence check picks the best (`concerns/tetrad_candidates.py`); the
|
|
133
135
|
runners-up stay on `self.alternatives` with their verdicts, the
|
|
134
136
|
winner's verdict on `self.verdict`. Measured reason and the guard
|
|
135
137
|
against turning this into a loop: that module's docstring.
|
|
@@ -171,6 +173,12 @@ class TetradSketch(ReasonableConcern[ViewSketchPerspectiveDto], SettingsAware):
|
|
|
171
173
|
"drawn": len(candidates),
|
|
172
174
|
"selected": best,
|
|
173
175
|
"floors": [None if v is None else round(v.floor, 2) for v in verdicts],
|
|
176
|
+
"validity": [
|
|
177
|
+
None if v is None or v.dialectical_validity is None
|
|
178
|
+
else round(v.dialectical_validity, 2)
|
|
179
|
+
for v in verdicts
|
|
180
|
+
],
|
|
181
|
+
"oppositions": [c.antithesis for c in candidates],
|
|
174
182
|
"alternatives": [c.model_dump() for c, _v in self.alternatives],
|
|
175
183
|
}
|
|
176
184
|
return tension
|
|
@@ -45,7 +45,7 @@ The view BEFORE the upgrade, not a lighter version of the checked one.
|
|
|
45
45
|
|
|
46
46
|
from __future__ import annotations
|
|
47
47
|
|
|
48
|
-
from typing import Optional
|
|
48
|
+
from typing import Optional, Sequence
|
|
49
49
|
|
|
50
50
|
from pydantic import BaseModel, Field
|
|
51
51
|
|
|
@@ -215,6 +215,33 @@ For each pair:
|
|
|
215
215
|
THESIS_IS_FIXED = """The thesis (T) is GIVEN, in the person's own words, and it is FIXED: carry it into the view exactly as it stands — do not reword, shorten, sharpen or generalise it, and do not put a different position in its place. Everything else in the tetrad is built around it as given."""
|
|
216
216
|
|
|
217
217
|
|
|
218
|
+
|
|
219
|
+
#: How much of the person's own words the view turn's JUDGE reads (characters,
|
|
220
|
+
#: newest turns kept whole). The judge never sees T or A, so without context
|
|
221
|
+
#: it scores the four aspects' coherence against nothing: the persisted path
|
|
222
|
+
#: and the one-shot build pass their material, and the view turn passed ""
|
|
223
|
+
#: until 2026-10-13 (the first app's handoff, §3). The person's turns are what
|
|
224
|
+
#: the migration mines as material too (`migration.person_turns`); a card's
|
|
225
|
+
#: history is one utterance, a long consultation is bounded here so six judge
|
|
226
|
+
#: calls do not each re-read it whole (no cache breakpoint sits on a judge
|
|
227
|
+
#: call). Policy, not config.
|
|
228
|
+
JUDGE_CONTEXT_CHARS = 4_000
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def judge_context(person_texts: Sequence[str], budget: int = JUDGE_CONTEXT_CHARS) -> str:
|
|
232
|
+
"""The person's turns as the judge's `<context>`, in order, the NEWEST
|
|
233
|
+
kept whole within `budget` and older ones dropped first — a tetrad drawn
|
|
234
|
+
now answers what was said last. Empty when nothing was said."""
|
|
235
|
+
kept: list[str] = []
|
|
236
|
+
used = 0
|
|
237
|
+
for text in reversed([t.strip() for t in person_texts if t and t.strip()]):
|
|
238
|
+
if kept and used + len(text) > budget:
|
|
239
|
+
break
|
|
240
|
+
kept.append(text)
|
|
241
|
+
used += len(text)
|
|
242
|
+
return "\n\n".join(reversed(kept))
|
|
243
|
+
|
|
244
|
+
|
|
218
245
|
def view_sketch_prompt(
|
|
219
246
|
focus: Optional[str], max_words: int, thesis: Optional[str] = None
|
|
220
247
|
) -> str:
|
|
@@ -239,6 +266,16 @@ def view_sketch_prompt(
|
|
|
239
266
|
(`THESIS_IS_FIXED`): the stance ask comes OFF — there is nothing to find —
|
|
240
267
|
and the view is asked for the ONE tension that position stands in, because
|
|
241
268
|
a pinned T says nothing about any other tension and a card shows one.
|
|
269
|
+
|
|
270
|
+
ONE request for every draw of a best-of-N, by measurement (2026-10-13,
|
|
271
|
+
`tests/e2e/probe_view_turn_ask.py`, pinned, 40 utterances, two arms the
|
|
272
|
+
same day): asking draw 2..N for a different opposition made every card's
|
|
273
|
+
spares a different position (75/80 positions) and cost the WINNER —
|
|
274
|
+
coherence 19/40 against 27/40 with identical draws, positions 34 against
|
|
275
|
+
37, 1.26x the seconds — so the draws stay a re-roll of one request and
|
|
276
|
+
the spares stay the same tension reworded. The rejected ask and its
|
|
277
|
+
figures: `docs/dev-notes/antithesis-selection.md`, "Best-of-3 drew the
|
|
278
|
+
same tetrad three times".
|
|
242
279
|
"""
|
|
243
280
|
pinned = (thesis or "").strip()
|
|
244
281
|
focus_line = (
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dialectical_framework-2.1.0 → dialectical_framework-2.1.1}/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.1.0 → dialectical_framework-2.1.1}/src/dialectical_framework/agents/apps.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
|
|
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
|
|
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
|