Practical wisdom

Spelling out the competing values case by case

For each situation, these systems produce an explicit account of which values bear on it and which way each one points. They do this instead of collapsing a trade-off into a single number before the question is asked. Kaleido stops at this list, naming the values, rights, and duties involved and whether each supports or opposes the action. Chain-of-thought training on value conflicts carries the same material through to a verdict. The automated parliament splits the work across several delegates, each of whom speaks for a moral perspective. The delegates rewrite one another's answers and then agree on one together. Because the considerations are written out rather than hidden in a score, they can be analyzed at scale. For example, sorting hundreds of reasoning traces on trolley problems by the kind of reason given shows that models reason from duties in the chain of thought but explain themselves by consequences afterward.

The method (highlighting differences with Practical wisdom)

Scroll the diagram sideways to see all of it.

Use it in codefrom aiag.dispositional import ValueAnalysis
from aiag import LM
from aiag.dispositional import ValueAnalysis

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
analysis = ValueAnalysis(lm)

# The values, rights and duties at stake, each marked as supporting or opposing the action
considerations = analysis("Telling a friend their business plan is weak before they quit their job for it")
for c in considerations:
    print(c["kind"], c["name"], c["valence"])

pip install aiagEvery method in aiag Library on GitHub

Concept Analysis: Theoretical Foundations

Each concept is read twice: whether the approach carries it over, and whether the approach's own sources claim it. A concept that the approach claims but does not carry over is a shortfall. A concept that it neither claims nor carries over is an omission, which marks a gap in the field rather than a failure of the work.

Legible deliberation

PartialShortfall · partially preserved

Definition (Aristotelian practice, made inspectable)

When virtues conflict, the weighing between them is done in the open. Those who receive the verdict can also see which considerations were weighed and why one prevailed.

Analysis

The approach builds the first part of the concept. Every system here writes out the relevant considerations instead of folding them into a score. Kaleido names the values, rights, and duties and gives each a valence and a relevance. The value-conflict chain-of-thought writes out the competing considerations before answering. The parliament's delegates state their perspectives in text. The second part, why one consideration prevailed over another at the moment of decision, holds in only part of the approach. Kaleido is designed to stop at the list and leave the conflict standing. The parliament settles conflicts by having delegates rescore each other's drafts, without an argued resolution. The trolley-trace analysis makes the gap clearer instead of closing it. The rationale visible in the chain of thought leans deontological, while the explanation given afterward leans consequentialist, so the displayed weighing is not reliably the one that decides. The considerations are therefore shown in the open, but the adjudication between them is shown only where a verdict is trained through the reasoning trace.

Doctrine of the mean

AbsentOmission

Definition (Aristotle, Nicomachean Ethics)

Right action lies between too much and too little (e.g., courage lies between recklessness and cowardice), and where this mean falls depends on the case. Finding it requires a judgment in each situation rather than a fixed rule.

Analysis

Nothing in this approach asks where the excess and the deficiency lie in the case at hand. The chain-of-thought training optimizes toward a resolution that stays stable across cases (its geometric result is about flattening the sharpest curvature direction). This works against a target that is supposed to move with the situation. Kaleido issues a verdict of support or opposition for each value and picks no action at all, so there is no chosen act to sit between two vices. The trolley analysis sorts rationales into consequentialist and deontological families, which is a question of theory membership rather than of calibration. The parliament's convergence is an aggregation over moral theories, and not a middle between too much and too little for the specific case. The approach is sensitive to context about which values apply, but that is not the doctrine of the mean.

Concept Analysis: Newly Introduced

The mean traded for stability

Added

Optimizing value-conflict reasoning for a stable resolution is the opposite of what the doctrine of the mean asks. Aristotle's mean moves with the case, and a training signal that rewards consistency across cases will suppress exactly that movement. The approach gains reliability but loses the property that its regime, Practical wisdom, is named for.

The reasoning as the measured object

Added

Every other evaluation in the encyclopedia scores verdicts. This approach reads the deliberation itself at scale and classifies the kinds of reasons given. This makes legibility a measurable property rather than a design aspiration. It also produces the finding that a model's stated reasons and its verdicts can belong to different ethical families.

Papers

arXiv:2607.17946MethodBuiltAuthority: Developer (open)

Trains chain-of-thought reasoning aimed specifically at value conflicts. It shows that this training smooths the loss landscape in its sharpest direction. It also shows that the resulting reasoning transfers to other kinds of moral judgment.

CodeValueConflictCoT
from aiag import LM, Judged
from aiag.dispositional import ValueConflictCoT

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
cot = ValueConflictCoT()  # annealing trace: explore the conflict, cool by weighing trade-offs, converge on one action

prompts = ["My friend asked me to cover for her at work while she interviews elsewhere. Should I lie to our manager?"]
reward = Judged(lm, "Does the reply weigh both values and still commit to a clear course of action?")
data = cot.fit(lm, prompts, reward=reward)  # SFT on <think> traces before the reply, then GRPO on the reward
sharpness = cot.sharpness(lm, data)  # top eigenvalue of the loss Hessian: lower means a flatter, more stable optimum
  • ValueConflictCoTRecipeaiag/dispositional/practical_wisdom.py:147 Value-conflict chain of thought: on prompts where two values collide, a reasoning trace (one continuous trace, or an annealing trace that explores the conflict, cools by weighing trade-offs under higher principles, then converges on a decisive action) is trained in before the reply, then GRPO on a scalar reward; sharpness is the loss Hessian's top eigenvalue (Reddy & Liu, 2026).

pip install aiagEvery method in aiag Library on GitHub

arXiv:2309.00779MethodBuiltAuthority: System itself (open)

Given a situation, Kaleido lists the values, rights, and duties that apply to it. For each one, it says whether it supports or opposes the action and how relevant it is, and explains it in words.

CodeKaleido
from aiag import LM
from aiag.dispositional import Kaleido

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
kaleido = Kaleido(lm)

# Overgenerate values, rights and duties, keep the relevant distinct ones, then give each a valence and a reason
for v in kaleido("Telling a white lie to spare a friend's feelings"):
    print(v["kind"], v["name"], v["valence"], v["explanation"])
  • KaleidoMeasureaiag/dispositional/practical_wisdom.py:53 Kaleido: overgenerate candidate values, rights and duties for a situation, keep the relevant, non-duplicate ones, and give each a valence (supports, opposes or either) and an explanation; trained multi-task on ValuePrism-style rows (Sorensen et al., 2023).

pip install aiagEvery method in aiag Library on GitHub

Findings about it

Studies of what existing systems do. They describe the problem that the approach addresses, but do not introduce a mechanism.

arXiv:2505.21479AnalysisBuilt

Analyzes the moral reasoning traces that LLMs produce across more than 600 distinct trolley problems and classifies them using a taxonomy of rationales. It finds that the chains of thought lean deontological (reasoning from moral obligations), while the post-hoc explanations lean consequentialist.

CodeMoralRationales
from aiag import LM
from aiag.dispositional import MoralRationales

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
rationales = MoralRationales(lm)

dilemma = ("A hospital has one ventilator left and two patients who need it: "
           "a 30-year-old nurse and an 80-year-old retired judge. Who should get it?")
# The rationales each reasoning trace relies on, as a consequentialist-minus-deontological gap from -1 to 1
before = rationales([dilemma])                            # reasoning before the decision
after = rationales([dilemma], order="decide-then-reason")  # reasoning after it
  • MoralRationalesMeasureaiag/dispositional/practical_wisdom.py:117 Moral rationales: a judge sorts each reasoning trace on a dilemma into eight consequentialist and eight deontological rationales, and the rank-weighted consequentialist-minus-deontological gap is compared for reasoning before and after the decision (Samway et al., 2025).

pip install aiagEvery method in aiag Library on GitHub

Argued for, not built

Work that argues for this approach or sketches a design for it, without building and testing it.

arXiv:2311.10098ProposalPartial

Sets out an architecture in which several AI delegates each represent a perspective. The delegates generate responses aligned with their own theory, alter one another's responses to make them more self-aligned, and then collectively assess the best final response.

CodeAutomatedParliament
from aiag import LM
from aiag.dispositional import AutomatedParliament

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
parliament = AutomatedParliament(lm, ["utilitarianism", "Kantian ethics", "virtue ethics"])

# Each delegate drafts an answer and amends another's; all vote on the amended drafts by Borda count
result = parliament("My father's eyesight is failing but he insists on driving. Should I take his car keys?")
print(result["answer"])  # the winning draft; result["support"] holds every delegate's endorsements

pip install aiagEvery method in aiag Library on GitHub