This document tracks the budget of the Department of Agrarian Reform – Office of the Secretary (DAR-OSEC) across ten fiscal years, FY 2018 to FY 2027, following each peso from the Executive’s proposal (NEP) to enactment (GAA), release (allotment), commitment (obligation), and final cash payment (disbursement). It is written for civil-society organizations and advocates scrutinizing the newly released FY 2027 proposal — so it pairs the long-run record with a close look at what the Executive is now proposing, and it ends with a full, sortable line-item table advocates can interrogate directly.
The headline for FY 2027: after a one-year surge to ₱16.8B in 2026, the Executive proposes to pull DAR-OSEC back to ₱14.7B — a 13% cut. But the more important story is what is being cut and what is being scaled up. The being-wound-down World Bank land-titling project (SPLIT) falls ₱4.4B; the money pivots into livelihood and value-chain lines — the VISTA project and a brand-new ₱1.4B flagship, Pang-Agraryong Tulay para sa Bagong Bayanihan.
This matters because of a distinctive DAR pattern the long record makes clear. The agency runs on two very different kinds of money: routine, domestically-run programs that absorb beautifully (94–99% disbursed), and foreign-assisted and newer project lines that absorb badly (19–38%). The FY 2027 proposal leans harder on the second kind — scaling up exactly the lines DAR has the weakest record of actually spending, and adding one with no track record at all. That is the central question this report equips advocates to press.
The FY 2027 NEP proposes to shrink DAR-OSEC to ₱14.7B — down 13% from the FY 2026 enacted ₱16.8B. After a one-year surge, the Executive is pulling the department back (though still well above the ₱8–10B pre-2026 baseline).
The land-titling project (SPLIT) is being wound down. The World Bank-funded SPLIT falls from ₱5.1B (2026, the single largest line) to just ₱0.7B — a ₱4.4B cut — dragging the Land Tenure Security program down with it.
The money pivots to ARB development and livelihood. ARB Development & Sustainability rises +₱2.4B, led by the VISTA value-chain project (₱1.2B → ₱2.0B) and a brand-new ₱1.4B line, Pang-Agraryong Tulay para sa Bagong Bayanihan.
Core Land Acquisition & Distribution (LAD) grows modestly to ₱3.1B and is again the largest single line.
A red flag for advocates. The projects being scaled up are the ones DAR absorbs worst. VISTA disbursed just 19% of its allotment in 2025, yet is proposed to nearly double; the new Pang-Agraryong Tulay line has no track record at all. Meanwhile the domestic core — LAD, legal assistance, social infrastructure — disburses at 94–99%, versus 31–38% for SPLIT.
Congress has cut DAR’s proposals before. In FY 2022 and FY 2023 the enacted GAA came in ₱2.4B and ₱4.5B below the Executive’s NEP — so the FY 2027 numbers are a starting point advocates can shape, not a settled outcome.
The scrutiny question in one line: is a smaller budget that leans on weak-absorbing and untested project lines a credible plan to finish agrarian reform — or a headline figure the delivery record can’t support?
Period. FY 2018 through FY 2027. FY 2027 is the NEP — the Executive’s proposal — only: it has not been debated or enacted, and has no execution data. FY 2026 reflects NEP/GAA only. Execution data (Adjusted Allotments, Obligations, Disbursements) is available for FY 2018–2025, so the most recent per-P/A/P utilization shown throughout is FY 2025.
Reading the proposal. Wherever a chart or table shows FY 2027, the figure is the proposed amount. Whether it survives Congress — which has cut DAR’s proposals before — is exactly what advocates can shape. The FY 2025 execution columns are included alongside the 2027 proposal so a reader can weigh each line’s track record against what it is now being handed.
Key terms. NEP = National Expenditure Program (the Executive’s proposal); GAA = General Appropriations Act (what Congress enacts). Allotment = what an agency is cleared to spend; Obligation = a spending commitment; Disbursement = cash actually paid out. D/A (disbursements ÷ allotment) is the sharpest measure of whether money reaches the ground.
One known data gap. FY 2018 execution data for the foreign-assisted projects (SPLIT, IARCDSP, MINSAAD, CONVERGE, IPAC, VISTA) and two small building lines is not yet encoded. The 2018 aggregate execution totals therefore exclude those P/A/Ps — about ₱2B of GAA. To avoid presenting biased ratios, the absorption charts cover FY 2019–2025 only, and the 2018 execution figures are masked in the evolution chart and table. Subsequent years are complete.
Scope. The DAR Office of the Secretary, which is the entire department as encoded here. Current New Appropriations only; nominal pesos.
PREXC structure. General Administration and Support; Support to Operations; and three core programs — Land Tenure Security, Agrarian Justice Delivery, and ARB (Agrarian Reform Beneficiaries) Development and Sustainability.
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).
evo <- totals_by_year %>%
filter(metric %in% c("NEP","GAA","AdjAllot","Obligations","Disbursements")) %>%
mask_2018() %>%
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)) +
labs(title = "DAR-OSEC budget, NEP through Disbursements (FY 2018–2027)",
subtitle = "A flat PHP 8–10B budget for eight years, a one-year jump to PHP 16.8B (2026) — then a proposed pull-back to PHP 14.7B (2027)",
x = NULL, y = NULL,
caption = "Execution lines start at FY 2019 (2018 foreign-assisted SAAODB not yet encoded). FY 2026 = NEP/GAA only; FY 2027 = NEP (proposed) only.") +
theme_dar() + guides(color = guide_legend(nrow = 1))
The flat stretch from 2018 to 2025 is the most striking long-run feature — in nominal terms, DAR’s budget barely moved for eight years while health, education, and social welfare grew steadily. The 2026 enacted budget broke the pattern; the FY 2027 proposal (the rightmost point, NEP only) steps back down to ₱14.7B — still above the old baseline, but a clear pull-back. Notice too that in two years (2022 and 2023) the NEP line sits well above the GAA line: those are years Congress cut the proposal, a reversal explored below — and a reminder that the 2027 proposal is not the last word. The table gives the figures (2018 execution masked, per the data note; the 2027 column carries the proposal only).
tbl_evo <- totals_by_year %>%
filter(metric %in% c("NEP","GAA","AdjAllot","Obligations","Disbursements")) %>%
mask_2018() %>%
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 | 9.9 | 7.8 | 8.0 | 8.4 | 12.4 | 14.4 | 8.9 | 10.4 | 16.1 | 14.7 |
| GAA | 9.5 | 7.8 | 9.1 | 8.5 | 10.0 | 9.9 | 8.1 | 10.4 | 16.8 | |
| Adj. Allotment | 7.8 | 7.6 | 8.4 | 10.0 | 8.3 | 8.1 | 10.4 | |||
| Obligations | 7.3 | 7.1 | 7.8 | 8.3 | 8.0 | 7.9 | 9.6 | |||
| Disbursements | 6.9 | 6.5 | 7.4 | 7.9 | 7.8 | 7.7 | 8.6 |
DAR’s most distinctive budget feature is the direction of Congressional adjustment. The table pairs each year’s GAA growth with the net change against the Executive’s NEP — and that change is negative in several years.
wide_yr <- totals_by_year %>% 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 | 9.5 | 9.9 | -0.4 | |
| 2019 | 7.8 | -17.8% | 7.8 | 0.0 |
| 2020 | 9.1 | 16.6% | 8.0 | 1.1 |
| 2021 | 8.5 | -7.5% | 8.4 | 0.0 |
| 2022 | 10.0 | 18.6% | 12.4 | -2.4 |
| 2023 | 9.9 | -1.6% | 14.4 | -4.5 |
| 2024 | 8.1 | -18.1% | 8.9 | -0.8 |
| 2025 | 10.4 | 29.2% | 10.4 | 0.0 |
| 2026 | 16.8 | 61.4% | 16.1 | 0.8 |
| 2027 | 14.7 |
In FY 2022 and FY 2023 the enacted GAA came in ₱2.4B and ₱4.5B below the Executive’s proposal — almost entirely by cutting the SPLIT land-titling project. Rather than treating the proposal as a floor to build on, the legislature has repeatedly judged it too large to spend, and trimmed it.
DAR-OSEC’s budget runs through five PREXC programs. The chart shows the enacted budget by program; the tables give pesos and shares.
comp <- df_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) +
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 = "Land Tenure Security is the largest pillar — and the 2026 jump is concentrated there",
x = NULL, y = NULL) +
theme_dar() + guides(fill = guide_legend(nrow = 2, byrow = TRUE))
The Land Tenure Security Program — which houses both the core Land Acquisition and Distribution work and the SPLIT titling project — is the largest pillar, and the 2026 jump lands almost entirely there, because SPLIT sits inside it. The other programs (Agrarian Justice Delivery, ARB Development) are stable and comparatively small.
comp_tbl <- comp %>% group_by(year) %>% mutate(share = amount/sum(amount)) %>% ungroup()
comp_amt <- comp_tbl %>% mutate(amount = round(amount/1e9,2)) %>%
select(category, year, amount) %>% pivot_wider(names_from = year, values_from = amount)
kbl_clean(comp_amt %>% rename(`Program (PHP B)` = category),
font = 12, digits = 2, format.args = list(big.mark=","), na = "")
| Program (PHP B) | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| ARB Development and Sustainability Program | 3.84 | 1.94 | 1.91 | 1.51 | 1.31 | 1.60 | 1.68 | 2.15 | 3.53 |
| Agrarian Justice Delivery Program | 0.94 | 0.81 | 0.81 | 0.90 | 0.83 | 0.92 | 0.89 | 0.91 | 1.04 |
| General Administration and Support | 1.60 | 1.89 | 1.82 | 1.88 | 1.83 | 2.00 | 2.11 | 2.24 | 2.42 |
| Land Tenure Security Program | 2.47 | 2.47 | 3.87 | 3.44 | 5.35 | 4.62 | 2.69 | 3.48 | 8.68 |
| Support to Operations | 0.69 | 0.73 | 0.71 | 0.72 | 0.70 | 0.73 | 0.71 | 1.66 | 1.18 |
comp_pct <- comp_tbl %>% mutate(share = round(share*100,1)) %>%
select(category, year, share) %>% pivot_wider(names_from = year, values_from = share)
Share of each year’s total budget:
kbl_clean(comp_pct %>% rename(`Program (% of GAA)` = category), font = 12, digits = 1, na = "")
| Program (% of GAA) | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|---|
| ARB Development and Sustainability Program | 40.3 | 24.8 | 21.0 | 17.9 | 13.1 | 16.2 | 20.8 | 20.5 | 20.9 |
| Agrarian Justice Delivery Program | 9.8 | 10.3 | 8.9 | 10.6 | 8.2 | 9.3 | 11.0 | 8.7 | 6.2 |
| General Administration and Support | 16.8 | 24.1 | 19.9 | 22.2 | 18.3 | 20.3 | 26.1 | 21.5 | 14.4 |
| Land Tenure Security Program | 25.9 | 31.6 | 42.4 | 40.8 | 53.4 | 46.8 | 33.3 | 33.3 | 51.5 |
| Support to Operations | 7.3 | 9.3 | 7.8 | 8.5 | 6.9 | 7.4 | 8.8 | 15.9 | 7.0 |
The expense-class mix shifts noticeably over the period: Capital Outlay shrinks to almost nothing, and MOOE — which carries the loan-funded project spending — surges.
ec_levels <- c("Personnel Services (PS)","Maintenance & Other Op. Exp. (MOOE)","Capital Outlays (CO)")
comp_ec <- df_long_all %>%
filter(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 were 13% of GAA in 2018 but collapsed to under 5%; MOOE surges to 58% in 2026",
x = NULL, y = NULL) +
theme_dar() + guides(fill = guide_legend(nrow = 1))
Capital Outlay was 13% of the 2018 budget and has since collapsed to under 5%; MOOE rises to 58% of the 2026 GAA. The MOOE surge is the loan projects in disguise — SPLIT and the other foreign-assisted lines are largely classified as operating expenditure (surveys, contracted services, titling activities), so the expense-class shift is really the project shift seen from a different angle.
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) | 41.0 | 52.8 | 48.6 | 55.5 | 47.7 | 53.0 | 61.8 | 51.4 | 36.7 |
| Maintenance & Other Op. Exp. (MOOE) | 46.0 | 45.3 | 51.0 | 44.2 | 48.1 | 46.8 | 38.1 | 46.4 | 58.2 |
| Capital Outlays (CO) | 13.1 | 1.9 | 0.4 | 0.2 | 4.2 | 0.3 | 0.1 | 2.2 | 5.2 |
top10 <- pap_year %>% filter(year == 2026, !is.na(GAA), GAA > 0) %>%
arrange(desc(GAA)) %>% slice_head(n = 10) %>% mutate(pap = factor(pap, levels = rev(pap)))
ggplot(top10, aes(pap, GAA)) +
geom_col(fill = bar_fill, width = 0.75) +
geom_text(aes(label = php_b(GAA)), hjust = -0.1, size = 3.3, color = "grey20") +
coord_flip() +
scale_x_discrete(labels = function(x) str_wrap(x, 46)) +
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 2026 GAA",
subtitle = "The SPLIT land-titling project is now the single largest line — larger than core LAD",
x = NULL, y = NULL) +
theme_dar() +
theme(panel.grid.major.y = element_blank(), panel.grid.major.x = element_line(color = "grey85"))
This is the table built for scrutiny. It lists every P/A/P in the department — not just the top lines — with the proposed and enacted amounts for FY 2025, 2026, and the new FY 2027 proposal side by side, and, crucially, each line’s most recent actual spending record (FY 2025 utilization). The rightmost columns show what the agency was allotted, what it committed (obligated), what it actually paid out (disbursed), and the disbursement rate (D/A) — so a reader can weigh each 2027 proposal against the line’s demonstrated ability to spend. It is sortable, searchable, and exportable to CSV. Amounts are in PHP billions; the FY 2027 GAA column is intentionally blank (not yet enacted).
mw <- df_long %>%
group_by(pap, category, year, metric) %>%
summarise(amount = if (all(is.na(amount))) NA_real_ else sum(amount, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = c(metric, year), values_from = amount)
getcol <- function(df, nm) if (nm %in% names(df)) df[[nm]] else NA_real_
master <- tibble(
`P/A/P` = mw$pap,
`Program` = str_replace(mw$category, " Program$", ""),
`NEP 2025 (B)` = getcol(mw,"NEP_2025")/1e9,
`GAA 2025 (B)` = getcol(mw,"GAA_2025")/1e9,
`NEP 2026 (B)` = getcol(mw,"NEP_2026")/1e9,
`GAA 2026 (B)` = getcol(mw,"GAA_2026")/1e9,
`NEP 2027 (B)` = getcol(mw,"NEP_2027")/1e9,
`Proposed chg 26→27 (B)` = (getcol(mw,"NEP_2027") - getcol(mw,"GAA_2026"))/1e9,
`Allot 2025 (B)` = getcol(mw,"AdjAllot_2025")/1e9,
`Oblig 2025 (B)` = getcol(mw,"Obligations_2025")/1e9,
`Disb 2025 (B)` = getcol(mw,"Disbursements_2025")/1e9,
`D/A 2025` = getcol(mw,"Disbursements_2025")/getcol(mw,"AdjAllot_2025")
) %>% arrange(desc(`NEP 2027 (B)`))
dt_table(master, page = 25,
money_cols = c("NEP 2025 (B)","GAA 2025 (B)","NEP 2026 (B)","GAA 2026 (B)","NEP 2027 (B)",
"Proposed chg 26→27 (B)","Allot 2025 (B)","Oblig 2025 (B)","Disb 2025 (B)"),
pct_cols = "D/A 2025")
Sort by NEP 2027 to see the proposal’s priorities; sort by D/A 2025 to see which lines actually spend what they are given. A line with a large FY 2027 proposal but a low D/A 2025 is where the gap between ambition and delivery is widest. Blank cells mean no appropriation or no execution record in that year (the FY 2027 GAA is blank because the budget is not yet enacted; some project lines have no FY 2025 execution).
The FY 2027 NEP is the live document advocates can still shape. It proposes to bring DAR-OSEC down to ₱14.7B, a 13% cut from the 2026 enacted level — but the aggregate hides a sharp reallocation within the department.
mw2 <- df_long %>% group_by(pap, year, metric) %>%
summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = c(metric, year), values_from = amount)
g26v <- if ("GAA_2026" %in% names(mw2)) mw2$GAA_2026 else NA_real_
n27v <- if ("NEP_2027" %in% names(mw2)) mw2$NEP_2027 else NA_real_
chg <- tibble(pap = mw2$pap, g26 = g26v, n27 = n27v) %>%
mutate(g26 = coalesce(g26, 0), n27 = coalesce(n27, 0), delta = (n27 - g26)/1e9) %>%
filter(abs(delta) >= 0.1) %>% arrange(delta) %>%
mutate(pap = factor(str_trunc(pap, 50), levels = str_trunc(pap, 50)),
dir = ifelse(delta >= 0, "Proposed increase", "Proposed cut"))
ggplot(chg, aes(delta, pap, fill = dir)) +
geom_col(width = 0.72) +
geom_text(aes(label = sprintf("%+.1f", delta), hjust = ifelse(delta >= 0, -0.15, 1.15)), size = 3.2, color = "grey20") +
scale_fill_manual(values = c("Proposed increase" = "#1B9E77", "Proposed cut" = "#D95F02")) +
scale_x_continuous(labels = function(v) paste0(peso, v, "B"), expand = expansion(mult = c(0.16, 0.16))) +
scale_y_discrete(labels = function(x) str_wrap(x, 40)) +
labs(title = "Proposed change by P/A/P, FY 2026 enacted → FY 2027 proposed",
subtitle = "SPLIT is cut ₱4.4B; VISTA and a brand-new ₱1.4B flagship 'Pang-Agraryong Tulay' are the main increases",
x = NULL, y = NULL) +
theme_dar() + theme(panel.grid.major.y = element_blank(),
panel.grid.major.x = element_line(color = "grey85")) +
guides(fill = guide_legend(nrow = 1))
The reallocation has a clear shape. The World Bank-funded SPLIT land-titling project is wound down (−₱4.4B), taking the Land Tenure Security program down with it. In its place the Executive scales up livelihood and value-chain work: the VISTA project nearly doubles (₱1.2B → ₱2.0B) and a brand-new ₱1.4B flagship, Pang-Agraryong Tulay para sa Bagong Bayanihan, appears for the first time. Core Land Acquisition & Distribution grows modestly to ₱3.1B and is again the largest single line.
Here is what advocates should press hardest. The chart pairs each rising FY 2027 line with the share of its allotment it actually disbursed in FY 2025 — its most recent track record.
risers <- tibble(
line = c("VISTA (value-chain)", "Pang-Agraryong Tulay (new)", "Land Acquisition & Distribution"),
prop_2027 = c(2.00, 1.42, 3.11),
da_2025 = c(0.19, NA, 0.98))
rl <- risers %>% mutate(line = factor(line, levels = rev(line)))
ggplot(rl, aes(da_2025, line)) +
geom_col(aes(x = 1), fill = "grey90", width = 0.6) +
geom_col(aes(fill = da_2025 < 0.6), width = 0.6) +
geom_text(aes(label = ifelse(is.na(da_2025), "no track record",
scales::percent(da_2025, accuracy = 1)),
x = ifelse(is.na(da_2025), 0.02, da_2025)),
hjust = ifelse(is.na(rl$da_2025), 0, -0.15), size = 3.4, color = "grey20") +
scale_fill_manual(values = c("TRUE" = "#D95F02", "FALSE" = "#1B9E77"), guide = "none") +
scale_x_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1.05), expand = c(0,0)) +
labs(title = "FY 2025 disbursement rate of the lines being scaled up in FY 2027",
subtitle = "The two projects growing fastest are the ones DAR spends worst — or has never run at all",
x = "Disbursements ÷ allotment, FY 2025", y = NULL) +
theme_dar() + theme(panel.grid.major.y = element_blank())
The pattern is the core of the scrutiny case. VISTA disbursed just 19% of its 2025 allotment, yet is proposed to nearly double. Pang-Agraryong Tulay is brand new — ₱1.4B with no track record at all. Only LAD, which absorbs at 98%, is a proven spender among the growing lines. Meanwhile the line being cut, SPLIT, is itself a weak absorber (33% in 2025) — so the reallocation is less “from weak to strong” than “from one weak-absorbing project to others.” Two questions follow directly: (1) what will make VISTA and Pang-Agraryong disburse when comparable projects have not, and (2) is winding down SPLIT a decision that land parcelization is finished, or merely a pause that leaves titling unfunded?
The single most important fact about the 2026 budget is what kind of money it adds. The chart below splits the GAA into domestically-funded core programs and foreign-assisted (loan-funded) projects.
fap <- df_long %>%
filter(metric == "GAA", year <= 2026, !is.na(amount)) %>%
mutate(grp = ifelse(is_fap, "Foreign-assisted projects", "Core (domestically-funded)")) %>%
group_by(year, grp) %>% summarise(amount = sum(amount, na.rm = TRUE), .groups = "drop") %>%
mutate(grp = factor(grp, levels = c("Core (domestically-funded)", "Foreign-assisted projects")))
ggplot(fap, aes(year, amount, fill = grp)) +
geom_col(width = 0.75, color = "white", linewidth = 0.2) +
scale_fill_manual(values = c("Core (domestically-funded)" = "#1B9E77", "Foreign-assisted projects" = "#D95F02")) +
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 = "Core vs. foreign-assisted, GAA 2018–2026",
subtitle = "Loan-funded projects jump from ~10% of the budget (2025) to 37% (2026)",
x = NULL, y = NULL) +
theme_dar() + guides(fill = guide_legend(nrow = 1))
df_long %>% filter(metric == "GAA", !is.na(amount)) %>%
group_by(year) %>%
summarise(total = sum(amount, na.rm = TRUE), fap = sum(amount[is_fap], na.rm = TRUE), .groups = "drop") %>%
transmute(Year = year, `Total GAA (B)` = round(total/1e9,1),
`Foreign-assisted (B)` = round(fap/1e9,1),
`FAP share` = scales::percent(fap/total, accuracy = 1)) %>%
kbl_clean(font = 13, align = "rrrr", na = "")
| Year | Total GAA (B) | Foreign-assisted (B) | FAP share |
|---|---|---|---|
| 2018 | 9.5 | 2.0 | 21% |
| 2019 | 7.8 | 0.4 | 5% |
| 2020 | 9.1 | 1.1 | 12% |
| 2021 | 8.5 | 0.6 | 7% |
| 2022 | 10.0 | 2.6 | 26% |
| 2023 | 9.9 | 1.6 | 16% |
| 2024 | 8.1 | 0.0 | 0% |
| 2025 | 10.4 | 1.1 | 10% |
| 2026 | 16.8 | 6.3 | 37% |
For eight years the foreign-assisted share bounced between roughly 5% and 26%, never settling. In 2026 it leaps to 37% — and as the absorption section shows, these are exactly the lines DAR struggles most to spend. The next section looks at the largest of them.
The Support to Parcelization of Lands for Individual Titling (SPLIT) project, a World Bank–financed land-titling effort, is the clearest illustration of every DAR theme at once: Executive ambition, Congressional skepticism, and weak disbursement.
split <- pap_year %>% filter(str_detect(pap, "SPLIT")) %>%
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(split, 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_axis, breaks = pretty_breaks(5), limits = c(0, NA), expand = expansion(mult = c(0, .05))) +
scale_x_continuous(breaks = c(2018, 2020, 2022, 2024, 2026)) +
labs(title = "SPLIT project: proposed, enacted, allotted, disbursed (2018–2026)",
subtitle = "The Executive proposes large; Congress trims; and what is released is only partly spent",
x = NULL, y = NULL) +
theme_dar() + guides(color = guide_legend(nrow = 1))
pap_year %>% filter(str_detect(pap, "SPLIT"), year %in% 2020:2026) %>%
transmute(FY = year, `NEP (B)` = round(NEP/1e9,2), `GAA (B)` = round(GAA/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.5, align = "rrrrrr", na = "")
| FY | NEP (B) | GAA (B) | Allotment (B) | Disbursed (B) | D/A |
|---|---|---|---|---|---|
| 2020 | 0.50 | 0.00 | 0.00 | ||
| 2021 | 0.50 | 0.52 | 0.52 | 0.20 | 38% |
| 2022 | 4.55 | 2.55 | 2.55 | 0.80 | 31% |
| 2023 | 6.14 | 1.58 | |||
| 2024 | 0.81 | 0.00 | 0.00 | 0.00 | |
| 2025 | 0.67 | 0.67 | 0.67 | 0.22 | 33% |
| 2026 | 5.09 | 5.09 |
The pattern is unmistakable. The Executive proposed ₱4.6B (2022) and ₱6.1B (2023); Congress cut these to ₱2.6B and ₱1.6B. For 2026 the NEP and GAA finally agree at ₱5.1B — making SPLIT the single largest line in the budget. But the disbursement record is the catch: SPLIT’s disbursement-to-allotment has run only 31–38%, and the newer VISTA project (IFAD-funded) disbursed just 19% in 2025. With foreign-assisted projects set to be 37% of the 2026 budget, absorption is the central delivery risk — the money is there, but the agency’s record of converting loan allotments into titled parcels is poor.
Across 2019–2025, DAR is a generally sound absorber: all three execution ratios sit in a tight 79–98% band, with FY 2022 the clear soft spot.
absorp_long <- absorp_total %>% 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 = 2019:2025) +
labs(title = "DAR-OSEC absorptive capacity, 2019–2025",
subtitle = "Generally a sound absorber — all three ratios sit in a tight 79–98% band; FY 2022 is the clear outlier",
x = NULL, y = NULL) +
theme_dar() + guides(color = guide_legend(nrow = 1))
absorp_total %>%
transmute(Year = year, `Allotment (B)` = round(AdjAllot/1e9,2),
`Obligations (B)` = round(Obligations/1e9,2), `Disbursements (B)` = round(Disbursements/1e9,2),
`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", na = "")
| Year | Allotment (B) | Obligations (B) | Disbursements (B) | O/A | D/O | D/A |
|---|---|---|---|---|---|---|
| 2019 | 7.83 | 7.33 | 6.86 | 94% | 94% | 88% |
| 2020 | 7.65 | 7.10 | 6.48 | 93% | 91% | 85% |
| 2021 | 8.44 | 7.77 | 7.45 | 92% | 96% | 88% |
| 2022 | 10.02 | 8.26 | 7.90 | 82% | 96% | 79% |
| 2023 | 8.25 | 8.02 | 7.78 | 97% | 97% | 94% |
| 2024 | 8.07 | 7.93 | 7.67 | 98% | 97% | 95% |
| 2025 | 10.44 | 9.60 | 8.55 | 92% | 89% | 82% |
But this aggregate hides the same core-versus-project split that runs through the whole budget. The soft years coincide with heavier foreign-assisted activity, and the agency-wide figure is a blend of near-perfect domestic execution and weak project execution — a blend the next tables pull apart.
Restricting to PS and MOOE (Capital Outlay’s allotment base is too small — under ₱50M most years — for a meaningful ratio), personnel spending absorbs almost fully while operating expenditure is more variable.
ec_levels2 <- c("Personnel Services (PS)","Maintenance & Other Op. Exp. (MOOE)")
absorp_ec <- df_long_all %>%
filter(metric %in% c("AdjAllot","Disbursements"), expense_class %in% c("1PS","2MOOE"), year %in% 2019: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 > 0, Disbursements/AdjAllot, NA_real_),
expense_class = factor(expense_class, levels = c("1PS","2MOOE"), labels = ec_levels2))
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.9, show.legend = FALSE, color = "grey20") +
scale_color_manual(values = ec_pal) +
scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1.08), breaks = seq(0, 1, 0.2)) +
scale_x_continuous(breaks = 2019:2025) +
labs(title = "Disbursement-to-Allotment by Expense Class, 2019–2025",
subtitle = "Personnel spending absorbs near-fully (~99%); operating expenditure runs 64–86%",
x = NULL, y = NULL,
caption = "Capital Outlays omitted — the allotment base is too small (< PHP 50M most years) to be meaningful.") +
theme_dar() + guides(color = guide_legend(nrow = 1))
The split is starkest at the P/A/P level. Both tables cover lines with a 2025 allotment of at least ₱0.1B.
abs_2025 <- 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 — DAR’s core domestic functions: land distribution, legal assistance, social infrastructure, personnel administration, all at 94–100%.
abs_2025 %>% arrange(desc(`D/A`)) %>% slice_head(n = 7) %>%
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", na = "")
| P/A/P | Allotment (B) | O/A | D/O | D/A |
|---|---|---|---|---|
| Administration of Personnel Benefits | 0.15 | 100% | 100% | 100% |
| Social Infrastructure Building | 0.91 | 100% | 99% | 99% |
| Land Acquisition and Distribution (LAD) | 2.61 | 99% | 99% | 98% |
| Provision of Agrarian Legal Assistance | 0.53 | 99% | 98% | 97% |
| Climate Resilient Farm Productivity Support | 0.43 | 99% | 96% | 94% |
| General Management and Supervision | 2.09 | 99% | 95% | 94% |
| Adjudication of Agrarian Reform Cases | 0.23 | 97% | 96% | 93% |
Weakest absorbers, FY 2025 — the foreign-assisted projects: VISTA (19%), SPLIT (33%). Policy Formulation (53%) is the one sizable domestic exception.
abs_2025 %>% arrange(`D/A`) %>% slice_head(n = 7) %>%
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", na = "")
| P/A/P | Allotment (B) | O/A | D/O | D/A |
|---|---|---|---|---|
| Value Chain Innovation for Sustainable Transformati… | 0.41 | 37% | 51% | 19% |
| Support to Parcelization of Lands for Individual Ti… | 0.67 | 56% | 60% | 33% |
| Policy Formulation, Monitoring and Evaluation, Info… | 1.62 | 89% | 60% | 53% |
| Supervision and Management and Processes Relative t… | 0.12 | 92% | 95% | 87% |
| Supervision and Management for Effective Delivery o… | 0.15 | 97% | 91% | 88% |
| Enterprise Development and Economic Support | 0.24 | 98% | 91% | 89% |
| Adjudication of Agrarian Reform Cases | 0.23 | 97% | 96% | 93% |
The contrast is the whole story: where the work is routine and domestically run, disbursement reaches 94–100%; where it depends on loan drawdowns, surveys, and project management, it falls to a fifth or a third of what was released.
Every P/A/P with a 2025 allotment, all three ratios, sortable and searchable.
abs_full <- 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"))
Six of the most consequential lines, each showing enacted budget, allotment, and disbursements together. Where the lines sit on top of one another, execution is clean; where disbursements fall away, money is released but unspent.
trend_paps <- c(
"Support to Parcelization of Lands for Individual Titling (SPLIT) Project IBRD Loan No. 9141 - PH",
"Land Acquisition and Distribution (LAD)",
"General Management and Supervision",
"Policy Formulation, Monitoring and Evaluation, Information Management, and Systems Development",
"Social Infrastructure Building",
"Climate Resilient Farm Productivity Support")
trend_dat <- 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("SPLIT Project (land titling)","Land Acquisition & Distribution",
"General Management & Supervision","Policy Formulation & M&E",
"Social Infrastructure Building","Climate-Resilient Farm Productivity")))
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 = "Domestic programs track GAA closely; SPLIT shows wide gaps between enacted, allotted, and disbursed",
x = NULL, y = NULL) +
theme_dar() + guides(color = guide_legend(nrow = 1))
The five domestic panels are textbook clean execution — the disbursement line shadows the allotment, and Land Acquisition and Distribution, the agency’s historic core function, tracks its budget closely throughout. SPLIT is the visible exception: a jagged line with wide gaps between what was enacted, what was released, and what was actually spent — the volatility that makes the 2026 scale-up a genuine risk rather than a routine expansion.
These follow directly from the FY 2027 proposal and the spending record in the master table above.
Underlying data: DBM-published budget and execution data for the DAR Office of the Secretary (Current New Appropriations only), FY 2018–2027. FY 2027 is the NEP (the Executive’s proposal) only and has no execution data; FY 2026 reflects NEP/GAA only. Execution measures (Allotments, Obligations, Disbursements) cover FY 2018–2025, so the most recent per-P/A/P utilization shown is FY 2025; FY 2018 SAAODB for foreign-assisted projects is pending encoding, so aggregate absorption analysis covers FY 2019–2025. Prepared as the long-form companion to the DAR-OSEC budget briefing.