Preserve the dissenting reasoning behind contested decisions, as a durable record.
Project description
holdout
Most multi-model tools synthesize the disagreement into one answer, dissolving the dissent in the process. holdout deliberately preserves the dissenting position — because for decisions with no verifiable answer, the losing reasoning is exactly what's worth keeping.
Preserve the dissenting reasoning behind contested decisions, as a durable record.
holdout puts a question that has no verifiable answer to several independently prompted
reasoners, each committing a written rationale and a YES/NO vote before seeing any
peer. It keeps every rationale — including the losing one — as a durable, retrievable
record, and on disagreement returns a crux (the specific, falsifiable disagreement
to resolve) instead of forcing an answer.
The output is an artifact, not a decision. holdout does not make a recommendation, does
not synthesize the positions into one answer, and makes no accuracy claim.
The project's internal codename and report aesthetic is MAGI (the three deliberating
systems from Neon Genesis Evangelion: Melchior, Balthasar, Caspar). The installable
package, CLI, and imports are holdout; "MAGI" in prose refers to the concept and
the visual identity of the rendered reports.
Why
Most multi-model tools synthesize: they merge several model outputs into one "best" answer, and the dissent is dissolved in the process. That is the right move for questions that have an answer key. It is the wrong move for consequential decisions that don't — "should we rewrite this service," "is this trade-off acceptable" — where fusing model outputs manufactures false confidence, and where the losing reasoning is exactly what you want preserved for the later postmortem.
holdout is for that second class of question only. It applies the practice that courts,
medical boards, and intelligence analysis have long used — preserved, structured dissent
under conditions of high stakes and absent ground truth — to software-assisted decisions.
What it is not
- Not a synthesis engine. There is no step that merges the positions into one answer.
- Not an accuracy tool. It is not benchmarked and concedes that consensus methods win on questions that have answers.
- Not a decision-maker. On a split it returns a structured input to a human, not a verdict.
- Not a learning system. The store records and retrieves; it does not score agents.
Install
pip install holdout
Use
from holdout import Agent
from holdout.protocol.engine import Panel
from holdout.providers.openai_compat import OpenAICompatProvider
panel = Panel(
agents=[
Agent(name="empirical", mandate="Reason from data and measurable outcomes"),
Agent(name="principled", mandate="Reason from duty, cost, and absent stakeholders"),
Agent(name="practitioner", mandate="Reason from pattern, precedent, and experience"),
],
provider=OpenAICompatProvider(...),
)
record = await panel.deliberate(
"Should we move the auth service to a new language?",
tier="hard_to_reverse", # the caller asserts reversibility
)
record.outcome # 'majority' | 'split' | 'fragile_agreement'
record.positions # every agent's full rationale + vote, verbatim
record.minority # the preserved losing rationale
record.crux # the consequence-anchored crux (only on a split)
record.to_report() # render the self-contained report file
holdout "Should we adopt this dependency?" --tier hard_to_reverse --report decision.html
holdout similar "Should we adopt a different dependency?"
Status
Early. The type contract and provider seam are in place and verified; the deliberation
engine, store, report, and CLI are built in order per the build spec. See CLAUDE.md for
the build plan and the two invariants that must hold throughout.
Design
Three documents describe the project at three altitudes:
- Build spec — what to implement, and nothing else.
- Testing strategy — how "correct by inspection" becomes "correct by a green run," and why the two invariants are tested as structure rather than example.
- Design document — the full case, the boundary of the claim, and the cross-field evidence. Not needed to build.
License
Apache-2.0.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file holdout-0.1.1.tar.gz.
File metadata
- Download URL: holdout-0.1.1.tar.gz
- Upload date:
- Size: 135.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dec6aebca8c91f931fdc35f7517919cfaadce961164945d7ac4114d0f44d35f6
|
|
| MD5 |
e46385320df92aedf60575054841447f
|
|
| BLAKE2b-256 |
24f68a1bbc9867aeef4c8b1a779c397108b8b8d13213b5a972ec24b257430113
|
File details
Details for the file holdout-0.1.1-py3-none-any.whl.
File metadata
- Download URL: holdout-0.1.1-py3-none-any.whl
- Upload date:
- Size: 27.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1edcd516759e31c6fb4cad1b9eb15bf73d87fb5dfba392db73be616fc91d4540
|
|
| MD5 |
6132d634861bacfba7a66f2ae7470f86
|
|
| BLAKE2b-256 |
fa6aceaa0dbd2509ad3ba417f6c21b2463ea08a4081e5a95975eca2d03bb32c4
|