templates: split-decision kit — provider-isolated position sweeps for contested decisions#52
Open
snapsynapse wants to merge 1 commit into
Conversation
One decision question fanned to N workers on different providers, each writing one independent position in an isolated task directory; the check validates the position contract (metadata, closed stance vocabulary, summary, reasoning floor) and prints exactly what's missing. Assembly into a lintable decision record is documented as an optional second phase, since tasks have no ordering. Kit follows house anatomy (manifest.json + checks/ + README fill-in table), lints clean as a skeleton and filled-in, and adds its row to the catalog, composition guide, and orchestrator skill table. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
I needed to settle a contested tooling decision without one model's framing anchoring every opinion that followed, so I ran it as a Ringer swarm: one position task per provider engine, isolated task directories so panelists can't read each other, identical brief for all. The output ended up as an arbitrated decision record (recorded run, 2026-07-04, two providers), and the shape is documented as a worked example in AIDR's RECIPES.md, which cites Ringer as the reference implementation. This kit is that sweep in house template anatomy, so the next person doesn't rebuild it.
In the kit:
manifest.json— three provider-isolated position tasks. Specs are byte-identical apart from the panelist label; provider diversity comes from the per-taskengine/modelfields, never cloned engine blocks.checks/check_position.py— validates the position contract and prints exactly what's missing: heading, five metadata lines, a stance from a closed vocabulary (recommend | oppose | alternative | abstain), a real summary, a floor on reasoning length. A file with two position blocks fails (the usual symptom of another participant's output leaking in), and anabstainthat doesn't name what's missing fails too.README.md— fill-in table, gotchas (the independence axis is the provider, not the temperature; don't pre-rank the alternatives in the brief), and an optional second phase assembling the positions into a lintable decision record — tasks have no ordering, so assembly can't be a task that waits on the others.Stated in the README rather than papered over: the check can't prove two engines resolve to genuinely different models (self-reported
model/provideris a declaration; the JSONL run log and the identity registry corroborate), and it can't prove the reasoning is any good. Reading positions is the orchestrator's job; deciding is a human's.Executed proof:
PASS; invalid stance + thin summary + thin reasoning →FAILnaming all three; leaked second block →FAIL; missing file →FAIL.test_templates_are_cleanlinting the new skeleton../ringer.py lint:lint: clean (3 tasks).No changes to
ringer.py. Templates and docs only. This distinguishes itself frombakeoff(positions argue a decision, they don't compete on a benchmark) andadversarial-review(reviewers inspect an artifact; panelists argue a question) — the composition-guide row says the same.🤖 Generated with Claude Code