Overview

This document tracks the budget of the Department of Environment and Natural Resources – Office of the Secretary (DENR-OSEC) across ten fiscal years, FY 2018 to FY 2027 — with FY 2027 the Executive’s proposal (NEP), not yet enacted — following each peso from the Executive’s proposal (NEP) to enactment (GAA), release (allotment), commitment (obligation), and final cash payment (disbursement). It covers the Office of the Secretary; the department’s attached bureaus are summarised in a short section at the end.

It is the long-form companion to the DENR-OSEC briefing material. Where a slide deck must compress, this version keeps the full argument and adds reference tables — sortable, searchable, and exportable — so a reader can interrogate the figures directly.

DENR-OSEC has one defining feature: its budget has not grown. Over 2018–2026 it has been held almost perfectly flat in nominal terms at ₱16–19B — which, against the inflation of the period, is a real-terms cut. Three further features define it: Congress is a net subtractor, trimming the proposal in most years and cutting forestry hardest of all; administration is the single largest line in the budget; and the department has been shedding capital spending (down from 37% of the budget to 12%) in favour of payroll. The result is an environment department doing relatively less on-the-ground work, on a budget that has effectively shrunk, even as its mandate — climate resilience, Manila Bay, biodiversity, mining oversight — has expanded.

1 Executive summary

The FY 2027 proposal (NEP) is ₱20.6B — essentially flat on the 2026 proposal (₱20.5B), extending a decade of near-zero nominal growth. What makes DENR unusual is that this proposal is closer to a ceiling than a floor: Congress does not reliably augment DENR — it trimmed the 2026 proposal by ₱1.25B at enactment, so advocates arguing for more cannot assume the enacted budget will rise above the NEP. The proposal barely reshuffles internally — only a handful of lines move by more than ₱0.2B — so the story is the standstill itself, on a budget that has lost roughly 30% of its real value since 2018.

DENR-OSEC’s budget has been frozen. The enacted GAA has held at ₱16–20B for nine straight years — ₱19.4B in 2018, ₱19.3B in 2026. 2018 remains the peak. In nominal terms that is near-zero growth; adjusting for inflation, the FY 2026 budget is worth roughly ₱13.6B in 2018 pesos — about 30% below where the department started the period.

Congress is a net subtractor, and forestry is the target. The enacted GAA came in below the Executive’s proposal in six of nine years. The cuts fall overwhelmingly on Forest Development (the greening/reforestation line): cumulatively −₱12.4B from NEP to GAA, and the enacted line itself shrank from ₱6.6B (2018) to ₱2.4B (2026) — a ~63% collapse as the National Greening Program wound down.

Administration is the single largest line. General Management and Supervision (₱4.0B in 2026, about 21% of the OSEC budget) is the biggest single P/A/P — larger than any one operational program.

The department is shedding capital and adding payroll. Capital Outlays fell from 37% of the GAA (2018) to 12% (2026), while Personnel Services rose from 31% to 45%. The foreign-assisted field projects (INREMP and the Forestland Management Project) wound down by 2021 and 2023 respectively and were not replaced.

Absorption is decent and improving, but capital lags. Aggregate disbursement-to-allotment held at 82–88% from 2019 onward (with 2018 the one weak year at 74%). Personnel spending disburses at 97–99%, but MOOE and Capital Outlays trail (53–84%), and information-systems lines absorb worst.

Court-mandated cleanups are sizable line items. The Manila Bay rehabilitation (₱1.24B, pursuant to a Supreme Court continuing mandamus) and the Pasig River rehabilitation (₱0.10B) sit inside the operational program.

DENR is the portrait of a mandate outgrowing its money. The budget has been flat for nearly a decade, Congress keeps cutting the reforestation line, and the department is spending relatively more on salaries and less on the ground — even as climate and environmental pressures intensify.

2 A note on the data

Period. FY 2018 through FY 2027 for NEP and FY 2018 through FY 2026 for GAA — FY 2027 is the NEP (the Executive’s proposal) only, not yet debated or enacted and with no execution data, so wherever a chart or table shows FY 2027 the figure is proposed. Unusually for a line department, Congress has not reliably added to DENR-OSEC (it trimmed the 2026 proposal), so the FY 2027 NEP is closer to a ceiling than a floor. Execution data (Adjusted Appropriations, Adjusted Allotments, Obligations, Disbursements) is available for every year 2018–2025; FY 2026 reflects NEP/GAA only.

Scope. The main analysis is DENR Office of the Secretary only; the attached bureaus (EMB, MGB, NAMRIA, NWRB, PCSDS) are summarised in a short attached-agencies section at the end. Current New Appropriations only; nominal pesos unless a real (2018-constant) figure is named.

Expense classes. Personnel Services (PS), Maintenance & Other Operating Expenses (MOOE), and Capital Outlays (CO). DENR carries no Financial Expenses.

PREXC structure (OSEC). General Administration and Support; Support to Operations; and three operational programs — Natural Resources Conservation and Development (PREXC 3102, the operational core: forestry, protected areas, land survey, coastal/marine, and the Manila Bay and Pasig cleanups), Natural Resources Enforcement and Permitting (3101), and a small Natural Resources Assessment and Research line (3203).

On “real terms”. This dataset contains no price index. The real-terms figures cited here (e.g. the FY 2026 budget at ≈₱13.6B in 2018 pesos, ~30% below 2018) are drawn from the briefing, which deflates by the PSA Consumer Price Index (2018 = 100); the underlying nominal series is reproduced in full here.

Absorptive-capacity denominator. Unless noted, ratios use Adjusted Allotments. The three ratios are O/A (Obligations ÷ Allotment), D/O (Disbursements ÷ Obligations), and D/A (Disbursements ÷ Allotment).

3 The aggregate budget

3.1 A flat budget for nine years

evo <- osec_totals %>% filter(metric %in% c("NEP","GAA","AdjAllot","Obligations","Disbursements")) %>%
  mutate(metric = factor(metric, levels = c("NEP","GAA","AdjAllot","Obligations","Disbursements"),
    labels = c("NEP (proposed)","GAA (enacted)","Adj. Allotment","Obligations","Disbursements")))
ggplot(evo, aes(year, total, color = metric, group = metric)) +
  geom_line(linewidth = 1.0) + geom_point(size = 2) +
  scale_color_manual(values = exec_pal) +
  scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
  scale_x_continuous(breaks = c(seq(2018, 2026, 2), 2027)) +
  annotate("text", x = 2027, y = Inf, label = "proposed", vjust = 1.4, size = 3, color = "grey45") +
  labs(title = "DENR-OSEC budget, NEP through Disbursements (FY 2018–2027)",
       subtitle = "Held almost perfectly flat at PHP 16–20B for a decade; the FY 2027 NEP proposes ~PHP 20.6B",
       x = NULL, y = NULL, caption = "FY 2027 is the NEP (proposed) only; FY 2026 reflects NEP/GAA only; execution runs through 2025.") +
  theme_denr() + guides(color = guide_legend(nrow = 1))

The flat line is the whole story. In a period when most departments’ budgets rose by half or doubled, DENR-OSEC’s enacted budget barely moved — ₱19.4B in 2018, ₱19.3B in 2026. The NEP line (proposed) sits consistently above the GAA line: the Executive asks for more than Congress grants, year after year.

tbl_evo <- osec_totals %>% filter(metric %in% c("NEP","GAA","AdjAllot","Obligations","Disbursements")) %>%
  mutate(value = total/1e9) %>% select(year, metric, value) %>%
  pivot_wider(names_from = year, values_from = value) %>%
  mutate(metric = factor(metric, levels = c("NEP","GAA","AdjAllot","Obligations","Disbursements"),
    labels = c("NEP","GAA","Adj. Allotment","Obligations","Disbursements"))) %>%
  arrange(metric) %>% rename(`PHP B` = metric)
kbl_clean(tbl_evo, font = 13, digits = 1, format.args = list(big.mark = ","), na = "")
PHP B 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027
NEP 21.6 18.7 19.9 20.0 19.6 17.9 18.6 19.2 20.5 20.6
GAA 19.4 16.5 18.9 18.0 19.0 18.1 19.3 19.3 19.3
Adj. Allotment 19.3 16.4 16.3 18.0 19.0 18.1 19.3 19.2
Obligations 18.7 15.8 14.8 17.4 18.3 17.1 17.6 17.4
Disbursements 14.3 13.5 12.8 15.6 16.6 15.6 16.0 15.7

3.2 Flat in name, falling in real value

A flat nominal budget understates the squeeze. The index below sets each year’s enacted GAA against 2018 = 100: the nominal line hovers around its starting point the entire period.

idx <- osec_totals %>% filter(metric == "GAA") %>% arrange(year) %>%
  mutate(index = total / total[year == 2018] * 100)
ggplot(idx, aes(year, index)) +
  geom_hline(yintercept = 100, linetype = "dashed", color = "grey55") +
  geom_line(linewidth = 1.1, color = "#1B9E77") + geom_point(size = 2.2, color = "#1B9E77") +
  geom_text(aes(label = round(index)), vjust = -1.0, size = 3, color = "grey25") +
  scale_x_continuous(breaks = 2018:2026) +
  scale_y_continuous(limits = c(0, 115), breaks = seq(0, 100, 25)) +
  labs(title = "DENR-OSEC enacted GAA, indexed to 2018 = 100 (nominal)",
       subtitle = "Nine years near the starting line — before any adjustment for inflation",
       x = NULL, y = "Index (2018 = 100)") +
  theme_denr()

Because the underlying dataset has no price index, the deflated figure here is drawn from the briefing (PSA CPI, 2018 = 100): adjusting for inflation, the FY 2026 budget of ₱19.3B is worth roughly ₱13.6B in 2018 pesos — about 30% below the department’s 2018 level. The department’s real resources have shrunk by nearly a third even as its mandate has widened.

3.3 Congress as a net subtractor

wide_yr <- osec_totals %>% pivot_wider(names_from = metric, values_from = total)
growth <- wide_yr %>% arrange(year) %>%
  transmute(year, `GAA (B)` = round(GAA/1e9,1), `Growth %` = scales::percent(GAA/lag(GAA) - 1, accuracy = 0.1),
            `NEP (B)` = round(NEP/1e9,1), `Net adj. GAA−NEP (B)` = round((GAA-NEP)/1e9,1))
kbl_clean(growth, font = 13, align = "rrrrr", na = "")
year GAA (B) Growth % NEP (B) Net adj. GAA−NEP (B)
2018 19.4 21.6 -2.2
2019 16.5 -15.0% 18.7 -2.2
2020 18.9 14.6% 19.9 -1.1
2021 18.0 -4.8% 20.0 -2.0
2022 19.0 5.6% 19.6 -0.6
2023 18.1 -4.6% 17.9 0.2
2024 19.3 6.6% 18.6 0.7
2025 19.3 -0.1% 19.2 0.1
2026 19.3 0.1% 20.5 -1.3
2027 20.6

The net-adjustment column is negative in six of nine years. Congress trims the Executive’s environment proposal more often than not — most heavily in 2018–2021 (−₱1B to −₱2.2B a year). As the next sections show, those cuts are concentrated in one place: forestry.

4 Where the money goes

4.1 By PREXC program

comp <- osec_long %>% filter(metric == "GAA", year <= 2026, !is.na(amount)) %>%
  group_by(year, category) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
  mutate(category = factor(category, levels = names(cat_pal)))
ggplot(comp, aes(year, amount, fill = category)) +
  geom_col(width = 0.75, color = "white", linewidth = 0.2) +
  scale_fill_manual(values = cat_pal, labels = function(x) str_wrap(x, 24)) +
  scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
  scale_x_continuous(breaks = seq(2018, 2026, 2)) +
  labs(title = "Composition of the GAA by PREXC program, 2018–2026",
       subtitle = "The field program (NR Conservation & Development) shrank; administration held its ground",
       x = NULL, y = NULL) +
  theme_denr() + guides(fill = guide_legend(nrow = 3, byrow = TRUE))

The green Natural Resources Conservation and Development band — the on-the-ground field program housing forestry, protected areas, and land management — contracted over the period, because forestry inside it was cut. Administration (gold) and Support to Operations held roughly steady, so the department’s mix tilted away from field operations.

comp_tbl <- comp %>% group_by(year) %>% mutate(share = round(amount/sum(amount)*100,1)) %>% ungroup() %>%
  select(category, year, share) %>% pivot_wider(names_from = year, values_from = share)
kbl_clean(comp_tbl %>% rename(`Program (% of GAA)` = category), font = 12.5, digits = 1, na = "")
Program (% of GAA) 2018 2019 2020 2021 2022 2023 2024 2025 2026
General Administration and Support 14.9 18.3 15.5 16.8 19.9 20.6 20.5 20.7 24.5
Natural Resources Assessment and Research 0.5 0.4 0.4 0.4 0.4 0.4 0.3 0.5 0.4
Natural Resources Conservation and Development 66.2 56.9 64.3 61.5 60.1 56.2 56.1 52.7 51.0
Natural Resources Enforcement and Permitting 7.0 10.3 8.6 9.0 8.4 9.6 8.6 8.8 9.1
Support to Operations 11.4 14.0 11.1 12.2 11.2 13.1 14.4 17.4 15.1

4.2 By expense class

ec_levels <- c("Personnel Services (PS)","Maintenance & Other Op. Exp. (MOOE)","Capital Outlays (CO)")
comp_ec <- df_long_all %>% filter(agency == "Office of the Secretary", metric == "GAA", year <= 2026,
                                  expense_class %in% c("1PS","2MOOE","6CO")) %>%
  group_by(year, expense_class) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
  mutate(expense_class = factor(expense_class, levels = c("1PS","2MOOE","6CO"), labels = ec_levels))
ggplot(comp_ec, aes(year, amount, fill = expense_class)) +
  geom_col(width = 0.75, color = "white", linewidth = 0.2) +
  scale_fill_manual(values = ec_pal) +
  scale_y_continuous(labels = php_b_axis, breaks = pretty_breaks(6), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
  scale_x_continuous(breaks = seq(2018, 2026, 2)) +
  labs(title = "GAA composition by Expense Class, 2018–2026",
       subtitle = "Capital Outlays fell from 37% (2018) to 12% (2026); Personnel Services rose from 31% to 45%",
       x = NULL, y = NULL) +
  theme_denr() + guides(fill = guide_legend(nrow = 1))

This is the most telling chart in the report. Capital Outlays — physical works like reforestation, facilities, and survey infrastructure — fell from 37% of the budget to 12%, while Personnel Services climbed from 31% to 45%. On a frozen total, a department spending a rising share on salaries is necessarily spending a falling share on the ground. The wind-down of the foreign-assisted field projects (next section) is part of this story.

ec_share <- comp_ec %>% group_by(year) %>% mutate(share = round(amount/sum(amount)*100,1)) %>% ungroup() %>%
  select(expense_class, year, share) %>% pivot_wider(names_from = year, values_from = share)
kbl_clean(ec_share %>% rename(`Expense class (% of GAA)` = expense_class), font = 12.5, digits = 1, na = "")
Expense class (% of GAA) 2018 2019 2020 2021 2022 2023 2024 2025 2026
Personnel Services (PS) 31.1 39.7 35.5 39.8 39.2 41.8 38.9 39.7 44.9
Maintenance & Other Op. Exp. (MOOE) 32.2 37.1 46.3 35.8 39.9 40.7 42.7 45.5 43.5
Capital Outlays (CO) 36.7 23.3 18.1 24.3 20.9 17.5 18.4 14.8 11.6

4.3 The largest P/A/Ps (FY 2027 NEP, proposed)

top10 <- osec_pap_year %>% filter(year == 2027, !is.na(NEP), NEP > 0) %>%
  arrange(desc(NEP)) %>% slice_head(n = 10) %>% mutate(pap = factor(pap, levels = rev(pap)))
ggplot(top10, aes(pap, NEP)) +
  geom_col(fill = "#54278F", width = 0.75) +
  geom_text(aes(label = php_b(NEP)), hjust = -0.1, size = 3.3, color = "grey20") +
  coord_flip() +
  scale_x_discrete(labels = function(x) str_wrap(x, 44)) +
  scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0, .20)), limits = c(0, NA)) +
  labs(title = "Top 10 P/A/Ps by FY 2027 NEP (proposed)",
       subtitle = "General Management & Supervision is still the single largest line — bigger than any one field program",
       x = NULL, y = NULL) +
  theme_denr() +
  theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"))

That administration tops the list is itself a finding: in a department whose purpose is forests, mines, water, and biodiversity, the single largest line is General Management and Supervision — ₱4.0B, about 21% of the 2026 OSEC budget. The operational heavyweights that follow — Forest Development, Protected Areas, Land Survey, and the natural-resources permitting line — are each smaller than the overhead.

Full P/A/P ranking (interactive)

allp <- osec_pap_year %>% filter(year == 2027) %>%
  transmute(`P/A/P` = pap, `NEP 2027 (B)` = NEP/1e9)
nep_gaa_26 <- osec_pap_year %>% filter(year == 2026) %>%
  transmute(`P/A/P` = pap, `NEP 2026 (B)` = NEP/1e9, `GAA 2026 (B)` = GAA/1e9)
da25 <- osec_pap_year %>% filter(year == 2025) %>%
  transmute(`P/A/P` = pap, `D/A 2025` = ifelse(!is.na(AdjAllot) & AdjAllot > 0, Disbursements/AdjAllot, NA_real_))
allp <- allp %>% full_join(nep_gaa_26, by = "P/A/P") %>% left_join(da25, by = "P/A/P") %>%
  arrange(desc(`NEP 2027 (B)`))
dt_table(allp, page = 12, money_cols = c("NEP 2027 (B)","NEP 2026 (B)","GAA 2026 (B)"), pct_cols = "D/A 2025")

5 What the FY 2027 proposal changes

Comparing the two proposals — the FY 2026 NEP against the FY 2027 NEP — isolates what the Executive itself chose to change. For DENR the answer is: almost nothing. The FY 2027 proposal is close to a line-by-line copy of the FY 2026 one; only a handful of P/A/Ps move by more than ₱0.15B, and the largest single move is well under half a billion pesos. In a portfolio of this size that near-total stillness is the finding — there is no reallocation to scrutinise, only a standstill to question.

nep_change <- osec_pap_year %>%
  filter(year %in% c(2026, 2027)) %>%
  select(pap, year, NEP) %>%
  pivot_wider(names_from = year, values_from = NEP, names_prefix = "y") %>%
  mutate(change = (coalesce(y2027, 0) - coalesce(y2026, 0)) / 1e9) %>%
  filter(abs(change) >= 0.15) %>%
  arrange(desc(change)) %>%
  mutate(pap = factor(pap, levels = rev(pap)),
         dir = ifelse(change >= 0, "Increased", "Reduced"))

ggplot(nep_change, aes(pap, change, fill = dir)) +
  geom_col(width = 0.6) +
  geom_text(aes(label = sprintf("%+.2f", change),
                hjust = ifelse(change >= 0, -0.15, 1.15)),
            size = 3, color = "grey25") +
  coord_flip() +
  scale_fill_manual(values = c("Increased" = "#1B7837", "Reduced" = "#D95F02")) +
  scale_x_discrete(labels = function(x) str_wrap(x, 44)) +
  scale_y_continuous(labels = function(v) paste0(peso, v, "B"),
                     expand = expansion(mult = c(0.22, 0.22))) +
  labs(title = "What the Executive changed: FY 2026 NEP to FY 2027 NEP (PHP B)",
       subtitle = "Only three lines move by more than PHP 0.15B \u2014 a standstill proposal",
       x = NULL, y = NULL) +
  theme_denr() +
  theme(panel.grid.major.y = element_blank(),
        panel.grid.major.x = element_line(color = "grey85"),
        legend.position = "none")

The only material moves are a top-up to natural-resource management arrangements (+₱0.42B) and to land survey (+₱0.21B), set against a trim to data-management and IT systems (−₱0.48B). Everything else is held within a rounding error of its 2026 proposed level. For an agency whose mandate — climate resilience, biodiversity, Manila Bay, mining oversight — has only expanded, a proposal that changes essentially nothing is itself the point of scrutiny.

6 The shrinking of forestry

The clearest movement in the DENR budget is the steady retreat of its reforestation effort. Forest Development, Rehabilitation, Maintenance and Protection — the line that carried the National Greening Program — was the department’s largest field program at the start of the period and has been cut, both by the Executive’s own proposals and by Congress on top of them.

forest <- osec_pap_year %>% filter(str_detect(pap, "Forest Development")) %>%
  select(year, NEP, GAA, AdjAllot, Disbursements) %>%
  pivot_longer(-year, names_to = "metric", values_to = "amount") %>% filter(!is.na(amount)) %>%
  mutate(metric = factor(metric, levels = c("NEP","GAA","AdjAllot","Disbursements"),
    labels = c("NEP (proposed)","GAA (enacted)","Adj. Allotment","Disbursements")))
ggplot(forest, aes(year, amount, color = metric, group = metric)) +
  geom_line(linewidth = 1.0) + geom_point(size = 2.2) +
  scale_color_manual(values = exec_pal) +
  scale_y_continuous(labels = php_b, breaks = pretty_breaks(5), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
  scale_x_continuous(breaks = 2018:2026) +
  labs(title = "Forest Development: proposed, enacted, allotted, disbursed (2018–2026)",
       subtitle = "From PHP 6.6B enacted (2018) to PHP 2.4B (2026); Congress cuts the proposal further every year",
       x = NULL, y = NULL) +
  theme_denr() + guides(color = guide_legend(nrow = 1))

osec_pap_year %>% filter(str_detect(pap, "Forest Development")) %>%
  transmute(FY = year, `NEP (B)` = round(NEP/1e9,2), `GAA (B)` = round(GAA/1e9,2),
            `Cong. cut (B)` = round((GAA-NEP)/1e9,2), `Allotment (B)` = round(AdjAllot/1e9,2),
            `Disbursed (B)` = round(Disbursements/1e9,2),
            `D/A` = ifelse(!is.na(AdjAllot) & AdjAllot > 0, scales::percent(Disbursements/AdjAllot, accuracy = 1), NA_character_)) %>%
  arrange(FY) %>% kbl_clean(font = 13, align = "rrrrrrr", na = "")
FY NEP (B) GAA (B) Cong. cut (B) Allotment (B) Disbursed (B) D/A
2018 8.62 6.62 -2.00 6.62 5.24 79%
2019 6.64 4.09 -2.55 4.09 3.70 90%
2020 6.65 4.65 -2.00 4.12 3.65 89%
2021 6.73 4.74 -1.99 4.74 4.26 90%
2022 5.31 3.89 -1.42 3.88 3.58 92%
2023 4.15 4.05 -0.10 4.05 3.39 84%
2024 4.12 2.86 -1.26 2.85 2.61 92%
2025 3.10 3.10 0.00 3.10 2.75 89%
2026 3.51 2.42 -1.09
2027 3.56

Two cuts compound here. The Executive’s proposal for forestry fell from ₱8.6B (2018) to ₱3.5B (2026); then Congress trimmed the proposal further in almost every year — cumulatively −₱12.4B below NEP across the period. The enacted line ends at ₱2.4B, roughly a third of its 2018 level. Alongside this, the department’s two foreign-assisted field projects — the Integrated Natural Resources and Environmental Management Project (INREMP) and the Forestland Management Project — wound down by 2021 and 2023 respectively and were not replaced, removing what had been a meaningful slice of capital-intensive, on-the-ground work (and a chronically weak absorber, disbursing 17–50% in its active years).

The forestry retreat has a mirror image. As active reforestation (Forest Development) shrank from ₱6.6B to ₱2.4B, conservation (Protected Areas Development and Management) grew from ₱1.4B to ₱2.3B — the two faces of DENR’s forest strategy. Congress is not simply cutting the environment budget; within a frozen total it is reallocating from planting trees toward managing and protecting what already stands.

7 Congressional action: NEP → GAA

aug <- osec_pap_year %>% filter(year <= 2026) %>% group_by(pap) %>%
  summarise(nep = sum(NEP, na.rm = TRUE), gaa = sum(GAA, na.rm = TRUE), .groups = "drop") %>%
  mutate(change = gaa - nep) %>% filter(abs(change) >= 2e8)
aug_plot <- bind_rows(aug %>% arrange(desc(change)) %>% slice_head(n = 7),
                      aug %>% arrange(change) %>% slice_head(n = 5)) %>% distinct() %>%
  mutate(direction = ifelse(change >= 0, "Net increase (GAA > NEP)", "Net decrease (GAA < NEP)"),
         hj = ifelse(change >= 0, -0.12, 1.12), pap = factor(pap, levels = pap[order(change)]))
ggplot(aug_plot, aes(pap, change/1e9, fill = direction)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = sprintf("%+.1fB", change/1e9), hjust = hj), size = 2.9, color = "grey20") +
  coord_flip() +
  scale_fill_manual(values = c("Net increase (GAA > NEP)" = "#1B9E77", "Net decrease (GAA < NEP)" = "#D95F02")) +
  scale_x_discrete(labels = function(x) str_trunc(x, 48)) +
  scale_y_continuous(labels = function(v) paste0(peso, v, "B"), expand = expansion(mult = c(0.25, 0.25))) +
  labs(title = "Cumulative NEP-to-GAA change by P/A/P, 2018–2026",
       subtitle = "Forestry is cut far more than anything else; protected areas and coastal work are added",
       x = NULL, y = NULL) +
  theme_denr() +
  theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85")) +
  guides(fill = guide_legend(nrow = 1))

The pattern is lopsided. Forest Development absorbs essentially all of the cutting (−₱12.4B). On the additions side, Congress consistently tops up Protected Areas (+₱2.9B cumulative), Coastal and Marine Resources (+₱0.7B), and Land Survey (+₱0.6B) — reallocating, in effect, from reforestation toward conservation and land administration. The full list of material movers is below.

aug_full <- osec_pap_year %>% filter(year <= 2026) %>% group_by(pap) %>%
  summarise(nep = sum(NEP, na.rm = TRUE), gaa = sum(GAA, na.rm = TRUE), .groups = "drop") %>%
  mutate(change = gaa - nep) %>% filter(abs(change) >= 1e8) %>%
  transmute(`P/A/P` = pap, `Σ NEP (B)` = nep/1e9, `Σ GAA (B)` = gaa/1e9, `Cumulative change (B)` = change/1e9) %>%
  arrange(`Cumulative change (B)`)
dt_table(aug_full, page = 10, money_cols = c("Σ NEP (B)","Σ GAA (B)","Cumulative change (B)"))

8 Absorptive capacity

8.1 At the aggregate

absorp_long <- osec_absorp %>% select(year, oblig_allot, disb_oblig, disb_allot) %>%
  pivot_longer(-year, names_to = "ratio", values_to = "value") %>%
  mutate(ratio = factor(ratio, levels = c("oblig_allot","disb_oblig","disb_allot"),
    labels = c("Obligations / Adj. Allotment","Disbursements / Obligations","Disbursements / Adj. Allotment")))
ggplot(absorp_long, aes(year, value, color = ratio, group = ratio)) +
  geom_line(linewidth = 0.9) + geom_point(size = 2) +
  scale_color_manual(values = absorp_pal) +
  scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1.08), breaks = seq(0, 1, 0.2)) +
  scale_x_continuous(breaks = 2018:2025) +
  labs(title = "DENR-OSEC absorptive capacity, 2018–2025",
       subtitle = "A solid absorber by Philippine standards — D/A held at 82–88% from 2019 onward; FY 2018 was the one weak year",
       x = NULL, y = NULL) +
  theme_denr() + guides(color = guide_legend(nrow = 1))

osec_absorp %>% transmute(Year = year, `Allotment (B)` = round(AdjAllot/1e9,1),
            `Obligations (B)` = round(Obligations/1e9,1), `Disbursements (B)` = round(Disbursements/1e9,1),
            `O/A` = scales::percent(oblig_allot, accuracy = 1), `D/O` = scales::percent(disb_oblig, accuracy = 1),
            `D/A` = scales::percent(disb_allot, accuracy = 1)) %>%
  kbl_clean(font = 13, align = "rrrrrrr")
Year Allotment (B) Obligations (B) Disbursements (B) O/A D/O D/A
2018 19.3 18.7 14.3 97% 76% 74%
2019 16.4 15.8 13.5 96% 86% 83%
2020 16.3 14.8 12.8 91% 86% 78%
2021 18.0 17.4 15.6 97% 90% 87%
2022 19.0 18.3 16.6 97% 91% 88%
2023 18.1 17.1 15.6 94% 91% 86%
2024 19.3 17.6 16.0 91% 91% 83%
2025 19.2 17.4 15.7 91% 90% 82%

Unlike the budget itself, absorption is sound — disbursement-to-allotment held at 82–88% from 2019 onward, with 2018 (74%) the one weak year. A frozen, increasingly personnel-weighted budget is, mechanically, easier to spend: salaries disburse almost fully, so as PS rose as a share of the total, aggregate absorption held up.

8.2 By expense class

absorp_ec <- df_long_all %>% filter(agency == "Office of the Secretary",
    metric %in% c("AdjAllot","Disbursements"), expense_class %in% c("1PS","2MOOE","6CO"), year %in% 2018:2025) %>%
  group_by(year, metric, expense_class) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
  pivot_wider(names_from = metric, values_from = amount) %>%
  mutate(da = ifelse(AdjAllot > 1e8, Disbursements/AdjAllot, NA_real_),
         expense_class = factor(expense_class, levels = c("1PS","2MOOE","6CO"),
                                labels = c("Personnel Services (PS)","Maintenance & Other Op. Exp. (MOOE)","Capital Outlays (CO)")))
ggplot(absorp_ec, aes(year, da, color = expense_class, group = expense_class)) +
  geom_line(linewidth = 0.9) + geom_point(size = 1.8) +
  geom_text(aes(label = scales::percent(da, accuracy = 1)), vjust = -1.0, size = 2.8, show.legend = FALSE, color = "grey20") +
  scale_color_manual(values = ec_pal) +
  scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1.12), breaks = seq(0, 1, 0.2)) +
  scale_x_continuous(breaks = 2018:2025) +
  labs(title = "Disbursement-to-Allotment by Expense Class, 2018–2025",
       subtitle = "Personnel absorbs at 97–99% every year; MOOE and Capital Outlays both run 53–84%",
       x = NULL, y = NULL) +
  theme_denr() + guides(color = guide_legend(nrow = 1))

The aggregate hides the usual split: Personnel Services disburses at 97–99% every year, while MOOE and Capital Outlays run 53–84%. The remaining capital spending — what survives of the field works — is the hardest to convert into payments within the year, the same pattern seen across the infrastructure-heavy departments, just on a much smaller base.

8.3 Strongest and weakest absorbers (FY 2025)

abs_2025 <- osec_pap_year %>% filter(year == 2025, !is.na(AdjAllot), AdjAllot >= 1e8) %>%
  mutate(`O/A` = Obligations/AdjAllot, `D/O` = Disbursements/Obligations, `D/A` = Disbursements/AdjAllot,
         `Allotment (B)` = round(AdjAllot/1e9, 2))

Strongest absorbers, FY 2025 — land administration, legal, policy, and the forestry line all disburse at 89–94%.

abs_2025 %>% arrange(desc(`D/A`)) %>% slice_head(n = 6) %>%
  transmute(`P/A/P` = str_trunc(pap, 54), `Allotment (B)`,
            `O/A` = scales::percent(`O/A`, accuracy = 1), `D/O` = scales::percent(`D/O`, accuracy = 1),
            `D/A` = scales::percent(`D/A`, accuracy = 1)) %>%
  kbl_clean(font = 13, align = "lrrrr")
P/A/P Allotment (B) O/A D/O D/A
Land Survey, Disposition and Records Management 1.87 98% 96% 94%
Legal Services including Operations Against Unlawfu… 0.34 98% 96% 94%
Formulation and Monitoring of ENR Sector Policies, … 0.75 94% 96% 91%
Administration of Personnel Benefits 0.21 100% 91% 91%
Development, Updating and Implementation of the Ope… 1.24 94% 95% 89%
Forest Development, Rehabilitation, Maintenance and… 3.10 95% 93% 89%

Weakest absorbers, FY 2025 — information systems (Data Management, 32%), enforcement, and research lines.

abs_2025 %>% arrange(`D/A`) %>% slice_head(n = 6) %>%
  transmute(`P/A/P` = str_trunc(pap, 54), `Allotment (B)`,
            `O/A` = scales::percent(`O/A`, accuracy = 1), `D/O` = scales::percent(`D/O`, accuracy = 1),
            `D/A` = scales::percent(`D/A`, accuracy = 1)) %>%
  kbl_clean(font = 13, align = "lrrrr")
P/A/P Allotment (B) O/A D/O D/A
Data Management including Systems Development and M… 1.28 76% 43% 32%
Operations against illegal environment and natural … 0.11 72% 78% 56%
Conduct of Special Studies, Design and Development … 0.49 67% 85% 57%
Soil Conservation and Watershed Management includin… 0.66 77% 77% 59%
Protection and conservation of wildlife 0.19 80% 78% 63%
Management of Coastal and Marine Resources/Areas 0.26 88% 85% 76%

The standout laggard is Data Management including Systems Development at 32% — a ₱1.3B IT line that disbursed barely a third of its allotment, the kind of large under-spend that warrants a direct question about procurement and contracting.

Full absorption table, FY 2025 (interactive)

abs_full <- osec_pap_year %>% filter(year == 2025, !is.na(AdjAllot), AdjAllot > 0) %>%
  transmute(`P/A/P` = pap, `Allotment (B)` = AdjAllot/1e9, `Obligations (B)` = Obligations/1e9,
            `Disbursements (B)` = Disbursements/1e9, `O/A` = Obligations/AdjAllot,
            `D/O` = ifelse(Obligations>0, Disbursements/Obligations, NA_real_), `D/A` = Disbursements/AdjAllot) %>%
  arrange(`D/A`)
dt_table(abs_full, page = 15, money_cols = c("Allotment (B)","Obligations (B)","Disbursements (B)"),
         pct_cols = c("O/A","D/O","D/A"))

9 Program deep-dives

9.1 Trajectories of the largest programs

trend_paps <- c(
  "General Management and Supervision",
  "Forest Development, Rehabilitation, Maintenance and Protection",
  "Protected areas development and management",
  "Land Survey, Disposition and Records Management",
  "Natural Resources management arrangement/agreement and permit issuance",
  "Development, Updating and Implementation of the Operational Plan for the Manila Bay Coastal Management Strategy pursuant to SC Decision under GR No. 171947-48")
trend_dat <- osec_pap_year %>% filter(pap %in% trend_paps) %>%
  select(pap, year, GAA, AdjAllot, Disbursements) %>%
  pivot_longer(c(GAA, AdjAllot, Disbursements), names_to = "metric", values_to = "amount") %>%
  filter(!is.na(amount)) %>%
  mutate(metric = factor(metric, levels = c("GAA","AdjAllot","Disbursements"),
    labels = c("GAA (enacted)","Adj. Allotment","Disbursements")),
    pap = factor(pap, levels = trend_paps,
      labels = c("General Management & Supervision","Forest Development","Protected Areas",
                 "Land Survey & Records","NR Management & Permitting","Manila Bay Rehabilitation")))
trend_pal <- c("GAA (enacted)" = "#54278F","Adj. Allotment" = "#08519C","Disbursements" = "#31A354")
ggplot(trend_dat, aes(year, amount, color = metric, group = metric)) +
  geom_line(linewidth = 0.9) + geom_point(size = 1.5) +
  facet_wrap(~ pap, ncol = 3, scales = "free_y", labeller = label_wrap_gen(width = 24)) +
  expand_limits(y = 0) +
  scale_color_manual(values = trend_pal) +
  scale_y_continuous(labels = php_b, breaks = pretty_breaks(4)) +
  scale_x_continuous(breaks = c(2018, 2022, 2026)) +
  labs(title = "How the six largest programs have evolved (2018–2026)",
       subtitle = "Forestry falls; administration, protected areas, and the Manila Bay mandate hold or rise",
       x = NULL, y = NULL) +
  theme_denr() + guides(color = guide_legend(nrow = 1))

The panels capture the reallocation cleanly. Forest Development slopes down throughout. Administration is flat-to-rising and executes tightly. Protected Areas, Land Survey, and the court-mandated Manila Bay rehabilitation hold their ground or grow — the conservation-and-administration core that Congress has protected even as it cut reforestation.

10 The attached bureaus

The main report covers the Office of the Secretary. DENR also has five attached bureaus and councils, appropriated separately and shown here on an appropriations basis only — no P/A/P-level execution data is published for them. Together they add roughly ₱9B to the DENR total, and the FY 2027 proposal leaves them close to their recent levels, with one notable trim.

attached <- df_long_all %>%
  filter(agency != "Office of the Secretary", expense_class == "TOTAL") %>%
  group_by(agency, year, metric) %>%
  summarise(amount = if (all(is.na(amount))) NA_real_ else sum(amount, na.rm = TRUE), .groups = "drop")

att_2027 <- attached %>% filter(metric == "NEP", year == 2027, !is.na(amount), amount > 0) %>%
  arrange(amount) %>% mutate(agency = factor(agency, levels = agency))

ggplot(att_2027, aes(agency, amount)) +
  geom_col(fill = "#54278F", width = 0.66) +
  geom_text(aes(label = php_b(amount)), hjust = -0.1, size = 3.2, color = "grey20") +
  coord_flip() +
  scale_x_discrete(labels = function(x) str_wrap(x, 40)) +
  scale_y_continuous(labels = php_b_axis, expand = expansion(mult = c(0, .22)), limits = c(0, NA)) +
  labs(title = "Attached bureaus by FY 2027 NEP (proposed)",
       subtitle = "Appropriations basis only; no execution data is published for these bureaus",
       x = NULL, y = NULL) +
  theme_denr() +
  theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"))

att_tbl <- attached %>%
  filter((metric == "NEP" & year %in% c(2026, 2027)) | (metric == "GAA" & year == 2026)) %>%
  mutate(key = paste0(metric, year)) %>%
  select(agency, key, amount) %>%
  pivot_wider(names_from = key, values_from = amount) %>%
  transmute(Bureau = agency,
            `NEP 2027 (B)` = NEP2027/1e9,
            `NEP 2026 (B)` = NEP2026/1e9,
            `GAA 2026 (B)` = GAA2026/1e9) %>%
  arrange(desc(`NEP 2027 (B)`))
kbl_clean(att_tbl, font = 13, digits = 2, format.args = list(big.mark = ","), na = "")
Bureau NEP 2027 (B) NEP 2026 (B) GAA 2026 (B)
Environmental Management Bureau 3.10 3.31 3.46
National Mapping and Resource Information Authority 1.99 1.97 1.98
Mines and Geosciences Bureau 1.89 1.84 1.85
National Water Resources Board 0.28 0.29 0.29
Palawan Council for Sustainable Development Staff 0.15 0.15 0.15

The Environmental Management Bureau (₱3.1B) — which handles pollution control and environmental compliance — is the largest attached body, and it is proposed down from its ₱3.46B FY 2026 enacted level. NAMRIA (mapping, ₱2.0B) and the Mines and Geosciences Bureau (₱1.9B) are close to flat, and the National Water Resources Board and Palawan Council are small and steady. As with the OSEC lines, none of these bureaus publishes P/A/P-level execution data, so this appropriations view is as far as the analysis can go.

11 Questions for discussion

  1. A budget frozen for nine years. DENR-OSEC has been flat in nominal pesos since 2018 — a real-terms cut of about 30% — even as climate, biodiversity, and pollution mandates expanded. Is this a deliberate prioritization, and what has the department had to forgo?
  2. The retreat from reforestation. Forest Development fell from ₱6.6B to ₱2.4B enacted, cut by both the Executive and Congress (−₱12.4B cumulative below NEP). Is the National Greening Program being wound down by design, and what replaces it?
  3. Administration as the largest line. General Management and Supervision is the single biggest item in the budget. Is the overhead share appropriate for a department whose field programs are shrinking?
  4. Shedding capital for payroll. Capital Outlays fell from 37% to 12% of the budget while Personnel Services rose to 45%. With the foreign-assisted field projects closed out, how much real on-the-ground capacity remains?
  5. The information-systems under-spend. Data Management disbursed only 32% of a ₱1.3B allotment in 2025. What is the binding constraint on the department’s IT and systems modernization?

Underlying data: DBM-published budget and execution data for the DENR Office of the Secretary (Current New Appropriations only), FY 2018–2026; attached bureaus are out of scope. Execution measures (Allotments, Obligations, Disbursements) cover FY 2018–2025. Real-terms figures are deflated by the PSA Consumer Price Index (2018 = 100), external to this dataset. Prepared as the long-form companion to the DENR-OSEC budget briefing.