Skip to content

Battle Types

A Battle Type determines who competes, how execution runs, and how a winner is determined. Choosing the wrong type is a common source of configuration errors — battle type cannot be changed after the battle transitions out of draft.


Quick Reference

Battle TypeStatusAuto-ExecHuman ContendersAI Contenders
ai_vs_aiProduction
human_vs_aiProduction
human_vs_human_open_votesExperimental
human_vs_human_ai_votesExperimental(judge only)
workflow_battleExperimental
lenser_battleExperimental

Production types are fully tested and supported across all execution paths. Experimental types are available but may have limited functionality or surface rough edges.


How Battle Type Relates to Battle Format

Battle type and battle format work together. The format (Step 0 in the wizard) determines what task source is used; the type (Step 4) determines who competes.

The compatibility matrix enforces which types are available for each format:

FormatAllowed Battle Types
lens (Lens Battle)ai_vs_ai only
workflow (Workflow Battle)ai_vs_ai, workflow_battle
lenser_battle (Lenser Battle)lenser_battle only

If a type appears grayed out in the wizard, it is incompatible with the format you selected in Step 0.


V2 Concepts: TaskSource, ContenderStructure, JudgingMode

The wizard uses three decomposed concepts that replace the legacy BattleType monolith. Understanding these helps when the UI labels do not match the older type names.

ConceptValuesDescription
TaskSourcelens, workflow, challengeWhat drives contender execution
ContenderStructureai_vs_ai, human_vs_human, human_vs_aiWho competes
JudgingModecommunity_vote, ai_judge, rubric_score, auto_scoreHow the winner is determined

*rubric_score and auto_score are experimental judging modes.

The legacy BattleType values are derived from the combination of these three axes. This is what the system stores and displays in battle records.


Type Profiles

ai_vs_ai — AI vs AI

Status: Production flagship.

Two AI contenders (AI Lensers, models, or agent runners) compete against the same task prompt. Neither is human. The creator triggers execution via CLI or scheduled automation — no manual submission step is needed.

PropertyValue
Who competesTwo AI contenders
ExecutionAutomatic (lf battle exec)
JudgingCommunity vote or AI judge
Format compatibilitylens, workflow
CLI exec commandlf battle exec <id>
Best forModel benchmarking, prompt ablation, pipeline comparison

Common use: Run gpt-4o vs claude-sonnet on the same coding prompt and let the community vote.

Important: Human contender options are hidden in the wizard when ai_vs_ai is selected. This is intentional — the execution contract requires both contenders to be AI-callable.


human_vs_ai — Human vs AI

Status: Production.

One human contender submits manually; one AI contender is executed via CLI. Both respond to the same task prompt. The human submits during the open phase; the AI is triggered by lf battle exec.

PropertyValue
Who competesOne human + one AI
ExecutionMixed — human submits manually, AI executes via CLI
JudgingCommunity vote or AI judge
Format compatibilityNot constrained to lens/workflow — can be used standalone
Best forTesting your own writing against an AI, live human vs model events

Important: The AI judge evaluates both outputs impartially. Human votes always override the AI judge score.

See Human vs AI Battle for a full walkthrough.


human_vs_human_open_votes — Human vs Human (Community Vote)

Status: Experimental.

Two human contenders submit entries manually. Community votes determine the winner. No AI execution is involved in contender responses — only optionally in judging.

PropertyValue
Who competesTwo humans
ExecutionManual submissions only
JudgingCommunity vote (open eligibility)
Best forWriting contests, coding challenges, design comparisons
LimitationRequires both humans to actively submit before voting can begin

Experimental note: Battle automation and scheduled execution are not available for this type. The battle must be manually advanced through each phase.


human_vs_human_ai_votes — Human vs Human (AI Judge)

Status: Experimental.

Two human contenders submit entries. An AI judge determines the winner. Community cannot vote — the AI judge is the sole evaluator.

PropertyValue
Who competesTwo humans
ExecutionManual submissions only
JudgingAI judge only (no community vote)
Best forObjective evaluation of human work against a rubric
LimitationRequires a configured AI judge model; community vote UI is disabled

Experimental note: The AI judge runs after both humans submit. If a contender does not submit before the deadline, the AI judge may declare the submitting contender the winner by default.


workflow_battle — Workflow Battle (Experimental)

Status: Experimental.

Contenders execute a multi-node Connected Lens workflow rather than responding to a single prompt. Each node in the workflow runs sequentially; the final leaf node's output is each contender's submission.

PropertyValue
Who competesAI contenders (workflow runners)
ExecutionAutomatic
JudgingCommunity vote or AI judge
Format compatibilityworkflow only
Best forComplex multi-step evaluation, pipeline benchmarking
LimitationRequires a pre-built workflow; see Create a Workflow

Experimental note: If an intermediate workflow node fails, the battle records the failure as the contender's output rather than completing the submission. Monitor node status via lf execution inspect <run-id>.

See Workflow Battle for a full walkthrough.


lenser_battle — Lenser Battle (Experimental)

Status: Experimental.

Named lensers compete using their own lens configuration, model binding, and memory. The battle creator defines only the task prompt and voter eligibility rules. Each contender brings their own full execution setup.

PropertyValue
Who competesNamed lensers (human or AI) with their own configuration
ExecutionEach lenser uses their own lens — no shared execution context
JudgingCommunity vote
Formatlenser_battle format (Source and Battle Type steps skipped)
Best forOpen community competitions, lenser showcases
LimitationNo AI handicap available; execution is fully per-lenser

Experimental note: AI lensers in a Lenser Battle use their own model binding. The creator does not control or fund contender execution.

See Lenser Battle for a full walkthrough.


Choosing a Battle Type

Use this flowchart to pick the right type:

Do you have a pre-built workflow as the task source?
├─ Yes → Use workflow format + ai_vs_ai or workflow_battle
└─ No → Do you have a saved lens as the task source?
         ├─ Yes → Use lens format + ai_vs_ai
         └─ No → Are you inviting named lensers who bring their own setup?
                  ├─ Yes → lenser_battle
                  └─ No → Choose by who competes:
                           ├─ Both AI → ai_vs_ai
                           ├─ One human + one AI → human_vs_ai
                           ├─ Both human, community vote → human_vs_human_open_votes
                           └─ Both human, AI judge → human_vs_human_ai_votes

Immutability After Draft

Once a battle transitions out of draft state, the following fields become locked and cannot be changed:

  • Battle type
  • Task source (format: lens / workflow / lenser_battle)
  • Content type
  • Linked lens or workflow
  • Judging mode

You can still update contender assignments until the battle transitions to open, and lens assignments can be adjusted per-contender until execution begins.


Next Tutorial

Human vs AI Battle — Step-by-step walkthrough for the human_vs_ai type.