Skip to content

templates: split-decision kit — provider-isolated position sweeps for contested decisions#52

Open
snapsynapse wants to merge 1 commit into
NateBJones-Projects:mainfrom
snapsynapse:feat/split-decision-template-kit
Open

templates: split-decision kit — provider-isolated position sweeps for contested decisions#52
snapsynapse wants to merge 1 commit into
NateBJones-Projects:mainfrom
snapsynapse:feat/split-decision-template-kit

Conversation

@snapsynapse

Copy link
Copy Markdown
Contributor

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-task engine/model fields, 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 an abstain that 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.
  • One row each in the templates catalog, the composition guide, and the orchestrator skill's pattern table.

Stated in the README rather than papered over: the check can't prove two engines resolve to genuinely different models (self-reported model/provider is 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:

  • Check script exercised against four fixtures: valid position → PASS; invalid stance + thin summary + thin reasoning → FAIL naming all three; leaked second block → FAIL; missing file → FAIL.
  • Full suite: 218 passed, Python 3.12, macOS — includes test_templates_are_clean linting the new skeleton.
  • A fully filled-in copy passes ./ringer.py lint: lint: clean (3 tasks).

No changes to ringer.py. Templates and docs only. This distinguishes itself from bakeoff (positions argue a decision, they don't compete on a benchmark) and adversarial-review (reviewers inspect an artifact; panelists argue a question) — the composition-guide row says the same.

🤖 Generated with Claude Code

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant