| name | agentsop-framework-selection |
| version | 0.1.0 |
| description | Neutral, framework-agnostic decision tree for project kickoff: "which agent /
RAG / LLM framework should I reach for?" Synthesizes the ecosystem sections of
7 landmark-project SOPs (LangGraph, LlamaIndex, DSPy, CrewAI, vLLM, Aider, Dify)
into one layered rubric. Core stance: frameworks are LAYERS, not competitors โ
a real project usually combines DSPy (compile) + LlamaIndex (retrieve) +
LangGraph (orchestrate) + vLLM (serve), and you choose ONE per layer, not one
to rule all. Use when starting any LLM/agent/RAG project, or whenever
the "which framework?" question is asked. Deliberately neutral โ unlike vendor
docs and the LangChain-biased `framework-selection` on skill.sh, this skill has
no horse in the race.
|
| overlay | true |
| cross_links | ["llm-engine-selection","agent-topology-selection","repo-state-gating"] |
Framework-Fit Decision Tree at Project Kickoff ยท SOP (ENHANCE overlay)
Overlay posture: this is the capstone Phase-D skill โ the most-cited entry
at any project kickoff. It decides which layer(s) you need and which
framework owns each layer. It does not teach any framework's API; for that,
descend to the per-framework SOPs (langgraph-sop, llamaindex-sop,
dspy-sop, crewai-sop, vllm-sop, aider-sop, dify-sop). Every
load-bearing claim carries an inline source tag resolving in
references/R1-decision-tree.md.
Neutrality note: vendor pages each claim the center of the universe
(LangChain: "use LangGraph for production"; LlamaIndex: "the document agent
platform"; Dify: "scaffolding is the bottleneck"). This skill quotes those
claims but does not adopt any of them. The 7 SOPs disagree on the crossover
points; we surface the disagreements rather than papering over them.
1. ไฝๆถๆฟๆดป (When to Activate)
Activate when any of the following fire:
- A new LLM / agent / RAG project is starting and no framework has been chosen yet.
- Someone asks "which framework should I use?" / "LangChain or LlamaIndex?" /
"LangGraph vs CrewAI?" / "do we need a framework at all?"
- A coder is about to
pip install an orchestration / RAG / agent framework
before having articulated what layers the project needs.
- A project already picked one framework "for everything" and is now fighting it
in a layer it was never good at (e.g., doing deep RAG inside CrewAI, or
hand-rolling retrieval inside LangGraph).
- A no-code / visual builder (Dify, Flowise, LangFlow) has hit a complexity
ceiling and the team is asking "do we rewrite in code?"
Do not re-run this skill mid-implementation for a layer already chosen โ that
is churn. Run it once at kickoff, and again only when a new layer appears
(e.g., "we now need to self-host the model" โ triggers [[agentsop-llm-engine-selection]]).
Mental check: the wrong framework is the single highest-cost decision in the
project โ it is a one-week-to-reverse mistake, sometimes a one-month one.
crewai-sop ยท OP-1, vllm-sop ยท OP-7. Spend 20 minutes on this tree before
opening any tutorial.
2. ๆ ธๅฟๅฟๆบๆจกๅ (Core Mental Model)
Frameworks are layers, not competitors. The single most common kickoff error
is treating "LangChain vs LlamaIndex vs DSPy vs CrewAI vs vLLM" as a horse race
with one winner. They are not on the same axis. A mature LLM system is a stack:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ L7 App platform / UI / Auth โ Dify, Flowise, LangFlow โ ship-fast scaffolding
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ L6 Serving / inference โ vLLM, SGLang, llama.cpp โฆ โ โ see [[agentsop-llm-engine-selection]]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ L3 Orchestration / control โ LangGraph, CrewAI, Workflows โ โ see [[agentsop-agent-topology-selection]]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ L2 Retrieval / context โ LlamaIndex, Haystack โ ingestion, index, query
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ L1 Modeling / prompt-compile โ DSPy, Outlines, Guidance โ the LM call itself
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Coding-agent surface (cross) โ Aider, Cline, Cursor โฆ โ end-user product, not a layer
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
DSPy's own ecosystem doc draws this layering explicitly โ DSPy "sits underneath
LangChain, LlamaIndex, LangGraph as a compiler for individual LM calls"
dspy-sop ยท R5. LlamaIndex's doc says "many production systems use both:
LlamaIndex as the retrieval layer, LangGraph as the orchestration layer"
llamaindex-sop ยท R5. Dify's doc describes the hybrid "Dify for frontend/RAG/auth
- LangGraph for core agent logic behind HTTP"
dify-sop ยท R5. The convergence is
unanimous: choose per layer, then check interop.
Three corollaries:
- You may not need every layer. A static-corpus Q&A bot needs L1 only
(stuff the context window). A RAG chatbot needs L1+L2. A durable multi-step
agent needs L1+L2+L3. Only self-hosting adds L6. Only mixed-role teams add L7.
- The cleanest combinations are additive; the awkward ones are same-layer.
DSPy+LangGraph (compile-inside-node) and LlamaIndex+LangGraph (retrieve-then-
orchestrate) are textbook
dspy-sop ยท R5. DSPy+LangChain or DSPy+CrewAI are a
"smell" โ both are L1-ish prompt strategies fighting for the same slot
dspy-sop ยท R5.
- "No framework" is a legitimate answer for โฅ1 layer. Frameworks earn their
dependency surface only past a complexity threshold (ยง4 gate G0).
3. SOP (The Procedure)
The kickoff procedure runs as numbered steps (Pass A = Steps 1โ6, Pass B = Step 7, Pass C = Step 8):
Pass A โ Identify the layers you actually need. Walk the stack top to bottom
and mark each layer needed / not-needed for this project:
-
L1 Modeling โ Is there โฅ1 non-trivial LM call whose prompt will be iterated,
swapped across models, or whose output is parsed by code? (Almost always yes.)
-
L2 Retrieval โ Does the system answer over private / large / changing data it
cannot fit in context? (Yes โ need retrieval. No โ skip.)
-
L3 Orchestration โ Is there cycle / branch / memory-across-turns / human
approval / >1 coordinating agent? (Yes โ need orchestration. A single straight-
line call โ skip; raw SDK suffices.)
-
L6 Serving โ Are you hosting open-weights models yourself (vs calling a hosted
API)? (Yes โ [[agentsop-llm-engine-selection]]. No โ skip.)
-
L7 App platform โ Do non-engineers (PM/ops) need to co-author or operate the
app, or do you need UI+API+auth+logging out of the box? (Yes โ consider a
platform. No โ code framework.)
-
Coding-agent surface โ Is the deliverable code edits in a repo? (Yes โ
[[agentsop-repo-state-gating]] then Aider/Cline/Cursor. This is orthogonal to L1โL7.)
-
Pass B โ For each needed layer, apply the per-layer fit rubric (ยง4). Each
layer has its own short decision tree; do not let one framework's gravity pull
you into using it for a layer it is weak at.
-
Pass C โ Check interop and the "do you even need a framework?" gate. Confirm
the chosen pieces compose (additive, not same-layer collisions โ ยง7 interop map),
and run gate G0 on each layer to confirm a framework beats raw SDK there.
Output of the procedure: a one-line-per-layer decision, e.g.
L1: raw prompts (will revisit DSPy at 30 labeled examples) ยท L2: LlamaIndex ยท L3: LangGraph ยท L6: hosted API (no self-host yet) ยท L7: none (code-first).
4. ๆไฝๆจกๅ (Operations)
G0 โ The "do you even need a framework?" gate (run per layer)
Before adopting any framework on a layer, confirm raw SDK is insufficient.
Frameworks trade dependency-surface and a learning curve for batteries. Raw wins
when the layer is trivial:
| Layer | Raw SDK wins whenโฆ | Framework wins whenโฆ |
|---|
| L1 | 1 LM call, no metric, verbatim-prompt audit need, rapid iteration | โฅ2 calls, โฅ30 labeled examples, a metric, model swaps dspy-sop ยท R5 |
| L2 | corpus <100k tokens & static โ stuff context + prompt cache | reimplementing >2 of {splitter, ingestion, reranker, synthesizer, evaluator} llamaindex-sop ยท R5 |
| L3 | control flow expressible in plain if/else, no state-between-turns, no HITL | cycles, durable state, HITL, parallel topology langgraph-sop ยท R5 |
"If the corpus is small (<100k tokens) and static โ no framework needed. Stuff
the context window with prompt caching." llamaindex-sop ยท R5. "Plain LangChain
[or raw SDK]: no cycles, no state-between-turns, no HITL โ a single LLM call."
langgraph-sop ยท R5.
OP-1 โ Layer identification (Pass A)
Mark each of L1/L2/L3/L6/L7 + coding-surface as needed or not, per ยง3 Pass A.
This is the highest-leverage step: most "wrong framework" pain is actually
"picked an L3 tool when the project was L2," or vice versa.
OP-2 โ L1 Modeling pick rubric
- Raw prompts โ default for a single, rapidly-iterating call (G0).
- DSPy โ when you have โฅ2 LM calls, โฅ30 labeled examples, and a measurable
metric, and prompts are brittle on model swap. DSPy compiles prompts into a
versioned artifact
dspy-sop ยท R5. Combines additively into L3 (compile inside
a LangGraph node) and L2 (compile the synthesizer downstream of a retriever).
- Outlines / Guidance / LMQL โ when you need grammar-level guarantees
(valid JSON / regex / BNF) on a single call. Orthogonal to DSPy: Outlines forces
the shape, DSPy makes the prompt good
dspy-sop ยท R5.
- Do not pick two L1 strategies that fight for the slot (DSPy + LangChain-
prompt-templates is a "smell"
dspy-sop ยท R5).
OP-3 โ L2 Retrieval pick rubric
- LlamaIndex โ the default retrieval layer; index is a first-class noun,
~5-line baseline RAG, built-in evaluators, LlamaParse for messy documents
llamaindex-sop ยท R5. Reach for it whenever private/large/changing data must
be retrieved.
- Haystack โ when the system is "classical IR with an LLM bolted on" and
YAML-configurable pipelines are valued by ops
llamaindex-sop ยท R5.
- RAGFlow โ when retrieval quality on hard documents (tables, layout,
KG-RAG) is the literal bottleneck, not app assembly
dify-sop ยท R5.
- Raw vector store (Pinecone/Qdrant/โฆ) โ only if you will reimplement โค2 RAG
primitives (G0); otherwise you rebuild LlamaIndex badly
llamaindex-sop ยท R5.
- Repo-map (Aider tree-sitter), NOT embeddings โ when the "corpus" is a code
repo. Aider's symbol-map hits 70.3% file-selection on SWE-Bench Lite without an
index
aider-sop ยท R5. The SOPs disagree here (LlamaIndex assumes embeddings
work for code; Aider's evidence says repo-map beats them) โ for code, prefer the
repo-map; for prose, prefer embeddings (ยง6).
OP-4 โ L3 Orchestration pick rubric
First gate through [[agentsop-agent-topology-selection]] (single-agent + tools handles
~80% of "multi-agent" asks crewai-sop ยท DC-1). Then, if orchestration is needed:
- Single agent + tools โ the baseline.
create_react_agent (LangGraph),
dspy.ReAct, a CrewAI single Agent, or a plain SDK tool loop. Start here.
- LangGraph โ when the workflow needs cycles, durable state across crashes,
human-in-the-loop (
interrupt()), time-travel debugging, or
supervisor/swarm/hierarchical parallelism langgraph-sop ยท R5. The 2026
production-reliability leader.
- CrewAI โ when the domain maps cleanly to roles on a whiteboard
(researcher โ writer โ reviewer), non-engineers must read/edit agent definitions
(YAML), and you want ideaโdemo fastest
crewai-sop ยท R5. Trade-off: shallow
state, thin eval, no built-in persistence.
- LlamaIndex Workflows โ when the project is retrieval-heavy and needs only
some agency; staying in-ecosystem keeps retrieval primitives as first-class
neighbors
llamaindex-sop ยท R5.
- The graph-vs-role crossover is the central disagreement (ยง5, DC-1). Common
pattern: prototype on CrewAI, port to LangGraph for production
crewai-sop ยท R5.
- AutoGen โ only if conversation/debate is the literal product; note it is in
maintenance mode as of 2026 โ adopt with eyes open
crewai-sop ยท R5,
langgraph-sop ยท R5. OpenAI Swarm โ study/reference only, not production.
OP-5 โ L6 Serving pick โ delegate
If self-hosting open-weights models: hand off entirely to [[agentsop-llm-engine-selection]].
One-line summary of that skill's rubric: production+GPU+concurrent โ vLLM (the
2026 default); prefix-heavy agent/RAG โ A/B SGLang; NVIDIA-locked + 1โ2wk budget โ
TensorRT-LLM; CPU/edge/โค1 user โ llama.cpp; local dev โ Ollama vllm-sop ยท R5,
vllm-sop ยท OP-7. If calling a hosted API (OpenAI/Anthropic/โฆ), skip L6 entirely.
OP-6 โ L7 App-platform pick rubric
- Dify โ when the bottleneck is scaffolding (UI+API+auth+vector store+logs
+versioning in one box) and mixed-role teams (PM+ops+eng) co-author
dify-sop ยท R5. Visual DAG with Code-node escape hatch.
- Flowise โ fastest path for a single "chatbot + doc retrieval" demo; thin
beyond that
dify-sop ยท R5.
- LangFlow โ when you want a visual builder you can later export to Python
and evolve (LangChain-bound)
dify-sop ยท R5.
- n8n + AI nodes โ when the project is automation-first (400+ non-AI
integrations) with AI sprinkled in, not AI-first
dify-sop ยท R5.
- Mind the ceiling (ยง5 DC-3, ยง6): visual builders break down past ~40 nodes /
HITL needs / >10 QPS/pod / extreme RAG / sub-second latency
dify-sop ยท R5.
OP-7 โ Coding-agent surface pick โ gate first
If the deliverable is code edits in a repo, gate through [[agentsop-repo-state-gating]]
(Aider et al. are for existing repos; greenfield โ plain LLM chat
aider-sop ยท R5). Then: terminal + git-clean history + scriptable โ Aider;
per-tool-call approval in VS Code โ Cline; visual/autocomplete + closed product โ
Cursor; cross-IDE โ Continue; autonomous ticketโPR โ OpenHands aider-sop ยท R5.
This surface is orthogonal to L1โL7 โ a coding agent uses L1โL6 internally.
OP-8 โ Interop check (Pass C)
Confirm chosen pieces compose. Additive (good): DSPy-in-node, LlamaIndex-retriever-
as-tool, Dify-frontend + LangGraph-behind-HTTP, vLLM serving any of the above via
its OpenAI-compatible API dspy-sop ยท R5, dify-sop ยท R5. Collisions (re-pick):
two L1 prompt strategies; two L3 orchestrators owning the same control flow; a
visual platform asked to do what its code-escape-hatch should.
5. ๅฐๅขๅณ็ญๆกไพ (Dilemma Cases)
DC-1 โ LangGraph vs CrewAI (graph vs role)
Tension. Both are L3 orchestrators; they pick different first abstractions.
LangGraph: "everything is a node in a state graph." CrewAI: "everything is a role
on a team" crewai-sop ยท R5. The SOPs openly concede there is no clean rubric
for the crossover โ CrewAI itself recommends "prototype on Crew, port to
LangGraph for production," which concedes the disagreement
phase-b ยท open-questions.
Resolution. Decide on two axes:
- Whiteboard test โ if you can draw the workflow as named teammates with
handoffs and no branching/cycles, CrewAI Sequential is the faster path to a
demo
crewai-sop ยท R5.
- Durability test โ if any of {cycles, crash-survival, multi-tenant shared
threads, human-approval gate, time-travel debugging} is a hard requirement, go
LangGraph โ these are definitional there and absent/shallow in CrewAI
langgraph-sop ยท R5.
- Honest 2026 consensus: production reliability โ LangGraph; team velocity / "ship
a demo by Friday" โ CrewAI
crewai-sop ยท R5. The standard arc is prototype on
CrewAI โ port critical paths to LangGraph.
DC-2 โ Framework vs raw SDK (when raw wins)
Tension. Framework gravity says "always use the framework." But every
framework is a dependency surface and a learning curve, and on a trivial layer it
is pure overhead dify-sop ยท R5 (Dify's own doc: "for teams whose bottleneck is
expressive depth, Dify is overhead").
Resolution. Run G0 per layer. Raw SDK wins when: a single LM call with no
cross-turn state and no metric (L1); a corpus under 100k tokens that fits in
context with prompt caching (L2 llamaindex-sop ยท R5); control flow that fits in
plain if/else with no HITL (L3 langgraph-sop ยท R5). The DSPy line-count table
is instructive but not a reason to pick a framework โ fewer lines on a task that
doesn't need compilation is a false economy dspy-sop ยท R5. Pick the framework
the moment you cross the threshold, not before.
DC-3 โ Dify (visual) vs a code framework (the ceiling)
Tension. Visual builders let PM/ops co-author and ship in days; code
frameworks give expressive depth. Picking visual too early wastes the
scaffolding savings; picking code too early excludes non-engineers
dify-sop ยท R5.
Resolution. Start visual (Dify) when the bottleneck is scaffolding and a
mixed-role team must operate the app; plan the code-escape hatch up front
(Code nodes, or externalize logic behind HTTP). Migrate to a code framework when
you hit Dify's stated ceilings: single graph >~40โ50 nodes (canvas/comprehension
collapse), need for pause-wait-resume / time-travel (Dify explicitly does not
support HITL โ issue #21455 "not planned"), sustained >10 QPS/pod, or extreme RAG
experimentation dify-sop ยท R5, phase-b ยท open-questions. Note the threshold
numbers are Dify-engine-specific and uncorroborated by other SOPs โ treat as
directional, not gospel (ยง6).
DC-4 โ LlamaIndex vs LangGraph for agentic RAG (which layer leads?)
Tension. A "RAG agent" needs both L2 and L3; which framework do you build
around? LlamaIndex frames itself as "the document agent platform"
llamaindex-sop ยท R5; LangChain frames LangGraph as the production orchestrator
langgraph-sop ยท R5. Both want to be the spine.
Resolution. Let the dominant difficulty lead. If the hard part is messy
documents / retrieval quality, build around LlamaIndex (with LlamaParse) and add
LangGraph only when agentic logic emerges. If the hard part is multi-step
reasoning / many tools / durable state, build around LangGraph and embed
LlamaIndex retrievers as one tool among many llamaindex-sop ยท R5. They are not
competitors at the same layer โ the error is forcing one to do the other's job.
6. ๅๆจกๅผไธ่พน็ (Anti-Patterns & Boundaries)
- AP-1 โ Framework-driven development. Picking the framework before
articulating the problem ("let's build it in LangChain/CrewAI/Dify") and then
bending the problem to fit. The fix is Pass A first: identify layers, then
pick. The framework choice is downstream of the layer map, never upstream.
- AP-2 โ One framework for all layers. Using CrewAI to do deep RAG, or
LangGraph to hand-roll retrieval, or DSPy to orchestrate, because it was the
first tool installed. Each framework is strong on ~1 layer and mediocre off it
dspy-sop ยท R5. Choose per layer; compose.
- AP-3 โ Same-layer framework collision. Combining two tools that fight for
the same slot: DSPy + LangChain prompt-templates, two L3 orchestrators, or DSPy
inside CrewAI agents (cultural mismatch โ "prompt as config" vs "prompt as
compiled artifact")
dspy-sop ยท R5. Mixed same-layer adoption is "usually a
smell."
- AP-4 โ Visual-builder past its ceiling. Pushing a Dify/Flowise canvas past
~40 nodes, or demanding HITL / sub-second latency / extreme RAG from a visual
platform that was never built for it
dify-sop ยท R5. The fix is the planned
code-escape hatch (DC-3), not more nodes.
- AP-5 โ Treating serving as an orchestration choice. vLLM/SGLang/TGI are a
different layer (L6); your LangGraph graph calls them through a model
provider
langgraph-sop ยท R5. Don't compare "LangGraph vs vLLM" โ defer to
[[agentsop-llm-engine-selection]].
- AP-6 โ Adopting maintenance-mode tools blind. AutoGen is in maintenance mode
(Microsoft pivoted to its Agent Framework); OpenAI Swarm and TGI are
experimental / maintenance
crewai-sop ยท R5, vllm-sop ยท R5. Adoption-risk is
a first-class selection criterion, not a footnote.
Boundary โ disagreements this skill does NOT resolve (surfaced honestly per
phase-b ยท open-questions): the graph-vs-role crossover point (DC-1); Dify's
specific node-count thresholds (DC-3, Dify-specific, uncorroborated);
embeddings-vs-repo-map for code (OP-3 โ likely "repo-map for code, embeddings for
prose," but no single SOP states it); and whether JSON-tool-calls degrade
non-code structured outputs (Aider's finding is code-specific โ do not
over-generalize).
7. ่ทจๆกๆถๅฏน็
ง (Cross-Framework Layered Map)
The full layered map โ which framework owns which layer, with interop notes:
| Layer | Primary owner(s) | Reach-past whenโฆ | Interop |
|---|
| L1 Modeling / compile | DSPy dspy-sop ยท R5 | grammar guarantees โ Outlines/Guidance; single rapid call โ raw | Additive into L2 (synthesizer) & L3 (in-node). Awkward with LangChain/CrewAI prompts (same-layer). |
| L2 Retrieval | LlamaIndex llamaindex-sop ยท R5 | classical IR โ Haystack; hard-doc RAG โ RAGFlow; code โ Aider repo-map | Retriever exposed as a tool to any L3 (LangGraph/CrewAI/AutoGen). |
| L3 Orchestration | LangGraph (durable) / CrewAI (role) / Workflows (retrieval-native) langgraph-sop ยท R5, crewai-sop ยท R5, llamaindex-sop ยท R5 | single-agent suffices โ drop to baseline; debate โ AutoGen (maint-mode) | Calls L2 retrievers as tools; runs L1 (DSPy) inside nodes; served by L6. Gate via [[agentsop-agent-topology-selection]]. |
| L6 Serving | vLLM (default) vllm-sop ยท R5 | prefix-heavy โ SGLang; NVIDIA-locked โ TensorRT-LLM; CPU/edge โ llama.cpp; dev โ Ollama | OpenAI-compatible API; any L1/L2/L3 above calls it transparently. Defer to [[agentsop-llm-engine-selection]]. |
| L7 App platform | Dify dify-sop ยท R5 | single chatbot โ Flowise; export-to-Python โ LangFlow; automation-first โ n8n | Hosts UI/API/auth; calls a code framework (LangGraph/CrewAI) or LlamaIndex behind HTTP for depth. |
| Coding surface (cross) | Aider aider-sop ยท R5 | VS Code approval โ Cline; visual โ Cursor; cross-IDE โ Continue; autonomous โ OpenHands | Orthogonal product; uses L1โL6 internally. Gate via [[agentsop-repo-state-gating]]. |
Canonical additive stack (2026 consensus): DSPy compiles the LM calls โ
LlamaIndex retrieves โ LangGraph orchestrates (with HITL + durable state) โ vLLM
serves the open-weights model โ (optionally) Dify wraps the frontend/auth. Each
piece is best-in-class on its layer and composes cleanly with the next
dspy-sop ยท R5, llamaindex-sop ยท R5, dify-sop ยท R5.
The one-paragraph kickoff answer. Don't ask "which framework?" โ ask "which
layers does this project need, and what's the dominant difficulty on each?"
Identify layers (Pass A), pick the best tool per layer with the ยง4 rubrics (Pass
B), confirm they compose and that each layer actually clears the no-framework gate
(Pass C). Defer serving to [[agentsop-llm-engine-selection]], multi-agent shape to
[[agentsop-agent-topology-selection]], and coding-agent applicability to
[[agentsop-repo-state-gating]]. The frameworks are layers; you are assembling a stack,
not crowning a winner.