Forecast a Decision: Which CEO Replacement Maximizes Share Price
This case study prices every option one board has, in three calls: multi_agent to build the candidate field, a categorical forecast to find the internal bench, and decision to price each appointment against keeping the incumbent.
For why the question is worth asking, why prediction markets cannot answer it, and the results across ten companies, see Fire the CEO.
The example is Meta. Its board cannot remove the chief executive at all, since Mark Zuckerberg controls about 61% of the votes, which makes it a clean illustration of an imposed alternative: the thing that separates a decision forecast from a conditional one.
Step 1: build the candidate field
multi_agent runs several research agents on different angles and synthesizes them. Availability matters more than fame here, because it is what actually constrains a board, so one direction is dedicated to it. Set return_list so each nominee comes back as its own row.
import asyncio
from pandas import DataFrame
from futuresearch.ops import multi_agent
company = DataFrame([{
"company": "Meta Platforms (NASDAQ: META)",
"incumbent": "Mark Zuckerberg",
"mandate": (
"Zuckerberg controls roughly 61% of voting power, so a change is his own "
"choice rather than the board's. The next chief executive inherits very "
"large AI capital expenditure and its return, Reality Labs losses, "
"advertising growth, and regulatory exposure."
),
}])
NOMINEE_SCHEMA = {
"type": "object",
"properties": {
"nominee_name": {"type": "string"},
"current_role": {"type": "string", "description": "Title and employer, with a source URL."},
"evidence_status": {
"type": "string",
"description": (
"PUBLICLY_LINKED if a credible source connects this person to this "
"CEO role, quoting it. NOMINATED_BY_ANALYSIS if this is your own "
"reasoned nomination and no public source links them."
),
},
"fit_argument": {"type": "string"},
"availability": {"type": "string", "description": "Dated signal with a source."},
"shortlist_status": {"type": "string", "description": "NOMINATED or CONSIDERED_REJECTED."},
"rejection_reason": {"type": "string"},
},
"required": ["nominee_name", "current_role", "evidence_status", "shortlist_status"],
}
async def build_field():
return await multi_agent(
task=(
"Nominate the best realistic external candidates to become this "
"company's next CEO. This is an analytic question, not only a "
"discovery question: name the executives a competent search committee "
"would actually shortlist, even where nobody has been publicly floated. "
"Every person must be real and currently identifiable. Never invent a "
"person and never invent a link between a person and this role. "
"Return both your nominees and everyone you seriously considered and "
"set aside, with the reason."
),
input=company,
directions=[
"Sitting executives at direct competitors and close peers who would be credible successors.",
"Executives who are unusually available right now: recently stepped down, passed over in a rival's succession, company being acquired or split, or a completed turnaround with no next act. Date every signal.",
"Work from the mandate: who has solved this company's specific problem elsewhere, with the episode and its measurable outcome.",
"How this board actually chooses: its history of internal versus external hires, what its directors value, and any activist pressing for a profile.",
"Widen the field deliberately: turnaround specialists, operators from adjacent industries whose underlying problem was the same.",
],
effort_level="medium",
response_schema=NOMINEE_SCHEMA,
return_list=True,
)
The evidence_status field is the honesty gate. Most nominees will be NOMINATED_BY_ANALYSIS, and mislabeling your own nomination as public reporting is the failure that would undermine the whole exercise. The CONSIDERED_REJECTED rows matter as much as the shortlist: for Meta they returned Bret Taylor locked into his own company and John Ternus about to take over at Apple, which is triage you would otherwise never see.
Step 2: find the internal bench
The candidate pass looks outward. To get the internal successor, ask the ordinary unconditional question of who actually holds the job, and read the names out of the rationale.
from futuresearch.ops import forecast
import json
successor = DataFrame([{
"question": "Who will be the CEO of Meta Platforms (NASDAQ: META) on 2027-06-30?",
"categories": json.dumps([
"Mark Zuckerberg",
"Another internal Meta executive",
"An external hire",
"Meta is no longer an independent public company",
"Other",
]),
"background": (
"Mark Zuckerberg, founder and chief executive, controls roughly 61% of "
"voting power. Dina Powell McCormick became President and Vice Chairman "
"in January 2026."
),
"resolution_criteria": (
"The person holding the CEO title on 2027-06-30 per company filings. "
"Name the leading internal and external candidates in the rationale "
"whether or not a change occurs, and say plainly when nobody is publicly "
"discussed rather than naming someone who is not."
),
}])
async def find_bench():
return await forecast(
input=successor,
forecast_type="categorical",
categories_field="categories",
effort_level="high",
)
Categorical forecasts are high effort only. Meta comes back at Zuckerberg 96%, another internal executive 3%, which is the reality check: the value ladder in step 3 prices a decision that is very unlikely to be taken.
Step 3: price every option
Now the decision forecast. The alternatives are the baseline, the internal successor from step 2, an unnamed veteran as a control, and the named outsiders from step 1.
from futuresearch.ops import decision
RIDER = "; Meta remains an independent public company through 2027-08-31"
ladder = DataFrame([{
"question": (
"By how many US dollars will the value of one share of Meta Platforms "
"(NASDAQ: META) on 2027-08-31 differ from its value in the baseline "
"scenario described by the first alternative?"
),
"alternatives": json.dumps([
"Mark Zuckerberg remains CEO" + RIDER,
"Zuckerberg hands the CEO role within the coming weeks to Dina Powell McCormick, who accepts, while remaining chairman with his voting control unchanged" + RIDER,
"Zuckerberg hands the CEO role within the coming weeks to an external hire, a veteran technology public-company chief executive, who accepts, while remaining chairman with his voting control unchanged" + RIDER,
"Zuckerberg hands the CEO role within the coming weeks to Larry Culp, who accepts, while remaining chairman with his voting control unchanged" + RIDER,
"Zuckerberg hands the CEO role within the coming weeks to Adam Selipsky, who accepts, while remaining chairman with his voting control unchanged" + RIDER,
]),
"background": (
"Meta Platforms (META, \$587.16 on 2026-08-13; about 2.55B shares). "
"Dina Powell McCormick is an internal executive, president and vice "
"chairman since January 2026. Larry Culp is chairman and chief executive "
"of GE Aerospace and executed the break-up of General Electric. Adam "
"Selipsky was chief executive of Amazon Web Services and now leads a "
"large AI data-centre venture."
),
"resolution_criteria": (
"Percentiles of the dollar difference versus the first alternative's "
"world, using the closing price on the primary US listing on 2027-08-31."
),
}])
async def price_options():
return await decision(
input=ladder,
alternatives_field="alternatives",
forecast_type="numeric",
output_field="share_value_effect_vs_baseline",
units="USD per share (difference vs the baseline scenario)",
context=(
"Each row's FIRST alternative is the baseline scenario. For EACH "
"alternative, forecast the dollar difference between the value of one "
"share on 2027-08-31 under that alternative and its value under the "
"baseline. Positive means worth more than the baseline. Price named "
"individuals on their actual records and what markets would infer "
"from that specific appointment; price the generic branch as the "
"expectation over the candidates a real search would produce. The "
"named individuals are candidates identified by our own analysis: "
"none has been approached, so treat each appointment as a hypothetical "
"rather than evidence that any process is under way."
),
)
asyncio.run(price_options())
Four details make these numbers mean something.
Price differences, not levels. Independently forecast share prices jitter by a few percent, which swamps most real effects. Asking for the difference against a shared baseline cancels that.
The baseline must return exactly zero. Every branch is a difference against the same world, so the baseline is a free internal control. It has come back at exactly zero on every row run this way. A non-zero baseline means the frame slipped and the row should be discarded.
Riders belong in the alternative text. A timing pin ("within the coming weeks"), acceptance ("who accepts"), and an independence clause keep the branch from quietly pricing a takeover instead of an appointment.
Keep the unnamed control. No board can hire a hypothetical, so it is never a recommendation. It exists to measure what knowing the specific person is worth, and it occasionally wins, which tells you the field you could actually hire is weaker than the mandate.
Results
| Option | Effect | 10th to 90th | Market value |
|---|---|---|---|
| Larry Culp | +3.4% | -20% to +27% | +$51B |
| Adam Selipsky | +1.8% | -17% to +21% | +$27B |
| Zuckerberg stays (baseline) | 0% | ||
| An unnamed veteran (control) | ≈ 0% | -18% to +16% | -$4.3B |
| Dina Powell McCormick | -4.9% | -24% to +10% | -$74B |
The spread between the best named outsider and the control is 3.7% of share price, and that gap is the point: a board already has a rough sense of what a good outsider is worth, and does not know which particular person is the good outsider. Note also that the market prices a capital-allocation disciplinarian above a product executive here, which is a statement about what investors think the company's problem is.
Going deeper
- Why this question needs a decision forecast, and the results across ten companies: Fire the CEO
- Published output: the value ladders and who will be CEO in 2027
- Reference: decision, forecast, multi_agent