Virtù and Fortuna: The Limits of Strategic Control

Fortune favours the bold is the line readers attribute to Chapter 25 of The Prince (1513/1532). The line is Virgil’s, retrofitted by tradition. It’s also the line that strips the chapter of its usefulness. Machiavelli’s argument was structural, not motivational. Half of any outcome is shaped by the strategist. Half is not. The careers and the companies that come apart usually fail at the upstream task: telling those two halves apart before the river runs.

What Machiavelli Actually Said

Chapter 25 arrives at the end of a long argument that has, until then, treated the prince as the dominant actor. Then Machiavelli writes the chapter that gives the rest of the book its weight. Fortuna is the arbiter of one-half of our actions. Virtù is the other half, or perhaps a little less. Not fatalism. Not voluntarism. A partial theory of agency under partial control.

The cleanest image is the river.

I compare her to one of those raging rivers, which when in flood overflows the plains, sweeping away trees and buildings, bearing away the soil from place to place; everything flies before it, all yield to its violence, without being able in any way to withstand it; and yet, though its nature be such, it does not follow therefore that men, when the weather becomes fair, shall not make provision, both with defences and barriers, in such a manner that, rising again, the waters may pass away by canal, and their force be neither so unrestrained nor so dangerous. So it happens with fortune, who shows her power where valour has not prepared to resist her, and thither she turns her forces where she knows that barriers and defences have not been raised to constrain her.

Machiavelli, The Prince, Chapter XXV ("What Fortune Can Effect In Human Affairs And How To Withstand Her"), trans. W. K. Marriott (1908). Public-domain edition: Project Gutenberg eBook 1232.

The river is fortuna. The dykes are virtù. Neither is sufficient on its own, and the strategist’s only legitimate move is to dig the canals before the weather turns. "Fortune favours the bold" loses this. It treats virtù as a temperament; Machiavelli treats it as engineering. The bold prince who has dug no canals is debris with confidence. The cautious prince who has dug canals is the one the river skirts.

The Corporate Misreading

A 2x2 with decision quality on the vertical axis and outcome quality on the horizontal; the "Dumb luck" quadrant (bottom-right: bad decision, good outcome) is flagged as the most dangerous because it rewards a bad process

Most organisations garble this split before they get to use it. Two failure modes do most of the damage. They look like opposites.

Post-mortem cultures under-attribute to fortuna. Every win is read as skill. Every loss is a headwind, a regulator surprise, a moment of bad timing nobody could have seen. Skill, then, swells and shrinks to fit whatever happened, and the learning function becomes mathematically incapable of disagreement with itself.

The CEO’s instinct caused the IPO. Or so the founder-myth culture insists. The near-bankruptcy three years earlier was, in hindsight, "the discipline that built us." Outcomes flatter the protagonist regardless of path, and boards struggle to notice because the protagonist controls the narrative.

The image above is the diagnostic. Two cells are easy. A good decision producing a good outcome (top-right) is the case the firm trains for; a poor decision producing a poor outcome (bottom-left) is the case it diagnoses without difficulty. The off-diagonals are where the trouble lives. Top-left (good decision, bad outcome) is the sound process punished by fortuna; the right response is not to fire the team. The dangerous quadrant is bottom-right. A poor decision produced a good outcome. The system rewards the wrong process. The wrong process gets reused. The lesson the firm "learns" is one it will pay for the next time the river runs.

I find the off-diagonals more useful than the diagonals. That’s where the luck-skill confusion actually lives. Most performance-review systems collapse them.

Forecasting and the Virtù/Fortuna Split

Thirty illustrative forecasters scattered by calibration against realised hit rate; four quadrants separate skill from luck

Five centuries after The Prince, Philip Tetlock and Dan Gardner arrived at the same separation in Superforecasting (Crown Publishers, 2015). One discipline carries the book: judge process and outcome independently. Calibration measures how well a forecaster’s stated probabilities track reality across many forecasts. Hit rate measures whether one specific call came in. The two come apart. Conflating them is the most reliable mistake an organisation can make.

The scatter above shows thirty illustrative forecasters across one stylised year. The Pearson correlation between calibration and hit rate is 0.53. That is real signal. It isn’t enough to read calibration off a single year. The top three forecasters by calibration averaged 0.88 there and 0.67 on hit rate. The bottom three averaged 0.28 and 0.49. A 0.18-point hit-rate gap is enough to lose the year, and small enough to look like noise in any single tournament.

Promote on hit rate alone, and you keep the forecasters who drew the right months. Fire on hit rate alone, and you lose the analysts whose process is the one you actually want when the next surprise arrives. Tetlock’s evidence and Machiavelli’s frame point at the same response. Score the process. Score the outcome. Don’t collapse them into a single spreadsheet column.

Building Dykes Before the Flood

Outcome under a 70 per cent shock plotted against capability built in advance; the virtù-aligned curve rises early, the form-locked curve only late

The practical heart of the chapter is the dyke. Capability built in advance is the only intervention that survives contact with the flood. The chart above puts numbers on it. Baseline outcome is 100, shock is 70 per cent. At moderate capability (50 units on the x-axis), a form-locked organisation lands at 50.50; a virtù-aligned organisation lands at 91.25. The same preparation produces a 40.75-point gap, because the two converted preparation into resilience under very different curves.

Three concrete dykes. Cash reserves: undrawn credit lines, covenant flexibility, a balance sheet built so the firm can buy the discounted asset on the day the dislocation arrives. Scenario rehearsal: the operating playbook run against the unwelcome cases before the cases land, so the decision under stress is one the team has practised rather than one they meet at two in the morning. Succession bench: leadership depth such that a single departure does not flood the plain.

Yesterday’s piece on Musashi’s ku made a related claim about preserving real options. Optionality is not virtù. Taleb’s Antifragile (Random House, 2012) is the closest modern treatment of the convex shape. They fail in the same way: the firm pays the cost of the option and then refuses to spend it when the moment arrives.

My read is that most boards are too lenient with the firms that built no dykes and got lucky, and too harsh with the firms that built dykes the year before a flood that never arrived. The diagnostic is mechanical. Pull the last ten strategic decisions of any size. Classify each one against the 2×2 above. Count the off-diagonal share. That number is the firm’s luck-skill confusion rate, and most leadership teams have never written it down.

Thursday the series stays with Machiavelli. Chapter 12 of The Prince is the operationally relevant one most readers skip: an argument about why hired capability fails at exactly the moment a firm needs it most.

Thursday, Article 12: "Mercenaries Will Ruin You." Machiavelli on outsourced capability.

Interactive Dashboard

Two interactives. A decision-quality / outcome-quality classifier where you drop your last ten strategic calls into the 2×2 and read off your firm’s luck-skill confusion rate. And a dyke-curve explorer where you slide the shock magnitude and the firm’s prepared capability, and watch the form-locked and virtù-aligned outcomes diverge in real time.

Show R Code
# =============================================================================
# generate_virtu_fortuna_images.R
# Article 11 of "Strategy That Lasts" - May 19, 2026
# "Virtu and Fortuna: The Limits of Strategic Control" (Machiavelli)
#
# Builds three 800x500 images and a locked numerical dataset JSON for the post:
#   1. virtu_decision_outcome_2x2.png   - decision quality x outcome quality
#   2. virtu_dyke_curve.png             - optionality-as-insurance
#   3. virtu_brier_score_skill_luck.png - synthetic forecaster panel
#
# Run from project root:
#   Rscript Scripts/generate_virtu_fortuna_images.R
#
# Series accent: sage green (Machiavelli) #95C49B
# Plus standard theme_inphronesys palette where appropriate
# =============================================================================

suppressPackageStartupMessages({
  library(ggplot2)
  library(dplyr)
  library(tidyr)
  library(scales)
  library(jsonlite)
  library(showtext)
  library(sysfonts)
})

source("Scripts/theme_inphronesys.R")

# --- Series color system (locked) ---------------------------------------------
mach_colors <- list(
  accent     = "#95C49B",   # sage green - Machiavelli accent
  cream      = "#F3F0E8",   # background cream
  ink        = "#1F2A38",   # deep ink
  muted      = "#B8B2A0",   # muted grey/dust
  dust_red   = "#B07C70"    # dusty red for the contrasting form-locked curve
)

# =============================================================================
# Verified facts table (printed for Echo-Devil cross-check)
# =============================================================================
verified_facts <- tribble(
  ~fact,                                                                    ~value,                                                                  ~source_url,
  "Machiavelli, The Prince, Ch 25 - chosen translation",                    "W. K. Marriott (1908), public domain",                                  "https://www.gutenberg.org/cache/epub/1232/pg1232.txt",
  "Machiavelli, The Prince, Ch 25 title (Marriott)",                        "What Fortune Can Effect In Human Affairs And How To Withstand Her",     "https://www.gutenberg.org/cache/epub/1232/pg1232.txt",
  "Project Gutenberg eBook number",                                         "1232",                                                                  "https://www.gutenberg.org/ebooks/1232",
  "Fortune-is-half claim (Marriott)",                                       "Fortune is the arbiter of one-half of our actions, but ... she still leaves us to direct the other half, or perhaps a little less.", "https://www.gutenberg.org/cache/epub/1232/pg1232.txt",
  "Tetlock & Gardner, Superforecasting - publisher",                        "Crown Publishers (Penguin Random House), New York",                     "https://www.penguinrandomhouse.com/books/227815/superforecasting-by-philip-e-tetlock-and-dan-gardner/",
  "Tetlock & Gardner, Superforecasting - year",                             "2015",                                                                  "https://www.penguinrandomhouse.com/books/227815/superforecasting-by-philip-e-tetlock-and-dan-gardner/",
  "Tetlock & Gardner, Superforecasting - ISBN-13",                          "978-0-8041-3669-3",                                                     "https://www.abebooks.com/9780804136693/Superforecasting-Art-Science-Prediction-Tetlock-0804136696/plp",
  "Taleb, Antifragile - publisher",                                         "Random House, New York",                                                "https://en.wikipedia.org/wiki/Antifragile_(book)",
  "Taleb, Antifragile - year",                                              "2012",                                                                  "https://en.wikipedia.org/wiki/Antifragile_(book)",
  "Taleb, Antifragile - ISBN-13",                                           "978-1-4000-6782-4",                                                     "https://en.wikipedia.org/wiki/Antifragile_(book)",
  "Tetlock direct-quote availability",                                      "No page-verified quote sourced. Alpha must paraphrase.",                "https://www.penguinrandomhouse.com/books/227815/superforecasting-by-philip-e-tetlock-and-dan-gardner/",
  "Taleb direct-quote availability",                                        "No page-verified quote sourced. Alpha must paraphrase optionality concept.", "https://en.wikipedia.org/wiki/Antifragile_(book)"
)

cat("\n========== VERIFIED FACTS (Virtu/Fortuna, May 19, 2026) ==========\n")
print(verified_facts, n = Inf, width = Inf)
cat("===================================================================\n\n")

# =============================================================================
# Verbatim Machiavelli passage (W. K. Marriott, 1908; public domain)
# Source: Project Gutenberg eBook #1232 (https://www.gutenberg.org/cache/epub/1232/pg1232.txt)
# This is the EXACT text Alpha must use if quoting. Do not rewrite.
# =============================================================================
machiavelli_quote <- paste0(
  "I compare her to one of those raging rivers, which when in flood overflows ",
  "the plains, sweeping away trees and buildings, bearing away the soil from ",
  "place to place; everything flies before it, all yield to its violence, ",
  "without being able in any way to withstand it; and yet, though its nature ",
  "be such, it does not follow therefore that men, when the weather becomes ",
  "fair, shall not make provision, both with defences and barriers, in such a ",
  "manner that, rising again, the waters may pass away by canal, and their ",
  "force be neither so unrestrained nor so dangerous. So it happens with ",
  "fortune, who shows her power where valour has not prepared to resist her, ",
  "and thither she turns her forces where she knows that barriers and ",
  "defences have not been raised to constrain her."
)

machiavelli_half_quote <- paste0(
  "Fortune is the arbiter of one-half of our actions, ... ",
  "but ... she still leaves us to direct the other half, or perhaps a little less."
)

# =============================================================================
# 1. virtu_decision_outcome_2x2.png
# 2x2 matrix per the outline-locked layout:
#   X axis = OUTCOME  (left = bad outcome, right = good outcome)
#   Y axis = DECISION (top  = good decision, bottom = bad decision)
#
# Quadrants:
#   top-right    (good dec, good out) = "Earned win"  (sage, diagonal)
#   top-left     (good dec, bad out)  = "Bad luck"    (grey, off-diag)
#   bottom-right (bad dec,  good out) = "Dumb luck"   (grey, off-diag)  *** dangerous
#   bottom-left  (bad dec,  bad out)  = "Earned loss" (sage, diagonal)
# =============================================================================

quad_data <- tibble(
  outcome  = factor(c("Good", "Bad", "Good", "Bad"),
                    levels = c("Bad", "Good")),
  decision = factor(c("Good", "Good", "Bad", "Bad"),
                    levels = c("Bad", "Good")),
  label    = c("Earned win", "Bad luck", "Dumb luck", "Earned loss"),
  sublabel = c("(virtu rewarded)", "(earned dignity)",
               "(lesson misread)", "(easy to diagnose)"),
  detail   = c(
    "Process sound.\nFortuna cooperated.\nWhat you train for.",
    "Process sound.\nFortuna intervened.\nDo not punish.",
    "Process wrong.\nFortuna covered for it.\nWorst case for learning.",
    "Process wrong.\nFortuna confirmed it.\nEasy to diagnose."
  ),
  is_diag  = c(TRUE, FALSE, FALSE, TRUE),
  fill_col = c(mach_colors$accent, mach_colors$muted,
               mach_colors$muted, mach_colors$accent),
  text_col = rep(mach_colors$ink, 4)
)

p1 <- ggplot(quad_data, aes(x = outcome, y = decision)) +
  geom_tile(aes(fill = I(fill_col)), width = 0.92, height = 0.92,
            colour = "white", linewidth = 1.2) +
  geom_text(aes(label = label), nudge_y = 0.30,
            family = "Inter", fontface = "bold",
            size = 6.0, colour = mach_colors$ink, lineheight = 0.95) +
  geom_text(aes(label = sublabel), nudge_y = 0.13,
            family = "Inter", fontface = "italic",
            size = 3.6, colour = mach_colors$ink) +
  geom_text(aes(label = detail), nudge_y = -0.18,
            family = "Inter", size = 3.5,
            colour = mach_colors$ink, lineheight = 1.10) +
  # Dangerous quadrant arrow points UP at bottom-right "Dumb luck" cell
  annotate("segment",
           x = 2.0, xend = 2.0, y = 0.50, yend = 0.62,
           colour = mach_colors$dust_red, linewidth = 0.6,
           arrow = arrow(length = unit(0.20, "cm"), type = "closed")) +
  annotate("text",
           x = 2.0, y = 0.44,
           label = "Most dangerous: good outcome rewards a bad process",
           family = "Inter", fontface = "italic", size = 3.6,
           colour = mach_colors$dust_red, hjust = 0.5) +
  scale_x_discrete(position = "bottom",
                   labels = c("Bad outcome", "Good outcome"),
                   expand = expansion(add = 0.5)) +
  scale_y_discrete(labels = c("Bad\ndecision", "Good\ndecision"),
                   expand = expansion(add = c(0.85, 0.6))) +
  coord_cartesian(clip = "off") +
  labs(
    title    = "Virtu and Fortuna: separating decision quality from outcome",
    subtitle = "Sage cells = signal aligned (process and outcome agree); grey cells = luck dominated",
    x = NULL, y = NULL,
    caption  = "Framework adapted from Duke (2018) decision-quality/outcome-quality matrix."
  ) +
  theme_inphronesys(grid = "none") +
  theme(
    axis.text.x = element_text(size = 11, colour = mach_colors$ink),
    axis.text.y = element_text(size = 11, colour = mach_colors$ink, lineheight = 0.95),
    axis.ticks = element_blank(),
    plot.margin = margin(15, 18, 12, 14),
    plot.background = element_rect(fill = "white", colour = NA)
  )

ggsave("https://inphronesys.com/wp-content/uploads/2026/05/virtu_decision_outcome_2x2.png", p1,
       width = 8, height = 5, dpi = 100, bg = "white")

# =============================================================================
# 2. virtu_dyke_curve.png
# Optionality-as-insurance: outcome vs capability under a fixed shock.
#
# Functional form (LOCKED for Charlie's dashboard):
#   outcome(dyke, shock_pct, k) = baseline - (shock_pct/100) * baseline * (1 - dyke/100)^k
#
# Locked parameters:
#   baseline   = 100
#   k_form     = 0.5    (form-locked - steep, late-rising curve)
#   k_virtu    = 3.0    (virtu-aligned - early rise, gentle)
#   shock_pct  = 70     (the static-chart reference shock)
#   dyke_ref   = 50     (dashboard reference dyke)
# =============================================================================

baseline    <- 100
k_form      <- 0.5
k_virtu     <- 3.0
shock_ref   <- 70
dyke_ref    <- 50

outcome_fn <- function(dyke, shock_pct, k) {
  pmax(0, baseline - (shock_pct / 100) * baseline * (1 - dyke / 100)^k)
}

dyke_seq <- seq(0, 100, by = 1)
curve_df <- tibble(
  dyke = rep(dyke_seq, 2),
  type = factor(rep(c("Form-locked", "Virtu-aligned"), each = length(dyke_seq)),
                levels = c("Form-locked", "Virtu-aligned")),
  k    = rep(c(k_form, k_virtu), each = length(dyke_seq)),
  outcome = c(outcome_fn(dyke_seq, shock_ref, k_form),
              outcome_fn(dyke_seq, shock_ref, k_virtu))
)

endpts <- curve_df |>
  filter(dyke == 75) |>
  mutate(
    label_x = dyke + 4,
    label_y = case_when(
      type == "Virtu-aligned" ~ outcome + 2,
      type == "Form-locked"   ~ outcome - 4,
      TRUE                    ~ outcome
    )
  )

p2 <- ggplot(curve_df, aes(x = dyke, y = outcome, colour = type)) +
  geom_vline(xintercept = dyke_ref, colour = mach_colors$muted,
             linewidth = 0.5, linetype = "dashed") +
  annotate("text", x = dyke_ref + 1.5, y = 8,
           label = "Shock arrives here",
           family = "Inter", fontface = "italic", size = 3.4,
           colour = mach_colors$muted, hjust = 0) +
  geom_line(linewidth = 1.6) +
  geom_text(data = endpts,
            aes(x = label_x, y = label_y, label = type),
            family = "Inter", fontface = "bold", size = 4,
            hjust = 0, vjust = 0.5, show.legend = FALSE) +
  geom_point(data = curve_df |> filter(dyke == dyke_ref),
             size = 3.6) +
  annotate("segment",
           x = dyke_ref - 4, xend = dyke_ref - 4,
           y = outcome_fn(dyke_ref, shock_ref, k_form),
           yend = outcome_fn(dyke_ref, shock_ref, k_virtu),
           colour = mach_colors$ink, linewidth = 0.4) +
  annotate("text",
           x = dyke_ref - 6,
           y = mean(c(outcome_fn(dyke_ref, shock_ref, k_form),
                      outcome_fn(dyke_ref, shock_ref, k_virtu))),
           label = "Virtu gap",
           family = "Inter", fontface = "italic", size = 3.6,
           colour = mach_colors$ink, hjust = 1) +
  scale_colour_manual(values = c("Form-locked"   = mach_colors$dust_red,
                                  "Virtu-aligned" = mach_colors$accent),
                       guide = "none") +
  scale_x_continuous(limits = c(0, 105),
                     breaks = seq(0, 100, 25),
                     expand = c(0, 0),
                     labels = function(x) paste0(x, "%")) +
  scale_y_continuous(limits = c(0, 105),
                     breaks = seq(0, 100, 25),
                     expand = c(0, 0)) +
  labs(
    title    = "Capability built in advance is the dyke that holds the river",
    subtitle = paste0("Outcome when a ", shock_ref,
                      "% shock arrives, by curve shape (k = 0.5 vs 3.0)"),
    x = "Capability (dyke) built in advance",
    y = "Outcome under shock (baseline = 100)",
    caption  = "Functional form: outcome = baseline - (shock/100) * baseline * (1 - dyke/100)^k. Dashboard reproduces this exactly."
  ) +
  theme_inphronesys(grid = "y") +
  theme(plot.background = element_rect(fill = "white", colour = NA))

ggsave("https://inphronesys.com/wp-content/uploads/2026/05/virtu_dyke_curve.png", p2,
       width = 8, height = 5, dpi = 100, bg = "white")

# =============================================================================
# 3. virtu_brier_score_skill_luck.png
# 30 synthetic forecasters: x = calibration (process quality),
# y = realized hit rate (outcome quality). Four quadrants annotated.
# =============================================================================

set.seed(42)

n_forecasters <- 30
calibration <- runif(n_forecasters, 0.20, 0.90)
hit_rate    <- 0.30 + 0.55 * calibration + rnorm(n_forecasters, 0, 0.13)
hit_rate    <- pmin(0.95, pmax(0.10, hit_rate))

forecasters <- tibble(
  id          = sprintf("F%02d", seq_len(n_forecasters)),
  calibration = round(calibration, 3),
  hit_rate    = round(hit_rate, 3)
)

forecasters_sorted <- forecasters |> arrange(desc(calibration))
top_decile <- forecasters_sorted |> slice(1:3) |>
  summarise(calib = mean(calibration), hit = mean(hit_rate))
bot_decile <- forecasters_sorted |> slice((n_forecasters - 2):n_forecasters) |>
  summarise(calib = mean(calibration), hit = mean(hit_rate))

calib_mid <- 0.55
hit_mid   <- 0.55

p3 <- ggplot(forecasters, aes(x = calibration, y = hit_rate)) +
  geom_vline(xintercept = calib_mid, colour = mach_colors$muted,
             linewidth = 0.4, linetype = "dashed") +
  geom_hline(yintercept = hit_mid, colour = mach_colors$muted,
             linewidth = 0.4, linetype = "dashed") +
  annotate("text", x = 0.225, y = 0.90,
           label = "Unskilled but lucky",
           family = "Inter", fontface = "bold", size = 3.7,
           colour = mach_colors$dust_red, hjust = 0) +
  annotate("text", x = 0.225, y = 0.86,
           label = "(don't promote them)",
           family = "Inter", fontface = "italic", size = 3.2,
           colour = mach_colors$muted, hjust = 0) +
  annotate("text", x = 0.86, y = 0.90,
           label = "Skilled and lucky",
           family = "Inter", fontface = "bold", size = 3.7,
           colour = mach_colors$accent, hjust = 1) +
  annotate("text", x = 0.86, y = 0.86,
           label = "(the visible winners)",
           family = "Inter", fontface = "italic", size = 3.2,
           colour = mach_colors$muted, hjust = 1) +
  annotate("text", x = 0.225, y = 0.18,
           label = "Unskilled and unlucky",
           family = "Inter", fontface = "bold", size = 3.7,
           colour = mach_colors$ink, hjust = 0) +
  annotate("text", x = 0.86, y = 0.18,
           label = "Skilled but unlucky",
           family = "Inter", fontface = "bold", size = 3.7,
           colour = mach_colors$accent, hjust = 1) +
  annotate("text", x = 0.86, y = 0.14,
           label = "(don't fire them)",
           family = "Inter", fontface = "italic", size = 3.2,
           colour = mach_colors$muted, hjust = 1) +
  geom_point(size = 3.4, colour = mach_colors$accent,
             alpha = 0.85, stroke = 0) +
  scale_x_continuous(limits = c(0.10, 1.00),
                     breaks = seq(0.2, 0.9, 0.1),
                     labels = scales::number_format(accuracy = 0.1),
                     expand = c(0, 0)) +
  scale_y_continuous(limits = c(0.10, 1.00),
                     breaks = seq(0.2, 0.9, 0.1),
                     labels = scales::number_format(accuracy = 0.1),
                     expand = c(0, 0)) +
  labs(
    title    = "Skill and luck mix in any single tournament",
    subtitle = "Thirty synthetic forecasters, one year of outcomes (illustrative; not Tetlock data)",
    x = "Calibration (process quality)",
    y = "Realised hit rate (outcome quality)",
    caption  = "Synthetic data, set.seed(42). Illustrative only. Real Brier-score work uses multi-year panels (Tetlock & Gardner 2015)."
  ) +
  theme_inphronesys(grid = "xy") +
  theme(plot.background = element_rect(fill = "white", colour = NA))

ggsave("https://inphronesys.com/wp-content/uploads/2026/05/virtu_brier_score_skill_luck.png", p3,
       width = 8, height = 5, dpi = 100, bg = "white")

# =============================================================================
# DELTA-DEVIL DATA-INTEGRITY CHECK BLOCK
# Every numeric claim in Alpha's prose must be derivable from this block alone.
# Echo-Devil reproduces these values by running the script and comparing.
# =============================================================================
pearson_calib_hit <- cor(forecasters$calibration, forecasters$hit_rate)

cat("\n=================================================================\n")
cat("DELTA-DEVIL STATS BLOCK - reproduce on re-run, compare to prose\n")
cat("=================================================================\n")
cat(sprintf("  Pearson correlation (calibration vs hit rate): %.4f\n",
            pearson_calib_hit))
cat(sprintf("    -> rounded to 2 decimals for prose:         %.2f\n",
            pearson_calib_hit))
cat("\n")
cat(sprintf("  Top-decile mean calibration:                  %.4f\n",
            top_decile$calib))
cat(sprintf("    -> rounded to 2 decimals for prose:         %.2f\n",
            top_decile$calib))
cat(sprintf("  Top-decile mean hit rate:                     %.4f\n",
            top_decile$hit))
cat(sprintf("    -> rounded to 2 decimals for prose:         %.2f\n",
            top_decile$hit))
cat("\n")
cat(sprintf("  Bottom-decile mean calibration:               %.4f\n",
            bot_decile$calib))
cat(sprintf("    -> rounded to 2 decimals for prose:         %.2f\n",
            bot_decile$calib))
cat(sprintf("  Bottom-decile mean hit rate:                  %.4f\n",
            bot_decile$hit))
cat(sprintf("    -> rounded to 2 decimals for prose:         %.2f\n",
            bot_decile$hit))
cat("\n")
cat("  Dyke-curve key claims (baseline=100, k_form=0.5, k_virtu=3.0):\n")
cat(sprintf("    Form-locked outcome at shock=70, dyke=50:   %.4f\n",
            outcome_fn(50, 70, k_form)))
cat(sprintf("    Virtu-aligned outcome at shock=70, dyke=50: %.4f\n",
            outcome_fn(50, 70, k_virtu)))
cat(sprintf("    Virtu gap at shock=70, dyke=50:             %.4f\n",
            outcome_fn(50, 70, k_virtu) - outcome_fn(50, 70, k_form)))
cat("\n")
cat("  The Prince - date convention (locked across team):\n")
cat("    Composition year:                 1513\n")
cat("    First-print year:                 1532\n")
cat("    Canonical long form  (prose):     'written 1513, published 1532'\n")
cat("    Canonical short form (caption):   '(1513/1532)'\n")
cat("=================================================================\n\n")

References

  • Machiavelli, Niccolò. The Prince, Chapter XXV ("What Fortune Can Effect In Human Affairs And How To Withstand Her"), translated by W. K. Marriott. London: J. M. Dent & Sons, 1908. Public-domain edition: Project Gutenberg eBook 1232. The river-and-dykes passage and the "Fortune is the arbiter of one-half of our actions" line are both verbatim from this edition.
  • Tetlock, Philip E., and Dan Gardner. Superforecasting: The Art and Science of Prediction. New York: Crown Publishers (Penguin Random House), 2015. ISBN 978-0-8041-3669-3. https://www.penguinrandomhouse.com/books/227815/superforecasting-by-philip-e-tetlock-and-dan-gardner/. Source for the process-versus-outcome separation and the calibration / Brier-score vocabulary applied in Section 3.
  • Taleb, Nassim Nicholas. Antifragile: Things That Gain From Disorder. New York: Random House, 2012. ISBN 978-1-4000-6782-4. Background reading on optionality and convexity; referenced in Section 4 as the closest modern treatment of the option-spending discipline that virtù requires.
  • Duke, Annie. Thinking in Bets: Making Smarter Decisions When You Don’t Have All the Facts. New York: Portfolio (Penguin Random House), 2018. ISBN 978-0-7352-1635-7. The decision-quality / outcome-quality 2×2 in Section 2 is adapted from Duke’s "resulting" framework: the cognitive habit of judging a decision by its outcome instead of its process.
  • Article 8 in this series: The Way of Strategy: What a 17th-Century Swordsman Knew About Mastery, inphronesys.com, May 14, 2026.
  • Article 9 in this series: Hyōshi: Musashi’s Discipline of Tempo, inphronesys.com, May 15, 2026.
  • Article 10 in this series: The Void: Strategic Emptiness as Competitive Advantage, inphronesys.com, May 18, 2026. The "preserved real options" thread referenced in Section 4 picks up directly from the Void article’s argument on corporate ku.
  • Articles 1–7 in this series: Strategy That Lasts: The Classics, May 2026, on inphronesys.com.

Comments

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert