diff --git a/front_end/messages/en.json b/front_end/messages/en.json
index 9cca3e7662..b6c650a5c1 100644
--- a/front_end/messages/en.json
+++ b/front_end/messages/en.json
@@ -236,6 +236,7 @@
"metaculus_prediction": "Metaculus Prediction",
"metaculus": "Metaculus",
"community": "community",
+ "enterProbability": "Enter probability",
"communityPrediction": "Community Prediction",
"unweightedAggregate": "Unweighted Aggregate",
"firstQuartile": "lower 25%",
@@ -273,6 +274,8 @@
"commentsReadGuidelines": "Read our guidelines",
"commentsLearnMarkdown": "Learn about our Markdown",
"commentDeleted": "Comment deleted",
+ "deleteCommentConfirmTitle": "Delete comment?",
+ "deleteCommentConfirmDescription": "This comment will be removed. This can't be undone.",
"commentsReportCommentHeading": "Report this comment",
"commentsReportCommentDescription": "Is there something wrong with this comment? Please help us keep our community great by reporting it.",
"commentsReportSpam": "Report as spam",
@@ -354,6 +357,7 @@
"searchOptionActivePrediction": "Active Prediction",
"searchOptionWithdrawnPrediction": "Withdrawn",
"searchOptionNotPredicted": "Not Predicted",
+ "searchOptionCommented": "Commented",
"searchOptionAuthored": "Authored",
"searchOptionUpvoted": "Upvoted",
"searchOptionPrivate": "Private",
@@ -388,6 +392,7 @@
"unreadWithTotalCount": "({unread_count_formatted} unread){total_count_formatted} total",
"unreadWithTotalCountXs": "({unread_count_formatted}){total_count_formatted}",
"forecastersWithCount": "{count_formatted} {count, plural, =1 {forecaster} other {forecasters}}",
+ "histogramBinShare": "{share} weight of forecasts",
"or": "or",
"signupInviteUsers": "Invite Users",
"signupInviteUsersDescription": "Enter the email addresses of users you would like to invite, separated by newlines. They will receive an invitation to sign up by email.",
@@ -493,6 +498,7 @@
"reminderErrorPercentLifetimeRequired": "Please set a percent of lifetime",
"reminderErrorPercentLifetimeCannotHappen": "This would result in no notification, please select a lower value",
"reminderErrorPercentLifetimeWouldNotRepeat": "This would result in no repetition. Consider switching to \"Doesn't Repeat\"",
+ "reminderErrorDuplicateDate": "This date is already selected. Please choose a different date.",
"reminderNotePlaceholder": "Write yourself a note...",
"reminderCPChangesDescription1": "Notify me when the forecast changes by more than 10%",
"reminderCPChangesDescription2": "For continuous questions, this is measured by a Kolmogorov–Smirnov test.",
@@ -616,6 +622,9 @@
"questionWeight": "Question Weight",
"questionWeightTooltip": "This question has a weight of {weight}%, providing {count, plural, =1 {{weightDiff}% fewer points} other {a {weightDiff}% point boost}} compared to regular Metaculus questions.",
"includeBots": "Include Bots",
+ "excludeBots": "Exclude Bots",
+ "onlyBots": "Only Bots",
+ "bots": "Bots",
"includeBotsTooltip": "For this question, bot forecasts contribute to the Community Prediction. Learn more about AI Benchmarking",
"includeBotsInAggregatesLabel": "Include Bots in Aggregates",
"includeBotsInAggregatesExplanation": "When enabled, bot forecasts will be included in aggregate calculations for this question and will affect scoring. Otherwise, they will affect neither.",
@@ -851,6 +860,7 @@
"userProfile": "{username}'s profile",
"unknownUserProfile": "User's profile",
"userMedals": "{username}'s medals",
+ "userContributions": "{username}'s contributions",
"unknownUserMedals": "User's medals",
"noMedals": "No medals yet",
"leaderboard": "Leaderboard",
@@ -905,6 +915,12 @@
"parentBackgroundInfo": "Parent Question Background Info",
"childBackgroundInfo": "Child Question Background Info",
"histogram": "Histogram",
+ "distributions": "Distributions",
+ "quartileLabelP25": "25th %",
+ "quartileLabelMedian": "Median",
+ "quartileLabelP75": "75th %",
+ "pdfCdfExplanation": "PDF (Probability Density Function) shows how likely different outcomes are around specific values, while CDF (Cumulative Distribution Function) shows the cumulative probability of outcomes up to a certain value.",
+ "pmfCdfExplanation": "PMF (Probability Mass Function) shows how likely different specific outcomes are, while CDF (Cumulative Distribution Function) shows the cumulative probability of outcomes up to a certain value.",
"frequency": "Frequency",
"brierScoreForPlayer": "Brier scores for player predictions",
"scoreHistogram": "Score Histogram",
@@ -916,6 +932,7 @@
"parentResolutionCriteria": "Parent Resolution Criteria",
"childResolutionCriteria": "Child Resolution Criteria",
"loadMoreComments": "Load more comments",
+ "linkedComment": "Linked comment",
"followers": "Followers",
"followed": "Followed",
"followButton": "Follow",
@@ -1000,7 +1017,7 @@
"settingsNewEmail": "New Email",
"settingsEmailChangeDescription": "Enter a new email address and a password, and we'll send you a link to change your email.",
"settingsChangeEmailAddress": "Change email address",
- "settingsChangeEmailAddressSuccess": "A confirmation email has been sent to your new address. Please follow the link inside to activate it.",
+ "settingsChangeEmailAddressSuccess": "A confirmation email has been sent to your old address. Please follow the link inside to activate it.",
"emailChangeErrorMessage": "Failed to change email",
"emailChangeSuccessMessage": "Your email address has been changed successfully",
"socialAccountNoPasswordBanner": "Your account doesn't have a password yet. Set one below to change your email or log in with email and password.",
@@ -1334,6 +1351,8 @@
"keyFactor": "Key Factor",
"scrollToKeyFactor": "Scroll to key factor",
"keyFactors": "Key Factors",
+ "keyFactorsFor": "Key factors for",
+ "goToKeyFactor": "Go to key factor {number}",
"topKeyFactors": "Top Key Factors",
"notAvailable": "Not available",
"indexesTitle": "Project",
@@ -1394,6 +1413,7 @@
"selectChildQuestion": "Select Child Question",
"pickQuestion": "Pick Question",
"viewQuestions": "View Questions({count})",
+ "includingSubquestions": "Including Subquestions: {count}",
"predictionFlow": "Prediction Flow",
"started": "Started",
"starts": "Starts",
@@ -1977,6 +1997,7 @@
"copyQuestionLinkSuccess": "Question link successfully created! You can see them under the Question Links section for each question.",
"viewQuestionLinks": "View Question Links",
"moreActions": "More actions",
+ "openOnMetaculus": "Open on Metaculus",
"copyQuestionLinkImpactPrefix": "has a",
"copyQuestionLinkImpactSuffix": "causal impact on:",
"copyQuestionLinkStrengthLabel": "The strength of this impact is:",
@@ -2039,6 +2060,7 @@
"tournamentTimelineStarts": "Starts {when}",
"tournamentTimelineEnds": "Ends {when}",
"tournamentTimelineClosed": "Pending resolutions",
+ "tournamentTimelinePendingWinners": "Pending winners announcement",
"tournamentTimelineAllResolved": "All questions resolved",
"tournamentRelativeSoon": "soon",
"tournamentRelativeUnderMinute": "in under a minute",
@@ -2210,5 +2232,138 @@
"whyTrustMetaculusLessNoiseTitle": "Less noise, more truth",
"whyTrustMetaculusLessNoise": "Metaculus's crowd-powered forecasts cut through the noise by grounding every prediction in transparent evidence, accountable scoring, and a decade of demonstrated accuracy. Metaculus equips policymakers, researchers, journalists, and corporate organizations with evidence-based forecasts that surface clear, quantifiable insight into the world's most critical uncertainties. Explore our suite of Business Solutions to learn more about how Metaculus can improve your organization's decision-making.",
"publishTimeLockedDescription": "Publish time cannot be changed after creation.",
- "feedTileSummaryPlaceholder": "Optional: Enter a custom summary text to display on feed tiles (if not provided, a summary will be auto-generated from the notebook content)"
+ "feedTileSummaryPlaceholder": "Optional: Enter a custom summary text to display on feed tiles (if not provided, a summary will be auto-generated from the notebook content)",
+ "laborHubJobsBreadcrumb": "All Jobs",
+ "laborHubJobsVisitCta": "Visit Jobs",
+ "laborHubJobsPageTitle": "All Jobs · Labor Automation Forecasting Hub | Metaculus",
+ "laborHubJobsPageDescription": "Browse 15 US occupations forecasted by the Metaculus community through 2035. See how AI may reshape each one.",
+ "laborHubJobsHeroTitle": "Which jobs will survive AI?",
+ "laborHubJobsHeroLead": "Metaculus forecasters track 15 representative US occupations through 2035. Pick a job to see the forecast trajectory, the why behind the numbers, and what comes next.",
+ "laborHubJobDetailTitle": "Will AI replace {name}? · Metaculus Labor Hub forecast",
+ "laborHubJobDetailDescription": "Community forecasts for {name} employment, wages and AI exposure through 2035. Live from the Metaculus Labor Automation Forecasting Hub.",
+ "laborHubJobDetailSubtitle": "Community forecast of employment change versus 2025, across 2027, 2030, and 2035.",
+ "laborHubJobsClickTileSubtitle": "Click any tile for the full forecast & forecaster commentary",
+ "laborHubJobsYearToggleLabel": "Forecast year",
+ "laborHubJobsExploreCta": "Explore the full Labor Hub Dashboard",
+ "laborHubJobsExploreCtaSub": "Occupations and wages · economy-wide forecasts · forecaster commentary",
+ "laborHubJobsByYear": "By {year}",
+ "laborHubJobsJumpToLabel": "Jump to:",
+ "laborHubJobsFeltenLabel": "Felten et al. exposure",
+ "laborHubJobsFeltenTooltip": "Academic measure of how much a job's required abilities overlap with current AI capabilities.",
+ "laborHubJobsMnaLabel": "M&A vulnerability",
+ "laborHubJobsMnaTooltip": "Academic measure combining a job's AI exposure with how well its workers can adapt.",
+ "laborHubJobsAoeLabel": "Anthropic Exposure",
+ "laborHubJobsAoeTooltip": "Grounded in real, anonymized Claude usage — the share of this job's tasks already being done with AI.",
+ "laborHubJobsRingHigh": "HIGH",
+ "laborHubJobsRingMed": "MED",
+ "laborHubJobsRingLow": "LOW",
+ "laborHubJobsCuratedInsightsTitle": "Curated insights",
+ "laborHubJobsCuratedInsightsEmpty": "No insights surfaced for {name} yet — check the full Labor Hub for active discussion.",
+ "laborHubJobsInsightSourceFromAnotherPost": "from a related question",
+ "laborHubJobsWagesTitle": "Median wage by 2035",
+ "laborHubJobsWagesSub": "Real change vs 2025",
+ "laborHubJobsWagesUnavailable": "Per-occupation wage forecast not yet tracked",
+ "laborHubJobsHoursTitle": "Hours / week · economy-wide",
+ "laborHubJobsHoursEconomyWideSub": "By 2035, vs {from} hrs/week in 2025",
+ "laborHubJobsShareTitle": "Share this forecast",
+ "laborHubJobsShareLead": "Download a share card and share this forecast with your network.",
+ "laborHubJobsShareYearLabel": "Headline year",
+ "laborHubJobsShareYearOption": "By {year}",
+ "laborHubJobsShareSave": "Save Image",
+ "laborHubJobsShareTweet": "Share on X",
+ "laborHubJobsShareLinkedin": "Share on LinkedIn",
+ "laborHubJobsMetricSeeAll": "Click to compare this to other jobs →",
+ "laborHubJobsMetricPaperLink": "Read the paper →",
+ "laborHubJobsProForecasterTitle": "Pro Forecaster",
+ "laborHubJobsMetricChartHead": "How compares",
+ "laborHubJobsMetricLower": "lower",
+ "laborHubJobsMetricHigher": "higher",
+ "laborHubJobsFeltenSource": "Felten, Raj & Seamans — Language modeling AIOE",
+ "laborHubJobsFeltenAxisLabel": "Felten exposure score (standardized)",
+ "laborHubJobsFeltenNature1": "The AI Occupational Exposure (AIOE) measures the overlap between AI capabilities and the abilities an occupation requires, aggregated from O*NET ability data.",
+ "laborHubJobsFeltenNature3": "Higher exposure does not by itself mean a job will be automated — it can equally signal that AI augments the work.",
+ "laborHubJobsFeltenBounds": "Scale: standardized z-score · the average occupation sits near 0; positive values are more exposed than average, negative values less.",
+ "laborHubJobsMnaSource": "Manning & Aguirre — Vulnerability score",
+ "laborHubJobsMnaAxisLabel": "Manning & Aguirre vulnerability (0–1)",
+ "laborHubJobsMnaNature1": "Academic measure combining exposure to AI with workers' adaptive capacity.",
+ "laborHubJobsMnaNature3": "Vulnerability scores are related both to the likelihood of displacement (through AI exposure) and its burden (through adaptive capacity).",
+ "laborHubJobsMnaBounds": "Scale: 0 to 1 · highest in occupations that are both heavily exposed and their workers are poorly cushioned against displacement.",
+ "laborHubJobsAoeSource": "Massenkoff & McCrory — Observed Exposure (AOE)",
+ "laborHubJobsAoeAxisLabel": "Observed AI exposure (0–100%)",
+ "laborHubJobsAoeNature1": "Unlike purely theoretical measures, this is also grounded in real, anonymized Claude usage: what people are actually doing with AI right now, mapped to O*NET occupation tasks.",
+ "laborHubJobsAoeNature3": "AOE captures observed adoption, not potential — a low value may mean the work simply isn't being brought to Claude yet, not that AI couldn't do it.",
+ "laborHubJobsAoeBounds": "Scale: 0% to 100% · highest in occupations whose tasks AI can theoretically do and is already being used for.",
+ "laborHubJobsChartA11y": "Employment forecast by year",
+ "laborHubJobsChartBaseline": "Baseline",
+ "midtermsHubMetaTitle": "2026 US Midterm Elections | Metaculus",
+ "midtermsHubMetaDescription": "Real-time forecasts from the Metaculus community on the 2026 US midterm elections.",
+ "midtermsHubChamberSenate": "Senate",
+ "midtermsHubChamberHouse": "House",
+ "midtermsHubChamberGovernor": "Governor",
+ "midtermsHubChamberControl": "Chamber control",
+ "midtermsHubCongressForecast": "Congressional Control",
+ "midtermsHubChamberCurrent": "Current:",
+ "midtermsHubChamberForecast": "Forecast:",
+ "midtermsHubChamberTooltipBody": "Forecasters give {party} a {pct}% chance of holding the most {chamber} seats.",
+ "midtermsHubChamberTooltipDisclaimer": "Click to view forecasting question",
+ "midtermsHubPartyDemocrats": "Democrats",
+ "midtermsHubPartyRepublicans": "Republicans",
+ "midtermsHubOutcomeRepRep": "Rep House / Rep Senate",
+ "midtermsHubOutcomeRepDem": "Dem House / Rep Senate",
+ "midtermsHubOutcomeDemRep": "Rep House / Dem Senate",
+ "midtermsHubOutcomeDemDem": "Dem House / Dem Senate",
+ "midtermsHubCongressSummary": "Forecasters' current views on Congress control are reflected in the probabilities above.",
+ "midtermsHubThingsToWatch": "Key Drivers",
+ "midtermsHubAbortionAmendment": "Missouri abortion-rights repeal",
+ "midtermsHubAbortionAmendmentContext": "Missouri voters decide whether to repeal the abortion-rights protections they enshrined in 2024.",
+ "midtermsHubElectoralConsequences": "Electoral Consequences",
+ "midtermsHubConsequenceQuestion": "Question",
+ "midtermsHubConsequenceIfRep": "if Rep Congress",
+ "midtermsHubConsequenceIfDem": "if Dem Congress",
+ "midtermsHubConsequenceHeaderRepTitle": "Republican Congress",
+ "midtermsHubConsequenceHeaderRepSubtitle": "If GOP controls",
+ "midtermsHubConsequenceHeaderSplitTitle": "Split Congress",
+ "midtermsHubConsequenceHeaderSplitSubtitle": "If control is split",
+ "midtermsHubConsequenceIfSplit": "if Split Congress",
+ "midtermsHubMailInBallots": "Mail-in ballot court challenge",
+ "midtermsHubMailInBallotsContext": "New USPS restrictions could reshape mail-in voting access, but pending lawsuits may block them before November.",
+ "midtermsHubElectionEmergency": "Election-integrity national emergency",
+ "midtermsHubElectionEmergencyContext": "A national emergency declaration could expand federal authority over the election.",
+ "midtermsHubConsequenceHeaderDemTitle": "Democratic Congress",
+ "midtermsHubConsequenceHeaderDemSubtitle": "If Dems control",
+ "midtermsHubConsequenceClimate": "Will major federal climate legislation be passed before 2028?",
+ "midtermsHubConsequenceMinWage": "Will the federal minimum wage be raised before 2028?",
+ "midtermsHubConsequenceImmigration": "Will a major immigration reform bill pass before 2028?",
+ "midtermsHubConsequenceShutdown": "Will there be a government shutdown lasting more than 14 days before 2028?",
+ "midtermsHubCommunityInsights": "Community Insights",
+ "midtermsHubScrollLeft": "Scroll insights left",
+ "midtermsHubScrollRight": "Scroll insights right",
+ "midtermsHubDemocrat": "Democrat",
+ "midtermsHubRepublican": "Republican",
+ "midtermsHubNotContested": "Not contested",
+ "midtermsHubDemPct": "{pct}% Democrat",
+ "midtermsHubRepPct": "{pct}% Republican",
+ "midtermsHubNoForecast": "No forecast",
+ "midtermsHubFooterDisclaimer": "Not affiliated with any political party.",
+ "midtermsHubHeroTitleLine1": "2026 US",
+ "midtermsHubHeroTitleLine2": "Midterm Elections",
+ "midtermsHubHeroSubtitle": "Forecasts from the Metaculus community on contested races and the policies they will shape.",
+ "midtermsHubHeroSubtitleMobile": "Real-time forecasts from the Metaculus community.",
+ "midtermsHubConsequencesSubtitle": "How forecasted outcomes shift depending on which party holds Congress.",
+ "midtermsHubUpdatedRealtime": "Updated in real time",
+ "midtermsHubMetaculusUser": "Metaculus User",
+ "midtermsHubComingSoon": "Coming Soon",
+ "midtermsHubClickToView": "Click to view question",
+ "midtermsHubSeatDistributionsTitle": "Seat Distributions",
+ "midtermsHubSeatDistributionsSubtitle": "The community's forecasts for the final seat advantage in each chamber.",
+ "midtermsHubSenateSeats": "Senate",
+ "midtermsHubHouseSeats": "House",
+ "midtermsHubDemSeatAdvantage": "Democratic Seat Advantage",
+ "midtermsHubRepSeatAdvantage": "Republican Seat Advantage",
+ "midtermsHubEven": "EVEN",
+ "midtermsHubForecastUnavailable": "Forecast unavailable",
+ "midtermsHubSeatAdvantageTooltip": "{count} seat advantage",
+ "midtermsHubSeatAdvantageOverTooltip": ">{count} seat advantage",
+ "midtermsHubProbabilityTooltip": "{value}% probability",
+ "midtermsHubEvenTooltip": "Even"
}
diff --git a/front_end/src/app/(main)/aggregation-explorer/components/aggregation_graph_panel.tsx b/front_end/src/app/(main)/aggregation-explorer/components/aggregation_graph_panel.tsx
index aa747cc5b7..319a747187 100644
--- a/front_end/src/app/(main)/aggregation-explorer/components/aggregation_graph_panel.tsx
+++ b/front_end/src/app/(main)/aggregation-explorer/components/aggregation_graph_panel.tsx
@@ -90,6 +90,7 @@ export default function AggregationGraphPanel({
choice: method.id,
label: method.label,
includeBots: method.includeBots,
+ onlyBots: method.onlyBots,
color: colorById.get(method.id) ?? METAC_COLORS.gray["400"],
})),
[methods, colorById]
diff --git a/front_end/src/app/(main)/aggregation-explorer/components/aggregation_method_selector.tsx b/front_end/src/app/(main)/aggregation-explorer/components/aggregation_method_selector.tsx
index 8573e58307..7a0a9bc7f5 100644
--- a/front_end/src/app/(main)/aggregation-explorer/components/aggregation_method_selector.tsx
+++ b/front_end/src/app/(main)/aggregation-explorer/components/aggregation_method_selector.tsx
@@ -15,6 +15,8 @@ import LoadingIndicator from "@/components/ui/loading_indicator";
import Switch from "@/components/ui/switch";
import { useAuth } from "@/contexts/auth_context";
+type BotMode = "exclude" | "include" | "only";
+
import AggregationLabel from "./aggregation_label";
import {
AGGREGATION_EXPLORER_OPTIONS,
@@ -99,6 +101,7 @@ type Props = {
joinedBeforeDate?: string;
userIds?: number[];
includeBots?: boolean;
+ onlyBots?: boolean;
}) => void;
defaultIncludeBots?: boolean;
};
@@ -120,7 +123,9 @@ export default function AggregationMethodSelector({
AggregationMethod.recency_weighted
);
const [selectedChildId, setSelectedChildId] = useState(null);
- const [includeBots, setIncludeBots] = useState(defaultIncludeBots);
+ const [botMode, setBotMode] = useState(
+ defaultIncludeBots ? "include" : "exclude"
+ );
const [joinedBeforeDate, setJoinedBeforeDate] = useState("");
const [userFilterEnabled, setUserFilterEnabled] = useState(false);
const [userIdsText, setUserIdsText] = useState("");
@@ -224,11 +229,18 @@ export default function AggregationMethodSelector({
) : null}
{showBotToggle ? (
-