Overview

The President’s FY 2027 budget asks Congress for ₱7.2 trillion at a moment when growth has fallen to 2.3%, inflation has run above 6% for six months, the peso is past ₱62 to the dollar, and a Super El Niño is setting in. This briefer reads the proposal against that backdrop: what is in it, what it does about the crises households are living through, where the pork risks sit, and what advocates can ask Congress to change.

It draws on two compilations of DBM data. The first is a Program/Activity/Project (P/A/P) level workbook covering every national government agency, DPWH, the State Universities and Colleges, budgetary support to government corporations, and the special purpose funds, FY 2020 to FY 2027. The second is an agency-level series of appropriations, allotments, obligations, and disbursements from FY 2016. Macroeconomic and fiscal actuals come from PSA, BSP, and Bureau of the Treasury series.

1 Key takeaways

  1. The budget grows 6%, but agency budgets grow 2%. Of the ₱407B increase, about ₱316B is automatic appropriations, and interest payments alone rise ₱164B. Programmed new appropriations for agencies and special purpose funds rise from ₱4,402.8B to ₱4,494.1B, or 2.1%, while the DBCC’s own inflation assumption for 2026 is 6 to 7%. Counting payroll, 63.8% of the budget is now non-allocable, and the allocable remainder falls in nominal pesos.
  2. It was written for a normal year. Every dedicated fuel-relief line is at zero. Service Contracting has no line. Crop insurance, palay procurement, and the food stamp program are flat in pesos. The Department of Energy’s entire budget is ₱2.0B. 4Ps is cut ₱13.9B.
  3. The growth bet is transport concrete and rice. Rail, the DPWH road network, bridges, ports, and airports total about ₱442B, more than double what Congress enacted for them in 2026; irrigation and rice programs add about ₱148B. Industry and trade, digital, energy, and tourism together receive about ₱29B, with DTI, DICT, and DOE all cut.
  4. The executive reverses Congress’s ayuda add-ons but keeps the LGU and local-infrastructure lumps. AICS, MAIFIP, TUPAD, school feeding, and classrooms all fall back to their NEP 2026 levels. Financial Assistance to LGUs stays at the ₱37.5B Congress set (the executive had asked for ₱5.0B), and DPWH’s local access-roads line arrives as a single ₱105.7B item.
  5. Infrastructure is ₱1,031B across the budget, and 38% of it is outside DPWH. Against the 2026 GAA, DPWH and rail rise while classrooms, health facilities, farm-to-market roads, irrigation, SUC buildings, and scattered public buildings all fall, which is the list Congress restores every year.
  6. Flood control returns at ₱103.5B after Congress cut the program to ₱4.8B in 2026, and rail takes most of the new capital money: the North-South Commuter Railway and the Metro Manila Subway together ask for ₱191.2B, against the ₱49.2B Congress enacted for them in 2026.
  7. Congress reallocated ₱661B inside the 2026 budget without changing its total, up from ₱268B in 2020. The same lines gain every year (DPWH local infrastructure, AICS, MAIFIP, TUPAD, the House’s own budget) and the same lines pay for it (pensions, rail, DPWH’s Support to Operations, 4Ps).
  8. PBC’s red-flag basket is about ₱864B, or ₱976B with unprogrammed appropriations, which are proposed at ₱112.0B, the lowest in years. Patronage-prone programs are ₱140B of it, the political offices (the President, the Vice President, and Congress) ₱38B, and infrastructure ₱686B. Congress has added ₱74B to its own budget over seven years. Congress raised the executive’s unprogrammed figure in four of the last five budgets.
  9. There is room to fix this inside the ceiling. Returning the discretionary lumps to the executive’s own 2026 proposal levels, trimming the unexplained increment in DPWH local roads, and holding AFP Modernization flat frees roughly ₱125B. The crisis-response and social protection items proposed here cost well under half of that.

2 The macroeconomic and fiscal context

2.1 Growth has slowed for four straight quarters

gdp <- sna_exp %>%
  filter(Valuation == "Constant 2018 Prices", Expenditure == "Gross Domestic Product",
         Quarter >= as.Date("2022-01-01")) %>%
  mutate(g = GrowthRate * 100, lab = sprintf("%.1f", g))
last_q <- max(gdp$Quarter)
ggplot(gdp, aes(Quarter, g)) +
  annotate("rect", xmin = as.Date("2025-11-15"), xmax = as.Date("2026-11-15"), ymin = 3.5, ymax = 4.5,
           fill = "#54278F", alpha = 0.15) +
  annotate("text", x = as.Date("2026-09-01"), y = 5.0, label = "DBCC 2026 target\n3.5 to 4.5%",
           size = 3.2, color = "#54278F", fontface = "bold", lineheight = 0.9) +
  geom_col(aes(fill = Quarter >= as.Date("2025-07-01")), width = 70, show.legend = FALSE) +
  geom_text(aes(label = lab), vjust = -0.5, size = 3.1) +
  scale_fill_manual(values = c(`FALSE` = "grey65", `TRUE` = dn_col)) +
  scale_x_date(breaks = seq(as.Date("2022-01-01"), as.Date("2026-10-01"), by = "6 months"),
               labels = function(d) paste0("Q", (as.integer(format(d, "%m")) - 1) %/% 3 + 1, "\n", format(d, "%Y"))) +
  scale_y_continuous(limits = c(0, 9.5), labels = function(x) paste0(x, "%")) +
  labs(x = NULL, y = "Real GDP growth, year on year",
       title = "Growth has fallen from 5.4% to 2.3% in a year",
       subtitle = "Quarterly real GDP growth, constant 2018 prices",
       caption = "Source: PSA National Accounts. Shaded band is the DBCC's full-year 2026 growth target (193rd DBCC, July 2026).") +
  theme_pbc()

The economy grew 2.3% in the second quarter of 2026, the slowest pace outside the pandemic since 2009, and 2.6% for the first half. The DBCC’s revised full-year target is 3.5 to 4.5%, which now requires growth of at least 4.4% in the second half.

The slowdown has two sources, and both bear on the budget. The first is the state itself. After the flood-control corruption scandal broke in mid-2025, public works procurement froze; public construction contracted by about a third year on year in both quarters of 2026. The second is the oil shock that followed the outbreak of war in the Middle East at the end of February 2026, which pushed inflation from 2.0% in January to 7.2% in April and has squeezed household spending since.

want <- c("01. Household final consumption expenditure" = "Household consumption",
          "02. Government final consumption expenditure" = "Government consumption",
          "03. Gross capital formation" = "Gross capital formation (investment)",
          "1. Construction" = "  of which: construction",
          "2. Durable equipment" = "  of which: durable equipment",
          "04. Exports of goods and services" = "Exports of goods and services",
          "05. Imports of goods and services" = "Imports of goods and services",
          "Gross Domestic Product" = "Gross Domestic Product")
sna_exp %>%
  filter(Valuation == "Constant 2018 Prices", Expenditure %in% names(want),
         Quarter >= as.Date("2025-04-01")) %>%
  mutate(Component = factor(want[as.character(Expenditure)], levels = unname(want)),
         q = paste0("Q", (as.integer(format(Quarter, "%m")) - 1) / 3 + 1, " ", format(Quarter, "%Y")),
         g = sprintf("%.1f", GrowthRate * 100)) %>%
  arrange(Quarter) %>% select(Component, q, g) %>%
  pivot_wider(names_from = q, values_from = g) %>% arrange(Component) %>%
  kbl_clean(align = c("l", rep("r", 5)), caption = "Real growth by expenditure component, year on year (%)")
Real growth by expenditure component, year on year (%)
Component Q2 2025 Q3 2025 Q4 2025 Q1 2026 Q2 2026
Household consumption 5.2 4.0 3.8 3.0 2.8
Government consumption 8.7 5.8 0.7 4.8 8.3
Gross capital formation (investment) 0.9 -2.0 -9.4 -3.1 -9.2
of which: construction 0.9 -0.2 -9.2 -4.3 -14.8
of which: durable equipment 11.8 2.1 -1.7 0.3 -13.6
Exports of goods and services 4.9 7.8 13.3 7.8 12.2
Imports of goods and services 3.6 3.2 3.2 6.8 5.5
Gross Domestic Product 5.4 4.0 3.0 2.8 2.3

Household consumption, which is about three quarters of the economy, has slowed from 5.2% to 2.8% in a year. Investment is contracting: construction fell 14.8% and durable equipment 13.6% in the second quarter. What is holding growth up is exports (electronics, mostly) and government consumption. That makes the size and timing of public spending in 2027 a first-order macroeconomic question.

2.2 Inflation is back above target

infl <- cpi %>%
  filter(Geolocation == "PHILIPPINES",
         Commodity %in% c("ALL ITEMS", "FOOD AND NON-ALCOHOLIC BEVERAGES"),
         Month >= as.Date("2022-01-01"), !is.na(Inflation)) %>%
  mutate(series = ifelse(Commodity == "ALL ITEMS", "Headline", "Food and non-alcoholic beverages"))
infl_last <- infl %>% group_by(series) %>% slice_max(Month, n = 1)
ggplot(infl, aes(Month, Inflation * 100, color = series)) +
  annotate("rect", xmin = min(infl$Month), xmax = max(infl$Month), ymin = 2, ymax = 4, fill = "grey60", alpha = 0.18) +
  annotate("text", x = as.Date("2022-10-01"), y = 3, label = "BSP target band, 2 to 4%", hjust = 0, size = 3.1, color = "grey35") +
  geom_hline(yintercept = 0, color = "grey70") +
  geom_line(linewidth = 1) +
  geom_point(data = infl_last, size = 2) +
  geom_text(data = infl_last, aes(label = sprintf("%.1f%%", Inflation * 100)), hjust = -0.25, size = 3.3, fontface = "bold", show.legend = FALSE) +
  scale_color_manual(values = c("Headline" = "black", "Food and non-alcoholic beverages" = "#E6550D")) +
  scale_x_date(date_breaks = "6 months", date_labels = "%b\n%Y", expand = expansion(mult = c(0.01, 0.07))) +
  scale_y_continuous(labels = function(x) paste0(x, "%")) +
  labs(x = NULL, y = "Year-on-year inflation",
       title = "Inflation tripled between January and April 2026 and has stayed above 6%",
       subtitle = "Monthly CPI inflation, 2018 = 100",
       caption = "Source: PSA Consumer Price Index.") +
  theme_pbc()

Headline inflation was 6.1% in August, the sixth straight month above the BSP’s target, for an eight-month average of 5.2%. Private forecasters expect it to re-accelerate toward 6.5% in September on oil near $95 a barrel and a peso that hit a record ₱62.68. The BSP has reversed its easing cycle and raised the policy rate to 5.00%, with another hike widely expected in October. Severe-weather risk runs in both directions: El Niño through the dry months, and a possible La Niña after it.

The labor market is starting to show the slowdown. Unemployment rose to 6.0% in the latest Labor Force Survey round, from under 5% in the second quarter. The government has repatriated more than 9,000 overseas workers from the Middle East since March, and remittance growth has slowed.

2.3 The fiscal position: a deficit that has stopped closing

fis <- ngcor %>%
  filter(Quarter >= as.Date("2016-01-01")) %>%
  transmute(Quarter,
            `Revenues` = Revenues4Q / NominalGDP4Q * 100,
            `Expenditures` = Expenditures4Q / NominalGDP4Q * 100,
            `Deficit` = -SurplusDeficit4Q / NominalGDP4Q * 100) %>%
  pivot_longer(-Quarter)
fis_last <- fis %>% group_by(name) %>% slice_max(Quarter, n = 1)
ggplot(fis, aes(Quarter, value, color = name)) +
  geom_hline(yintercept = 0, color = "grey70") +
  geom_line(linewidth = 1.05) +
  geom_point(data = fis_last, size = 2) +
  geom_text(data = fis_last, aes(label = sprintf("%.1f%%", value)), hjust = -0.25, size = 3.3, fontface = "bold", show.legend = FALSE) +
  scale_color_manual(values = c("Revenues" = "#08519C", "Expenditures" = "#E6550D", "Deficit" = "black")) +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y", expand = expansion(mult = c(0.01, 0.07))) +
  scale_y_continuous(labels = function(x) paste0(x, "%"), limits = c(0, 26)) +
  labs(x = NULL, y = "% of GDP, rolling four quarters",
       title = "Revenues are slipping as a share of GDP, and the deficit is stuck near 5.5%",
       subtitle = "National government revenues, expenditures, and deficit, rolling four-quarter sums as % of GDP",
       caption = "Source: Bureau of the Treasury cash operations reports; PSA nominal GDP.") +
  theme_pbc()

Over the four quarters to mid-2026, revenues were 15.9% of GDP and spending 21.4%, leaving a deficit of 5.5%. Revenue effort has drifted down from 16.7% at the end of 2024. The DBCC programs a 5.4% deficit for 2026 and 5.1% for 2027, and no longer expects to get below 4% before 2030. A year earlier it was promising 4.3% by 2028.

debt <- ngdebt %>% filter(Month >= as.Date("2016-01-01"), !is.na(NominalGDP4Q)) %>%
  transmute(Date = Month, series = "NG debt, % of GDP", value = TotalObligations / NominalGDP4Q * 100)
ints <- ngcor %>% filter(Quarter >= as.Date("2016-01-01")) %>%
  transmute(Date = Quarter,
            `Interest payments, % of revenues` = InterestPayments4Q / Revenues4Q * 100,
            `Interest payments, % of expenditures` = InterestPayments4Q / Expenditures4Q * 100) %>%
  pivot_longer(-Date, names_to = "series")
both <- bind_rows(debt %>% mutate(panel = "National government debt (% of GDP)"),
                  ints %>% mutate(panel = "Interest payments (rolling four quarters)"))
both_last <- both %>% group_by(series) %>% slice_max(Date, n = 1)
ggplot(both, aes(Date, value, color = series)) +
  geom_line(linewidth = 1.05) +
  geom_point(data = both_last, size = 2) +
  geom_text(data = both_last, aes(label = sprintf("%.1f%%", value)), hjust = -0.2, size = 3.2, fontface = "bold", show.legend = FALSE) +
  facet_wrap(~ panel, scales = "free_y") +
  scale_color_manual(values = c("NG debt, % of GDP" = "black",
                                "Interest payments, % of revenues" = "#B2182B",
                                "Interest payments, % of expenditures" = "#E6550D")) +
  scale_x_date(date_breaks = "2 years", date_labels = "%Y", expand = expansion(mult = c(0.02, 0.14))) +
  scale_y_continuous(labels = function(x) paste0(x, "%")) +
  labs(x = NULL, y = NULL,
       title = "Debt is at 66% of GDP, and interest now takes one peso in five of revenue",
       subtitle = "Outstanding national government debt, and interest payments as a share of revenues and of expenditures",
       caption = "Source: Bureau of the Treasury; PSA nominal GDP (rolling four quarters).") +
  theme_pbc() + guides(color = guide_legend(nrow = 2))

National government debt reached ₱19.07 trillion at the end of June 2026, or 66.0% of GDP, up from 63.2% at the end of 2025 and 39.6% in 2019. The ratio is rising because the denominator has stalled: nominal GDP grew 7.5% in the second quarter, while the DBCC’s 2027 program assumes about 9%. Interest payments now absorb 20.4% of revenues and 15.1% of expenditures, against 11.5% and 9.5% in 2019. The House’s own think tank, the CPBRD, calls the DBCC’s assumptions “notably optimistic” and estimates debt could reach 67% of GDP in 2027 under a moderate downside and 70.7% under a severe one.

This is why the budget’s composition matters more than its size this year. With the deficit program fixed and interest and the NTA growing on their own, every peso for crisis response has to come from somewhere else in the programmed budget.

2.4 The assumptions the budget was built on

tibble::tribble(
  ~Indicator, ~`DBCC, 2026`, ~`DBCC, 2027`, ~`Latest actual`,
  "Real GDP growth", "3.5 to 4.5%", "5.0 to 6.0%", "2.6% (first half 2026); 2.3% (Q2)",
  "Inflation", "6.0 to 7.0%", "4.0 to 5.0%", "6.1% (August); 5.2% (January to August average)",
  "Dubai crude, USD per barrel", "80 to 100", "70 to 90", "About 94 to 100 (September)",
  "Peso per US dollar", "60 to 62", "60 to 62", "62.68 (record low, mid-September)",
  "Revenues, % of GDP", "15.8%", "15.7%", sprintf("%.1f%% (four quarters to Q2 2026)", rev_now),
  "Deficit, % of GDP", "5.4%", "5.1%", sprintf("%.1f%% (four quarters to Q2 2026)", def_now),
  "NG debt, % of GDP", "", "64.4%", sprintf("%.1f%% (end-June 2026)", debt_now)
) %>% kbl_clean(align = c("l","r","r","l"),
  caption = "Macroeconomic assumptions and fiscal program behind the FY 2027 budget, against latest actuals")
Macroeconomic assumptions and fiscal program behind the FY 2027 budget, against latest actuals
Indicator DBCC, 2026 DBCC, 2027 Latest actual
Real GDP growth 3.5 to 4.5% 5.0 to 6.0% 2.6% (first half 2026); 2.3% (Q2)
Inflation 6.0 to 7.0% 4.0 to 5.0% 6.1% (August); 5.2% (January to August average)
Dubai crude, USD per barrel 80 to 100 70 to 90 About 94 to 100 (September)
Peso per US dollar 60 to 62 60 to 62 62.68 (record low, mid-September)
Revenues, % of GDP 15.8% 15.7% 15.9% (four quarters to Q2 2026)
Deficit, % of GDP 5.4% 5.1% 5.5% (four quarters to Q2 2026)
NG debt, % of GDP 64.4% 66.0% (end-June 2026)

DBCC figures from the 193rd DBCC statement (8 July 2026); 2027 debt ratio as reported from the BESF. Actuals from PSA, BSP, and BTr; market figures from mid-September 2026 press reports.

The peso is already outside the band the budget assumes through 2030. Oil is at the top of the 2026 range and above the 2027 range. Growth is a full point below the bottom of the 2026 target. Each of these pushes in the same direction: lower revenues than programmed, higher peso costs for imported fuel, rice, fertilizer, medicines, and foreign-denominated project loans, and higher interest payments.

2.5 What the DBM says about the proposal

The DBM submitted the NEP to Congress on 11 August 2026 under the theme “People-Centered Growth for an Inclusive and Resilient Future,” describing it as the administration’s final full-year spending plan. Its main claims, and what the data in this briefer say about each:

tibble::tribble(
  ~`What the DBM says`, ~`What the data show`,
  "The budget is ₱7.2 trillion, 21.7% of GDP, and 6% or ₱407B higher than 2026. About ₱316B of the increase is mandatory obligations: the higher NTA, the fourth salary tranche, and other fiscal obligations.",
  "Confirmed, and it is the central fact about this budget. Automatic appropriations rise from about ₱2,390B to ₱2,706B. Programmed new appropriations rise ₱91.3B, or 2.1%, below the DBCC's own inflation assumption.",
  "Unprogrammed appropriations are at a historic low of ₱111.984B, limited mainly to restoring PDIC's remitted fund balance and cover for foreign-assisted projects.",
  "True at the proposal stage: NEP 2026 carried ₱250.0B. But Congress enacted ₱150.9B for 2026, and it raised the executive's figure in 2022, 2023, 2024, and 2025. The number to watch is the one that comes out of bicam.",
  "Social services take the largest share at ₱2.456 trillion. Education, health, social protection, food security, jobs, and disaster resilience are the priorities.",
  "DepEd and DOH do grow against NEP 2026 (+4.8% and +4.0%), which is below inflation. 4Ps is cut ₱13.9B. AICS, MAIFIP, TUPAD, school feeding, classrooms, and textbooks all fall well below their 2026 enacted levels. Every dedicated fuel-relief line is zero.",
  "The consolidated health sector budget reaches ₱1.06 trillion, 3.19% of GDP.",
  "This is a broad sector definition the P/A/P data cannot reproduce. The DBM's own narrower figure for DOH, specialty hospitals, and PhilHealth is ₱353.8B. In the P/A/P data, the PhilHealth subsidy falls to ₱74.4B from ₱129.8B enacted, and MAIFIP is halved.",
  "Infrastructure under Build Better More is ₱1.467 trillion, 4.4% of GDP, ₱178.0B above the FY 2026 GAA.",
  "The comparison base is a GAA from which Congress had stripped ₱350B of DPWH. Capital outlays in the programmed budget are ₱1,122.6B: 14% above GAA 2026 but 13% below what the executive itself proposed for 2026.",
  "The DBCC will prioritize rationalizing cash subsidy and financial assistance programs to address overlaps and improve targeting.",
  "The NEP does revert Congress's ayuda add-ons. It does not apply the same logic to Financial Assistance to LGUs (₱37.5B, the executive's own 2026 proposal was ₱5.0B) or to the ₱105.7B DPWH local access-roads line.",
  "Ten departments receive 51.4% of the budget, led by DepEd at ₱976B.",
  "DBM's department figures include automatic appropriations such as retirement premiums, so they run higher than the new-appropriations figures used in this briefer (DepEd: ₱916.8B)."
) %>% kbl_clean(font = 12.5) %>% column_spec(1, width = "46%")
What the DBM says What the data show
The budget is ₱7.2 trillion, 21.7% of GDP, and 6% or ₱407B higher than 2026. About ₱316B of the increase is mandatory obligations: the higher NTA, the fourth salary tranche, and other fiscal obligations. Confirmed, and it is the central fact about this budget. Automatic appropriations rise from about ₱2,390B to ₱2,706B. Programmed new appropriations rise ₱91.3B, or 2.1%, below the DBCC’s own inflation assumption.
Unprogrammed appropriations are at a historic low of ₱111.984B, limited mainly to restoring PDIC’s remitted fund balance and cover for foreign-assisted projects. True at the proposal stage: NEP 2026 carried ₱250.0B. But Congress enacted ₱150.9B for 2026, and it raised the executive’s figure in 2022, 2023, 2024, and 2025. The number to watch is the one that comes out of bicam.
Social services take the largest share at ₱2.456 trillion. Education, health, social protection, food security, jobs, and disaster resilience are the priorities. DepEd and DOH do grow against NEP 2026 (+4.8% and +4.0%), which is below inflation. 4Ps is cut ₱13.9B. AICS, MAIFIP, TUPAD, school feeding, classrooms, and textbooks all fall well below their 2026 enacted levels. Every dedicated fuel-relief line is zero.
The consolidated health sector budget reaches ₱1.06 trillion, 3.19% of GDP. This is a broad sector definition the P/A/P data cannot reproduce. The DBM’s own narrower figure for DOH, specialty hospitals, and PhilHealth is ₱353.8B. In the P/A/P data, the PhilHealth subsidy falls to ₱74.4B from ₱129.8B enacted, and MAIFIP is halved.
Infrastructure under Build Better More is ₱1.467 trillion, 4.4% of GDP, ₱178.0B above the FY 2026 GAA. The comparison base is a GAA from which Congress had stripped ₱350B of DPWH. Capital outlays in the programmed budget are ₱1,122.6B: 14% above GAA 2026 but 13% below what the executive itself proposed for 2026.
The DBCC will prioritize rationalizing cash subsidy and financial assistance programs to address overlaps and improve targeting. The NEP does revert Congress’s ayuda add-ons. It does not apply the same logic to Financial Assistance to LGUs (₱37.5B, the executive’s own 2026 proposal was ₱5.0B) or to the ₱105.7B DPWH local access-roads line.
Ten departments receive 51.4% of the budget, led by DepEd at ₱976B. DBM’s department figures include automatic appropriations such as retirement premiums, so they run higher than the new-appropriations figures used in this briefer (DepEd: ₱916.8B).

DBM claims from its 11 August 2026 press release and the 193rd DBCC statement.

3 What’s inside the budget

3.1 The envelope: a ₱7.2 trillion budget, ₱407 billion more than 2026

env <- totals %>% transmute(year, total = `NEP Total Appropriations`, new_incl_ua = `NEP New Appropriations`) %>%
  left_join(pap_tot %>% filter(src == "NEP") %>% select(year, programmed = amt), by = "year") %>%
  filter(year >= 2020) %>%
  mutate(automatic = total - programmed, ua = new_incl_ua - programmed)
env_long <- env %>% select(year, `Programmed new appropriations (agencies and special purpose funds)` = programmed,
                           `Automatic appropriations (NTA, interest, retirement premiums, others)` = automatic) %>%
  pivot_longer(-year)
ggplot(env_long, aes(factor(year), value, fill = name)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = comma(value, accuracy = 1)), position = position_stack(vjust = 0.5), color = "white", size = 3.2, fontface = "bold") +
  geom_text(data = env, aes(factor(year), total, label = paste0(peso, comma(total, accuracy = 1), "B")), inherit.aes = FALSE, vjust = -0.5, size = 3.3, fontface = "bold") +
  scale_fill_manual(values = c("Programmed new appropriations (agencies and special purpose funds)" = "#54278F",
                               "Automatic appropriations (NTA, interest, retirement premiums, others)" = "grey60")) +
  scale_y_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0, 0.08))) +
  labs(x = "Proposed budget (NEP), fiscal year", y = NULL,
       title = "Automatic appropriations now drive the growth of the budget",
       subtitle = "Total proposed obligation program, split between programmed new appropriations and automatic appropriations",
       caption = "Programmed new appropriations are the sum of all P/A/P lines in the compiled workbook. Automatic appropriations are derived as the total program less that sum.\nUnprogrammed appropriations sit outside the total and are shown separately in the red-flags section.") +
  theme_pbc() + guides(fill = guide_legend(nrow = 2))

The proposed program is ₱7,200.2B, against ₱6,793.2B for 2026: an increase of ₱407B, or 6.0%. This section shows where that increase goes. Of that, ₱4,494.1B is programmed new appropriations, the part Congress votes on line by line and the part this briefer can see at P/A/P level. The remaining ₱2,706.1B is automatic: the National Tax Allotment, interest payments, retirement and life insurance premiums, and similar items that do not need annual legislation.

Between the two proposals, automatic appropriations grow by ₱315.8B (13.2%) and programmed new appropriations by ₱91.3B (2.1%). This matches the DBM’s own statement that about ₱316B of the increase is mandatory. With inflation running at 5 to 6%, a 2.1% nominal increase is a real cut of around 3%. The government is tightening the part of the budget that delivers services, during a slowdown in which public spending is one of the few things still growing.

3.1.1 Automatic appropriations

comp_levels <- c("National Tax Allotment (IRA before 2022)", "Interest payments", "BARMM annual block grant",
                 "Retirement and life insurance premiums", "Special accounts and other earmarked funds", "Net lending", "Tax expenditures")
an <- auto_long %>% filter(src == "NEP", !is.na(amt)) %>% mutate(component = factor(component, levels = comp_levels))
a_of <- function(comp, yr) sum(an$amt[an$component == comp & an$year == yr])
auto_tot <- an %>% group_by(year) %>% summarise(amt = sum(amt))
auto_check <- max(abs(auto_tot$amt - env$automatic[match(auto_tot$year, env$year)]))
auto_pal <- c("National Tax Allotment (IRA before 2022)" = "#08519C", "Interest payments" = "#B2182B", "BARMM annual block grant" = "#1B7837",
              "Retirement and life insurance premiums" = "#FF7F0E", "Special accounts and other earmarked funds" = "#9467BD",
              "Net lending" = "grey55", "Tax expenditures" = "grey75")
ggplot(an, aes(factor(year), amt, fill = component)) +
  geom_col(width = 0.72, position = position_stack(reverse = TRUE)) +
  geom_text(data = an %>% filter(component %in% comp_levels[1:2]), aes(label = comma(amt, accuracy = 1)),
            position = position_stack(vjust = 0.5, reverse = TRUE), color = "white", size = 3.1, fontface = "bold") +
  geom_text(data = auto_tot, aes(factor(year), amt, label = comma(amt, accuracy = 1)), inherit.aes = FALSE, vjust = -0.5, size = 3.3, fontface = "bold") +
  scale_fill_manual(values = auto_pal) +
  scale_y_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0, 0.08))) +
  labs(x = "Proposed budget (NEP), fiscal year", y = NULL,
       title = "Two items, the NTA and interest, are 90% of automatic appropriations",
       subtitle = "Automatic appropriations by component, PHP billions",
       caption = "Source: automatic appropriations tab of the compiled workbook (BESF). Enacted levels equal proposed levels in every year, so only one series is shown.") +
  theme_pbc() + guides(fill = guide_legend(nrow = 4))

at <- tibble::tibble(component = comp_levels) %>%
  mutate(y2020 = sapply(component, a_of, 2020), y2026 = sapply(component, a_of, 2026), y2027 = sapply(component, a_of, 2027))
at <- bind_rows(at, at %>% summarise(component = "All automatic appropriations", across(-component, sum)))
inc <- at$y2027[nrow(at)] - at$y2026[nrow(at)]
at %>% transmute(` ` = component, `FY 2020` = bn(y2020), `FY 2026` = bn(y2026), `FY 2027` = bn(y2027),
                 `Change, 2026 to 2027` = ifelse(abs(y2027 - y2026) < 0.05, "0.0", sprintf("%+.1f", y2027 - y2026)),
                 `Change (%)` = ifelse(abs(y2027 - y2026) < 0.05, "0.0", sprintf("%+.1f", (y2027 / y2026 - 1) * 100)),
                 `Share of the increase (%)` = sprintf("%.0f", (y2027 - y2026) / inc * 100)) %>%
  kbl_clean(align = c("l", rep("r", 6)), caption = "Automatic appropriations by component (PHP billions)") %>%
  row_spec(nrow(at), bold = TRUE)
Automatic appropriations by component (PHP billions)
FY 2020 FY 2026 FY 2027 Change, 2026 to 2027 Change (%) Share of the increase (%)
National Tax Allotment (IRA before 2022) 648.9 1,190.5 1,319.8 +129.3 +10.9 41
Interest payments 451.0 950.0 1,114.3 +164.3 +17.3 52
BARMM annual block grant 63.6 94.0 104.2 +10.2 +10.9 3
Retirement and life insurance premiums 49.3 82.2 89.0 +6.8 +8.3 2
Special accounts and other earmarked funds 12.5 30.5 35.6 +5.1 +16.8 2
Net lending 10.0 28.7 28.7 0.0 0.0 0
Tax expenditures 14.5 14.5 14.5 0.0 0.0 0
All automatic appropriations 1,249.8 2,390.4 2,706.1 +315.8 +13.2 100
rl <- auto %>% filter(component == "Retirement and life insurance premiums") %>% group_by(UACS_DPT_DSC) %>%
  summarise(v = sum(NEP_2027_EXP_TOTAL) / 1e9) %>% arrange(desc(v))
sa <- auto %>% filter(component == "Special accounts and other earmarked funds") %>%
  transmute(fund = UACS_FUNDSUBCAT_DSC, dept = UACS_DPT_DSC, v26 = NEP_2026_EXP_TOTAL / 1e9, v27 = NEP_2027_EXP_TOTAL / 1e9) %>% arrange(desc(v27))
barmm_new <- L %>% filter(dep == "ALGU", str_detect(agy, "Bangsamoro")) %>% summarise(v = sum(N27, na.rm = TRUE)) %>% pull(v)

Automatic appropriations are spending that standing laws authorize without an annual vote. They total ₱2,706.1B, or 37.6% of the budget, up from 30.5% in 2020. The itemized tab sums to the same figure this briefer derives from the budget totals, in every year.

The National Tax Allotment is the largest item at ₱1,319.8B. It is set by formula: 40% of national tax collections three years earlier, so the 2027 figure reflects 2024 revenues and will keep rising regardless of what happens to the economy in 2026. Interest payments are ₱1,114.3B, two and a half times their 2020 level, and the fastest-growing large item in the entire budget at +17.3%. Together the two are 90% of automatic appropriations and 93% of their increase. Neither can be changed in the budget deliberations; both can be changed by what Congress does about revenues and the deficit.

The BARMM annual block grant, 5% of net national internal revenue collections under the Bangsamoro Organic Law, is ₱104.2B. It is separate from the ₱11.4B in new appropriations for BARMM under Allocations to LGUs, and the two are kept as distinct line items here. Retirement and life insurance premiums are ₱89.0B, of which DepEd alone accounts for ₱59.2B. That is the difference between the ₱916.8B in new appropriations used in this briefer and the ₱976B the DBM cites for the department.

The remaining ₱35.6B is about sixty special accounts and earmarked funds that agencies spend from their own collections. The largest are the Malampaya Gas Fund (₱8.0B), DICT’s Free Public Internet Access Fund (FPIAF) (₱6.8B, up from ₱5.0B), and the AFP Modernization Trust Fund (₱3.6B). These matter when reading agency budgets: DICT’s and DOE’s new appropriations fall, but each has a special account that grows. Net lending has been carried at ₱28.7B since 2021 and tax expenditures at ₱14.5B since 2020.

3.1.2 How much of the budget can Congress actually move?

ps_of <- function(src, yr) sum(wide[[paste0(src, "_", yr, "_EXP_1PS")]], na.rm = TRUE) / 1e9
# Interest payments and the National Tax Allotment, from the automatic appropriations tab
besf <- tibble::tibble(item = c("Interest payments", "National Tax Allotment"),
                       y2026 = c(a_of("Interest payments", 2026), a_of(comp_levels[1], 2026)),
                       y2027 = c(a_of("Interest payments", 2027), a_of(comp_levels[1], 2027)))
na_tbl <- tibble::tibble(
  item  = c("Total obligation program", "Automatic appropriations", "  of which: interest payments",
            "  of which: National Tax Allotment", "  of which: other automatic items",
            "Personnel services in programmed appropriations", "Non-allocable (automatic + personnel services)",
            "Allocable (everything else)"),
  y2026 = c(e26$total, e26$automatic, besf$y2026[1], besf$y2026[2], e26$automatic - sum(besf$y2026),
            ps_of("GAA", 2026), e26$automatic + ps_of("GAA", 2026), e26$total - e26$automatic - ps_of("GAA", 2026)),
  y2027 = c(e27$total, e27$automatic, besf$y2027[1], besf$y2027[2], e27$automatic - sum(besf$y2027),
            ps_of("NEP", 2027), e27$automatic + ps_of("NEP", 2027), e27$total - e27$automatic - ps_of("NEP", 2027)))
na_tbl %>% transmute(` ` = item, `FY 2026 program` = bn(y2026), `Share (%)` = sprintf("%.1f", y2026 / e26$total * 100),
                     `FY 2027 proposed` = bn(y2027), `Share (%) ` = sprintf("%.1f", y2027 / e27$total * 100),
                     `Change (%)` = sprintf("%+.1f", (y2027 / y2026 - 1) * 100)) %>%
  kbl_clean(align = c("l", rep("r", 5)), caption = "The non-allocable share of the budget (PHP billions)")
The non-allocable share of the budget (PHP billions)
FY 2026 program Share (%) FY 2027 proposed Share (%) Change (%)
Total obligation program 6,793.2 100.0 7,200.2 100.0 +6.0
Automatic appropriations 2,390.4 35.2 2,706.1 37.6 +13.2
of which: interest payments 950.0 14.0 1,114.3 15.5 +17.3
of which: National Tax Allotment 1,190.5 17.5 1,319.8 18.3 +10.9
of which: other automatic items 249.8 3.7 272.0 3.8 +8.9
Personnel services in programmed appropriations 1,760.1 25.9 1,891.0 26.3 +7.4
Non-allocable (automatic + personnel services) 4,150.5 61.1 4,597.1 63.8 +10.8
Allocable (everything else) 2,642.7 38.9 2,603.1 36.2 -1.5
nonalloc <- na_tbl[7, ]; alloc <- na_tbl[8, ]

FY 2026 uses enacted personnel services. All rows are computed from the compiled workbook, including its automatic appropriations tab.

Following PBC’s method, treat as non-allocable everything that is either automatically appropriated or committed to payroll. That share rises from 61.1% of the budget to 63.8%. The allocable remainder falls in nominal pesos, from ₱2,642.7B to ₱2,603.1B. Interest payments alone grow by ₱164.3B, or 17.3%, which is more than the entire ₱91.3B increase in programmed appropriations. Interest and the NTA together explain ₱293.6B of the ₱315.8B rise in automatic appropriations.

Counting all personnel services as non-allocable is a simplification, since new positions are a choice, but it is the right order of magnitude. Congress is debating a little over a third of the ₱7.2 trillion, and that third is shrinking.

3.2 By expense class

cls_lab <- c(PS = "Personnel Services (PS)", MOOE = "Maintenance & Other Op. Exp. (MOOE)",
             FE = "Financial Expenses (FE)", CO = "Capital Outlays (CO)")
cls <- long %>% filter(cls != "TOTAL") %>%
  group_by(src, year, cls) %>% summarise(amt = sum(amt, na.rm = TRUE) / 1e9, .groups = "drop") %>%
  filter((src == "NEP" & year %in% 2026:2027) | (src == "GAA" & year == 2026), cls != "FE") %>%
  mutate(col = factor(paste(src, year), levels = c("NEP 2026", "GAA 2026", "NEP 2027")),
         cls = factor(cls_lab[cls], levels = cls_lab)) %>%
  group_by(col) %>% mutate(share = amt / sum(amt))
ggplot(cls, aes(col, amt, fill = cls)) +
  geom_col(width = 0.62) +
  geom_text(aes(label = paste0(comma(amt, accuracy = 1), "\n(", percent(share, accuracy = 1), ")")),
            position = position_stack(vjust = 0.5), color = "white", size = 3.3, fontface = "bold", lineheight = 0.9) +
  scale_fill_manual(values = ec_pal) +
  scale_y_continuous(labels = function(x) paste0(peso, comma(x), "B")) +
  labs(x = NULL, y = NULL,
       title = "Congress moved about PHP 300B from capital outlays to MOOE in 2026; the NEP restores about half",
       subtitle = "Programmed new appropriations by expense class, PHP billions",
       caption = "Financial expenses are negligible and omitted.") +
  theme_pbc()

Personnel services are 42% of the programmed budget, MOOE 33%, and capital outlays 25%. Capital outlays are proposed at ₱1,122.6B. Against the executive’s 2026 proposal that is a 12.8% cut; against the 2026 GAA it is a 14.2% increase. The gap between those two readings is the ₱350B Congress took out of DPWH after the flood-control scandal and redistributed, largely into MOOE-funded assistance programs.

This is the reason the briefer reports two comparisons throughout. NEP 2026 to NEP 2027 shows how the executive’s own priorities changed. GAA 2026 to NEP 2027 shows what agencies and beneficiaries will feel against the current year. Neither alone is the full story, and claims of “cuts” or “increases” that cite only one should be checked against the other.

3.3 The biggest departments

dept <- L %>% group_by(dep, Department = dept) %>%
  summarise(across(c(N26, G26, N27), ~ if (all(is.na(.x))) NA_real_ else sum(.x, na.rm = TRUE)), .groups = "drop") %>%
  filter(coalesce(N27, 0) > 0) %>%
  mutate(`vs NEP 2026` = N27 - N26, `vs NEP 2026 (%)` = (N27 / N26 - 1) * 100,
         `vs GAA 2026` = N27 - G26, `vs GAA 2026 (%)` = (N27 / G26 - 1) * 100,
         share = N27 / sum(N27) * 100)
top_dept <- dept %>% slice_max(N27, n = 15) %>%
  select(dep, `NEP 2026` = N26, `GAA 2026` = G26, `NEP 2027` = N27) %>%
  pivot_longer(-dep) %>%
  mutate(name = factor(name, levels = c("NEP 2027", "GAA 2026", "NEP 2026")),
         dep = recode(dep, "ALGU" = "Allocations to LGUs", "BSGC" = "Support to GOCCs"))
ord <- top_dept %>% filter(name == "NEP 2027") %>% arrange(value) %>% pull(dep)
ggplot(top_dept, aes(value, factor(dep, levels = ord), fill = name)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.75) +
  geom_text(aes(label = comma(value, accuracy = 1)), position = position_dodge(width = 0.8), hjust = -0.15, size = 2.9) +
  scale_fill_manual(values = c("NEP 2026" = "#CBC9E2", "GAA 2026" = "#54278F", "NEP 2027" = "#E6550D"),
                    breaks = c("NEP 2026", "GAA 2026", "NEP 2027")) +
  scale_x_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0, 0.08))) +
  labs(x = NULL, y = NULL,
       title = "Fifteen largest departments and funds, programmed new appropriations",
       subtitle = "NEP 2026, GAA 2026, and NEP 2027, PHP billions",
       caption = "New appropriations only; excludes automatic appropriations such as retirement and life insurance premiums, so figures run below DBM's headline department totals.") +
  theme_pbc() + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey90"))

DepEd is the largest at ₱916.8B, about a fifth of the programmed budget, followed by DPWH, DILG, DND, and DOTr. Three things stand out in the ranking. DOTr moves from eleventh in the 2026 GAA to fifth. DPWH, which held more than a quarter of programmed appropriations in the 2025 GAA, is now at 14%. And Allocations to LGUs, mostly the Local Government Support Fund, has grown by two thirds against the executive’s previous proposal.

dept %>% arrange(desc(N27)) %>%
  transmute(Department, `NEP 2026` = N26, `GAA 2026` = G26, `NEP 2027` = N27,
            `Share of NEP 2027 (%)` = share, `vs NEP 2026` , `vs NEP 2026 (%)`, `vs GAA 2026`, `vs GAA 2026 (%)`) %>%
  dt_table(caption = "All departments and special purpose funds, programmed new appropriations (PHP billions). Sortable and exportable.",
           page = 15, money_cols = c("NEP 2026","GAA 2026","NEP 2027","vs NEP 2026","vs GAA 2026"),
           pct_cols = c("Share of NEP 2027 (%)","vs NEP 2026 (%)","vs GAA 2026 (%)"))

3.4 The biggest agencies

agy_tbl <- L %>% group_by(Department = dep, Agency = agy) %>%
  summarise(across(c(N26, G26, N27), ~ if (all(is.na(.x))) NA_real_ else sum(.x, na.rm = TRUE)), .groups = "drop") %>%
  filter(coalesce(N26, 0) + coalesce(G26, 0) + coalesce(N27, 0) > 0) %>% arrange(desc(N27)) %>%
  mutate(`vs NEP 2026` = N27 - coalesce(N26, 0), `vs GAA 2026` = N27 - coalesce(G26, 0))
agy_tbl %>% rename(`NEP 2026` = N26, `GAA 2026` = G26, `NEP 2027` = N27) %>%
  dt_table(caption = "All agencies, programmed new appropriations (PHP billions). Includes each State University and College and each government corporation receiving budgetary support.",
           page = 20, money_cols = c("NEP 2026","GAA 2026","NEP 2027","vs NEP 2026","vs GAA 2026"))

The budget is concentrated. The twelve largest of 368 agencies hold 72% of programmed new appropriations: the offices of the secretary of DepEd, DPWH, DOH, DOTr, DSWD, and DA; the PNP; the Pension and Gratuity Fund; the Army and the Navy; PhilHealth; and the Supreme Court and lower courts. What Congress does to these dozen agencies decides most of what the budget does.

3.5 The biggest programs, activities, and projects

wrap_lab <- function(x, w = 78) str_wrap(x, w)
top_pap <- L %>% filter(!is.na(N27)) %>% slice_max(N27, n = 25) %>%
  mutate(PAP = str_replace(PAP, "^Foreign-Assisted Projects?:", "FAP:"),
         PAP = str_replace(PAP, "^Locally-Funded Projects?:", "LFP:"),
         lab = wrap_lab(paste0(dep, ": ", PAP)))
ggplot(top_pap, aes(N27, reorder(lab, N27))) +
  geom_col(fill = "#54278F", width = 0.72) +
  geom_text(aes(label = comma(N27, accuracy = 0.1)), hjust = -0.15, size = 3) +
  scale_x_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0, 0.09))) +
  labs(x = NULL, y = NULL, title = "The 25 largest line items in the FY 2027 NEP",
       subtitle = "Programmed new appropriations, PHP billions",
       caption = "FAP = foreign-assisted project; LFP = locally-funded project. Labels are otherwise as they appear in the NEP.") +
  theme_pbc(11) + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey90"),
                        axis.text.y = element_text(size = 8.3, lineheight = 0.85))

Twenty-five line items out of 2,846 funded lines account for ₱2,367.3B, or 53% of programmed new appropriations. The top of the list is payroll and pensions: school operations, police operations, the Pension and Gratuity Fund, and Army force sustainment. The discretionary weight sits further down: the North-South Commuter Railway (₱123.8B), DPWH’s Basic Infrastructure Program access-roads line (₱105.7B), DOH regional hospitals (₱102.9B), 4Ps (₱99.1B), and the Metro Manila Subway (₱67.4B).

3.6 The biggest increases and cuts

Line items get renamed, merged, and split between budgets, and a naive comparison of labels produces false “new” and “discontinued” programs. Before ranking changes, this briefer groups lines that were restructured between 2026 and 2027: the Pension and Gratuity Fund and the Miscellaneous Personnel Benefits Fund (each collapsed into a single line), the calamity fund (restructured into new sub-lines), DepEd’s private-education subsidies (the Senior High School voucher, ESC, and the joint delivery voucher merged into one “Government Assistance and Subsidies” line), and DPWH’s local access-road lines (SIPAG, BIP, and the separately labeled tourism, ecozone, seaport, and airport access roads, all folded into one BIP line).

fam_of <- function(dep, agy, pap) {
  p <- coalesce(pap, "")
  case_when(
    dep == "Pension and Gratuity Fund" ~ "Pension and Gratuity Fund (all lines)",
    dep == "Miscellaneous Personnel Benefits Fund" ~ "Miscellaneous Personnel Benefits Fund (all lines)",
    dep == "NDRRMF" ~ "NDRRM Fund / calamity fund (all lines)",
    dep == "DepEd" & str_detect(p, "Senior High School Voucher|Educational Service Contracting|Joint Delivery Voucher|^Government Assistance and Subsidies$") ~
      "Private-education subsidies: SHS voucher, ESC, joint delivery voucher (merged in 2027)",
    dep == "DPWH" & str_detect(p, "(SIPAG|Basic Infrastructure Program).*(Access Roads|Interjurisdictional)|Access Roads leading to") ~
      "Local and access roads: BIP, SIPAG, tourism, ecozone, seaport and airport access roads (merged in 2027)",
    dep == "DPWH" & str_detect(p, "(SIPAG|Basic Infrastructure Program).*(Multi-Purpose|Multipurpose)") ~
      "BIP and SIPAG multi-purpose buildings",
    dep == "DPWH" & str_detect(p, "(SIPAG|Basic Infrastructure Program).*Flood") ~ "BIP and SIPAG flood mitigation structures",
    dep == "DA" & str_detect(p, "National Livestock Program|Animal Industry Development") ~
      "Livestock: National Livestock Program lines and the new Animal Industry Development and Competitiveness Program",
    TRUE ~ p)
}
fam <- L %>% filter(tab != "SUCs") %>%
  mutate(family = fam_of(dep, agy, PAP)) %>%
  group_by(dep, agy, family) %>%
  summarise(across(c(N26, G26, N27), ~ if (all(is.na(.x))) NA_real_ else sum(.x, na.rm = TRUE)), .groups = "drop") %>%
  mutate(vs_nep = coalesce(N27, 0) - coalesce(N26, 0), vs_gaa = coalesce(N27, 0) - coalesce(G26, 0),
         family = str_replace(family, "^Foreign-Assisted Projects?:", "FAP:"),
         family = str_replace(family, "^Locally-Funded Projects?:", "LFP:"),
         family = ifelse(str_detect(family, "^Conduct of police patrol operations"), "Conduct of police patrol operations and other related activities [label shortened]", family),
         lab = str_wrap(ifelse(dep %in% c("Pension and Gratuity Fund", "Miscellaneous Personnel Benefits Fund", "NDRRMF"), family, paste0(dep, ": ", family)), 72))
mover_plot <- function(var, title, subtitle) {
  d <- bind_rows(fam %>% slice_max(.data[[var]], n = 14), fam %>% slice_min(.data[[var]], n = 14)) %>%
    mutate(v = .data[[var]])
  ggplot(d, aes(v, reorder(lab, v), fill = v > 0)) +
    geom_col(width = 0.72, show.legend = FALSE) +
    geom_text(aes(label = ifelse(v > 0, paste0("+", comma(v, accuracy = 0.1)), comma(v, accuracy = 0.1)),
                  hjust = ifelse(v > 0, -0.12, 1.12)), size = 2.9) +
    scale_fill_manual(values = c(`TRUE` = up_col, `FALSE` = dn_col)) +
    scale_x_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0.12, 0.12))) +
    labs(x = NULL, y = NULL, title = title, subtitle = subtitle,
         caption = "Restructured lines are grouped into families (see text). New lines count from zero so they appear; FY 2027 has no GAA yet.\nThe PNP police-operations label is shortened; its full text is in the reference table.") +
    theme_pbc(11) + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey90"),
                          axis.text.y = element_text(size = 7.9, lineheight = 0.85))
}

3.6.1 Against the executive’s own 2026 proposal

mover_plot("vs_nep", "What the executive changed: NEP 2026 to NEP 2027",
           "Fourteen largest increases and decreases by line item, PHP billions")

Proposal to proposal, the executive’s choices are clear. Money moves out of DPWH flood control (the two main flood lines lose ₱151B between them) and DPWH Support to Operations, and into rail, the PNP, school operations and teacher pay, Financial Assistance to LGUs, election preparations, and a new ₱20B animal industry program. The ASEAN hosting budget (₱17.6B) drops out because the summit year ends. 4Ps loses ₱13.9B.

3.6.2 Against the 2026 enacted budget

mover_plot("vs_gaa", "What changes against the current year: GAA 2026 to NEP 2027",
           "Fourteen largest increases and decreases by line item, PHP billions")

Against the enacted budget the picture flips. The largest increases are the things Congress cut in 2026 and the executive wants back: rail, flood control, bypass roads, DPWH Support to Operations. The largest decreases are the things Congress added and the executive does not want: PhilHealth’s one-time ₱60B court-ordered appropriation, classrooms, multi-purpose buildings, AICS, MAIFIP, school feeding, farm-to-market roads, and textbooks. The 2027 budget debate will largely be a rerun of this disagreement.

fam %>% filter(abs(vs_nep) >= 0.5 | abs(vs_gaa) >= 0.5) %>% arrange(desc(abs(vs_nep))) %>%
  transmute(Department = dep, Agency = agy, `Line item (or family)` = family,
            `NEP 2026` = N26, `GAA 2026` = G26, `NEP 2027` = N27, `vs NEP 2026` = vs_nep, `vs GAA 2026` = vs_gaa) %>%
  dt_table(caption = "All line items changing by ₱0.5B or more on either comparison (PHP billions). Excludes SUC lines.",
           page = 15, money_cols = c("NEP 2026","GAA 2026","NEP 2027","vs NEP 2026","vs GAA 2026"), money_digits = 2)

3.7 Infrastructure across the budget

Infrastructure is not only DPWH. Roads, bridges, irrigation, classrooms, health facilities, ports, power lines, and public buildings are funded through at least a dozen departments and government corporations. This section collects them in one place. Lines are assigned to groups by agency and label; the last group is a rule-based sweep of remaining construction, repair, and building lines whose funding is at least half capital outlay.

P  <- function(rx) str_detect(coalesce(L$PAP, ""), regex(rx, ignore_case = TRUE))
A  <- function(rx) str_detect(L$agy, regex(rx, ignore_case = TRUE))
is_proj <- P("Project")
grp <- rep(NA_character_, nrow(L)); itm <- rep(NA_character_, nrow(L))
assign_to <- function(cond, g, i) { hit <- cond & is.na(grp); grp[hit] <<- g; itm[hit] <<- i }

# A. DPWH, by program
dp <- L$dep == "DPWH"
dpwh_prog <- c("1000" = "General Administration and Support", "2000" = "Support to Operations", "3001" = "Local Program",
               "3002" = "Convergence and Special Support Program (BIP, SIPAG, other convergence roads)", "3101" = "Asset Preservation Program",
               "3102" = "Network Development Program", "3103" = "Bridge Program", "3201" = "Flood Management Program")
for (k in names(dpwh_prog)) assign_to(dp & L$prog == k, "DPWH", dpwh_prog[[k]])
assign_to(dp, "DPWH", "Other DPWH lines")

# B. Transport outside DPWH
dotr <- L$dep == "DOTr"
assign_to((dotr & is_proj & P("Railway|Subway|Metro Rail Transit|\\bMRT\\b|Light Rail|\\bLRT\\b|PNR")) | (L$dep == "BSGC" & A("Light Rail Transit|Philippine National Railways")),
          "Transport outside DPWH", "Rail: NSCR, Metro Manila Subway, MRT and LRT projects, LRTA and PNR support")
assign_to(dotr & P("\\bAirports?\\b|CNS/ATM"), "Transport outside DPWH", "Airports and air navigation projects")
assign_to(dotr & is_proj & P("\\bPorts?\\b|Container"), "Transport outside DPWH", "Ports: New Cebu International Container Port and local ports")
assign_to(dotr & P("Davao Public Transport|Bus Rapid Transit|Public Transport Modernization Program|EDSA Busway|Active Transport"),
          "Transport outside DPWH", "Road-based public transport: Davao bus project, Cebu BRT, PUV modernization, busway, active transport")

# C. Agriculture and fisheries
assign_to(L$dep == "BSGC" & A("National Irrigation"), "Agriculture and fisheries", "National Irrigation Administration: all lines")
assign_to(L$dep == "DA" & P("Farm-to-Market"), "Agriculture and fisheries", "DA farm-to-market roads and bridges")
assign_to(L$dep == "BSGC" & A("Fisheries Development Authority"), "Agriculture and fisheries", "PFDA: fish ports")
assign_to(L$dep == "DA" & P("Provision of Agricultural Equipment and Facilities|Fishery On-farm/Postharvest Equipment|Cold Storage"),
          "Agriculture and fisheries", "DA and BFAR equipment, postharvest facilities, and cold storage")
assign_to(L$dep == "DA" & P("Irrigation Network Services|Small Water Irrigation|Solar-Powered Irrigation"), "Agriculture and fisheries", "DA small-scale irrigation")
assign_to(L$dep == "DA" & P("Philippine Rural Development Project"), "Agriculture and fisheries", "Philippine Rural Development Project Scale-Up (World Bank)")

# D. Education
assign_to(L$dep == "DepEd" & P("^Basic Education Facilities"), "Education", "DepEd Basic Education Facilities (classrooms)")
assign_to(L$dep == "DepEd" & P("Safer and Resilient Schools"), "Education", "DepEd Infrastructure for Safer and Resilient Schools (World Bank)")

# E. Health
assign_to(L$dep == "DOH" & P("^Health Facilities Enhancement"), "Health", "DOH Health Facilities Enhancement Program")

# F. Power, water, digital, housing, and other GOCC infrastructure
assign_to(L$dep == "BSGC" & A("National Electrification"), "Power, water, digital, and housing", "National Electrification Administration: all lines")
assign_to(L$dep == "DICT" & P("Digital Infrastructure Project|National Broadband|Data Center|Digital Information Infrastructure"),
          "Power, water, digital, and housing", "DICT digital infrastructure, broadband, and data centers")
assign_to((L$dep == "BSGC" & A("National Housing Authority|Social Housing")) | (L$dep == "DHSUD" & P("Pabahay|4PH")),
          "Power, water, digital, and housing", "Housing: NHA, SHFC, and the 4PH program")
assign_to(L$dep == "ALGU" & P("Flood Control"), "Power, water, digital, and housing", "MMDA Metro Manila flood control")
assign_to(L$dep == "BSGC" & A("Local Water Utilities"), "Power, water, digital, and housing", "Local Water Utilities Administration")
kw <- "construct|rehabilitat|repair|building|\\broads?\\b|bridge|halls? of justice|barracks|\\bstations?\\b|infrastructure|facilities\\b"
assign_to(L$dep == "BSGC" & P(kw), "Power, water, digital, and housing", "Other GOCC infrastructure support (ecozones, BCDA, others)")

# G. Public buildings and facilities elsewhere: label names construction/repair/buildings AND at least half capital outlay
co_share <- pmax(L$C26n / ifelse(L$N26 > 0, L$N26, NA), L$C26g / ifelse(L$G26 > 0, L$G26, NA), L$C27 / ifelse(L$N27 > 0, L$N27, NA), na.rm = TRUE)
sweep <- P(kw) & coalesce(co_share, 0) >= 0.5 & L$tab != "SUCs" & !(L$dep %in% c("NDRRMF", "DOTr", "DA", "DICT", "ALGU"))
assign_to(sweep & L$dep %in% c("JUD", "DOJ"), "Public buildings and facilities elsewhere", "Justice sector: halls of justice, prosecution and corrections facilities")
assign_to(sweep & L$dep %in% c("DILG", "DND"), "Public buildings and facilities elsewhere", "Police, fire, jail, and military facilities")
assign_to(sweep, "Public buildings and facilities elsewhere", "All other agencies")

infra_lines <- L %>% mutate(group = grp, item = itm) %>% filter(!is.na(group))
# SUC capital outlays enter as one aggregate row (expense-class basis)
suc_row <- L %>% filter(tab == "SUCs") %>%
  summarise(group = "Education", item = "State Universities and Colleges: capital outlays (all 100+ institutions)",
            N26 = sum(C26n, na.rm = TRUE), G26 = sum(C26g, na.rm = TRUE), N27 = sum(C27, na.rm = TRUE))
grp_levels <- c("DPWH", "Transport outside DPWH", "Agriculture and fisheries", "Education", "Health",
                "Power, water, digital, and housing", "Public buildings and facilities elsewhere")
infra <- infra_lines %>% group_by(group, item) %>% summarise(across(c(N26, G26, N27), ~ sum(.x, na.rm = TRUE)), .groups = "drop") %>%
  bind_rows(suc_row) %>% filter(pmax(N26, G26, N27) >= 0.05) %>%
  mutate(group = factor(group, levels = grp_levels)) %>% arrange(group, desc(N27))
infra_grp <- infra %>% group_by(group) %>% summarise(across(c(N26, G26, N27), sum), .groups = "drop")
infra_tot <- infra_grp %>% summarise(across(c(N26, G26, N27), sum))
ig <- function(g, col = "N27") infra_grp[[col]][infra_grp$group == g]
ii <- function(rx, col = "N27") sum(infra[[col]][str_detect(infra$item, rx)])
igl <- infra_grp %>% pivot_longer(-group) %>%
  mutate(name = factor(recode(name, N26 = "NEP 2026", G26 = "GAA 2026", N27 = "NEP 2027"), levels = c("NEP 2027", "GAA 2026", "NEP 2026")),
         group = factor(group, levels = rev(grp_levels)))
ggplot(igl, aes(value, group, fill = name)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.75) +
  geom_text(aes(label = comma(value, accuracy = 0.1)), position = position_dodge(width = 0.8), hjust = -0.15, size = 3) +
  scale_fill_manual(values = c("NEP 2026" = "#CBC9E2", "GAA 2026" = "#54278F", "NEP 2027" = "#E6550D"), breaks = c("NEP 2026", "GAA 2026", "NEP 2027")) +
  scale_x_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0, 0.1))) +
  labs(x = NULL, y = NULL, title = "Infrastructure lines across the budget, by where they sit",
       subtitle = "Programmed new appropriations, PHP billions",
       caption = "This briefer's grouping of P/A/P lines; narrower than DBM's infrastructure program, which also counts LGU, GOCC, and other infrastructure-related outlays.") +
  theme_pbc() + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey90"))

The inventory comes to ₱1,031B in the NEP, against ₱1,196B in the executive’s previous proposal and ₱896B enacted for 2026. DPWH is 62% of it, so about ₱388B of infrastructure sits outside the department whose projects are now held to a documentation standard. The DBM’s own infrastructure figure, ₱1.467 trillion, is wider: it counts LGU infrastructure funded from the NTA, GOCC investment, and other outlays that are not P/A/P lines.

Three patterns stand out. The increase over 2026 is transport: DPWH recovers ₱113B of what Congress cut and rail more than triples against its enacted level, while nearly every other group is below its enacted level. The social infrastructure that Congress favors moves the other way: classrooms fall from ₱85.4B enacted to ₱30.6B, health facilities from ₱22.3B to ₱14.5B, farm-to-market roads and bridges from ₱33.3B to ₱17.1B, irrigation from ₱63.2B to ₱46.4B, and SUC capital outlays from ₱15.8B to ₱6.4B. And the scattered public buildings (halls of justice, police and fire stations, agency offices) shrink from ₱16.9B to ₱2.8B.

dpl <- infra %>% filter(group == "DPWH") %>% select(item, N26, G26, N27) %>% pivot_longer(-item) %>%
  mutate(name = factor(recode(name, N26 = "NEP 2026", G26 = "GAA 2026", N27 = "NEP 2027"), levels = c("NEP 2027", "GAA 2026", "NEP 2026")),
         item = str_wrap(item, 42))
ord_d <- dpl %>% filter(name == "NEP 2027") %>% arrange(value) %>% pull(item)
ggplot(dpl, aes(value, factor(item, levels = ord_d), fill = name)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.75) +
  geom_text(aes(label = comma(value, accuracy = 0.1)), position = position_dodge(width = 0.8), hjust = -0.15, size = 2.9) +
  scale_fill_manual(values = c("NEP 2026" = "#CBC9E2", "GAA 2026" = "#54278F", "NEP 2027" = "#E6550D"), breaks = c("NEP 2026", "GAA 2026", "NEP 2027")) +
  scale_x_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0, 0.1))) +
  labs(x = NULL, y = NULL, title = "DPWH by program: Congress and the executive want different departments",
       subtitle = "Programmed new appropriations, PHP billions") +
  theme_pbc() + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey90"), axis.text.y = element_text(size = 9, lineheight = 0.9))

Inside DPWH the disagreement between the branches is plain. The executive’s DPWH is built around the national network: Network Development at ₱176.6B, bridges, and asset preservation. Congress’s DPWH in 2026 was built around the Convergence program, which it raised from ₱167.8B to ₱240.5B while cutting Network Development nearly in half and flood management to almost nothing. The 2027 proposal returns to the executive’s version, with one concession: the Convergence program stays close to its NEP 2026 size and is now almost entirely the two BIP lump lines discussed in the red flags section.

idx_i <- table(infra$group)
infra %>% mutate(chg_n = N27 - N26, chg_g = N27 - G26) %>%
  transmute(`Line or group` = item, `NEP 2026` = bn(N26), `GAA 2026` = bn(G26), `NEP 2027` = bn(N27),
            `vs NEP 2026` = ifelse(abs(chg_n) < 0.05, "0.0", sprintf("%+.1f", chg_n)),
            `vs GAA 2026` = ifelse(abs(chg_g) < 0.05, "0.0", sprintf("%+.1f", chg_g))) %>%
  bind_rows(infra_tot %>% transmute(`Line or group` = "All infrastructure lines in this inventory", `NEP 2026` = bn(N26), `GAA 2026` = bn(G26), `NEP 2027` = bn(N27),
                                    `vs NEP 2026` = sprintf("%+.1f", N27 - N26), `vs GAA 2026` = sprintf("%+.1f", N27 - G26))) %>%
  kbl_clean(font = 12.5, align = c("l", rep("r", 5)), caption = "Infrastructure inventory (PHP billions)") %>%
  pack_rows(index = c(setNames(as.integer(idx_i[idx_i > 0]), names(idx_i[idx_i > 0])), "Total" = 1)) %>%
  column_spec(1, width = "46%") %>% row_spec(nrow(infra) + 1, bold = TRUE)
Infrastructure inventory (PHP billions)
Line or group NEP 2026 GAA 2026 NEP 2027 vs NEP 2026 vs GAA 2026
DPWH
Network Development Program 182.5 96.8 176.6 -5.9 +79.8
Convergence and Special Support Program (BIP, SIPAG, other convergence roads) 167.8 240.5 157.3 -10.5 -83.2
Flood Management Program 250.8 4.8 103.5 -147.4 +98.7
Asset Preservation Program 108.3 99.4 76.5 -31.8 -22.9
Support to Operations 82.4 29.6 51.6 -30.8 +22.0
Bridge Program 52.3 34.1 44.4 -7.9 +10.4
General Administration and Support 20.5 16.6 18.1 -2.4 +1.5
Local Program 15.4 7.8 14.6 -0.8 +6.8
Transport outside DPWH
Rail: NSCR, Metro Manila Subway, MRT and LRT projects, LRTA and PNR support 123.5 55.6 195.6 +72.1 +140.0
Road-based public transport: Davao bus project, Cebu BRT, PUV modernization, busway, active transport 3.6 3.8 15.5 +11.9 +11.7
Ports: New Cebu International Container Port and local ports 4.3 4.4 9.0 +4.7 +4.6
Airports and air navigation projects 5.9 7.9 5.8 0.0 -2.0
Agriculture and fisheries
National Irrigation Administration: all lines 45.1 63.2 46.4 +1.3 -16.9
DA farm-to-market roads and bridges 16.1 33.3 17.1 +1.0 -16.1
Philippine Rural Development Project Scale-Up (World Bank) 10.0 10.0 8.9 -1.1 -1.1
DA and BFAR equipment, postharvest facilities, and cold storage 4.3 4.8 5.7 +1.4 +0.9
PFDA: fish ports 2.1 4.5 3.8 +1.7 -0.7
DA small-scale irrigation 1.2 1.2 0.6 -0.5 -0.5
Education
DepEd Basic Education Facilities (classrooms) 28.1 85.4 30.6 +2.5 -54.8
State Universities and Colleges: capital outlays (all 100+ institutions) 9.6 15.8 6.4 -3.2 -9.4
DepEd Infrastructure for Safer and Resilient Schools (World Bank) 9.4 9.4 2.2 -7.2 -7.2
Health
DOH Health Facilities Enhancement Program 14.5 22.3 14.5 0.0 -7.8
Power, water, digital, and housing
National Electrification Administration: all lines 6.4 10.1 6.5 0.0 -3.6
DICT digital infrastructure, broadband, and data centers 8.4 5.2 5.6 -2.8 +0.4
Other GOCC infrastructure support (ecozones, BCDA, others) 6.3 5.6 4.7 -1.6 -0.9
Housing: NHA, SHFC, and the 4PH program 3.1 4.1 3.6 +0.5 -0.5
MMDA Metro Manila flood control 2.6 3.5 3.4 +0.8 -0.1
Public buildings and facilities elsewhere
All other agencies 7.0 8.1 2.6 -4.4 -5.6
Justice sector: halls of justice, prosecution and corrections facilities 2.7 2.7 0.2 -2.5 -2.5
Police, fire, jail, and military facilities 1.8 6.1 0.0 -1.8 -6.1
Total
All infrastructure lines in this inventory 1,195.7 896.5 1,031.1 -164.6 +134.6

“DA and BFAR equipment, postharvest facilities, and cold storage” is the sum of the Provision of Agricultural Equipment and Facilities (PAEF) lines under each DA commodity program (corn, high-value crops, rice, organic, urban agriculture, halal, livestock), BFAR’s Provision of Fishery On-farm/Postharvest Equipment and Facilities, and the Cold Storage Expansion Project. Excludes the calamity fund’s reconstruction lines, Financial Assistance to LGUs (much of which funds local infrastructure but is not itemized), DOTr’s right-of-way payments, and military equipment. SUC figures are capital outlays by expense class; GOCC lines are budgetary support and are classified as MOOE in the source even when they fund construction.

infra_lines %>% filter(coalesce(N26, 0) + coalesce(G26, 0) + coalesce(N27, 0) > 0) %>%
  transmute(Group = group, Department = dep, Agency = agy, `Program / Activity / Project` = PAP,
            `NEP 2026` = N26, `GAA 2026` = G26, `NEP 2027` = N27, `vs NEP 2026` = N27 - N26, `vs GAA 2026` = N27 - G26) %>%
  arrange(desc(`NEP 2027`)) %>%
  dt_table(caption = "Every line in the infrastructure inventory (PHP billions). Filter by group, agency, or keyword to inspect what was classified where.",
           page = 12, money_cols = c("NEP 2026","GAA 2026","NEP 2027","vs NEP 2026","vs GAA 2026"), money_digits = 2)

3.8 What does the budget say about the growth strategy?

A budget reveals a growth theory through the lines it chooses to fund at scale. The table groups the line items that most plausibly carry the government’s bet on future growth, as distinct from lines that pay for current services or transfers.

sum_lines <- function(d, label) d %>% filter(tab != "SUCs") %>%
  summarise(PAP = label, across(c(N26, G26, N27), ~ sum(.x, na.rm = TRUE)))
gl <- function(pap, dep = NULL, agy = NULL) { d <- L %>% filter(str_detect(coalesce(PAP, ""), regex(pap, ignore_case = TRUE)))
  if (!is.null(dep)) d <- d %>% filter(.data$dep == !!dep); if (!is.null(agy)) d <- d %>% filter(str_detect(.data$agy, agy)); d }
growth <- bind_rows(
  bind_rows(
    sum_lines(gl("North-South Commuter Railway", "DOTr"), "DOTr: North-South Commuter Railway"),
    sum_lines(gl("Metro Manila Subway", "DOTr"), "DOTr: Metro Manila Subway"),
    sum_lines(L %>% filter(dep == "DPWH", prog == "3102"), "DPWH: Network Development Program (bypass and diversion roads, missing links, road widening)"),
    sum_lines(L %>% filter(dep == "DPWH", prog == "3103"), "DPWH: Bridge Program"),
    sum_lines(gl("\\bAirports?\\b|CNS/ATM", "DOTr"), "DOTr: airport projects and air traffic management"),
    sum_lines(gl("Container Port", "DOTr"), "DOTr: New Cebu International Container Port"),
    sum_lines(gl("Davao Public Transport Modernization", "DOTr"), "DOTr: Davao Public Transport Modernization Project")) %>%
    mutate(pillar = "Transport and connectivity"),
  bind_rows(
    sum_lines(L %>% filter(dep == "BSGC", str_detect(agy, "National Irrigation")), "National Irrigation Administration: all lines"),
    sum_lines(gl("Rice Competitiveness Enhancement", "DA"), "DA: Rice Competitiveness Enhancement Program"),
    sum_lines(gl("Production Support Services \\(PSS\\) on the National Rice Program", "DA"), "DA: National Rice Program production support"),
    sum_lines(gl("Animal Industry Development", "DA"), "DA: Animal Industry Development and Competitiveness Program (new)"),
    sum_lines(gl("Farm-to-Market Roads", "DA"), "DA: farm-to-market roads"),
    sum_lines(gl("Rice for All", "DA"), "DA: Rice for All")) %>% mutate(pillar = "Agriculture and food"),
  bind_rows(
    sum_lines(gl("Universal Access to Quality Tertiary", "OEOs"), "CHED: Universal Access to Quality Tertiary Education"),
    sum_lines(L %>% filter(str_detect(agy, "Technical Education and Skills")), "TESDA: all lines"),
    sum_lines(L %>% filter(dep == "DOST"), "DOST: all agencies (research councils, scholarships, PAGASA, others)")) %>%
    mutate(pillar = "Skills, science, and technology"),
  bind_rows(
    sum_lines(L %>% filter(dep == "DTI"), "DTI: all agencies"),
    sum_lines(gl("promotion of exports and investments", "DTI"), "  of which: export and investment promotion"),
    sum_lines(gl("MSME Development Plan", "DTI"), "  of which: MSME Development Plan"),
    sum_lines(L %>% filter(str_detect(agy, "Public-Private Partnership")), "PPP Center: all lines"),
    sum_lines(gl("Public-Private Partnership Strategic Support Fund", "DPWH"), "DPWH: PPP Strategic Support Fund")) %>%
    mutate(pillar = "Industry, trade, and investment"),
  bind_rows(
    sum_lines(L %>% filter(dep == "DICT"), "DICT: all agencies"),
    sum_lines(gl("Philippine Digital Infrastructure Project", "DICT"), "  of which: Philippine Digital Infrastructure Project"),
    sum_lines(gl("National Broadband", "DICT"), "  of which: National Broadband Program")) %>% mutate(pillar = "Digital"),
  sum_lines(L %>% filter(dep == "DOE"), "DOE: all lines") %>% mutate(pillar = "Energy"),
  sum_lines(L %>% filter(dep == "DOT"), "DOT: all agencies") %>% mutate(pillar = "Tourism"))
pillar_tot <- growth %>% filter(!str_detect(PAP, "^  of which")) %>% group_by(pillar) %>%
  summarise(across(c(N26, G26, N27), sum), .groups = "drop")
pt <- pillar_tot %>% pivot_longer(-pillar) %>%
  mutate(name = factor(recode(name, N26 = "NEP 2026", G26 = "GAA 2026", N27 = "NEP 2027"),
                       levels = c("NEP 2027", "GAA 2026", "NEP 2026")))
ord_p <- pillar_tot %>% arrange(N27) %>% pull(pillar)
ggplot(pt, aes(value, factor(pillar, levels = ord_p), fill = name)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.75) +
  geom_text(aes(label = comma(value, accuracy = 0.1)), position = position_dodge(width = 0.8), hjust = -0.15, size = 3) +
  scale_fill_manual(values = c("NEP 2026" = "#CBC9E2", "GAA 2026" = "#54278F", "NEP 2027" = "#E6550D"),
                    breaks = c("NEP 2026", "GAA 2026", "NEP 2027")) +
  scale_x_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0, 0.1))) +
  labs(x = NULL, y = NULL, title = "The growth bet is transport concrete and rice; industry, digital, and energy barely register",
       subtitle = "Growth-related line items grouped by pillar, programmed new appropriations, PHP billions",
       caption = "Pillars are this briefer's grouping of selected line items (see table); they are not DBM categories and do not sum to any official total.") +
  theme_pbc() + theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey90"))

gt <- growth %>% mutate(chg = N27 - N26) %>%
  transmute(pillar, `Line item or group` = PAP, `NEP 2026` = bn(N26, 1), `GAA 2026` = bn(G26, 1), `NEP 2027` = bn(N27, 1),
            `Change, NEP to NEP` = ifelse(abs(chg) < 0.05, "0.0", sprintf("%+.1f", chg)))
idx <- table(factor(gt$pillar, levels = unique(gt$pillar)))
gt %>% select(-pillar) %>% kbl_clean(font = 12.5, align = c("l", "r", "r", "r", "r")) %>%
  pack_rows(index = setNames(as.integer(idx), names(idx))) %>% column_spec(1, width = "52%")
Line item or group NEP 2026 GAA 2026 NEP 2027 Change, NEP to NEP
Transport and connectivity
DOTr: North-South Commuter Railway 76.1 28.8 123.8 +47.8
DOTr: Metro Manila Subway 45.4 20.4 67.4 +22.1
DPWH: Network Development Program (bypass and diversion roads, missing links, road widening) 182.5 96.8 176.6 -5.9
DPWH: Bridge Program 52.3 34.1 44.4 -7.9
DOTr: airport projects and air traffic management 5.9 7.9 5.8 0.0
DOTr: New Cebu International Container Port 3.8 3.8 9.0 +5.2
DOTr: Davao Public Transport Modernization Project 1.7 1.7 15.1 +13.3
Agriculture and food
National Irrigation Administration: all lines 45.1 63.2 46.4 +1.3
DA: Rice Competitiveness Enhancement Program 30.0 30.0 30.0 0.0
DA: National Rice Program production support 26.4 26.4 25.6 -0.8
DA: Animal Industry Development and Competitiveness Program (new) 0.0 0.0 20.0 +20.0
DA: farm-to-market roads 16.0 33.0 16.0 0.0
DA: Rice for All 10.0 10.0 10.0 0.0
Skills, science, and technology
CHED: Universal Access to Quality Tertiary Education 27.4 37.5 27.8 +0.4
TESDA: all lines 20.0 26.1 20.9 +0.9
DOST: all agencies (research councils, scholarships, PAGASA, others) 30.0 31.7 30.5 +0.5
Industry, trade, and investment
DTI: all agencies 9.6 9.8 8.8 -0.8
of which: export and investment promotion 0.9 1.0 1.0 +0.1
of which: MSME Development Plan 0.8 0.8 1.0 +0.2
PPP Center: all lines 1.2 1.2 0.6 -0.6
DPWH: PPP Strategic Support Fund 4.0 1.0 1.0 -3.0
Digital
DICT: all agencies 13.8 13.1 12.5 -1.3
of which: Philippine Digital Infrastructure Project 4.8 3.3 2.2 -2.7
of which: National Broadband Program 1.5 0.7 1.1 -0.4
Energy
DOE: all lines 2.4 3.0 2.0 -0.3
Tourism
DOT: all agencies 3.7 4.2 4.0 +0.3

The strategy that emerges is a familiar one: build transport links and raise rice output. Transport and connectivity lines total ₱442B, more than double the ₱193B Congress enacted for the same lines in 2026. Two rail projects and the DPWH network program account for most of it, and a large part is loan-financed. Agriculture follows at ₱148B, anchored by irrigation, the ₱30B rice competitiveness fund, and a new ₱20B animal industry program.

This is also the short-run growth plan. Public construction has been contracting by a third, and the economic managers have said that the recovery they expect in the second half of 2026 depends on DPWH awarding contracts again. Restoring DPWH from ₱529.6B to ₱642.6B and tripling rail are, in effect, the stimulus. Whether it works depends on the execution problem described below, since DOTr and DPWH are the two large departments that pay out the smallest share of what they are allotted.

What the budget does not back is as telling. Goods exports grew 17% in the second quarter on electronics and semiconductors and were the main thing holding growth up, yet export and investment promotion is ₱1.0B and all of DTI is ₱8.8B, down 8.6% from the previous proposal. The Board of Investments’ automotive industry program carries no amount. DICT falls 9% and the World Bank-financed digital infrastructure project is cut by more than half. The Department of Energy gets ₱2.0B in a country where power costs are a standing complaint of manufacturers. The DBCC says it will expedite PPP flagships, while the PPP Center’s budget is halved and DPWH’s PPP support fund drops from ₱4.0B to ₱1.0B. Industry, digital, energy, and tourism together receive ₱29B, against ₱442B for transport.

Two qualifications. Much of Philippine industrial policy runs through tax incentives under CREATE MORE, which are tax expenditures and do not appear in the appropriations at all, so the budget understates the state’s effort there. And human capital is the largest growth investment of all if basic education is counted; the question on that front is quality and learning recovery, and the lines that would signal a push (tertiary education subsidies, TESDA scholarships, DOST’s research agenda) are flat or lower.

3.9 How people-centered is it?

The DBM’s theme invites a direct test: what happens to the lines that put money, food, care, or services directly in people’s hands?

bind_rows(
  pick("^Pantawid Pamilyang", dep = "DSWD"),
  pick("^Social Pension for Indigent", dep = "DSWD"),
  pick("^Protective Services for Individuals", dep = "DSWD"),
  pick("Ayuda sa Kapos ang Kita", dep = "DSWD"),
  pick("^Sustainable Livelihood Program", dep = "DSWD"),
  pick("Walang Gutom", dep = "DSWD"),
  pick("Reducing Food Insecurity and Undernutrition", dep = "DSWD"),
  pick("^Supplementary Feeding", dep = "DSWD"),
  pick("School-Based Feeding Program \\(SBFP\\)$", dep = "DepEd"),
  pick("^Basic Education Facilities", dep = "DepEd"),
  pick("^Textbooks and Other Instructional", dep = "DepEd"),
  pick("^New School Personnel Positions", dep = "DepEd"),
  pick("Universal Access to Quality Tertiary", dep = "OEOs"),
  pick("Medical Assistance to Indigent", dep = "DOH"),
  pick("^Health Facilities Enhancement", dep = "DOH"),
  pick("Operations of DOH Regional Hospitals", dep = "DOH"),
  pick(".", dep = "BSGC", agy = "Philippine Health Insurance", label = "PhilHealth: all budgetary support lines"),
  pick("^Livelihood and Emergency Employment", dep = "DOLE")
) %>% show_lines()
Agency Program / Activity / Project NEP 2026 GAA 2026 NEP 2027 Change, NEP to NEP
DSWD · OSEC Pantawid Pamilyang Pilipino Program (Implementation of Conditional Cash Transfer) 113.00 113.00 99.08 -13.92
DSWD · OSEC Social Pension for Indigent Senior Citizens 49.81 51.86 51.64 +1.83
DSWD · OSEC Protective Services for Individuals and Families in Difficult Circumstances 27.03 63.90 33.28 +6.26
DSWD · OSEC Locally-Funded Project: Ayuda sa Kapos ang Kita Program (AKAP) 0.00 0.00 0.00 0.00
DSWD · OSEC Sustainable Livelihood Program 4.50 5.31 5.12 +0.62
DSWD · OSEC Locally-Funded Project: Walang Gutom 2027: Food STAMP Program 1.89 1.89 1.89 0.00
DSWD · OSEC Foreign-Assisted Project: Reducing Food Insecurity and Undernutrition with Electronic Vouchers Project ADB Loan No. 4646-PHI 0.00 0.00 3.88 +3.88
DSWD · OSEC Supplementary Feeding Program 6.11 9.56 6.36 +0.25
DepEd · OSEC School-Based Feeding Program (SBFP) 11.78 25.70 11.43 -0.35
DepEd · OSEC Basic Education Facilities 28.06 85.40 30.55 +2.50
DepEd · OSEC Textbooks and Other Instructional Materials 11.16 19.51 6.47 -4.69
DepEd · OSEC New School Personnel Positions 42.30 42.30 31.74 -10.56
OEOs · Commission on Higher Education Universal Access to Quality Tertiary Education 27.41 37.55 27.79 +0.38
OEOs · Commission on Higher Education Universal Access to Quality Tertiary Education - Tertiary Education Subsidy 0.00 0.00 0.00 0.00
OEOs · Commission on Higher Education Universal Access to Quality Tertiary Education - Free Higher Education 0.00 0.00 0.00 0.00
DOH · OSEC Medical Assistance to Indigent and Financially - Incapacitated Patients (MAIFIP) 24.24 51.65 24.24 0.00
DOH · OSEC Health Facilities Enhancement Program 14.54 22.29 14.54 0.00
DOH · OSEC Operations of DOH Regional Hospitals and Other Health Facilities 95.26 101.75 102.87 +7.61
BSGC · Philippine Health Insurance Corporation PhilHealth: all budgetary support lines 53.26 129.78 74.45 +21.19
DOLE · OSEC Livelihood and Emergency Employment 14.60 25.36 16.70 +2.10

PHP billions. A zero means the line carried no amount in that budget. “Protective Services” is the line that carries AICS; “Livelihood and Emergency Employment” carries TUPAD.

The pattern is consistent. Wage-driven lines rise: school operations, regional hospitals, new teaching positions (though fewer than in 2026). Rules-based transfers are flat or cut: social pension is flat, the food stamp program is flat at ₱1.89B for the fourth year, and 4Ps falls below ₱100B for the first time in years while food inflation erodes the grant. Discretionary assistance is reset to the executive’s previous ask, which means halved against the current year: AICS, MAIFIP, school feeding, classrooms, and textbooks.

There is a defensible logic in the last of these. Lines like AICS and MAIFIP have grown through congressional insertion, reach beneficiaries through politicians’ referrals, and are the core of what PBC calls soft pork (see the red flags section). But the NEP takes the money out without putting it anywhere people can reach it by right. 4Ps, social pension, the food stamp program, PhilHealth benefit expansion, and crop insurance are the rules-based alternatives, and none of them grows. A people-centered budget would have moved the ayuda money into those.

3.10 How responsive is it to the crises of 2026?

The DBCC’s own statement names the shocks: the Middle East conflict and oil prices, elevated inflation, a looming El Niño, slower remittances. This section checks the budget lines that would carry a response to each.

3.10.1 Fuel and transport

bind_rows(
  pick("Fuel Subsidy to Transport Sector", dep = "DOTr"),
  pick("Fuel Assistance to Farmers", dep = "DA"),
  pick("Fuel Assistance to Fisherfolk", dep = "DA"),
  pick("Service Contracting", dep = "DOTr"),
  pick("Public Transport Modernization Program", dep = "DOTr"),
  pick("EDSA Busway", dep = "DOTr"),
  pick("Active Transport", dep = "DOTr"),
  pick("Cebu Bus Rapid Transit", dep = "DOTr"),
  pick("Davao Public Transport Modernization", dep = "DOTr"),
  pick("North-South Commuter Railway", dep = "DOTr"),
  pick("Metro Manila Subway", dep = "DOTr")
) %>% show_lines()
Agency Program / Activity / Project NEP 2026 GAA 2026 NEP 2027 Change, NEP to NEP
DOTr · OSEC Locally-Funded Project: Fuel Subsidy to Transport Sector Affected by Rising Fuel Prices 0.00 0.00 0.00 0.00
DA · OSEC Locally-Funded Project: Fuel Assistance to Farmers 0.00 0.00 0.00 0.00
DA · Bureau of Fisheries and Aquatic Resources Locally-Funded Project: Fuel Assistance to Fisherfolk 0.00 0.00 0.00 0.00
DOTr · OSEC Locally-Funded Project: Service Contracting of Public Utility Vehicle Program 1.30 0.00 0.00 -1.30
DOTr · OSEC Locally-Funded Project: Service Contracting Program for Public Transport (Intermodal and Multimodal) 0.00 1.00 0.00 0.00
DOTr · OSEC Locally-Funded Project: Public Transport Modernization Program (PTMP) 1.23 1.53 0.18 -1.06
DOTr · OSEC Locally-Funded Project: EDSA Busway Project 0.09 0.00 0.00 -0.09
DOTr · OSEC Locally-Funded Project: Active Transport Bike Share System and Safe Pathways Program 0.07 0.11 0.03 -0.04
DOTr · OSEC Foreign-Assisted Project: Cebu Bus Rapid Transit (BRT) Project IBRD Loan No. 8444-PH, CTF Loan No. TF017646-PH and AFD Loan No. CPH 1007 02 R 0.43 0.43 0.18 -0.26
DOTr · OSEC Foreign-Assisted Project: Davao Public Transport Modernization Project (DPTMP) ADB Loan Nos. 4324-PHI, 8450-PHI and 8449-PHI 1.74 1.74 15.08 +13.34
DOTr · OSEC Foreign-Assisted Project: North-South Commuter Railway (NSCR) System ADB Loan Nos. 3796-PHI, 4188-PHI and 4589-PHI, and JICA Loan Nos. PH-P262, PH-P270, PH-P276 and PH-P277 76.09 28.79 123.84 +47.75
DOTr · OSEC Foreign-Assisted Project: Metro Manila Subway Project (MMSP) Phase I JICA Loan Nos. PH-P267, PH-P275, PH-P279 and PH-P286 45.37 20.39 67.44 +22.07

Every dedicated fuel-relief line is at zero. DOTr’s fuel subsidy for the transport sector was ₱2.5B in 2025 and carries no amount in NEP 2026, GAA 2026, or NEP 2027. The DA’s fuel assistance to farmers no longer exists as a line, and BFAR’s fuel assistance to fisherfolk carries no amount. Service Contracting, which pays operators per kilometer and so cushions drivers and commuters at once, had ₱1.3B in NEP 2026 and ₱1.0B in the GAA; it has no line in NEP 2027. The PUV modernization program falls from ₱1.23B to ₱0.18B.

DOTr’s budget grows by ₱103B, and nearly all of it is two rail projects. Rail matters and deserves defending, but it delivers years from now. The one road-based exception is the Davao Public Transport Modernization Project, which rises from ₱1.7B to ₱15.1B. In past years fuel subsidies have also been lodged in unprogrammed appropriations with an oil-price trigger; the DBM describes the 2027 unprogrammed fund as limited mainly to PDIC and foreign-assisted project cover, so there appears to be no standby there either.

3.10.2 El Niño, water, and food

nia <- function(p) pick(p, dep = "BSGC", agy = "National Irrigation")
bind_rows(
  pick(".", dep = "BSGC", agy = "National Irrigation", label = "National Irrigation Administration: all lines"),
  nia("^Repair of National Irrigation Systems"), nia("^Repair of Communal Irrigation Systems"),
  nia("^Restoration of National Irrigation"), nia("^Restoration of Communal Irrigation"),
  nia("^Small Irrigation Project"), nia("^Repair of Pump Irrigation"), nia("^Establishment of Pump Irrigation"),
  nia("^Quick Response Fund"),
  pick("Small Water Irrigation and Impounding", dep = "DA"),
  pick("^Quick Response Fund", dep = "DA", agy = "OSEC"),
  pick(".", dep = "BSGC", agy = "Crop Insurance"),
  pick("^Local palay procurement", dep = "BSGC"),
  pick("Production Support Services \\(PSS\\) on the National Rice Program", dep = "DA"),
  pick("Rice Competitiveness Enhancement", dep = "DA"),
  pick("Rice for All", dep = "DA"),
  pick("Water Supply/ Septage", dep = "DPWH"),
  pick("Level III potable water", dep = "BSGC")
) %>% show_lines()
Agency Program / Activity / Project NEP 2026 GAA 2026 NEP 2027 Change, NEP to NEP
BSGC · National Irrigation Administration National Irrigation Administration: all lines 45.07 63.25 46.36 +1.29
BSGC · National Irrigation Administration Repair of National Irrigation Systems (NIS) 8.20 11.43 2.02 -6.18
BSGC · National Irrigation Administration Repair of Communal Irrigation Systems (CIS) 2.79 4.21 0.92 -1.87
BSGC · National Irrigation Administration Restoration of National Irrigation Systems 1.18 1.14 1.00 -0.18
BSGC · National Irrigation Administration Restoration of Communal Irrigation Systems 1.14 1.43 0.25 -0.89
BSGC · National Irrigation Administration Small Irrigation Project (SIP), Nationwide 2.10 2.15 0.20 -1.90
BSGC · National Irrigation Administration Repair of Pump Irrigation Systems 0.63 0.67 3.00 +2.37
BSGC · National Irrigation Administration Establishment of Pump Irrigation Project (EPIP) 4.02 6.27 7.02 +3.00
BSGC · National Irrigation Administration Quick Response Fund 0.30 0.30 1.70 +1.40
DA · OSEC Locally-Funded Project: Development of Upland Irrigation Systems and Small Water Irrigation and Impounding Project 0.50 0.50 0.46 -0.04
DA · OSEC Quick Response Fund 1.00 1.00 1.00 0.00
BSGC · Philippine Crop Insurance Corporation Agricultural insurance for farmers and fisherfolk under the RSBSA 4.50 6.50 4.50 0.00
BSGC · National Food Authority Local palay procurement 11.18 11.18 11.18 0.00
DA · OSEC Production Support Services (PSS) on the National Rice Program 26.41 26.41 25.62 -0.79
DA · OSEC Locally-Funded Project: Rice Competitiveness Enhancement Program 30.00 30.00 30.00 0.00
DA · OSEC Locally-Funded Project: Rice for All Program 10.00 10.00 10.00 0.00
DPWH · OSEC Construction/ Rehabilitation of Water Supply/ Septage and Sewerage/ Rain Water Collectors 2.28 1.87 7.30 +5.02
BSGC · Local Water Utilities Administration Provision of Level III potable water supply and adequate sanitation system 0.03 0.00 0.03 0.00

There are real drought signals inside NIA: pump irrigation repair rises from ₱0.63B to ₱3.0B, new pump irrigation from ₱4.0B to ₱7.0B, and NIA’s quick response fund from ₱0.3B to ₱1.7B. DPWH’s water supply line triples to ₱7.3B. But the repair and restoration of existing gravity systems, which is what keeps water moving to the largest service areas, falls sharply: national systems from ₱8.2B to ₱2.0B, communal systems from ₱2.8B to ₱0.9B, and small irrigation projects from ₱2.1B to ₱0.2B.

The risk-transfer and price-support lines do not move at all. Crop insurance premiums are ₱4.5B for the third straight proposal, in the year claims should spike. NFA palay procurement is ₱11.18B, which at higher farmgate prices buys fewer tons. The DA’s quick response fund is ₱1.0B. The Local Water Utilities Administration receives ₱0.03B. A dedicated El Niño response is nowhere visible as a line item; if it exists, it is inside the ₱25.6B rice production support lump, where it cannot be tracked.

One apparent cut is a relabel: the National Livestock Program’s production support (₱2.98B) goes to zero, but a new ₱20B Animal Industry Development and Competitiveness Program appears.

3.10.3 Electricity

bind_rows(
  pick(".", dep = "DOE", label = "Department of Energy: all lines"),
  pick("energy efficiency and conservation", dep = "DOE"),
  pick("^Promotion of renewable energy", dep = "DOE"),
  pick(".", dep = "BSGC", agy = "National Electrification", label = "National Electrification Administration: all lines"),
  pick("Electric Cooperatives Emergency and Resiliency", dep = "BSGC"),
  pick("Missionary Areas", dep = "BSGC"),
  pick(".", dep = "OEOs", agy = "Energy Regulatory", label = "Energy Regulatory Commission: all lines")
) %>% show_lines()
Agency Program / Activity / Project NEP 2026 GAA 2026 NEP 2027 Change, NEP to NEP
DOE · OSEC Department of Energy: all lines 2.37 2.96 2.03 -0.34
DOE · OSEC Supervision, development and implementation of energy efficiency and conservation programs (EECP) and projects 0.05 0.05 0.06 0.00
DOE · OSEC Promotion of renewable energy (RE) resources and payment of other obligations of the Republic of the Philippines pursuant to sovereign commitments 0.02 0.02 0.04 +0.02
BSGC · National Electrification Administration National Electrification Administration: all lines 6.44 10.13 6.49 +0.04
BSGC · National Electrification Administration Locally-Funded Project: Electric Cooperatives Emergency and Resiliency Fund 0.20 0.20 0.20 0.00
BSGC · National Power Corporation Provision of adequate, sustainable, reliable and quality supply of electricity to Missionary Areas 1.56 1.87 2.00 +0.44
OEOs · Energy Regulatory Commission Energy Regulatory Commission: all lines 0.88 0.90 0.92 +0.04

There is little here to cut, and that is the finding. The Department of Energy’s entire budget is ₱2.0B, down 14%. Energy efficiency and conservation gets ₱0.06B and renewable energy promotion ₱0.04B. The NEA is flat at ₱6.5B against ₱10.1B enacted; the Energy Regulatory Commission, which decides every rate case, is flat at ₱0.9B. No on-budget line exists for consumer power relief. The lifeline rate is paid for by other ratepayers, not by the budget.

3.10.4 Disaster funds and general shock absorbers

bind_rows(
  pick(".", dep = "NDRRMF", label = "NDRRM Fund (calamity fund): all lines"),
  pick("disaster risk reduction or mitigation, prevention and preparedness", dep = "NDRRMF"),
  pick(".", dep = "Contingent Fund", label = "Contingent Fund"),
  pick("^Financial Assistance to Local Government", dep = "ALGU"),
  pick("^Growth Equity Fund", dep = "ALGU"),
  pick("^Quick Response Fund", dep = "DSWD"),
  pick("^Disaster Response and Rehabilitation", dep = "DSWD")
) %>% show_lines()
Agency Program / Activity / Project NEP 2026 GAA 2026 NEP 2027 Change, NEP to NEP
NDRRMF · National Disaster Risk Reduction and Management Fund ( Calamity Fund ) NDRRM Fund (calamity fund): all lines 31.00 39.82 45.67 +14.67
NDRRMF · National Disaster Risk Reduction and Management Fund ( Calamity Fund ) For disaster risk reduction or mitigation, prevention and preparedness activities such as but not limited to training of personnel, procurement of equipment, capital expenditures and other pre-disaster activities including aid, relief, recovery, reconstruction and other work or services in connection with natural or human induced calamities 0.00 0.00 30.00 +30.00
Contingent Fund · Contingent Fund Contingent Fund 13.00 13.00 13.00 0.00
ALGU · Local Government Support Fund (formerly Financial Subsidy to LGUs) Financial Assistance to Local Government Units 5.00 37.49 37.49 +32.49
ALGU · Local Government Support Fund (formerly Financial Subsidy to LGUs) Growth Equity Fund 1.00 11.30 10.30 +9.30
DSWD · OSEC Quick Response Fund 1.25 3.00 1.25 0.00
DSWD · OSEC Disaster Response and Rehabilitation Program 1.94 2.19 1.97 +0.04

The calamity fund does rise, from ₱31.0B to ₱45.7B. It does so through a new ₱30B lump for “disaster risk reduction or mitigation, prevention and preparedness,” alongside ₱37.5B in Financial Assistance to LGUs and a ₱13B Contingent Fund. The money that could respond to a crisis is therefore held in discretionary pools released at the executive’s judgment, while the rule-based lines (fuel subsidies with a price trigger, crop insurance, 4Ps) are flat, cut, or empty.

3.10.5 Other shocks to plan for

bind_rows(
  pick(".", dep = "DMW", label = "Department of Migrant Workers: all lines"),
  pick("Worker's Welfare and Government Placement", dep = "DMW"),
  pick("^Welfare Services", dep = "DMW"),
  pick("Overseas Employment Facilitation", dep = "DMW"),
  pick("^Job Search Assistance", dep = "DOLE"),
  L %>% filter(dep == "DPWH", prog == "3201") %>%
    summarise(dep = "DPWH", agy = "OSEC", PAP = "Flood Management Program: all lines",
              across(c(N26, G26, N27), ~ sum(.x, na.rm = TRUE))),
  pick("Drainage along National Roads", dep = "DPWH", label = "Drainage along national roads: primary, secondary, and tertiary"),
  pick("Evacuation Centers", dep = "DPWH", label = "BIP and SIPAG evacuation centers and public health facilities"),
  pick("Retrofitting/ Strengthening of Permanent Bridges", dep = "DPWH"),
  pick("Emergency Housing Assistance", dep = "BSGC"),
  pick("Integrated Disaster Shelter Assistance", dep = "DHSUD"),
  pick("^Epidemiology and Surveillance", dep = "DOH")
) %>% show_lines()
Agency Program / Activity / Project NEP 2026 GAA 2026 NEP 2027 Change, NEP to NEP
DMW · OSEC Department of Migrant Workers: all lines 9.48 11.02 10.68 +1.20
DMW · OSEC Worker’s Welfare and Government Placement Services 4.00 4.80 4.65 +0.65
DMW · Overseas Workers Welfare Administration Welfare Services 2.32 3.12 3.29 +0.96
DMW · OSEC Overseas Employment Facilitation Services 0.10 0.10 0.09 0.00
DOLE · OSEC Job Search Assistance 0.13 0.13 0.13 0.00
DPWH · OSEC Flood Management Program: all lines 250.83 4.76 103.45 -147.38
DPWH · OSEC Drainage along national roads: primary, secondary, and tertiary 11.75 16.89 3.22 -8.53
DPWH · OSEC BIP and SIPAG evacuation centers and public health facilities 1.93 5.81 0.00 -1.93
DPWH · OSEC Retrofitting/ Strengthening of Permanent Bridges 7.63 4.82 3.01 -4.63
BSGC · National Housing Authority Locally-Funded Project: Emergency Housing Assistance Program 0.20 0.76 0.00 -0.20
DHSUD · OSEC Integrated Disaster Shelter Assistance Program 0.41 0.00 0.00 -0.41
DOH · OSEC Epidemiology and Surveillance 0.44 0.44 0.48 +0.04

Four more pressures are foreseeable, and the budget is thin on each.

A jobs slump. With investment contracting and unemployment rising, DOLE’s Job Search Assistance is ₱0.13B, TUPAD reverts to ₱16.7B, and no adjustment program for displaced workers exists.

Returning overseas workers. More than two million Filipinos work in the Middle East. The DMW’s budget is ₱10.4B, below the ₱10.8B enacted for 2026; the welfare line that carries the AKSYON Fund slips from ₱4.80B to ₱4.65B; overseas employment facilitation is ₱0.09B. No reintegration line exists in DMW or DOLE, although the President’s 2026 State of the Nation Address promised livelihood funding and job placement for returnees.

A wet year after the dry one. Flood management is ₱103.5B against ₱250.8B in the previous proposal. Drainage along national roads falls from ₱11.75B to ₱3.2B. The evacuation center lines Congress funded at ₱5.8B in 2026 do not appear. NHA’s emergency housing assistance and DHSUD’s disaster shelter assistance are both gone, and bridge retrofitting is down to ₱3.0B from ₱10.4B in the 2025 GAA. PBC is not arguing for restoring DPWH flood control as it was. The problem is that the money left and the function was not moved anywhere else.

The peso and imported costs. Flat peso amounts for fuel, fertilizer, rice, and medicines are real cuts when the peso is at a record low. DOH’s nationally procured commodities line falls from ₱10.2B to ₱9.1B. The large rail loans are yen and dollar exposures.

3.11 Can the government spend it?

util <- bds_long %>% filter(AGENCY == DEPARTMENT, year %in% 2023:2025) %>%
  select(Department = DEPARTMENT, PARTICULAR, year, amt) %>%
  filter(PARTICULAR %in% c("Allotments","Obligations","Disbursements")) %>%
  pivot_wider(names_from = PARTICULAR, values_from = amt) %>%
  mutate(obl = Obligations / Allotments * 100, dis = Disbursements / Allotments * 100)   # both rates on the same base
u25 <- util %>% filter(year == 2025, !Department %in% c("Total Budget"), !is.na(obl), !is.na(dis), Allotments >= 10) %>%
  mutate(dep = coalesce(str_match(Department, "\\(([^)]+)\\)\\s*$")[,2], Department),
         dep = ifelse(str_detect(Department, "^Total National"), "All NGAs", dep)) %>%
  select(dep, Allotments, `Obligations as % of allotments` = obl, `Disbursements as % of allotments` = dis) %>%
  pivot_longer(-c(dep, Allotments))
ord_u <- u25 %>% filter(name == "Disbursements as % of allotments") %>% arrange(value) %>% pull(dep)
ggplot(u25, aes(value, factor(dep, levels = ord_u), color = name)) +
  geom_vline(xintercept = 100, color = "grey80") +
  geom_line(aes(group = dep), color = "grey75", linewidth = 1.2) +
  geom_point(size = 3) +
  scale_color_manual(values = c("Obligations as % of allotments" = "#3182BD", "Disbursements as % of allotments" = "#E6550D"),
                     breaks = c("Obligations as % of allotments", "Disbursements as % of allotments")) +
  scale_x_continuous(labels = function(x) paste0(x, "%"), limits = c(30, 102)) +
  labs(x = NULL, y = NULL, title = "DPWH paid out 36 centavos of every peso it was allotted in 2025",
       subtitle = "FY 2025 budget utilization, departments with allotments of PHP 10B or more",
       caption = "Both rates are read against total allotments, which include continuing appropriations. The gap between the two dots is money obligated but not yet paid.\nNo FY 2026 execution data are available yet.") +
  theme_pbc() + theme(panel.grid.major.y = element_line(color = "grey93"))

Two rates on the same base tell the story. Obligations as a share of allotments show how much of its authority an agency committed; disbursements as a share of allotments show how much it actually paid out. Government-wide, the first fell from 94.2% in 2023 to 91.7% in 2025, and the second from 81.2% to 76.0%. DPWH ended 2025 having obligated 79.5% of its allotments and disbursed 36.3%, leaving ₱278B uncommitted and another ₱585B committed but unpaid. DOTr disbursed 52.7% of its allotments and DA 59.4%. At the other end, the Judiciary paid out 98.5%, DILG 92.0%, DSWD 91.5%, and DepEd 86.1%.

This matters for every recommendation below. A department that cannot pay out is a poor place to put crisis money, and a good place to look for room. Where a response can run through DSWD’s payment systems, it will reach people faster than one that has to pass through a public works pipeline that is still restarting.

util %>% filter(!is.na(obl)) %>%
  transmute(Department, Year = year, Allotments, Obligations, Disbursements,
            `Obligations / allotments (%)` = obl, `Disbursements / allotments (%)` = dis) %>%
  arrange(desc(Year), desc(Allotments)) %>%
  dt_table(caption = "Budget utilization by department, FY 2023 to FY 2025 (PHP billions)", page = 12,
           money_cols = c("Allotments","Obligations","Disbursements"),
           pct_cols = c("Obligations / allotments (%)","Disbursements / allotments (%)"))

4 Red flags to watch

PBC’s working taxonomy distinguishes soft pork (assistance programs whose beneficiaries are identified through politicians), hard pork (small, locally identified infrastructure), and the unprogrammed fund that has been used to pay for both. All three have a track record that the P/A/P data make visible, because the fingerprint of pork is the gap between what the executive proposes and what Congress enacts.

4.1 The red-flag total

ua <- bds_long %>% filter(DEPARTMENT == "Total Budget", PARTICULAR %in% c("NEP New Appropriations","GAA New Appropriations"), year >= 2020) %>%
  mutate(src = ifelse(str_detect(PARTICULAR, "^NEP"), "NEP", "GAA")) %>%
  left_join(pap_tot, by = c("src","year"), suffix = c("_new","_prog")) %>%
  mutate(ua = amt_new - amt_prog,
         src = factor(ifelse(src == "NEP", "NEP (proposed)", "GAA (enacted)"), levels = names(src_pal))) %>% filter(!is.na(ua))
sl <- function(d) d %>% summarise(across(c(N26, G26, N27), ~ sum(.x, na.rm = TRUE)))
Lq <- function(pap, dep, agy = NULL) { d <- L %>% filter(.data$dep == !!dep, str_detect(coalesce(PAP, ""), regex(pap, ignore_case = TRUE)))
  if (!is.null(agy)) d <- d %>% filter(str_detect(.data$agy, agy)); sl(d) }
manual <- function(a, b, c) tibble::tibble(N26 = a, G26 = b, N27 = c)
score <- bind_rows(
  Lq("^Protective Services for Individuals", "DSWD") %>% mutate(group = "Programs at high risk of political patronage", item = "DSWD Protective Services (AICS)"),
  manual(12.144, 22.444, 14.246) %>% mutate(group = "Programs at high risk of political patronage", item = "DOLE TUPAD*"),
  Lq("Medical Assistance to Indigent", "DOH") %>% mutate(group = "Programs at high risk of political patronage", item = "DOH MAIFIP"),
  Lq("Tulong Dunong", "OEOs") %>% mutate(group = "Programs at high risk of political patronage", item = "CHED Tulong Dunong"),
  Lq("Presidential Assistance to Farmers", "DA") %>% mutate(group = "Programs at high risk of political patronage", item = "DA Presidential Assistance to Farmers and Fisherfolk"),
  manual(10.763, 11.816, 10.770) %>% mutate(group = "Programs at high risk of political patronage", item = "Confidential and intelligence funds, all agencies*"),
  Lq("^Financial Assistance to Local Government", "ALGU") %>% mutate(group = "Programs at high risk of political patronage", item = "Financial Assistance to LGUs"),
  Lq("Barangay Development Program", "ALGU") %>% mutate(group = "Programs at high risk of political patronage", item = "NTF-ELCAC support to barangays"),
  Lq("^Growth Equity Fund", "ALGU") %>% mutate(group = "Programs at high risk of political patronage", item = "Growth Equity Fund"),
  sl(L %>% filter(dep == "OP")) %>% mutate(group = "Political offices", item = "Office of the President**"),
  sl(L %>% filter(dep == "OVP")) %>% mutate(group = "Political offices", item = "Office of the Vice President"),
  sl(L %>% filter(dep == "CONGRESS")) %>% mutate(group = "Political offices", item = "Congress: Senate, House of Representatives, electoral tribunals, and Commission on Appointments"),
  Lq("Farm-to-Market Roads in", "DA") %>% mutate(group = "Infrastructure at risk of insertions", item = "DA farm-to-market roads"),
  Lq("Provision of Agricultural Equipment and Facilities|Fishery On-farm/Postharvest Equipment|Cold Storage", "DA") %>% mutate(group = "Infrastructure at risk of insertions", item = "DA and BFAR equipment, postharvest facilities, and cold storage"),
  sl(L %>% filter(dep == "BSGC", str_detect(agy, "National Irrigation"))) %>% mutate(group = "Infrastructure at risk of insertions", item = "National Irrigation Administration"),
  Lq("^Health Facilities Enhancement", "DOH") %>% mutate(group = "Infrastructure at risk of insertions", item = "DOH Health Facilities Enhancement Program"),
  Lq("^Basic Education Facilities", "DepEd") %>% mutate(group = "Infrastructure at risk of insertions", item = "DepEd Basic Education Facilities"),
  sl(L %>% filter(dep == "DPWH", prog == "3101")) %>% mutate(group = "Infrastructure at risk of insertions", item = "DPWH Asset Preservation Program"),
  sl(L %>% filter(dep == "DPWH", prog == "3102")) %>% mutate(group = "Infrastructure at risk of insertions", item = "DPWH Network Development Program"),
  sl(L %>% filter(dep == "DPWH", prog == "3103")) %>% mutate(group = "Infrastructure at risk of insertions", item = "DPWH Bridge Program"),
  sl(L %>% filter(dep == "DPWH", prog == "3201")) %>% mutate(group = "Infrastructure at risk of insertions", item = "DPWH Flood Management Program"),
  sl(L %>% filter(dep == "DPWH", prog == "3002")) %>% mutate(group = "Infrastructure at risk of insertions", item = "DPWH Convergence and Special Support Program (BIP, SIPAG, and other convergence roads)"),
  sl(L %>% filter(dep == "DPWH", prog == "3001")) %>% mutate(group = "Infrastructure at risk of insertions", item = "DPWH Local Program"),
  ua %>% mutate(k = ifelse(src == "NEP (proposed)", paste0("N", year - 2000), paste0("G", year - 2000))) %>%
    filter(k %in% c("N26", "G26", "N27")) %>% select(k, ua) %>% pivot_wider(names_from = k, values_from = ua) %>%
    mutate(group = "Unprogrammed appropriations", item = "Unprogrammed appropriations"))
grp_tot <- score %>% group_by(group) %>% summarise(across(c(N26, G26, N27), sum), .groups = "drop")
rf_no_ua <- grp_tot %>% filter(group != "Unprogrammed appropriations") %>% summarise(across(c(N26, G26, N27), sum))
rf_all   <- grp_tot %>% summarise(across(c(N26, G26, N27), sum))
st <- bind_rows(score, grp_tot %>% mutate(item = "Subtotal")) %>%
  mutate(group = factor(group, levels = unique(score$group))) %>% arrange(group, item == "Subtotal") %>%
  filter(!(group == "Unprogrammed appropriations" & item == "Subtotal"))
idx <- table(st$group)
bind_rows(st %>% select(item, N26, G26, N27),
          rf_no_ua %>% mutate(item = "Total red flags, excluding unprogrammed"),
          rf_all %>% mutate(item = "Total red flags, including unprogrammed")) %>%
  transmute(` ` = item, `NEP 2026` = bn(N26), `GAA 2026` = bn(G26), `NEP 2027` = bn(N27)) %>%
  kbl_clean(font = 12.5, align = c("l", "r", "r", "r"), caption = "PBC's red-flag tally (PHP billions)") %>%
  pack_rows(index = c(setNames(as.integer(idx), names(idx)), "Totals" = 2)) %>%
  row_spec(which(st$item == "Subtotal"), bold = TRUE) %>% row_spec(nrow(st) + 1:2, bold = TRUE)
PBC’s red-flag tally (PHP billions)
NEP 2026 GAA 2026 NEP 2027
Programs at high risk of political patronage
DSWD Protective Services (AICS) 27.0 63.9 33.3
DOLE TUPAD* 12.1 22.4 14.2
DOH MAIFIP 24.2 51.6 24.2
CHED Tulong Dunong 0.0 2.7 0.0
DA Presidential Assistance to Farmers and Fisherfolk 0.0 10.0 0.0
Confidential and intelligence funds, all agencies* 10.8 11.8 10.8
Financial Assistance to LGUs 5.0 37.5 37.5
NTF-ELCAC support to barangays 8.1 8.1 9.7
Growth Equity Fund 1.0 11.3 10.3
Subtotal 88.3 219.4 140.1
Political offices
Office of the President** 27.3 28.0 10.1
Office of the Vice President 0.9 0.9 0.8
Congress: Senate, House of Representatives, electoral tribunals, and Commission on Appointments 26.4 38.6 27.0
Subtotal 54.6 67.5 37.9
Infrastructure at risk of insertions
DA farm-to-market roads 16.0 33.0 16.0
DA and BFAR equipment, postharvest facilities, and cold storage 4.3 4.8 5.7
National Irrigation Administration 45.1 63.2 46.4
DOH Health Facilities Enhancement Program 14.5 22.3 14.5
DepEd Basic Education Facilities 28.1 85.4 30.6
DPWH Asset Preservation Program 108.3 99.4 76.5
DPWH Network Development Program 182.5 96.8 176.6
DPWH Bridge Program 52.3 34.1 44.4
DPWH Flood Management Program 250.8 4.8 103.5
DPWH Convergence and Special Support Program (BIP, SIPAG, and other convergence roads) 167.8 240.5 157.3
DPWH Local Program 15.4 7.8 14.6
Subtotal 885.0 692.1 686.0
Unprogrammed appropriations
Unprogrammed appropriations 250.0 150.9 112.0
Totals
Total red flags, excluding unprogrammed 1,027.9 979.0 864.0
Total red flags, including unprogrammed 1,277.8 1,129.9 976.0

*TUPAD and confidential and intelligence funds are sub-line figures from PBC’s budget tracker; they are not separable in the P/A/P workbook. All other rows are computed from the workbook. The UA row is defined in the unprogrammed appropriations section below. **The Office of the President’s FY 2026 figures include ₱17.55B for hosting the ASEAN summits, a one-time item. Its confidential and intelligence funds are part of its budget and are also counted in the all-agency row above, so the totals overstate by that overlap (historically about ₱4.5B).

PBC tracks a fixed basket of lines through every stage of the budget: programs where beneficiaries are identified through politicians; the budgets of the political offices themselves (the Office of the President, the Office of the Vice President, and Congress); the infrastructure programs where projects are chosen district by district or where insertions have concentrated, in DPWH and in the DA, NIA, DOH, and DepEd; and the unprogrammed fund. The basket is ₱864.0B in the NEP, or ₱976.0B with unprogrammed appropriations. That is 19% of programmed new appropriations. It is below the executive’s previous proposal because flood control is less than half what was proposed a year ago, and below the 2026 GAA because the ayuda add-ons were not carried forward. The test is where it stands after bicam: in 2026 Congress cut the infrastructure part of the basket and more than doubled the patronage part, from ₱88.3B to ₱219.4B.

4.2 Soft pork: the ayuda lines

series <- function(d, label) d %>% summarise(across(matches("^[ng]20\\d\\d$"), ~ if (all(is.na(.x))) NA_real_ else sum(.x, na.rm = TRUE))) %>%
  mutate(line = label) %>% bind_cols(d %>% summarise(n2027 = if (all(is.na(N27))) NA_real_ else sum(N27, na.rm = TRUE)))
Lf <- function(pap, dep, agy = NULL) { d <- L %>% filter(.data$dep == !!dep, str_detect(coalesce(PAP, ""), regex(pap, ignore_case = TRUE)))
  if (!is.null(agy)) d <- d %>% filter(str_detect(.data$agy, agy)); d }
soft <- bind_rows(
  series(Lf("^Protective Services for Individuals", "DSWD"), "DSWD Protective Services (AICS)"),
  series(Lf("Ayuda sa Kapos ang Kita", "DSWD"), "DSWD AKAP"),
  series(Lf("Medical Assistance to Indigent", "DOH"), "DOH MAIFIP"),
  series(Lf("^Livelihood and Emergency Employment", "DOLE"), "DOLE TUPAD and livelihood"),
  series(Lf("^Financial Assistance to Local Government", "ALGU"), "Financial Assistance to LGUs"),
  series(Lf("Tulong Dunong", "OEOs"), "CHED Tulong Dunong")
) %>% rename(n2027x = n2027) %>%
  pivot_longer(matches("^[ng]20\\d\\d$"), names_to = "k", values_to = "v") %>%
  mutate(src = ifelse(substr(k, 1, 1) == "n", "NEP (proposed)", "GAA (enacted)"), year = as.integer(substr(k, 2, 5))) %>%
  bind_rows(., distinct(., line, n2027x) %>% transmute(line, src = "NEP (proposed)", year = 2027L, v = n2027x)) %>%
  filter(year >= 2020) %>% select(line, src, year, v) %>%
  group_by(line) %>% filter(year >= min(year[coalesce(v, 0) > 0])) %>% ungroup() %>%
  mutate(src = factor(src, levels = names(src_pal)))
ggplot(soft %>% filter(!is.na(v)), aes(year, v, color = src)) +
  geom_line(linewidth = 1) + geom_point(size = 1.8) +
  facet_wrap(~ line, scales = "free_y", ncol = 3) +
  scale_color_manual(values = src_pal, breaks = names(src_pal)) +
  scale_x_continuous(breaks = seq(2020, 2027, 1), labels = function(x) paste0("'", substr(x, 3, 4))) +
  scale_y_continuous(labels = function(x) paste0(comma(x, accuracy = 1), "B"), limits = c(0, NA)) +
  labs(x = NULL, y = "PHP billions", title = "The ayuda cycle: Congress adds, the next NEP resets, Congress adds again",
       subtitle = "Proposed (NEP) and enacted (GAA) amounts, FY 2020 to FY 2027. FY 2027 has a proposal only.",
       caption = "AKAP has never carried an amount in any NEP; it exists only in enacted budgets. Each series starts in the first year the line was funded.") +
  theme_pbc(11)

AICS, TUPAD, and the Health Facilities Enhancement Program have been raised by Congress in every one of the last seven budgets. MAIFIP has been raised in each of the four years it has existed as a line, by ₱88B in total. AKAP was created by Congress in 2024 with ₱26.7B, renewed at ₱26.2B in 2025, and has never carried an amount in any executive proposal. Financial Assistance to LGUs shows the ratchet most clearly: Congress raised it in five straight budgets to ₱37.5B, and the executive has now adopted Congress’s number as its own baseline.

For 2027 the executive proposes AICS at ₱33.3B, MAIFIP at ₱24.2B, and TUPAD and livelihood at ₱16.7B. If the pattern holds, each will roughly double by the time the GAA is signed, and an election is eighteen months away.

4.3 The political offices

pol_series <- function(d, label) map_dfr(2020:2026, function(y) tibble::tibble(office = label, year = y,
    `NEP (proposed)` = sum(d[[paste0("n", y)]], na.rm = TRUE), `GAA (enacted)` = sum(d[[paste0("g", y)]], na.rm = TRUE))) %>%
  bind_rows(tibble::tibble(office = label, year = 2027L, `NEP (proposed)` = sum(d$N27, na.rm = TRUE), `GAA (enacted)` = NA_real_))
pol <- bind_rows(pol_series(L %>% filter(dep == "CONGRESS"), "Congress"),
                 pol_series(L %>% filter(dep == "OP"), "Office of the President"),
                 pol_series(L %>% filter(dep == "OVP"), "Office of the Vice President"))
cong <- pol %>% filter(office == "Congress")
cong_add <- sum(cong$`GAA (enacted)` - cong$`NEP (proposed)`, na.rm = TRUE)
pol %>% pivot_longer(c(`NEP (proposed)`, `GAA (enacted)`), names_to = "src", values_to = "v") %>% filter(!is.na(v)) %>%
  mutate(src = factor(src, levels = names(src_pal)),
         office = factor(office, levels = c("Congress", "Office of the President", "Office of the Vice President"))) %>%
  ggplot(aes(factor(year), v, fill = src)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.75) +
  geom_text(aes(label = comma(v, accuracy = 0.1)), position = position_dodge(width = 0.8), vjust = -0.4, size = 2.5) +
  facet_wrap(~ office, scales = "free_y") +
  scale_fill_manual(values = src_pal, breaks = names(src_pal)) +
  scale_x_discrete(labels = function(x) paste0("'", substr(x, 3, 4))) +
  scale_y_continuous(labels = function(x) paste0(format(x, drop0trailing = TRUE, trim = TRUE), "B"), expand = expansion(mult = c(0, 0.12))) +
  labs(x = NULL, y = "PHP billions", title = "Congress has raised its own budget above the proposal in every one of the last seven years",
       subtitle = "Proposed (NEP) and enacted (GAA) budgets of the political offices, FY 2020 to FY 2027",
       caption = "Office of the President in FY 2026 includes PHP 17.55B for hosting the ASEAN summits. FY 2027 has a proposal only.") +
  theme_pbc(11)

The three political offices together are proposed at ₱37.9B. They belong on the watchlist for a different reason than the programs above: these are the budgets the people writing the GAA write for themselves, and the ones most exposed to political reward and punishment.

Congress is the clearest case. By convention the executive transmits the legislature’s proposal unchanged, and Congress then adds to it. It has done so in all seven years, by ₱74.2B in total: ₱18.8B in 2025 alone, when a ₱31.3B proposal became ₱50.1B, and ₱12.2B in 2026. The 2027 proposal is ₱27.0B. Most of the increase lands in the House’s general management line, which has averaged more than double its proposed level.

The Office of the President is treated with deference: Congress enacted exactly what was proposed in five of the seven years and added to it in the other two (₱5.4B in 2025, ₱0.7B in 2026), and it has never touched the national security oversight line that is the likely home of its confidential and intelligence funds. Its 2027 budget falls to ₱10.1B only because the ₱17.55B ASEAN hosting item ends; the rest is unchanged. The Office of the Vice President shows the punishment side. Congress cut it from ₱2.4B to ₱1.9B in 2024 and from ₱2.0B to ₱0.7B in 2025, and the executive now proposes ₱0.8B. Whatever one thinks of the office’s spending, a budget that tracks the occupant’s political standing is a red flag in itself.

4.4 Hard pork: local infrastructure

DPWH’s locally identified projects have been relabeled three times in seven years: “Local Infrastructure Program” lines in 2020 and 2021, then the Basic Infrastructure Program (BIP) and Sustainable Infrastructure Projects Alleviating Gaps (SIPAG) from 2022. Grouped into families, their history is continuous.

hp_family <- function(p) case_when(
  str_detect(p, "(SIPAG|Basic Infrastructure Program).*(Access Roads|Interjurisdictional|Coastal Roads)|Local Roads and Bridges") ~ "Local roads and bridges",
  str_detect(p, "(SIPAG|Basic Infrastructure Program).*(Multi-Purpose|Major|Strategic P)|Buildings and Other Structures - Multipurpose / Facilities - (Local|Construction)") ~ "Multi-purpose and public buildings",
  str_detect(p, "(SIPAG|Basic Infrastructure Program).*Flood|Flood Control and Drainage - .*(Local Infrastructure|Construction)") ~ "Local flood control",
  str_detect(p, "(SIPAG|Basic Infrastructure Program).*(Evacuation|Water|Ports)") ~ "Evacuation centers, water supply, local ports",
  TRUE ~ NA_character_)
hp <- L %>% filter(dep == "DPWH") %>% mutate(fam = hp_family(coalesce(PAP, ""))) %>% filter(!is.na(fam))
hp_long <- hp %>% select(fam, matches("^[ng]20\\d\\d$"), N27) %>%
  pivot_longer(-fam, names_to = "k", values_to = "v") %>%
  mutate(src = case_when(k == "N27" ~ "NEP (proposed)", substr(k, 1, 1) == "n" ~ "NEP (proposed)", TRUE ~ "GAA (enacted)"),
         year = ifelse(k == "N27", 2027L, as.integer(substr(k, 2, 5)))) %>%
  group_by(src, year) %>% summarise(v = sum(v, na.rm = TRUE), .groups = "drop") %>%
  filter(!(src == "GAA (enacted)" & year == 2027)) %>%
  mutate(src = factor(src, levels = names(src_pal)))   # NEP on the left, GAA on the right
ggplot(hp_long, aes(factor(year), v, fill = src)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.75) +
  geom_text(aes(label = comma(v, accuracy = 1)), position = position_dodge(width = 0.8), vjust = -0.4, size = 3.1) +
  scale_fill_manual(values = src_pal, breaks = names(src_pal)) +
  scale_y_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0, 0.08))) +
  labs(x = NULL, y = NULL, title = "DPWH local infrastructure: proposed at PHP 60B to 180B, enacted at up to PHP 426B",
       subtitle = "Local Infrastructure Program, BIP, and SIPAG lines combined (roads, buildings, flood control, and other local facilities)",
       caption = "FY 2023 NEP lodged some district-level funds centrally, which overstates that year's apparent add-on. FY 2027 has a proposal only.") +
  theme_pbc()

Congress added about ₱99B to these lines in 2020, ₱108B in 2021, ₱145B in 2022, ₱151B in 2023, ₱224B in 2024, and ₱248B in 2025. In 2026, after the scandal, the net addition fell to ₱82B, with local flood control removed entirely and local roads and multi-purpose buildings still raised by ₱94B.

Three things about the 2027 proposal deserve attention. First, SIPAG disappears as a label, but its money does not: the BIP access-roads line is ₱105.7B, almost exactly what Congress enacted for BIP and SIPAG access roads together in 2026 (₱105.6B). Second, that single line also absorbs what used to be separately labeled tourism, ecozone, seaport, airport, and interjurisdictional road lines, about ₱86B across all of them in NEP 2026. The purpose categories that let anyone ask “which tourism road?” are gone. Third, flood control is back at ₱103.5B. After the events of 2025, a ₱105.7B undifferentiated local roads line and ₱54B in multi-purpose buildings, with no published selection criteria, is the easiest part of this budget to question.

Other hard-pork lines with the same signature: DA farm-to-market roads (raised in six of seven years; ₱16.0B proposed, ₱33.0B enacted in 2026), NIA irrigation repair and pump irrigation, DepEd classrooms (₱28.1B proposed and ₱85.4B enacted in 2026), DOH health facilities, and capital projects in State Universities and Colleges, which receive ₱7B to ₱33B in net additions a year.

4.5 Unprogrammed appropriations

ggplot(ua, aes(factor(year), ua, fill = src)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.75) +
  geom_text(aes(label = comma(ua, accuracy = 1)), position = position_dodge(width = 0.8), vjust = -0.4, size = 3.1) +
  scale_fill_manual(values = src_pal, breaks = names(src_pal)) +
  scale_y_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0, 0.08))) +
  labs(x = NULL, y = NULL, title = "Unprogrammed appropriations: what the executive asks for and what Congress enacts",
       subtitle = "Derived as total new appropriations less the sum of programmed P/A/P lines, PHP billions",
       caption = "FY 2025 enacted figure is net of the President's veto. FY 2027 has a proposal only; the DBM reports it as PHP 111.984B.") +
  theme_pbc()

Unprogrammed appropriations are standby authority, released only if excess revenues or new loans materialize. They matter for two reasons. They are where Congress parks the programs it displaces from the programmed budget to make room for insertions, including foreign-assisted projects the country is already contractually bound to fund. And they were the vehicle for the 2024 sweep of GOCC balances, including PhilHealth’s and PDIC’s.

PBC’s tracker of the NEP’s unprogrammed annex breaks the ₱112.0B down as ₱57.0B to restore the fund balances of the Philippine Deposit Insurance Corporation, ₱42.6B in support for foreign-assisted projects (down from ₱97.3B), ₱8.8B to convert national government advances into subsidy, and ₱3.6B for risk management. More than half of the proposed fund, in other words, is the bill for the 2024 sweep coming due.

Congress raised the executive’s proposed figure by ₱100B in 2022, ₱219B in 2023, ₱450B in 2024, and ₱205B in 2025 (after the veto). Only in 2026 did it go down. The 2027 proposal of ₱112.0B is a real improvement on paper. The test is whether rail and other foreign-assisted projects cut from the programmed budget reappear here in December.

4.6 What Congress tends to bloat, and what pays for it

cong_family <- function(dep, p) case_when(
  dep == "DPWH" & !is.na(hp_family(p)) ~ paste0("DPWH local infrastructure: ", str_to_lower(hp_family(p))),
  TRUE ~ str_replace(str_replace(p, "^Locally-Funded Projects?:\\s*", ""), "^Foreign-Assisted Projects?:\\s*", ""))
cg <- L %>% filter(tab != "SUCs") %>% mutate(family = cong_family(dep, coalesce(PAP, ""))) %>%
  group_by(dep, agy, family) %>%
  summarise(across(matches("^d20\\d\\d$"), ~ if (all(is.na(.x))) NA_real_ else sum(.x, na.rm = TRUE)),
            across(matches("^[ng]20\\d\\d$"), ~ sum(.x, na.rm = TRUE)),
            N27 = if (all(is.na(N27))) NA_real_ else sum(N27, na.rm = TRUE), .groups = "drop")
dcols <- paste0("d", 2020:2026)
cg$yrs_up   <- rowSums(cg[dcols] >  0.05, na.rm = TRUE)
cg$yrs_down <- rowSums(cg[dcols] < -0.05, na.rm = TRUE)
cg$yrs_seen <- rowSums(sapply(2020:2026, function(y) cg[[paste0("n", y)]] + cg[[paste0("g", y)]] > 0))
cg$cum      <- rowSums(cg[dcols], na.rm = TRUE)
realloc <- tibble(year = 2020:2026,
                  adds = sapply(dcols, function(c) sum(pmax(L[[c]], 0), na.rm = TRUE)),
                  cuts = sapply(dcols, function(c) sum(pmin(L[[c]], 0), na.rm = TRUE)))
ggplot(realloc %>% pivot_longer(-year), aes(factor(year), value, fill = name)) +
  geom_col(width = 0.7, show.legend = FALSE) +
  geom_hline(yintercept = 0, color = "grey40") +
  geom_text(aes(label = comma(abs(value), accuracy = 1), vjust = ifelse(value > 0, -0.4, 1.3)), size = 3.2) +
  scale_fill_manual(values = c(adds = up_col, cuts = dn_col)) +
  scale_y_continuous(labels = function(x) paste0(peso, comma(x), "B"), expand = expansion(mult = c(0.1, 0.1))) +
  labs(x = NULL, y = NULL, title = "Congress now moves more than PHP 650B around inside a fixed total",
       subtitle = "Sum of all line-item increases (green) and decreases (red) between the NEP and the GAA, PHP billions",
       caption = "Line-level differences between proposed and enacted amounts across all P/A/Ps, including SUCs, GOCC support, and special purpose funds.") +
  theme_pbc()

The programmed total barely changes between the NEP and the GAA. What changes is what is inside it. In 2020 Congress added ₱268B to some lines and took the same from others. In 2026 it was ₱661B, about 15% of the programmed budget.

4.6.1 The lines that gain

cg %>% filter(yrs_up >= 4) %>% arrange(desc(cum)) %>% head(30) %>%
  transmute(Agency = paste(dep, agy, sep = " · "), `Line item (or family)` = family,
            `Years raised` = paste0(yrs_up, " of ", yrs_seen),
            `Cumulative add, 2020 to 2026` = bn(cum), `Add in 2026` = bn(d2026), `NEP 2027` = bn(N27)) %>%
  kbl_clean(font = 12.5, align = c("l","l","r","r","r","r"),
            caption = "Line items Congress raised above the executive's proposal in at least four of the last seven budgets (PHP billions)") %>%
  column_spec(2, width = "42%")
Line items Congress raised above the executive’s proposal in at least four of the last seven budgets (PHP billions)
Agency Line item (or family) Years raised Cumulative add, 2020 to 2026 Add in 2026 NEP 2027
DPWH · OSEC DPWH local infrastructure: local roads and bridges 7 of 7 506.5 40.8 107.1
DPWH · OSEC DPWH local infrastructure: multi-purpose and public buildings 7 of 7 379.2 35.1 41.0
DPWH · OSEC DPWH local infrastructure: local flood control 5 of 6 142.9 0.0 0.0
DSWD · OSEC Protective Services for Individuals and Families in Difficult Circumstances 7 of 7 113.1 36.9 33.3
DOH · OSEC Medical Assistance to Indigent and Financially - Incapacitated Patients (MAIFIP) 4 of 4 87.7 27.4 24.2
ALGU · Local Government Support Fund (formerly Financial Subsidy to LGUs) Financial Assistance to Local Government Units 5 of 6 58.4 32.5 37.5
DOLE · OSEC Livelihood and Emergency Employment 7 of 7 52.4 10.8 16.7
DepEd · OSEC Basic Education Facilities 4 of 7 50.8 57.3 30.6
CONGRESS · House of Representatives General Management and Supervision 7 of 7 45.0 8.7 6.3
DPWH · OSEC Preventive Maintenance - Secondary Roads 4 of 7 44.9 -4.5 11.7
DPWH · OSEC Rehabilitation/ Reconstruction of Roads with Slips, Slope Collapse, and Landslide - Secondary Roads 5 of 7 43.7 -1.9 4.8
DPWH · OSEC Special Road Fund - Motor Vehicle User’s Charge (MVUC) as per R.A. 11239 4 of 6 43.6 -3.5 0.0
DOH · OSEC Health Facilities Enhancement Program 7 of 7 38.6 7.8 14.5
DPWH · OSEC Rehabilitation/ Reconstruction of Roads with Slips, Slope Collapse, and Landslide - Tertiary Roads 6 of 7 30.9 1.0 2.9
DPWH · OSEC DPWH local infrastructure: evacuation centers, water supply, local ports 5 of 5 27.3 6.1 0.4
DA · OSEC Repair/Rehabilitation and Construction of Farm-to-Market Roads in Designated Key Production Areas 6 of 7 25.0 17.0 16.0
DPWH · OSEC Preventive Maintenance - Primary Roads 5 of 7 22.0 -3.7 18.6
BSGC · National Irrigation Administration Repair of National Irrigation Systems (NIS) 6 of 7 20.7 3.2 2.0
DPWH · OSEC Preventive Maintenance - Tertiary Roads 4 of 7 19.7 -2.7 5.7
DPWH · OSEC Buildings and Other Structures - Multipurpose / Facilities - National Building Program 4 of 7 18.5 -3.6 13.4
CONGRESS · House of Representatives Legislation of Laws and Other Related Activities 7 of 7 18.1 1.8 10.6
DOH · OSEC Operations of DOH Regional Hospitals and Other Health Facilities 7 of 7 17.4 6.5 102.9
DOLE · Technical Education and Skills Development Authority Promotion, Development and Evaluation of Technical Education and Skills Development Scholarship and Student Assistance Programs 4 of 4 17.2 3.7 5.4
DILG · Philippine National Police Conduct of police patrol operations and other related confidential activities against dissidents, subversives, lawless elements and organized crime syndicates and campaign against kidnapping, trafficking of women and minors, smuggling, carnapping, gunrunning, illegal fishing and trafficking of illegal drugs 4 of 7 16.6 16.0 202.3
DOLE · Technical Education and Skills Development Authority Promotion, Development and Implementation of Quality Technical Education and Skills Development Programs 4 of 4 14.0 2.4 14.0
DPWH · OSEC Construction/ Rehabilitation of Water Supply/ Septage and Sewerage/ Rain Water Collectors 5 of 7 12.9 -0.4 7.3
DOTr · OSEC Service Contracting of Public Utility Vehicle Program 4 of 5 11.3 -1.3 0.0
OEOs · Commission on Higher Education Tulong Dunong Program 4 of 4 9.6 2.7 0.0
DSWD · OSEC Sustainable Livelihood Program 5 of 7 9.1 0.8 5.1
DPWH · OSEC Road Widening - Secondary Roads 6 of 7 8.5 5.9 10.4

4.6.2 The lines that pay for it

cg %>% filter(yrs_down >= 4) %>% arrange(cum) %>% head(18) %>%
  transmute(Agency = paste(dep, agy, sep = " · "), `Line item (or family)` = family,
            `Years cut` = paste0(yrs_down, " of ", yrs_seen),
            `Cumulative cut, 2020 to 2026` = bn(cum), `Cut in 2026` = bn(d2026), `NEP 2027` = bn(N27)) %>%
  kbl_clean(font = 12.5, align = c("l","l","r","r","r","r"),
            caption = "Line items Congress cut below the executive's proposal in at least four of the last seven budgets (PHP billions)") %>%
  column_spec(2, width = "42%")
Line items Congress cut below the executive’s proposal in at least four of the last seven budgets (PHP billions)
Agency Line item (or family) Years cut Cumulative cut, 2020 to 2026 Cut in 2026 NEP 2027
Pension and Gratuity Fund · Pension and Gratuity Fund For payment of retirement and terminal leave benefits 7 of 7 -381.2 -32.5 0.0
DOTr · OSEC North-South Commuter Railway (NSCR) System ADB Loan Nos. 3796-PHI, 4188-PHI and 4589-PHI, and JICA Loan Nos. PH-P262, PH-P270, PH-P276 and PH-P277 7 of 7 -367.4 -47.3 123.8
DPWH · OSEC Support to Operations 7 of 7 -352.0 -52.8 51.6
DOTr · OSEC Metro Manila Subway Project (MMSP) Phase I JICA Loan Nos. PH-P267, PH-P275, PH-P279 and PH-P286 6 of 7 -194.1 -25.0 67.4
DPWH · OSEC Construction of By-Pass and Diversion Roads 7 of 7 -153.7 -75.0 127.3
DPWH · OSEC Construction/Rehabilitation of Flood Mitigation Facilities within Major River Basins and Principal Rivers 6 of 7 -126.5 -86.2 40.5
Miscellaneous Personnel Benefits Fund · Miscellaneous Personnel Benefits Fund Funding Requirements for Staffing Modifications and Upgrading of Salaries 5 of 6 -110.2 -10.8 0.0
DSWD · OSEC Pantawid Pamilyang Pilipino Program (Implementation of Conditional Cash Transfer) 5 of 7 -84.5 0.0 99.1
Pension and Gratuity Fund · Pension and Gratuity Fund For payment of pension 4 of 7 -73.1 0.0 0.0
DPWH · OSEC Construction of New Bridges 7 of 7 -58.6 -8.9 6.4
DPWH · OSEC Public-Private Partnership Strategic Support Fund (including ROW, Subsidy, and Variations) 6 of 7 -56.4 -3.0 1.0
DPWH · OSEC Construction of Missing Links/ New Roads 7 of 7 -42.7 -9.4 27.5
ALGU · Local Government Support Fund (formerly Financial Subsidy to LGUs) Support to the Barangay Development Program of the National Task Force to End Local Communist Armed Conflict (NTF-ELCAC) 4 of 6 -38.5 0.0 9.7
DOTr · OSEC Payment of Right-of-Way and Value-Added Tax Obligations 4 of 7 -30.5 0.0 2.8
NDRRMF · National Disaster Risk Reduction and Management Fund ( Calamity Fund ) Repair and Reconstruction of Permanent Structures, including Capital Expenditures for Pre-disaster Operations, Rehabilitation and Other Related Activities 5 of 7 -29.6 -2.2 0.0
DPWH · OSEC General Administration and Support 6 of 7 -24.8 -3.9 18.1
DepEd · OSEC Computerization Program 4 of 7 -20.3 -5.8 5.8
DPWH · OSEC Widening of Permanent Bridges 6 of 7 -19.8 -4.5 15.3

The funding sources are as stable as the beneficiaries. The Pension and Gratuity Fund’s retirement benefits line has been cut in all seven years, by ₱381B in total. The North-South Commuter Railway has been cut in all seven (₱367B) and the Metro Manila Subway in six (₱194B). DPWH’s Support to Operations has been cut in all seven, by ₱352B; the executive proposes ₱50B to ₱90B there each year and Congress strips it to ₱10B to ₱30B, which makes it function as a parking lot for bicam. NEP 2027 has ₱51.6B sitting in it again. 4Ps has been cut in five of seven years, by ₱85B, including ₱50B in 2025.

Two implications. The large rail ask is, in practice, the fund source everyone expects bicam to raid, so a position on rail has to say where trimmed rail money should go, or it will go to local roads. And several of the “payers” are obligations the state cannot avoid (pensions, loan-funded projects), which is how cuts to them end up resurfacing in unprogrammed appropriations.

4.6.3 Where new line items cluster

ins <- map_dfr(2020:2026, function(y) {
  n <- L[[paste0("n", y)]]; g <- L[[paste0("g", y)]]
  L %>% mutate(is_new = coalesce(n, 0) == 0 & coalesce(g, 0) > 0, amt = g, year = y) %>% filter(is_new) %>% select(dep, agy, year, amt)
})
ins %>% group_by(Agency = paste(dep, agy, sep = " · ")) %>%
  summarise(`New lines, 2020 to 2026` = n(), `Amount (PHP B)` = sum(amt), `Years with insertions` = n_distinct(year), .groups = "drop") %>%
  arrange(desc(`New lines, 2020 to 2026`)) %>% head(15) %>%
  mutate(`Amount (PHP B)` = bn(`Amount (PHP B)`)) %>%
  kbl_clean(font = 12.5, align = c("l","r","r","r"),
            caption = "Agencies receiving the most line items that had no amount in the NEP and a positive amount in the GAA")
Agencies receiving the most line items that had no amount in the NEP and a positive amount in the GAA
Agency New lines, 2020 to 2026 Amount (PHP B) Years with insertions
SUCs · University of the Philippines System 271 16.8 7
DOTr · OSEC 230 73.0 7
OEOs · Philippine Sports Commission 86 6.6 7
DILG · Philippine National Police 82 8.4 7
DA · OSEC 78 34.8 7
SUCs · Bukidnon State University 62 0.8 7
SUCs · Mindanao State University 61 18.4 7
DND · Philippine Army ( Land Forces ) 53 2.5 2
OEOs · Commission on Higher Education 47 13.0 7
BSGC · National Housing Authority 44 6.5 7
SUCs · Polytechnic University of the Philippines 42 1.4 7
OEOs · National Commission for Culture and the Arts-Proper 40 1.9 7
OEOs · National Historical Commission of the Philippines 39 0.4 7
SUCs · Mariano Marcos State University 37 2.5 7
SUCs · Bicol University 36 3.7 7

Line-item insertions, as opposed to top-ups of existing lines, cluster in a few places: DOTr’s Office of the Secretary (mostly local ports and airports), the University of the Philippines System and Mindanao State University, the Philippine Sports Commission, the PNP (stations and buildings), the DA, the National Housing Authority, and NIA. These are the agency pages to read first when the House and bicam versions are published.

5 What advocates can push to amend

The test for each item below is the same: it should respond to a need the budget ignores, run through an agency that can spend, and be paid for inside the ceiling.

5.1 Increases and new lines

tibble::tribble(
  ~Ask, ~`NEP 2027`, ~`Why, and how`,
  "Restore the DOTr fuel subsidy and the DA and BFAR fuel assistance lines as programmed items with a published oil-price trigger", "0", "The DBCC assumes Dubai crude at $70 to $90 in 2027; it is near $95 now. A programmed line with a trigger is auditable; a discretionary release is not.",
  "Restore and scale up Service Contracting; protect PUV modernization support, busways, and BRT", "No line; PTMP ₱0.18B", "Per-kilometer contracts protect drivers' incomes and commuters' fares at the same time, and deliver inside the fiscal year. Rail does not.",
  "Index 4Ps grants to food inflation for the poorest households, and restore the ₱13.9B cut", "₱99.1B", "The country's main rules-based transfer is being cut in nominal terms during a food-price shock. DSWD paid out 91.5% of its allotments in 2025.",
  "Scale up the Walang Gutom food stamp program", "₱1.89B (plus ₱3.9B ADB voucher project)", "Flat for four years. It is the best-targeted food instrument the government has.",
  "A dedicated, itemized El Niño response line in the DA: drought-tolerant seed, pump fuel, small water impounding, cloud seeding", "Not visible", "Whatever response exists is inside the ₱25.6B rice production support lump and cannot be tracked.",
  "Raise PCIC crop insurance premiums in line with expected claims; size NFA palay procurement to a stated buffer-stock target in days", "₱4.5B; ₱11.18B", "Both are flat in pesos in a drought year with higher farmgate prices.",
  "Restore NIA repair and restoration of existing systems to at least 2026 levels", "₱2.9B for national and communal repair (₱11.0B in NEP 2026)", "Keeping existing service areas irrigated is cheaper and faster than new construction.",
  "An on-budget electricity lifeline top-up targeted through DSWD, and a government energy management line (solar and efficiency retrofits for schools and DOH hospitals)", "None", "No budget line addresses power costs. Retrofits lower the state's own electricity bill for years.",
  "A reintegration program for returning overseas workers in DMW or DOLE; restore the DMW welfare line", "No line; ₱4.65B", "More than 9,000 repatriated since March; the SONA promised livelihood and placement support.",
  "Restore evacuation centers, NHA emergency housing, and DHSUD disaster shelter assistance ahead of a possible La Niña", "No lines", "Flood control was cut by more than half and nothing replaced its protective function.",
  "Carve a standby crisis-response fund with published triggers out of the ₱30B NDRRMF lump and Financial Assistance to LGUs", "₱30.0B and ₱37.5B, discretionary", "Rule-based release makes the response predictable and auditable."
) %>% kbl_clean(font = 12.5) %>% column_spec(1, width = "38%") %>% column_spec(2, width = "16%")
Ask NEP 2027 Why, and how
Restore the DOTr fuel subsidy and the DA and BFAR fuel assistance lines as programmed items with a published oil-price trigger 0 The DBCC assumes Dubai crude at $70 to $90 in 2027; it is near $95 now. A programmed line with a trigger is auditable; a discretionary release is not.
Restore and scale up Service Contracting; protect PUV modernization support, busways, and BRT No line; PTMP ₱0.18B Per-kilometer contracts protect drivers’ incomes and commuters’ fares at the same time, and deliver inside the fiscal year. Rail does not.
Index 4Ps grants to food inflation for the poorest households, and restore the ₱13.9B cut ₱99.1B The country’s main rules-based transfer is being cut in nominal terms during a food-price shock. DSWD paid out 91.5% of its allotments in 2025.
Scale up the Walang Gutom food stamp program ₱1.89B (plus ₱3.9B ADB voucher project) Flat for four years. It is the best-targeted food instrument the government has.
A dedicated, itemized El Niño response line in the DA: drought-tolerant seed, pump fuel, small water impounding, cloud seeding Not visible Whatever response exists is inside the ₱25.6B rice production support lump and cannot be tracked.
Raise PCIC crop insurance premiums in line with expected claims; size NFA palay procurement to a stated buffer-stock target in days ₱4.5B; ₱11.18B Both are flat in pesos in a drought year with higher farmgate prices.
Restore NIA repair and restoration of existing systems to at least 2026 levels ₱2.9B for national and communal repair (₱11.0B in NEP 2026) Keeping existing service areas irrigated is cheaper and faster than new construction.
An on-budget electricity lifeline top-up targeted through DSWD, and a government energy management line (solar and efficiency retrofits for schools and DOH hospitals) None No budget line addresses power costs. Retrofits lower the state’s own electricity bill for years.
A reintegration program for returning overseas workers in DMW or DOLE; restore the DMW welfare line No line; ₱4.65B More than 9,000 repatriated since March; the SONA promised livelihood and placement support.
Restore evacuation centers, NHA emergency housing, and DHSUD disaster shelter assistance ahead of a possible La Niña No lines Flood control was cut by more than half and nothing replaced its protective function.
Carve a standby crisis-response fund with published triggers out of the ₱30B NDRRMF lump and Financial Assistance to LGUs ₱30.0B and ₱37.5B, discretionary Rule-based release makes the response predictable and auditable.

5.2 Cuts and resizing

bind_rows(
  pick("^Financial Assistance to Local Government", dep = "ALGU"),
  pick("^Growth Equity Fund", dep = "ALGU"),
  pick("Barangay Development Program", dep = "ALGU"),
  fam %>% filter(str_detect(family, "^Local and access roads")) %>% transmute(dep, agy, PAP = family, N26, G26, N27),
  fam %>% filter(str_detect(family, "^BIP and SIPAG multi-purpose")) %>% transmute(dep, agy, PAP = family, N26, G26, N27),
  pick("Multipurpose / Facilities - National Building Program", dep = "DPWH"),
  L %>% filter(dep == "DPWH", prog == "2000") %>% summarise(dep = "DPWH", agy = "OSEC", PAP = "Support to Operations", across(c(N26, G26, N27), ~ sum(.x, na.rm = TRUE))),
  pick("North-South Commuter Railway", dep = "DOTr"),
  pick("Metro Manila Subway", dep = "DOTr"),
  pick(".", dep = "Revised AFP Modernization Program", label = "Revised AFP Modernization Program"),
  pick("Oversight Management on National Security", dep = "OP")
) %>% show_lines()
Agency Program / Activity / Project NEP 2026 GAA 2026 NEP 2027 Change, NEP to NEP
ALGU · Local Government Support Fund (formerly Financial Subsidy to LGUs) Financial Assistance to Local Government Units 5.00 37.49 37.49 +32.49
ALGU · Local Government Support Fund (formerly Financial Subsidy to LGUs) Growth Equity Fund 1.00 11.30 10.30 +9.30
ALGU · Local Government Support Fund (formerly Financial Subsidy to LGUs) Support to the Barangay Development Program of the National Task Force to End Local Communist Armed Conflict (NTF-ELCAC) 8.08 8.08 9.74 +1.66
DPWH · OSEC Local and access roads: BIP, SIPAG, tourism, ecozone, seaport and airport access roads (merged in 2027) 86.03 125.77 105.73 +19.69
DPWH · OSEC BIP and SIPAG multi-purpose buildings 29.69 79.87 40.97 +11.29
DPWH · OSEC Locally-Funded Projects: Buildings and Other Structures - Multipurpose / Facilities - National Building Program 10.22 6.61 13.43 +3.21
DPWH · OSEC Support to Operations 82.43 29.60 51.61 -30.82
DOTr · OSEC Foreign-Assisted Project: North-South Commuter Railway (NSCR) System ADB Loan Nos. 3796-PHI, 4188-PHI and 4589-PHI, and JICA Loan Nos. PH-P262, PH-P270, PH-P276 and PH-P277 76.09 28.79 123.84 +47.75
DOTr · OSEC Foreign-Assisted Project: Metro Manila Subway Project (MMSP) Phase I JICA Loan Nos. PH-P267, PH-P275, PH-P279 and PH-P286 45.37 20.39 67.44 +22.07
Revised AFP Modernization Program · Revised AFP Modernization Program Revised AFP Modernization Program 40.00 40.00 50.00 +10.00
OP · The President’s Offices Oversight Management on National Security Concerns 4.98 4.98 4.89 -0.09

The first group is discretionary lumps that should shrink. Financial Assistance to LGUs and the Growth Equity Fund were ₱5.0B and ₱1.0B in the executive’s own 2026 proposal; returning them there frees ₱41.8B. The DPWH local roads family is about ₱20B above its NEP 2026 equivalent with less itemization than before; the ask is to cut the increment and restore the purpose categories. Multi-purpose buildings carry ₱41.0B under BIP and ₱13.4B under the National Building Program. DPWH Support to Operations holds ₱27.3B in capital outlay that Congress has never once left intact. The NTF-ELCAC barangay program rises to ₱9.74B; Congress cut it to ₱1.95B in 2025 without visible consequence.

The second group should be resized, not opposed. Rail asks for ₱191.2B when Congress enacted ₱49.2B and DOTr disbursed 52.7% of its allotments in 2025. The constructive ask is a published drawdown schedule and an appropriation that matches it. Because these projects are loan-financed, trimming them lowers borrowing more than it frees cash, so it creates room under the deficit ceiling but is not a peso-for-peso swap with 4Ps. AFP Modernization rises from ₱40B to ₱50B while DND grows ₱29.5B on top; holding it at ₱40B in a year of real cuts to civilian agencies is a defensible position.

Confidential and intelligence funds are an object of expenditure, not a P/A/P, so they do not appear as lines in the workbook. PBC’s tracker puts them at ₱10.77B across all agencies (₱4.37B confidential, ₱6.40B intelligence), unchanged from the previous proposal; Congress raised them to ₱11.82B in 2026. The Office of the President’s ₱4.89B national security oversight line is the likeliest home of the largest one. A few general management lines jump without explanation and merit a question each: the Supreme Court (₱4.5B to ₱10.8B), the Coast Guard (₱6.3B to ₱9.5B), and DOJ (₱1.4B to ₱3.6B).

Taking only the first group and the AFP Modernization increment, the room is about ₱125B. The increases proposed above cost well under half of that.

5.3 Sector by sector

These are PBC’s asks by sector. Each is stated against both baselines, because most of what reads as a cut against the 2026 GAA is the executive declining to carry forward what Congress added.

5.3.1 Infrastructure: make disclosure the condition of release

About ₱686B of the proposal sits in PBC’s infrastructure watchlist: DPWH’s asset preservation, network development, bridge, flood management, convergence, and local programs, plus NIA, farm-to-market roads, DA and BFAR equipment and facilities, classrooms, and DOH health facilities. These are the lines where insertions and ghost projects have concentrated, and most are unverifiable as proposed. The fix already exists in one department. At the House briefing on 26 August 2026, Secretary Vince Dizon said every one of DPWH’s 11,395 proposed projects must carry an approved program of works, validated geotagged site photos, sign-off by district and regional engineers, and endorsement by the regional or local development council. PBC asks Congress to write that standard into the GAA as a special provision for every infrastructure peso, in DOH, DepEd, DA, NIA, and DOTr as much as DPWH: no release without the documents posted on a portal open to the public, media, researchers, and congressional staff. The same rule should apply to any project Congress adds.

5.3.2 Education: fund the inputs the learning crisis needs

DepEd is proposed at ₱916.8B, which is 4.8% above the executive’s previous proposal and 4.6% below the 2026 GAA. CHED (+4.4% and −27.2%) and TESDA (+4.7% and −19.8%) show the same split. What falls against the current year is specific: classrooms from ₱85.4B to ₱30.6B, school feeding from ₱25.7B to ₱11.4B, textbooks from ₱19.5B to ₱6.5B, new teaching positions from ₱42.3B to ₱31.7B, and tertiary education subsidies from ₱37.5B to ₱27.8B. The Constitution directs the state to give education the highest budgetary priority. In Guingona v. Carague (1991) the Supreme Court let debt service exceed the education budget, and the margin is now thin: the education sector is about ₱1,227B and interest payments ₱1,114B, a gap that closed from ₱345B to ₱112B in one year. PBC asks Congress to restore classrooms, textbooks, feeding, and teacher items at least to their 2026 enacted levels with project-level disclosure attached, and to ask DepEd how the proposal squares with the National Education and Workforce Development Plan 2026 to 2035.

5.3.3 Health: move the money into entitlements

Health sector funding is about ₱96B below the 2026 GAA. Nine tenths of that gap is two items: PhilHealth’s one-time ₱60B appropriation ordered by the Supreme Court, and the ₱27.4B Congress added to MAIFIP. Net of the one-off, the PhilHealth subsidy rises 6.7% to ₱74.4B. PBC does not ask for the MAIFIP add-on back; it is guarantee-letter medicine, and it sits on the red-flag list above. The ask is to convert it: put the equivalent into PhilHealth benefit expansion and DOH hospitals’ zero-balance billing, where a patient does not need a politician’s endorsement. Congress should also require PhilHealth to show its reserve drawdown schedule and the benefit improvements it will fund in 2027, and require DOH and PhilHealth to reconcile claims so the same bill cannot be charged to both MAIFIP and PhilHealth. One question for DBM: its “consolidated health sector” figure of ₱1.06 trillion is about three times the health function in the budget’s own classification, and the definition should be published.

5.3.4 Cost of living and social protection: start with 4Ps

PSA’s price index for the poorest 30% of households has been running about two points above headline inflation (8.2% against 6.2% in PBC’s latest reading). Against that, 4Ps is the one large program cut on both baselines, down 12.3% to ₱99.1B. DOE is also down on both (−14.4% and −31.6%). The other agencies often cited as cut (DA, NIA, DSWD, NEA) are above the executive’s previous proposal and below the GAA, because Congress’s additions to irrigation repair, farm-to-market roads, AICS, and rural electrification were not carried forward. PBC asks Congress to restore 4Ps and index its grants to food prices, scale up the food stamp program, raise crop insurance and palay procurement, and fund the fuel and transport relief lines listed above. If the economic managers are right that inflation is temporary, the question stands: how do poor households eat while waiting?

5.3.5 Transport: budget for the commuter now

PBC’s earlier analysis found that from 2010 to 2021 about 99% of the ₱2.8 trillion spent on road infrastructure went to building, widening, and maintaining roads, and about 1% to road-based public transport. The 2027 proposal repeats the pattern. DOTr gets ₱299.5B. Service Contracting has no line, and PUV modernization, the EDSA Busway, Cebu BRT, and active transport together receive about ₱0.4B. The costs of the status quo are large. JICA estimated Metro Manila congestion at ₱3.5B a day in 2017, rising to ₱5.4B a day by 2035 without intervention, and road crashes are among the leading causes of death for Filipinos aged 15 to 29, many of them pedestrians. PBC defends rail, which is cut in every bicam, but rail delivers in years. The ask is a restored Service Contracting line at scale, a fixed minimum share of the transport budget for road-based public transport, walking and cycling infrastructure, terminals, and PUV stops, and published medium-term targets for each.

5.3.6 Green before grey: nature-based flood protection

DPWH’s Flood Management Program is proposed at ₱103.5B. The lines that protect watersheds and coasts (DENR’s forest development and protection, protected areas, watershed and river basin management, and coastal and marine resources, plus NIA’s watershed line) total ₱6.9B, a ratio of about 15 to 1. All of DENR is ₱28.0B. Congress tends to trim the green side: it cut DENR’s forest line from ₱3.5B to ₱2.4B in 2026 while adding ₱94B to local roads and buildings. The flood control program that collapsed in 2025 was almost entirely concrete: dikes, revetments, and river walls, built project by project with little reference to the river basin. PBC asks that no flood control money be restored unless projects follow river-basin master plans, and that a fixed share of the program be earmarked for watershed reforestation, mangroves and wetlands, and floodplain restoration, implemented with DENR and LGUs under the same disclosure rule as DPWH.

5.4 Process asks

  1. Hold the unprogrammed fund at or below the executive’s ₱112.0B, and bar the transfer of foreign-assisted projects from programmed to unprogrammed status.
  2. No self-augmentation. The House raised its own general management line from ₱6.2B to ₱14.9B in the 2026 GAA, and has raised it in all seven years. Both chambers should commit to their NEP levels.
  3. Itemize the lumps. The ₱105.7B access-roads line, the ₱30B NDRRMF preparedness item, and Financial Assistance to LGUs should each come with project lists or allocation formulas before they are voted on.
  4. Publish the bicam changes line by line, in machine-readable form, with the proponent of each amendment.
  5. Tie any restored ayuda to rules. If Congress again tops up AICS, MAIFIP, and TUPAD, the additions should carry special provisions barring politician referrals and requiring beneficiary lists to be published.

6 Questions for the hearings

  1. Real cuts in a slowdown. Programmed new appropriations grow 2.1% against inflation of 5 to 6%. With public construction down by a third and household spending slowing, why is the executive tightening the part of the budget that delivers services?
  2. Where is the crisis response? The DBCC names oil, inflation, El Niño, and remittances as the risks. Which line items in the NEP respond to each, and why are the fuel subsidy, Service Contracting, and fuel assistance lines empty?
  3. The ₱105.7B line. Why were SIPAG and the tourism, ecozone, port, and interjurisdictional road lines merged into one Basic Infrastructure Program item, what is the project list, and who identified the projects?
  4. Rail absorptive capacity. What is the 2027 disbursement schedule for the NSCR and the Subway, and how much of the ₱191.2B can be paid out within the year, given that DOTr disbursed 52.7% of its allotments in 2025?
  5. The ayuda reset. The NEP halves AICS, MAIFIP, and school feeding against the current year. If the concern is targeting, why was none of that money moved into 4Ps, the food stamp program, PhilHealth benefits, or crop insurance?
  6. Assumptions. The peso is outside the 60 to 62 band and oil is above the 2027 range. What is the revenue and interest cost of each peso of depreciation and each $10 on oil, and what is the fallback if growth again misses by a full point?

7 A note on the data

  • Coverage. The P/A/P workbook covers programmed new appropriations: national government agencies, DPWH, SUCs, budgetary support to government corporations, and special purpose funds, FY 2020 to FY 2027. Automatic and unprogrammed appropriations are not itemized in it. Amounts are in pesos in the source and shown here in billions.
  • Blanks and zeros. P/A/P amounts are read with one rule. Blank cells become zeros in every expense column, so a line that carries no amount in a given budget reads as zero. Rows that are zero in every expense column of every year are dropped (42 rows). Document-years that are entirely zero are re-blanked so they read as “no data” (none in this edition of the workbook, which carries no FY 2027 GAA columns yet). New and discontinued lines therefore count from or to zero in every change calculation.
  • Two comparisons. Changes are shown against both NEP 2026 (the executive’s previous proposal) and GAA 2026 (the enacted budget). Many apparent cuts are reversals of congressional additions, and many apparent increases are restorations of congressional cuts.
  • Relabeled lines. Several funds and programs were restructured between 2026 and 2027. They are grouped into families before changes are ranked; the families are listed in the section on increases and cuts. The National Livestock Program’s apparent zeroing is offset by a new Animal Industry Development and Competitiveness Program.
  • Automatic and unprogrammed appropriations. Automatic appropriations are itemized in a separate tab of the workbook by agency and fund, without program codes, and read with the same blank-and-zero rule; the tab’s total equals the total program less the sum of P/A/P lines in every year. BARMM’s automatic block grant and its new appropriations under Allocations to LGUs are kept as distinct line items. Unprogrammed appropriations are derived as total new appropriations less the sum of P/A/P lines. Both reconcile to DBM’s published figures for FY 2027 (₱316B increase in mandatory obligations; ₱111.984B unprogrammed).
  • Execution data are agency-level, end at FY 2025, and cover national government agencies and SUCs only. Rates are read against total allotments, which include continuing appropriations.
  • Known data issues. Four Mindanao State University project lines carry text instead of amounts in their FY 2020 cells; these are read as zero. The Joint Legislative-Executive Councils carry no amounts in any year and drop out. FY 2023 NEP lodged some DPWH district funds centrally, which inflates that year’s apparent congressional additions.
  • Macroeconomic series are pulled at knit time from the public ajamontesa/PH-Econ-Data repository (PSA national accounts and CPI, BTr cash operations and debt, Labor Force Survey).

8 Reference: every line item of ₱100 million or more

L %>% filter(tab != "SUCs", pmax(coalesce(N26, 0), coalesce(G26, 0), coalesce(N27, 0)) >= 0.1) %>%
  transmute(Department = dep, Agency = agy, `Program / Activity / Project` = PAP,
            `NEP 2026` = N26, `GAA 2026` = G26, `NEP 2027` = N27,
            `vs NEP 2026` = coalesce(N27, 0) - coalesce(N26, 0), `vs GAA 2026` = coalesce(N27, 0) - coalesce(G26, 0)) %>%
  arrange(desc(`NEP 2027`)) %>%
  dt_table(caption = "All non-SUC line items with ₱100M or more in NEP 2026, GAA 2026, or NEP 2027 (PHP billions). Search by agency or keyword; export with the buttons.",
           page = 15, money_cols = c("NEP 2026","GAA 2026","NEP 2027","vs NEP 2026","vs GAA 2026"), money_digits = 2)

Underlying data: DBM National Expenditure Program and General Appropriations Act, FY 2020 to FY 2027, compiled at P/A/P level by the People’s Budget Coalition; DBM agency-level appropriations and utilization, FY 2016 to FY 2025; PSA, BSP, and Bureau of the Treasury macroeconomic and fiscal series. DBM and DBCC statements are quoted from their published press releases of July and August 2026.