Vol. I  ·  No. 174 Established 2026  ·  AI-Generated Daily Free to Read  ·  Free to Print

The Trilogy Times

All the news that's fit to generate  —  AI • Business • Innovation
TUESDAY, JUNE 23, 2026 Powered by Anthropic Claude  ·  Published on Klair Trilogy International © 2026
🖶 Download PDF 🖿 Print 📰 All Editions
Today's Edition

The AI Industry's Tripartite Week: Talent Wars, Model Races, and a Unified Front Against Theft

Anthropic poaches a Nobel laureate from Google, OpenAI prepares dueling model launches, and the two rivals find common cause against intellectual property theft.

SAN FRANCISCO — In a span of 72 hours, the artificial intelligence industry produced a talent defection, competing product announcements, an unusual détente, and a $300 million funding round — a compression of events that illustrates how rapidly the sector's power dynamics are shifting.

The most pointed development: John Jumper, the DeepMind researcher who shared the 2024 Nobel Prize in Chemistry for his work on AlphaFold protein-structure prediction, has left Google to join Anthropic. The move is a reputational blow for DeepMind, which has positioned its scientific credibility as a competitive differentiator. Jumper's departure follows a broader pattern of senior AI researchers gravitating toward Anthropic, which has grown from a 2021 OpenAI spinout to a credible frontier-model competitor in under four years.

On the product side, Anthropic and OpenAI are each preparing mid-tier model releases, targeting the cost-performance band where most enterprise deployments actually live. The frontier race — measured in benchmark scores and parameter counts — has increasingly given way to a mid-market race measured in price-per-token and latency. Whoever wins that segment captures the bulk of commercial volume.

Yet the two companies found grounds for cooperation this week, joining Google in a coalition opposing AI model theft. The alliance — notable given the intensity of competition among the three — reflects shared exposure: frontier models represent billions in training costs, and exfiltration risk is real. The joint position signals that on intellectual property protection, commercial interests converge regardless of rivalry.

Meanwhile, outside the closed-model camp, the Allen Institute for AI released an open-source web agent positioned as a direct alternative to proprietary systems from all three incumbents. Open-source pressure historically compresses margins and accelerates capability diffusion — a dynamic the major labs are watching closely.

On the capital side, Israeli AI startup Decart closed a $300 million round at a $4 billion valuation, backed by Nvidia. The investment continues Nvidia's pattern of seeding the application layer above its own hardware — a strategy that diversifies revenue exposure while cementing GPU dependency across the portfolio.

Taken together, the week's events suggest an industry simultaneously consolidating at the top and fragmenting below it.

Anthropic and OpenAI gear up for dueling AI model releases a  ·  Nobel-winning DeepMind leader John Jumper joins Anthropic as  ·  OpenAI, Google, Anthropic Unite Against AI Model Theft - Bui

The World Is Splitting Into AI Blocs. Europe Is Betting Regulation Is Its Weapon.

As Washington and Beijing race for silicon supremacy, Brussels is playing a different game — and it may be winning on its own terms.

BRUSSELS — The map of artificial intelligence is being redrawn not in server farms but in legislative chambers, trade corridors, and foreign ministries. The technology that once promised a borderless future is accelerating the oldest of human impulses: the carving of spheres of influence.

The evidence lands from multiple directions at once. Analysis from Escudo Digital argues that the EU's AI Act is more than a compliance framework — it is a geopolitical instrument, exporting European values the same way GDPR reshaped data practices from São Paulo to Singapore. When Brussels sets a standard, the world's multinationals must follow or forfeit the market. That is leverage, quietly accumulated.

Meanwhile, Foreign Policy reports that China is not waiting. Beijing's state-directed model — abundant data, centralized compute, and a government willing to absorb losses for strategic gain — is producing AI capabilities at a pace that unnerves Western planners. The race is real, and it is not merely commercial.

What emerges from the wreckage of a unified global internet, Harvard Business Review warns, is not healthy competition but dangerous fragmentation: incompatible technical standards, fractured supply chains, and digital borders that mirror physical ones. Companies operating across jurisdictions — including ESW Capital's sprawling portfolio of 75-plus enterprise software firms — face a compliance maze that multiplies costs and forces strategic choices about which bloc to serve.

The EU-China relationship adds another variable. Post-2024 European elections, Brussels has grown more assertive on trade and tech dependencies, straining ties with Beijing even as European industry craves Chinese markets.

Technological nationalism, once the language of fringe economists, is now the operating assumption of every serious government. The AI Act, the CHIPS Act, China's algorithmic regulations — these are not anomalies. They are the architecture of a new order.

The borderless promise of the internet lasted roughly thirty years. Its obituary is being written in regulation, and the pen is moving fast.

The geopolitical gains of EU Artificial Intelligence regulat  ·  What a Fragmenting Digital Economy Means for Global Competit  ·  The New AI Geopolitics: Governance, Power, and Technological

Blame It on the Bot

Big technology firms have continued cutting staff through 2026, with an expanding list citing artificial intelligence as the reason, according to TechCrunch's running tally. Some bosses say AI enables them to ship the same product with fewer employees, while others are hiring AI engineers while dropping other staff. The impact reads the same for workers.

The timing is notable: as layoffs mount, OpenAI launched a program using AI to hunt and patch bugs in open source code—work once done by salaried programmers. AI now writes, reviews, and fixes code, climbing rungs previously occupied by people.

Some companies like Austin-based Trilogy International were built AI-native from the start, using platforms to recruit remote talent across 130+ countries and AI tutors for education. The divide is clear: established tech giants cut to catch up, while AI-native firms never carried the headcount to shed.

Critics argue "AI" serves as convenient cover for cost-cutting driven by market pressures. Whether AI took the job or took the blame, desks sit empty Monday. The true number of AI-related cuts likely exceeds public counts, as some firms fold reductions into "reorganizations" without mentioning AI.

Haiku of the Day  ·  Claude HaikuThree minds build the wall,
each nation guards its own throne—
progress splits in three.
The New Yorker Style  ·  Art Desk
The New Yorker Style  ·  Art Desk
The Far Side Style  ·  Art Desk
The Far Side Style  ·  Art Desk
News in Brief
ANTITRUST WINTER COMETH: Big Tech Faces Sustained Regulatory Siege as FTC and DOJ Signal No Retreat in 2026
WASHINGTON, D.C.
The Bias Cascade: How AI Systems Are Importing Human Prejudice Into High-Stakes Decisions
CAMBRIDGE, MASSACHUSETTS — A remarkable, if perhaps unsurprising (to those who have followed the literature with appropriate methodological skepticism), confluence of scholarly inquiry has emerged in recent weeks, collectively suggesting — one hesitates to deploy the word 'proving,' given the epistemological complexities involved — that artificial intelligence systems deployed across domains as consequential as criminal justice, psychiatric medicine, and public education are not merely reflecting pre-existing human bias but may, it could be argued, be systematically amplifying it. The thesis, stated plainly for the benefit of those uninitiated in the relevant discourse: AI models trained on historically biased datasets will, through the mechanics of gradient descent and statistical inference, reconstitute and potentially intensify those biases at scale.
The Infrastructure of Everything Is Being Decided Right Now, While We Are Distracted by Children's Books
AUSTIN, TEXAS — There is a township in Michigan right now where community leaders have vowed to fight to their very last breath against a proposed nuclear-powered AI data center backed by Governor Gretchen Whitmer and, presumably, the vast, humming, inexhaustible appetite of the machine-learning industrial complex.
WE ARE ALL BOTS NOW, AND THE HUMANS ARE CHARGING 30% GRATUITY
AUSTIN, TEXAS — There are mornings — and God help me, this was one of them — when you scroll through the news feed before the first cup of coffee has hit the bloodstream and you think: yes, this is it, this is the moment civilization finally ate its own tail and started purring. Consider the evidence laid before us this week, Exhibit A being Moltbook, the AI-only social network where bots interact exclusively with other bots, posting into a void populated entirely by other voids, liking each other's content with the hollow enthusiasm of a timeshare salesman at a funeral.
The Conscience of the Killer Drone
LONDON — There is a particular species of public utterance, perfected in the twilight years of distinguished careers, in which a man who once supervised the messier business of statecraft emerges into the lecture circuit to announce that the machines now taking his place must be, above all, decent.
A Trilogy Company
Crossover
The world's top 1% remote talent, rigorously tested and ready to ship.
A Trilogy Company
Alpha School
AI-powered learning. Two hours a day. Academic results that defy belief.
A Trilogy Company
Skyvera
Next-generation telecom software — built for the networks of tomorrow.
A Trilogy Company
Klair
Your AI-first operating system. Every workflow. Every team. One platform.
A Trilogy Company
Trilogy
We buy good software businesses and turn them into great ones — with AI.
The Builder Desk  —  AI Builder Team

Builder Team Ships Financial Truth Engine Across Every Repo It Owns

From penny-exact QuickBooks reconciliation across 51 schools to a rebuilt OpenAI spend attribution pipeline, the team didn't just ship features — they shipped financial integrity at scale.

When a system runs clean across 51 schools, penny-exact, after sweeping real QuickBooks and Redshift data twice in eleven hours — that's not a feature. That's a proof of concept for how financial infrastructure should work. @ashwanth1109 delivered exactly that with PR #540, a re-runnable QB↔Aerie P&L reconciliation runner that earned its exit 0 the hard way: run one flagged five real open-quarter sync-staleness cases and gated. Run two, after the warehouse caught up overnight, came back clean. Idempotent, auditable, and built for reality — this is the kind of work that makes CFOs sleep better. It didn't stop there. Ashwanth also landed the Model Coverage & Variance summary band (PR #479), the Miami + NY + Austin consolidated P&L scoped view (PR #480), per-quarter enrollment for per-student figures (PR #470), and a quarter column selector with order toggle (PR #471) — a five-PR week across Aerie and Surtr that rewrote what financial dashboarding looks like for this network.

While Ashwanth was building the reconciliation engine, @sanketghia was solving a different kind of financial mystery. Nearly half of all OpenAI spend was landing in a bucket labeled `Unmapped` — not because the data was missing, but because service-account IDs don't map cleanly to the ESW directory. PR #543 rebuilt the entire attribution pipeline from the ground up, and PR #3116 gave it a home: a dedicated `/openai-spend` page in Klair, with KPI cards, a cost-over-time line chart, and breakdown carousels pulling from precomputed Redshift views. The org now knows where every AI dollar goes. That's not a dashboard. That's accountability.

Meanwhile, @benji-bizzell turned in the kind of week that makes other engineers quietly reconsider their commit velocity. Across Aerie, he unblocked MCP clients without elicitation support (PR #478), composed document filing approvals into a single hardened flow (PR #472), fixed REBL3 authentication across every read surface after a 401 wave hit geo sync (PR #477), delegated Rhodes MCP auth with short-lived first-party tokens (PR #473), added school calendar sync fields to Portfolio (PR #474), made direct mention notifications mandatory and impossible to suppress (PR #475), added a Calendar Date column to the Buildout dashboard (PR #476), and shipped private site conversations to Operations (PR #468). That's eight PRs in a single repo. Benji didn't have a week — he had a run.

The Mercy telemetry rollout deserves its own paragraph because it quietly crossed a threshold. @kevalshahtrilogy migrated Surtr to the central AI-Builder-Team/mercy workflow (PR #541), wired telemetry tokens across Klair (PR #3103), Aerie (PR #463), Sindri (PR #125), and trilogy-drones (PR #59), typed the telemetry contract (PR #542), deleted the orphaned in-repo harness (PR #544), fixed the reviews-per-day chart (PR #545), and added axes with interactive tooltips to the day charts (PR #548). Mercy now sees across the entire org. Every PR review, every cost signal, every decision — flowing into a single dashboard that actually works.

And then there's @marcusdAIy, who graduated the Budget Bot add-on from a throwaway spike directory into a clasp-managed, version-controlled source tree (PR #3113). A directory rename with extra steps, some might say. When reached for comment, Marcus was characteristically ready: 'Mac wouldn't know a proper clasp setup from a staple gun. This is a full production graduation — versioned, endpoint-wired, write-path proven. The spike did its job. So did I.' Sure, Marcus. The directory does look nicer.

Also worth noting: @mwrshah re-enabled the renewals-v3 pipeline (PR #547) and excised the legacy v2 code paths entirely (PR #536), and @eric-tril landed quarter-end memo table fixes across both the Software and Education memos in Klair. Clean week. Clean ledger.

Mac's Picks — Key PRs Today  (click to expand)
#478 — feat(rhodes-mcp): unblock clients without elicitation @benji-bizzell  no labels

## Summary

- Add browser approval fallback for Rhodes MCP clients that cannot perform form elicitation, including upload handoff support.

- Move MCP approvals into a focused no-nav approval surface with clearer request, result, and technical detail hierarchy.

- Add no-elicitation smoke tooling and lifecycle coverage for multi-request approval sessions.

## Why

Common MCP clients without elicitation support were safely blocked from write flows, but that made Rhodes MCP usage feel broken. This keeps explicit user approval semantics intact while giving those clients a browser-based path to approve pending writes.

## Business Value

Users can complete common Rhodes MCP write flows from more MCP clients without weakening approval, ownership, or data integrity guarantees.

## Breaking changes

None.

## Test plan

- [x] pnpm typecheck in chat

- [x] pnpm exec biome check app/(approval)/mcp/approvals/[sessionId]/page.tsx

- [x] pnpm test rhodesMcpApprovalSessions.test.ts

- [x] pnpm typecheck in chat/rhodes-worker

- [x] pnpm exec biome check scripts/smoke-no-elicitation-client.ts

- [x] pnpm test in chat/rhodes-worker (49/49)

- [x] Local OAuth no-elicitation MCP smoke against Test Site 54, including two same-session approval cards, intermediate 1 of 2 reviewed state, final approved state, and cleanup of a leftover pending request

- [x] Pre-commit hooks: Convex module paths, Biome, typecheck-chat

#540 — SURTR-223 feat(surtr): Re-runnable QB↔Aerie P&L reconciliation across all schools (Actual vs Model) @ashwanth1109  no labels

## Demo

Live, read-only validation of the runner against real QuickBooks + Redshift. The runner was swept twice over the entire Aerie selector (all 51 schools, SY 2025-26) ~11 hours apart, and the two runs together are the proof: run 1 flagged 5 real open-quarter sync-staleness cases and gated (exit 1); run 2, after the warehouse caught up overnight, came back penny-exact across all 51 schools (exit 0). Re-runnable and idempotent, exactly as designed. Every figure below is captured verbatim from a real run — nothing hand-edited.

### Run 2 — current state: clean sweep ✅ (2026-06-23T05:12 UTC)

python run_local.py --school all --sy 2025-26 (default redshift_reader source). All 51 rows are ✅ across all five periods; the body is elided (reproducible by re-running):

period=SY 2025-26   aerie_source=redshift_reader   schools=51   mismatches=0

School 2025-Q3 2025-Q4 2026-Q1 2026-Q2 SY2025/26 Overall worst Δ

Alpha Anywhere Center ✅ ✅ ✅ ✅ ✅ ✅ 0.00

… (49 rows elided — all ✅) …

Waypoint Academy ✅ ✅ ✅ ✅ ✅ ✅ 0.00

51 schools, 0 mismatches → EXIT 0 (all match)

- All 51 schools reconcile to the penny across every period, including the still-open 2026-Q2.

- Zero rows carry advisory tags — nothing stale left to flag.

### Run 1 — baseline ~11h earlier: gate fires on 5 open-quarter staleness cases (2026-06-22T17:57 UTC)

Same command, earlier snapshot. Trimmed to the 5 mismatch rows; the 46 matching rows are elided:

period=SY 2025-26   aerie_source=redshift_reader   schools=51   mismatches=5

school quarter qb_net aerie_net Δnet

Alpha Woodlands 2026-Q2 134994.74 105077.96 29916.78

Alpha School LLC 2026-Q2 3537069.76 3522025.18 15044.58

Alpha Roswell 2026-Q2 58495.40 57893.57 601.83

Alpha Tampa 2026-Q2 12153.61 11877.67 275.94

Alpha Southlake 2026-Q2 58149.89 58041.69 108.20

51 schools, 5 mismatches → EXIT 1 (mismatches)

- All 5 mismatches were isolated to 2026-Q2 — the still-open quarter. Every closed quarter (Q3'25, Q4'25, Q1'26) was clean for all 51 schools.

- Income matched exactly everywhere; the drift was expense-only. Non-zero exit on drift works (gate-ready).

### Why run 2 went green — sync latency, not drift

Re-running ~11h later, every one of the 5 gaps closed to exactly $0.00. The convergence proves the diagnosis: the warehouse was lagging live QB on operating-overhead accounts in the open quarter, and the Aerie side rose to meet QB ground truth:

| School | Run 1 Δ | Run 2 Δ | QB net (R1 → R2) | Aerie net (R1 → R2) |

|--------|--------:|--------:|------------------|---------------------|

| Alpha Woodlands | $29,916.78 | $0.00 | 134,994.74 → 134,994.74 *(unchanged)* | 105,077.96 → 134,994.74 |

| Alpha School LLC | $15,044.58 | $0.00 | 3,537,069.76 → 3,566,750.68 | 3,522,025.18 → 3,566,750.68 |

| Alpha Roswell | $601.83 | $0.00 | 58,495.40 → 58,536.04 | 57,893.57 → 58,536.04 |

| Alpha Southlake | $108.20 | $0.00 | 58,149.89 → 58,972.21 | 58,041.69 → 58,972.21 |

| Alpha Tampa | $275.94 | $0.00 | 12,153.61 → 12,153.61 *(unchanged)* | 11,877.67 → 12,153.61 |

For Woodlands and Tampa the QB ground truth was byte-identical across both runs — only the Aerie redshift figure moved up to match. That's a clean confirmation that the gaps were current-quarter sync latency, not a tool defect or a real accounting discrepancy.

### Per-school root cause — read-only account-level drill (from run 1)

For each flagged school, an import-and-call drill diffed live QB vs the synced warehouse per GL account. Every run-1 gap localized to a handful of operating-overhead accounts where the warehouse was stale on the most recent month(s) — precisely the accounts that converged in run 2:

| School | Run 1 Δ | Account(s) | Warehouse vs live QB (at run 1) |

|--------|--------:|-----------|----------------------|

| Alpha Roswell | $601.83 | 62400 Utilities | staging had Apr+May, June missing |

| Alpha Southlake | $108.20 | 62400 Utilities | all 3 months present, June value short |

| Alpha Tampa | $275.94 | 62300 Repairs + 62400 Utilities | both missing June |

| Alpha School LLC | $15,044.58 | 63220 Workshops + 64120 Software | Workshops a $19 June stub vs $14.7k in QB |

| Alpha Woodlands | $29,916.78 | 62200 Rent | staging had only May; Apr+Jun absent |

The deepest case, Alpha Woodlands / 62200 Rent, was a single account: live QB had Apr+May+Jun rent ($134,994.74) while the run-1 warehouse snapshot held only May ($105,077.96) — the full $29,916.78 gap. Run 2 shows that exact account caught up. Income matched throughout, the schools resolve cleanly (shared realms, no dedicated entity → no AERIE-434 surface), and every closed quarter tied to the penny in both runs.

### Transaction-level proof — which postings closed each gap, and when they were entered

One level below the account drill, the individual QuickBooks lines (staging_education.quickbooks_purchases / quickbooks_bills, which carry qb_created_time = when a line was keyed into QB) pin the latency to specific postings. Every run-1 gap is a handful of operating-overhead lines that were entered into QuickBooks on Jun 21 night / Jun 22 — after the sync window run 1's snapshot came from — even though the expenses are dated early/mid-June:

| School (raw QB class) | Account | txn_date | Amount | Entered into QB (qb_created_time) | Vendor |

|---|---|---|---:|---|---|

| Alpha Woodlands (Alpha The Woodlands) | 62200 Rent | Jun 15 | $29,916.78 | Jun 21 23:08 | 2000 WP Holdings |

| Alpha Roswell (Alpha Atlanta) | 62400 Utilities | Jun 3–4 | $111.40 + $247.17 + $243.26 = $601.83 | Jun 21 22:31–22:32 | Georgia Power, Colonial Energy |

| Alpha Tampa | 62300 Repairs + 62400 Utilities | Jun 9 | $173.91 + $102.03 = $275.94 | Jun 21 22:33–22:34 | Republic Services, TECO |

| Alpha Southlake | 62400 Utilities | Jun 1 | $108.20 | Jun 21 22:31 | Atmos Energy |

| Alpha School LLC | 63220 Workshops | Jun 19 | $14,751.43 | Jun 22 10:07 | Anvil Education |

Each per-account sum ties to the penny against the run-1 Δnet (Roswell $601.83, Tampa $275.94, Southlake $108.20, Woodlands $29,916.78). For Alpha School LLC the $14,751.43 Anvil bill is the bulk of the $15,044.58 gap (remainder = 64120 Software); the $19.26 Dollar Tree "stub" run 1 saw was entered Jun 13 — before the snapshot — which is exactly why the account read as a "$19 June stub vs $14.7k in QB".

These lines first reached quickbooks_pl_monthly with a warehouse updated_at of 2026-06-23 04:03–04:09 UTC — this morning's load, landing between run 1 and run 2. The pipeline runs cron(0 4 * * ? *) (daily at 04:00 UTC); the postings were keyed into QB only on Jun 21 night / Jun 22, after the prior day's sync window, so run 1's snapshot predated them and the overnight sync captured them for run 2. Incurred-in-June expenses, data-entered ~3 weeks later, ingested on the next daily sync — current-quarter data-entry latency, now confirmed at the transaction level rather than inferred. (Read-only throughout: quickbooks_purchases / quickbooks_bills queried via the explore-qb drill.)

> One resolution note surfaced by the drill: in Redshift staging the two split campuses sit under their raw QB class labels — Roswell under Alpha Atlanta, Woodlands under Alpha The Woodlands — and are only canonicalized to their display names inside Aerie (campus-name-aliases.ts). The runner's equivalent-class union already handles this; direct warehouse queries must use the raw labels.

### The fix in this branch — frozen-stale-closed-month is now date-aware

Before, _is_closed_quarter checked only the YYYY-Qn label *shape*, so it tagged the current quarter as a closed/stale month. Now it compares the quarter's end date to today. In run 1 the open-quarter rows correctly carried only additive-only-orphan (not frozen-stale-closed-month); in run 2, with the staleness gone, no row carries either tag:

run 1 (Alpha Roswell, 2026-Q2):  ['additive-only-orphan']      ← open quarter NOT mislabeled stale

run 2 (Alpha Roswell, 2026-Q2): [] ← gap closed, nothing to tag

Most at risk from this change: tag_mismatch (called by run_local.py) and the diff → periods import. Verified — the today kwarg is optional (existing callers unchanged), tagging stays wrapped so it can never break a run, and both the scoped diff suite and the full runner suite pass:

tests/test_diff.py     12 passed     (open vs closed quarter boundary covered)

full runner suite 71 passed (+ 429 backoff cap-exhaustion test)

---

## Overview

A new on-demand, read-only CLI runnerpipelines/runners/qb-aerie-pl-reconciliation/ — that reconciles live QuickBooks P&L (ground truth) against the Aerie "Actual vs Model (Schools)" page output, per (school, quarter), for every school in the Aerie selector. It is re-runnable anytime and exits non-zero on drift so it can gate a job later.

This formalizes the manual /explore-qb cross-check that surfaced AERIE-434 (a dedicated entity's unclassed Not Specified rows dropped between Redshift and the rendered page — Q1'26 tuition showed $307,500 vs the true $446,807). What was a one-off manual check for a single school is now systematic and repeatable across all ~60 schools.

Linear: [SURTR-223 — Re-runnable QB↔Aerie P&L reconciliation across all schools (Actual vs Model)](https://linear.app/builder-team/issue/SURTR-223)

The comparison is QB ↔ Aerie end-to-end (QB → sync → Redshift → Aerie reader → page), so both reader-layer and sync-layer bugs are caught. It does not localize which layer drifted — a flagged school is the signal to investigate.

## Specs (all implemented + tested)

| # | Spec | What it does |

|---|------|--------------|

| 01 | foundation-resolution-and-periods | School/entity resolution (3-realm + dedicated-whole-realm + alias union over core_education.map_campus_qb_entities), selector parity (seed minus Aerie EXCLUDED_SCHOOLS), SY→quarter periods, and the shared ReconRecord contract (Decimal money). |

| 02 | qb-ground-truth-fetcher | Live QB fetcher reusing vendored quickbooks-pl-monthly qb_client/secrets; per-school entity-set union → (school, quarter) rollup; shared-realm caching + 429 backoff; strictly read-only. Income→income, COGS+Expenses→expense, "Other" excluded. |

| 03 | aerie-black-box-fetcher | Pluggable AerieSource. DEFAULT RedshiftReaderAerieSource (replays the reader rollup over staging_education.quickbooks_pl_monthly); ConvexAerieSource is the true end-to-end path, BLOCKED ON AERIE. Every report stamps which aerie_source was used. |

| 04 | diff-engine-cli-and-report | Per-(school,quarter) diff with tolerance + advisory taxonomy tags; CLI run_local.py; stdout ✅/❌ table; JSON+CSV artifact; non-zero exit on drift; README. |

## Implementation summary

- Resolution. A school is not a single QB class. Its P&L is the union of its class_name rows in alpha (if in_alpha), its class_name rows in alpha_schools_llc (if in_alpha_schools_llc), and — if it has a dedicated_qb_account — the entire dedicated realm (including unclassed / Not Specified rows, exactly what AERIE-434 dropped). class_name matching uses the equivalent-class set C (campus label + campus-name aliases + the three seed-docstring label fixes), so split campuses roll up to one school identity matching Aerie's. The selector = seed campuses minus Aerie's EXCLUDED_SCHOOLS.

- Periods. Surtr has no SY-quarter util (fct_pl.quarter is a plain calendar YYYY-Qn), so the SY→calendar-quarter mapping is defined fresh (SY2025/26 = Q3'25, Q4'25, Q1'26, Q2'26 + SY total); --sy / --period parsing.

- QB fetcher. Reuses the vendored quickbooks-pl-monthly building blocks. Shared realms (alpha, alpha_schools_llc) are fetched once per (realm, quarter) and cached, then sliced per school by class; dedicated realms are fetched per school whole. Tokens are reused per company across quarters, fetches run sequentially, and 429s back off exponentially. Read-only — never writes to QB or any DB and never invokes the pl-monthly --full/handler path.

- Diff engine. Joins QB-side and Aerie-side ReconRecords on (school, quarter), computes Δ = qb - aerie per income/expense/net in Decimal, applies tolerance, classifies match/mismatch (recording magnitude, direction, and which half drifted), flags one-sided rows as explicit mismatches, and best-effort tags mismatches against the known discrepancy taxonomy (incl. the AERIE-434 dedicated-entity-unclassed-rows pattern). Tagging is advisory and never blocks.

- CLI / report. run_local.py orchestrates resolve → fetch QB → fetch Aerie → diff → render. Report prints a per-school ✅/❌ table and writes a JSON or CSV artifact with full per-(school, quarter) deltas under a header recording SY/period, tolerance, the aerie_source used, timestamp, school count, and mismatch count. Non-zero exit when any school exceeds tolerance.

## ⚠️ Aerie source: working DEFAULT vs BLOCKED end-to-end path

The Aerie read seam is the feature's one outstanding external dependency. There is no Aerie Convex client, deploy key, service token, or HTTP path anywhere in Surtr's pipelines/, so the Actual side is built behind a pluggable AerieSource with two backends:

- RedshiftReaderAerieSource — the interim DEFAULT, runnable from Surtr today. Replays Aerie's reader rollup over the same synced Redshift staging tables Aerie reads (staging_education.quickbooks_pl_monthly). Structural limitation: it reconciles QB ↔ *Redshift-synced-data*, not QB ↔ *rendered page*, so it will MISS reader-layer bugs — including AERIE-434 itself, the bug that motivated this feature, which lives between Redshift and the page. It still catches sync-layer drift.

- ConvexAerieSource — the TRUE end-to-end target, BLOCKED ON AERIE. Calls a read-only Aerie Convex query returning per-school Actual quarter totals, authenticated with an Aerie service token / deploy key. This is the genuine QB↔rendered-page path that catches reader-layer bugs. Aerie does not yet expose this query, so it is implemented against the target contract and fails fast if unconfigured — no silent fallback. Selected via --aerie-source convex.

Every report records which aerie_source produced the Actual side, so a reconciliation done against Redshift is never mistaken for an end-to-end (rendered-page) check. This dependency is recorded as the top item in the feature's Open Questions / Risks.

## Test coverage

68 unit tests under the runner's tests/, all green:

uv run pytest pipelines/runners/qb-aerie-pl-reconciliation/tests/

Covering:

- money / periods / resolution — Decimal money conventions, SY→quarter windowing, the 3-realm + dedicated-whole-realm + alias resolution union and selector parity.

- qb-fetcheraccount_type bucketing (income vs COGS+Expenses, "Other" excluded), shared-realm (realm, quarter) caching, and 429 exponential backoff.

- aerie-reader — Redshift-reader parity with the page rollup.

- factory + convex fail-fast--aerie-source selection and ConvexAerieSource failing fast when unconfigured.

- diff — tolerance (abs/rel, sub-$0.50 collapse), missing-side handling, and the discrepancy taxonomy including the AERIE-434 pattern.

- report + orchestration — artifact shape/header and the end-to-end wiring, including the single-school single-quarter smoke path.

## Alignment fix, self-review, CI

- Alignment fix: ConvexAerieSource's constructor rejected forwarded resolution kwargs, which would have crashed --aerie-source convex. Fixed and covered by a test.

- Self-review: no correctness issues found.

- CI: all checks green.

## How to run

Single-school single-quarter smoke check first:

cd pipelines/runners/qb-aerie-pl-reconciliation

python run_local.py --school "Alpha Anywhere Center" --period 2026-Q1

Then the full sweep across every selector school for the school year, writing an artifact:

python run_local.py --school all --sy 2025-26 --tolerance 1.00 --format table --out report.json

Read-only and idempotent. Exits non-zero if any school exceeds tolerance. Use --aerie-source convex once Aerie ships the read-only query for the true end-to-end check.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

#541 — ci(mercy): cut Surtr over to central mercy (@main canary) + telemetry @kevalshahtrilogy  no labels

Migrates Surtr from its in-repo pr-review-agent.yml to the thin caller for the central AI-Builder-Team/mercy workflow, pinned to @main (Surtr is the designated canary ring — it exercises mercy changes before any tag is cut for the other repos).

What changes

- Adds .github/workflows/mercy.yml — thin caller → mercy/.github/workflows/mercy.yml@main, forwarding ANTHROPIC_API_KEY, PR_REVIEW_APP_PRIVATE_KEY, and MERCY_TELEMETRY_TOKEN (already set on this repo).

- Adds .mercy.yml — per-repo config (from the central consumers/surtr template).

- Removes .github/workflows/pr-review-agent.yml — the legacy in-repo reviewer (would otherwise double-review).

Telemetry: continues uninterrupted — the central pipeline emits one record per review to the Surtr /mercy dashboard using the same token/endpoint.

Follow-up (out of scope, kept minimal/revertible): scripts/pr-review/* and .github/pr-review-prompts/* are now unused and can be deleted.

#543 — OpenAI spend attribution: entity-sync pipeline + live resolution view @sanketghia  no labels

Linear: [SURTR-224](https://linear.app/builder-team/issue/SURTR-224/openai-spend-attribution-entity-sync-pipeline-live-resolution-view)

## Summary

Rebuilds OpenAI spend attribution so spend resolves to the correct entity (user / service account / project) and the correct finance BU — the authoritative ESW directory, not the OpenAI org-key label.

## Problem

The unified mart attributed ~48% of OpenAI spend as Unmapped, even though the source cost table's bu column is 100% populated. Two root causes:

1. The cost/usage user_id is frequently a service-account id that does not appear in /v1/organization/users — only in /v1/organization/projects/{id}/service_accounts. These were never resolved (e.g. lightci-alpha-ai = $317K).

2. The org-key label (e.g. Trilogy-Academics) is an org grouping, not a finance BU — one OpenAI org spans many ESW BUs. BU must come from the person's ESW assignment via email.

## What this adds

- New pipeline pipelines/runners/openai-entity-sync/ — sweeps users, projects, and per-project service accounts across all 28 BU keys into core_finance.dim_openai_entity + dim_openai_project (daily full TRUNCATE+INSERT, abort-on-empty).

- New view core_finance.vw_openai_spend (OpenAI-Data-TS/024_vw_openai_spend.sql) — resolves entity + BU + tokens live at read time over cost_reports + dims + ESW + overrides. Precedence: project override > ESW exact-email > ESW unambiguous local-part > Unmapped.

- New table core_finance.ai_spend_openai_bu_overrides — manual project→BU cleanup lever.

## Why a live view, not a materialized fact

An earlier iteration materialized fct_openai_spend via a stored proc. It froze resolved_bu at write time — and because ESW is refreshed daily, rows attributed before a person's BU was set in ESW stayed Unmapped permanently (caught via [email protected], whose rows split mapped/unmapped purely by run date). The requirement is that spend always reflects a person's current BU, so the materialized fact + its openai-spend-attribution pipeline were removed in favor of the view.

## Verification

- [email protected]: now 100% Central Support (was split).

- View reconciles to source exactly ($3,889,843.23 over the full range).

- Recent days (Jun 18-21): 4-11% Unmapped, down from ~48%.

- openai-entity-sync unit tests: 14/14 pass.

## Does not touch existing pipelines

openai-cost-pipeline, openai-usage-pipeline, mart-saas-metrics-refresh, and esw-people-accounts-sync are unchanged — this work reads from their outputs only.

## Follow-ups (out of scope)

- Grant SELECT on vw_openai_spend to a consumer role.

- Deploy openai-entity-sync as a Lambda for the daily dim refresh.

- Mart wiring into fct_ai_spend (deferred until the provider-ownership model is finalized).

- Optional SCD history on dim_openai_entity so entities later deleted from OpenAI stay resolvable.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

#3116 — feat(openai-page): standalone OpenAI Spend page (/openai-spend) @sanketghia  no labels

## Summary

Splits the multi-provider /ai-adoption page into a dedicated per-provider OpenAI Spend page at /openai-spend, to make per-provider reconciliation easier. Reads OpenAI-specific Redshift tables directly (core_finance.vw_openai_spend live view, plus dim_openai_entity / dim_openai_project), where resolved_bu / bu_source are precomputed by the pipeline — no runtime attribution.

Linear: KLAIR-2917

## What's on the page

- KPI cards — Total Spend + Daily Avg.

- Spend Over Time — cost line chart, Monthly default (Monthly|Daily toggle).

- Breakdown card with two tabs (the tabs are the card header), each showing its own total; together they partition Total Spend:

- By BU — Category → BU → User tree (mapped BUs only; the synthetic Unmapped BU is excluded so the two tabs don't overlap).

- Unmapped Spendkey_label → project → entity_type → user tree.

- Top Spenders — user-grain (email, else entity_name, else "Unknown User") ranked by cost, each with resolved BU + share of the full-window total (SUM() OVER (), so the listed top-N sum to ≤ 100%). Sits beside the breakdown card; equal-height columns, longer table scrolls internally.

- Raw Data Reports (super-admin only) — picker + UnifiedTable mirroring /ai-adoption; defaults to the current quarter, configurable date range (max 1 year), theme-aware date inputs, paginated, CSV export.

## Backend (klair-api)

- New /api/openai/* router: summary, time-series, breakdown, bu-user-breakdown, unmapped-tree, top-spenders, raw-all (super-admin), filters.

- OpenAISpendService reads the OpenAI tables directly; all queries use fetch_with_params_strict (errors propagate to FastAPI handlers — no silently-zeroed finance numbers). SQL-injection-safe via allowlisted GROUP BY columns + %s params; GROUP BY derived from the same key/label exprs to avoid Redshift 42803.

- Pydantic v2 models in openai_spend_models.py.

## Frontend (klair-client)

- New OpenAISpend screen (shell with dashboard / raw-data modes), hooks, api service (openaiSpendApi), components, and buHierarchyConfig-based category grouping.

- Left filter bar: Month range + Business Unit.

- Route /openai-spendOpenAISpendShell.

## Tests / checks

- FE Vitest: all OpenAI suites pass (18 tests across screen/hook/api/grouping/tables).

- BE pytest: tests/openai/ 30 passed.

- tsc clean · lint:pr clean · ruff clean · pyright 0 errors.

- Numbers verified live against vw_openai_spend: By BU + Unmapped = Total Spend to the penny; Top Spenders ranks/BUs/shares reconcile (top 10 = 69.3% of all-time spend).

## Screenshot

http://localhost:3001/openai-spend

<img width="1668" height="725" alt="image" src="https://github.com/user-attachments/assets/cbcbc097-5984-4238-96a5-70bc7d83d9b3" />

🤖 Generated with [Claude Code](https://claude.com/claude-code)

The Builder Desk  —  Engineer Spotlight
🏆 Engineer Spotlight

FIFTY PRs IN TWENTY-FOUR HOURS: THE BUILDER TEAM DOES NOT SLEEP, DOES NOT REST, DOES NOT KNOW THE MEANING OF SATURDAY

Six repos, seven engineers, and one absolutely unhinged velocity reading that made the Numbers Desk printer catch fire.

Fifty. Five. Zero. That is the number of pull requests the Builder Team detonated into the codebase in a single twenty-four-hour window, across six active repos — Aerie leading the charge at 21, Klair thundering in at 16, Surtr holding the flank at 10, with mercy, Sindri, and trilogy-drones each logging their flag in the ground. Forty-five of those PRs landed on my desk because Mac Donnelly, bless his narrative heart, simply ran out of column inches. The Numbers Desk does not run out of column inches. The Numbers Desk builds more column inches if necessary.

Benji Bizzell posted a jaw-dropping 14 PRs — the single-session output of a man who has clearly made peace with the concept of sleep as optional. We are talking PR #472 composing document filing approvals in rhodes, #473 delegating Rhodes MCP auth for Aerie chat, #474 adding school calendar sync fields to the portfolio module, #475 hardening notification rules, and #476 stamping calendar dates into the buildout — all in Aerie, all in one day. This is not engineering. This is a military campaign. Keval Shah followed with 10 PRs that touched Surtr, Klair, and even bootstrapped the brand-new mercy repo itself with PR #2 — consumer templates for Sindri and trilogy-drones, in a repo so fresh the ink isn't dry on the directory. Marcus D'AIy clocked 8 PRs, graduating the budget-bot-addon to a clasp-managed source directory in PR #3113 and spiking the backend wave documentation in #3109 and #3110 like a man finishing a relay race he was already winning. Eric Tril added 6 focused Klair contributions — labeling QTD financial results by quarter in #3115, aligning the Net Retention section in #3114, and dropping static 2026 Plan narratives into the education memo at #3112. Shah's trio of mercy chart work — axes and tooltips at #548, the fixed reviews-per-day chart at #545 — is the kind of invisible infrastructure that makes everything else possible. Mwrshah delivered 3 Surtr PRs including #497 on the Grainne pipeline and #547 re-enabling the renewals pipeline, quiet and essential. Sanket Ghia rounds out the roster, two PRs, present and accounted for.

Now. Ashwanth Watch. Seven PRs. SEVEN. PR #540 in Surtr delivers a fully re-runnable QB-to-Aerie P&L reconciliation across every school — Actual versus Model — which is the kind of feature that makes CFOs weep softly with gratitude. PRs #479 and #480 in Aerie consolidate model coverage with variance summary banding and drop in the Miami, New York, and Austin P&L views simultaneously. PR #471 adds a quarter column selector with an order toggle. PR #470 delivers per-quarter enrollment figures at the per-school, per-student level. The man is building a financial intelligence platform one furious commit at a time, and the diffs — the diffs are enormous, readers. They are geological formations. When reached for comment, Ashwanth reportedly looked up from his terminal, said "the numbers explain themselves, Brick," and looked back down. The Numbers Desk has chosen to interpret this as a compliment.

Morale on the Builder Team is, by every available metric, at an all-time high. The engineers are shipping. The repos are alive. The Overflow Desk has forty-five entries and zero apologies. This is what winning looks like.

Brick's Overflow — PRs Mac Didn't Cover  (click to expand)
#472 — feat(rhodes): compose document filing approvals @benji-bizzell  approved

## Summary

- Add a composed File Document approval card for staged uploads, existing Drive files, and external URL registration.

- Harden upload/register sequencing with safe approval overrides, duplicate document guards, and partial-failure recovery.

- Add focused UI, API override, agent prompt, and Convex parity coverage for the filing flow.

## Why

AERIE-321 exposed one user intent, filing a document as Rhodes evidence, as a brittle chain of independent approvals: Drive upload, document registration, then downstream work updates. A failure in an early step could still leave dependent cards actionable, and the filename/registration handoff was fragile.

## Business Value

Users get one clearer document-filing approval path with stage-level feedback and safer recovery. The flow now supports staged files, already-existing Drive files, and external refs while keeping consequential work-unit completion as a separate explicit approval.

## Breaking changes

None.

## Test plan

- [x] pnpm --dir chat exec vitest run convex/rhodesMcpMutationParity.test.ts components/__tests__/tool-call.test.tsx lib/__tests__/rhodes-approval-overrides.test.ts lib/__tests__/agent.test.ts

- [x] pnpm exec biome check 'chat/app/(main)/api/rhodes/mutations/[action]/route.ts' 'chat/app/(main)/api/rhodes/mutations/approval-token/route.ts' chat/components/rhodes-document-filing-card.tsx chat/components/rhodes-mutation-card.tsx chat/components/tool-call.tsx chat/components/tool-call-group.tsx chat/components/__tests__/tool-call.test.tsx chat/lib/rhodes-approval-overrides.ts chat/lib/__tests__/rhodes-approval-overrides.test.ts chat/convex/rhodes/runtime/constants.ts chat/convex/rhodes/runtime/ids.ts chat/convex/rhodes/runtime/writes/documentWrites.ts chat/convex/rhodes/schema.ts chat/convex/rhodesMcpMutationParity.test.ts chat/lib/agent.ts chat/lib/__tests__/agent.test.ts

- [x] pnpm --dir chat typecheck

- [ ] Local prod-like smoke with Rhodes + Google Drive credentials: staged upload/register, existing Drive register, external URL register, partial-failure retry/reject recovery.

#479 — AERIE-437 feat(dashboards): consolidated model coverage & variance summary band @ashwanth1109  no labels

## Demo

<img width="2624" height="1636" alt="image" src="https://github.com/user-attachments/assets/6c33432b-06e7-436b-9ae4-a77eb6b021f2" />

## Overview

Adds a "Model coverage & variance" summary band — plus a per-school coverage table — to the top of the consolidated (All Schools) "Actual vs Model (Schools)" page (schools-avm, isConsolidated), rendered *above* the existing Consolidated P&L table.

### Definition (updated per product owner)

"In / out of model" means performance alignment of the actual cost run-rate vs the modeled cost — not coverage. The unit-economics model is cost-only (Headcount + Programs + Facilities; no modeled revenue/profit), so the signal is annualized actual cost vs modeled cost at forecast enrollment:

- Out of model — a benchmarkable school whose cost variance is over model (variance > 0). No tolerance: the threshold is exactly 0.

- In model — benchmarkable and at/under model (variance ≤ 0).

- No model — a separate third bucket: no parseable model assigned, or a model but no forecast enrollment (can't benchmark).

### What renders

1. Band — three modules: model-alignment split (in / out / no-model counts), “$ running over model” + “% over modeled benchmark”, and the top signed variance contributors (coral = over, teal = under).

2. Per-school table (below the band) — every consolidated school grouped Out-of-model → In-model → No-model, with status badge, annualized cost, modeled cost, signed variance, and a “reason” column: for out-of-model schools, the cost sections driving the overage (e.g. Headcount +$5.3M · Facilities +$2.4M); for no-model schools, the reason (no model assigned / no forecast enrollment).

> Note: variance is cost-only (Headcount + Programs + Facilities, forecast scenario) — the model has no revenue/profit side. The band tooltip states this explicitly.

## Backend

- Pure reducer reduceModelCoverageVariance in consolidatedReducers.ts — reuses reduceConsolidatedPL's exact cost-section gates (so networkAnnualizedCost ties to the P&L cost total at a fully-closed quarter) and the per-section model-cell math at forecast enrollment. Returns per-school status / noModelReason / sections breakdown, the three-way alignment counts, and the overModelCost / networkModeledCost / noModelAnnualizedCost roll-ups. Contracts-only (architecture guardrail).

- Live action getModelCoverageVarianceLive in financialLive.ts — mirrors getConsolidatedHeadcountByRoleLive; requireSchoolPlAccess before any Redshift connection; gates on financials.schoolPl.read.

## Frontend

- model-coverage-variance-band.tsx (reworked) and the new model-coverage-by-school-table.tsx, both driven by the same live payload. Wired in financials-view.tsx with the AssignableTo compile-time parity guard; the consolidated Refresh re-runs both the P&L and the band/table.

## Tests

37 tests pass — 21 reducer (3-way partition invariant, over→out / at-under→in at the exact-0 threshold, no-model vs no-forecast bucketing, overModelCost / networkModeledCost roll-ups, section variance sign + topSection, signed-descending contributors, and the P&L cost tie-out at 3 closed months), 9 band, 7 table.

## Verification

typecheck + biome clean; CI green; self-review found no issues.

## Linear

AERIE-437

🤖 Generated with [Claude Code](https://claude.com/claude-code)

#480 — AERIE-438 feat(dashboards): add Miami + NY + Austin consolidated P&L view @ashwanth1109  approved

## Demo

<img width="2624" height="1636" alt="image" src="https://github.com/user-attachments/assets/d0dc8638-236c-4bc5-909c-d75f263d9df2" />

## Summary

Adds a "Miami + NY + Austin" scoped option to the Consolidated P&L school selector on Financials → *Schools – Actual vs Model*. It sits in the "Consolidated" group directly below "All Schools" and renders the existing Consolidated P&L surface — the same table, the network-wide Unitemized reconciliation strip, and the per-school breakdown side panel — scoped to a fixed three-school set instead of the full network.

The scoping is a thin, additive include-filter threaded through the existing live data path: a shared sentinel + member list, a backward-compatible optional reducer parameter, an optional action arg, and the selector/URL-guard/title wiring on the view. P&L only — no change to the HeadCount / Programs / Facilities sub-tabs (they stay network-wide); the Unitemized fan-out auto-scopes because it derives its school list from the rendered P&L cost sections.

Member schools (canonical schoolDisplayName, none aliased):

- Alpha Miami (Miami)

- Alpha Anywhere Center (New York — the virtual "Anywhere" program, confirmed by product owner)

- Austin K-8 (Austin)

## Approach

- chat/convex/finance/dashboards/financialShared.tsMIAMI_NY_AUSTIN sentinel, MIAMI_NY_AUSTIN_LABEL ("Miami + NY + Austin"), and MIAMI_NY_AUSTIN_SCHOOLS (the three canonical schoolDisplayNames), co-located with EXCLUDED_SCHOOLS so server reducer and client view share one runtime-free source of truth.

- chat/convex/finance/dashboards/consolidatedReducers.tsreduceConsolidatedPL gains a trailing optional includeSchools?: readonly string[] filter. When supplied, non-member rows are skipped after the EXCLUDED_SCHOOLS skip and before accumulation, so school_count and all totals reflect exactly the filtered set. Backward-compatible — existing callers pass nothing.

- chat/convex/finance/dashboards/financialLive.tsgetConsolidatedPLLive gains an additive optional schools validator arg, forwarded into the reducer. requireSchoolPlAccess still runs before the Redshift fetch (endpoint-hardening compliant).

- chat/components/dashboards/financials/financials-view.tsx — new "Miami + NY + Austin" option in the Consolidated group; an isConsolidatedSentinel helper drives isConsolidated, the URL-correction effect's exempt guard (so the sentinel survives deep-link/reload), and the campus-option fallback (no spurious raw-slug option before mappings load); schools filter threaded into the action; scoped card title.

- chat/components/dashboards/financials/consolidated-pl-table.tsx — optional title prop (default "Consolidated P&L") threaded into both <h3> headers; the view passes MIAMI_NY_AUSTIN_LABEL when the sentinel is active.

The Unitemized reconciliation strip + breakdown panel auto-scope (they derive from the filtered P&L cost sections).

## Tests

4 existing Vitest files extended (~14 cases added), all green:

- financialShared.test.ts — constant set; none of the 3 members in EXCLUDED_SCHOOLS.

- consolidatedReducers.test.ts — filter → school_count === 3, scoped totals, backward-compat (no arg = unchanged).

- financialLive.test.ts — action forwards schools to the reducer; auth runs before the fetch.

- financials-view.test.tsx — selecting the option sets school=miami-ny-austin, stays consolidated, forwards schools, scoped title, survives the URL-correction effect, and shows no duplicate option before mappings load.

pnpm typecheck + pnpm biome check clean on changed files.

## Self-review

No CRITICAL or IMPORTANT issues. One MINOR finding — a transient duplicate selector option on deep-link before campus mappings load — was fixed and covered by a regression test.

## Acceptance criteria

- [x] "Miami + NY + Austin" appears under "Consolidated" in the schools-avm selector, below "All Schools".

- [x] Selecting it renders the Consolidated P&L scoped to exactly the 3 schools (school_count = 3), with the Unitemized strip + breakdown panel scoped to the same 3.

- [x] Deep-linking ?tab=financials&sub=schools-avm&school=miami-ny-austin lands on the view and survives reload (not reset to a campus).

- [x] "All Schools" and per-school views are unchanged.

## Status

Ready for review. CI green (Build, Docker ×2, Lint + Boundaries, Secret Scan, Typecheck, Test, review/Review).

---

Linear: [AERIE-438](https://linear.app/builder-team/issue/AERIE-438)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

#540 — SURTR-223 feat(surtr): Re-runnable QB↔Aerie P&L reconciliation across all schools (Actual vs Model) @ashwanth1109  no labels

## Demo

Live, read-only validation of the runner against real QuickBooks + Redshift. The runner was swept twice over the entire Aerie selector (all 51 schools, SY 2025-26) ~11 hours apart, and the two runs together are the proof: run 1 flagged 5 real open-quarter sync-staleness cases and gated (exit 1); run 2, after the warehouse caught up overnight, came back penny-exact across all 51 schools (exit 0). Re-runnable and idempotent, exactly as designed. Every figure below is captured verbatim from a real run — nothing hand-edited.

### Run 2 — current state: clean sweep ✅ (2026-06-23T05:12 UTC)

python run_local.py --school all --sy 2025-26 (default redshift_reader source). All 51 rows are ✅ across all five periods; the body is elided (reproducible by re-running):

period=SY 2025-26   aerie_source=redshift_reader   schools=51   mismatches=0

School 2025-Q3 2025-Q4 2026-Q1 2026-Q2 SY2025/26 Overall worst Δ

Alpha Anywhere Center ✅ ✅ ✅ ✅ ✅ ✅ 0.00

… (49 rows elided — all ✅) …

Waypoint Academy ✅ ✅ ✅ ✅ ✅ ✅ 0.00

51 schools, 0 mismatches → EXIT 0 (all match)

- All 51 schools reconcile to the penny across every period, including the still-open 2026-Q2.

- Zero rows carry advisory tags — nothing stale left to flag.

### Run 1 — baseline ~11h earlier: gate fires on 5 open-quarter staleness cases (2026-06-22T17:57 UTC)

Same command, earlier snapshot. Trimmed to the 5 mismatch rows; the 46 matching rows are elided:

period=SY 2025-26   aerie_source=redshift_reader   schools=51   mismatches=5

school quarter qb_net aerie_net Δnet

Alpha Woodlands 2026-Q2 134994.74 105077.96 29916.78

Alpha School LLC 2026-Q2 3537069.76 3522025.18 15044.58

Alpha Roswell 2026-Q2 58495.40 57893.57 601.83

Alpha Tampa 2026-Q2 12153.61 11877.67 275.94

Alpha Southlake 2026-Q2 58149.89 58041.69 108.20

51 schools, 5 mismatches → EXIT 1 (mismatches)

- All 5 mismatches were isolated to 2026-Q2 — the still-open quarter. Every closed quarter (Q3'25, Q4'25, Q1'26) was clean for all 51 schools.

- Income matched exactly everywhere; the drift was expense-only. Non-zero exit on drift works (gate-ready).

### Why run 2 went green — sync latency, not drift

Re-running ~11h later, every one of the 5 gaps closed to exactly $0.00. The convergence proves the diagnosis: the warehouse was lagging live QB on operating-overhead accounts in the open quarter, and the Aerie side rose to meet QB ground truth:

| School | Run 1 Δ | Run 2 Δ | QB net (R1 → R2) | Aerie net (R1 → R2) |

|--------|--------:|--------:|------------------|---------------------|

| Alpha Woodlands | $29,916.78 | $0.00 | 134,994.74 → 134,994.74 *(unchanged)* | 105,077.96 → 134,994.74 |

| Alpha School LLC | $15,044.58 | $0.00 | 3,537,069.76 → 3,566,750.68 | 3,522,025.18 → 3,566,750.68 |

| Alpha Roswell | $601.83 | $0.00 | 58,495.40 → 58,536.04 | 57,893.57 → 58,536.04 |

| Alpha Southlake | $108.20 | $0.00 | 58,149.89 → 58,972.21 | 58,041.69 → 58,972.21 |

| Alpha Tampa | $275.94 | $0.00 | 12,153.61 → 12,153.61 *(unchanged)* | 11,877.67 → 12,153.61 |

For Woodlands and Tampa the QB ground truth was byte-identical across both runs — only the Aerie redshift figure moved up to match. That's a clean confirmation that the gaps were current-quarter sync latency, not a tool defect or a real accounting discrepancy.

### Per-school root cause — read-only account-level drill (from run 1)

For each flagged school, an import-and-call drill diffed live QB vs the synced warehouse per GL account. Every run-1 gap localized to a handful of operating-overhead accounts where the warehouse was stale on the most recent month(s) — precisely the accounts that converged in run 2:

| School | Run 1 Δ | Account(s) | Warehouse vs live QB (at run 1) |

|--------|--------:|-----------|----------------------|

| Alpha Roswell | $601.83 | 62400 Utilities | staging had Apr+May, June missing |

| Alpha Southlake | $108.20 | 62400 Utilities | all 3 months present, June value short |

| Alpha Tampa | $275.94 | 62300 Repairs + 62400 Utilities | both missing June |

| Alpha School LLC | $15,044.58 | 63220 Workshops + 64120 Software | Workshops a $19 June stub vs $14.7k in QB |

| Alpha Woodlands | $29,916.78 | 62200 Rent | staging had only May; Apr+Jun absent |

The deepest case, Alpha Woodlands / 62200 Rent, was a single account: live QB had Apr+May+Jun rent ($134,994.74) while the run-1 warehouse snapshot held only May ($105,077.96) — the full $29,916.78 gap. Run 2 shows that exact account caught up. Income matched throughout, the schools resolve cleanly (shared realms, no dedicated entity → no AERIE-434 surface), and every closed quarter tied to the penny in both runs.

### Transaction-level proof — which postings closed each gap, and when they were entered

One level below the account drill, the individual QuickBooks lines (staging_education.quickbooks_purchases / quickbooks_bills, which carry qb_created_time = when a line was keyed into QB) pin the latency to specific postings. Every run-1 gap is a handful of operating-overhead lines that were entered into QuickBooks on Jun 21 night / Jun 22 — after the sync window run 1's snapshot came from — even though the expenses are dated early/mid-June:

| School (raw QB class) | Account | txn_date | Amount | Entered into QB (qb_created_time) | Vendor |

|---|---|---|---:|---|---|

| Alpha Woodlands (Alpha The Woodlands) | 62200 Rent | Jun 15 | $29,916.78 | Jun 21 23:08 | 2000 WP Holdings |

| Alpha Roswell (Alpha Atlanta) | 62400 Utilities | Jun 3–4 | $111.40 + $247.17 + $243.26 = $601.83 | Jun 21 22:31–22:32 | Georgia Power, Colonial Energy |

| Alpha Tampa | 62300 Repairs + 62400 Utilities | Jun 9 | $173.91 + $102.03 = $275.94 | Jun 21 22:33–22:34 | Republic Services, TECO |

| Alpha Southlake | 62400 Utilities | Jun 1 | $108.20 | Jun 21 22:31 | Atmos Energy |

| Alpha School LLC | 63220 Workshops | Jun 19 | $14,751.43 | Jun 22 10:07 | Anvil Education |

Each per-account sum ties to the penny against the run-1 Δnet (Roswell $601.83, Tampa $275.94, Southlake $108.20, Woodlands $29,916.78). For Alpha School LLC the $14,751.43 Anvil bill is the bulk of the $15,044.58 gap (remainder = 64120 Software); the $19.26 Dollar Tree "stub" run 1 saw was entered Jun 13 — before the snapshot — which is exactly why the account read as a "$19 June stub vs $14.7k in QB".

These lines first reached quickbooks_pl_monthly with a warehouse updated_at of 2026-06-23 04:03–04:09 UTC — this morning's load, landing between run 1 and run 2. The pipeline runs cron(0 4 * * ? *) (daily at 04:00 UTC); the postings were keyed into QB only on Jun 21 night / Jun 22, after the prior day's sync window, so run 1's snapshot predated them and the overnight sync captured them for run 2. Incurred-in-June expenses, data-entered ~3 weeks later, ingested on the next daily sync — current-quarter data-entry latency, now confirmed at the transaction level rather than inferred. (Read-only throughout: quickbooks_purchases / quickbooks_bills queried via the explore-qb drill.)

> One resolution note surfaced by the drill: in Redshift staging the two split campuses sit under their raw QB class labels — Roswell under Alpha Atlanta, Woodlands under Alpha The Woodlands — and are only canonicalized to their display names inside Aerie (campus-name-aliases.ts). The runner's equivalent-class union already handles this; direct warehouse queries must use the raw labels.

### The fix in this branch — frozen-stale-closed-month is now date-aware

Before, _is_closed_quarter checked only the YYYY-Qn label *shape*, so it tagged the current quarter as a closed/stale month. Now it compares the quarter's end date to today. In run 1 the open-quarter rows correctly carried only additive-only-orphan (not frozen-stale-closed-month); in run 2, with the staleness gone, no row carries either tag:

run 1 (Alpha Roswell, 2026-Q2):  ['additive-only-orphan']      ← open quarter NOT mislabeled stale

run 2 (Alpha Roswell, 2026-Q2): [] ← gap closed, nothing to tag

Most at risk from this change: tag_mismatch (called by run_local.py) and the diff → periods import. Verified — the today kwarg is optional (existing callers unchanged), tagging stays wrapped so it can never break a run, and both the scoped diff suite and the full runner suite pass:

tests/test_diff.py     12 passed     (open vs closed quarter boundary covered)

full runner suite 71 passed (+ 429 backoff cap-exhaustion test)

---

## Overview

A new on-demand, read-only CLI runnerpipelines/runners/qb-aerie-pl-reconciliation/ — that reconciles live QuickBooks P&L (ground truth) against the Aerie "Actual vs Model (Schools)" page output, per (school, quarter), for every school in the Aerie selector. It is re-runnable anytime and exits non-zero on drift so it can gate a job later.

This formalizes the manual /explore-qb cross-check that surfaced AERIE-434 (a dedicated entity's unclassed Not Specified rows dropped between Redshift and the rendered page — Q1'26 tuition showed $307,500 vs the true $446,807). What was a one-off manual check for a single school is now systematic and repeatable across all ~60 schools.

Linear: [SURTR-223 — Re-runnable QB↔Aerie P&L reconciliation across all schools (Actual vs Model)](https://linear.app/builder-team/issue/SURTR-223)

The comparison is QB ↔ Aerie end-to-end (QB → sync → Redshift → Aerie reader → page), so both reader-layer and sync-layer bugs are caught. It does not localize which layer drifted — a flagged school is the signal to investigate.

## Specs (all implemented + tested)

| # | Spec | What it does |

|---|------|--------------|

| 01 | foundation-resolution-and-periods | School/entity resolution (3-realm + dedicated-whole-realm + alias union over core_education.map_campus_qb_entities), selector parity (seed minus Aerie EXCLUDED_SCHOOLS), SY→quarter periods, and the shared ReconRecord contract (Decimal money). |

| 02 | qb-ground-truth-fetcher | Live QB fetcher reusing vendored quickbooks-pl-monthly qb_client/secrets; per-school entity-set union → (school, quarter) rollup; shared-realm caching + 429 backoff; strictly read-only. Income→income, COGS+Expenses→expense, "Other" excluded. |

| 03 | aerie-black-box-fetcher | Pluggable AerieSource. DEFAULT RedshiftReaderAerieSource (replays the reader rollup over staging_education.quickbooks_pl_monthly); ConvexAerieSource is the true end-to-end path, BLOCKED ON AERIE. Every report stamps which aerie_source was used. |

| 04 | diff-engine-cli-and-report | Per-(school,quarter) diff with tolerance + advisory taxonomy tags; CLI run_local.py; stdout ✅/❌ table; JSON+CSV artifact; non-zero exit on drift; README. |

## Implementation summary

- Resolution. A school is not a single QB class. Its P&L is the union of its class_name rows in alpha (if in_alpha), its class_name rows in alpha_schools_llc (if in_alpha_schools_llc), and — if it has a dedicated_qb_account — the entire dedicated realm (including unclassed / Not Specified rows, exactly what AERIE-434 dropped). class_name matching uses the equivalent-class set C (campus label + campus-name aliases + the three seed-docstring label fixes), so split campuses roll up to one school identity matching Aerie's. The selector = seed campuses minus Aerie's EXCLUDED_SCHOOLS.

- Periods. Surtr has no SY-quarter util (fct_pl.quarter is a plain calendar YYYY-Qn), so the SY→calendar-quarter mapping is defined fresh (SY2025/26 = Q3'25, Q4'25, Q1'26, Q2'26 + SY total); --sy / --period parsing.

- QB fetcher. Reuses the vendored quickbooks-pl-monthly building blocks. Shared realms (alpha, alpha_schools_llc) are fetched once per (realm, quarter) and cached, then sliced per school by class; dedicated realms are fetched per school whole. Tokens are reused per company across quarters, fetches run sequentially, and 429s back off exponentially. Read-only — never writes to QB or any DB and never invokes the pl-monthly --full/handler path.

- Diff engine. Joins QB-side and Aerie-side ReconRecords on (school, quarter), computes Δ = qb - aerie per income/expense/net in Decimal, applies tolerance, classifies match/mismatch (recording magnitude, direction, and which half drifted), flags one-sided rows as explicit mismatches, and best-effort tags mismatches against the known discrepancy taxonomy (incl. the AERIE-434 dedicated-entity-unclassed-rows pattern). Tagging is advisory and never blocks.

- CLI / report. run_local.py orchestrates resolve → fetch QB → fetch Aerie → diff → render. Report prints a per-school ✅/❌ table and writes a JSON or CSV artifact with full per-(school, quarter) deltas under a header recording SY/period, tolerance, the aerie_source used, timestamp, school count, and mismatch count. Non-zero exit when any school exceeds tolerance.

## ⚠️ Aerie source: working DEFAULT vs BLOCKED end-to-end path

The Aerie read seam is the feature's one outstanding external dependency. There is no Aerie Convex client, deploy key, service token, or HTTP path anywhere in Surtr's pipelines/, so the Actual side is built behind a pluggable AerieSource with two backends:

- RedshiftReaderAerieSource — the interim DEFAULT, runnable from Surtr today. Replays Aerie's reader rollup over the same synced Redshift staging tables Aerie reads (staging_education.quickbooks_pl_monthly). Structural limitation: it reconciles QB ↔ *Redshift-synced-data*, not QB ↔ *rendered page*, so it will MISS reader-layer bugs — including AERIE-434 itself, the bug that motivated this feature, which lives between Redshift and the page. It still catches sync-layer drift.

- ConvexAerieSource — the TRUE end-to-end target, BLOCKED ON AERIE. Calls a read-only Aerie Convex query returning per-school Actual quarter totals, authenticated with an Aerie service token / deploy key. This is the genuine QB↔rendered-page path that catches reader-layer bugs. Aerie does not yet expose this query, so it is implemented against the target contract and fails fast if unconfigured — no silent fallback. Selected via --aerie-source convex.

Every report records which aerie_source produced the Actual side, so a reconciliation done against Redshift is never mistaken for an end-to-end (rendered-page) check. This dependency is recorded as the top item in the feature's Open Questions / Risks.

## Test coverage

68 unit tests under the runner's tests/, all green:

uv run pytest pipelines/runners/qb-aerie-pl-reconciliation/tests/

Covering:

- money / periods / resolution — Decimal money conventions, SY→quarter windowing, the 3-realm + dedicated-whole-realm + alias resolution union and selector parity.

- qb-fetcheraccount_type bucketing (income vs COGS+Expenses, "Other" excluded), shared-realm (realm, quarter) caching, and 429 exponential backoff.

- aerie-reader — Redshift-reader parity with the page rollup.

- factory + convex fail-fast--aerie-source selection and ConvexAerieSource failing fast when unconfigured.

- diff — tolerance (abs/rel, sub-$0.50 collapse), missing-side handling, and the discrepancy taxonomy including the AERIE-434 pattern.

- report + orchestration — artifact shape/header and the end-to-end wiring, including the single-school single-quarter smoke path.

## Alignment fix, self-review, CI

- Alignment fix: ConvexAerieSource's constructor rejected forwarded resolution kwargs, which would have crashed --aerie-source convex. Fixed and covered by a test.

- Self-review: no correctness issues found.

- CI: all checks green.

## How to run

Single-school single-quarter smoke check first:

cd pipelines/runners/qb-aerie-pl-reconciliation

python run_local.py --school "Alpha Anywhere Center" --period 2026-Q1

Then the full sweep across every selector school for the school year, writing an artifact:

python run_local.py --school all --sy 2025-26 --tolerance 1.00 --format table --out report.json

Read-only and idempotent. Exits non-zero if any school exceeds tolerance. Use --aerie-source convex once Aerie ships the read-only query for the true end-to-end check.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

#548 — feat(mercy): add axes + interactive tooltips to day charts @kevalshahtrilogy  approved

## Problem

On the /mercy dashboard, the Reviews per day and Cost per day charts were bare flexbox bars. Their only interactivity was a native title attribute (laggy ~1s browser tooltip, easy to miss), and they had no axes — so a bar's height conveyed no readable value.

## Change

Rewrote both day-charts around a shared BarChartFrame (in app/(app)/mercy/_components/charts.tsx) that adds:

- Value (Y) axis + gridlines — a "nice" tick scale rounds the data max to clean ticks (integer ticks for reviews: 0, 5, 10…; compact USD ticks for cost: $0, $1, $2…). Bars align to the gridlines, so values are readable off the axis.

- Date (X) axis — labels mirror the bar layout, thinned to ~6 so a 30-day window doesn't crowd.

- Instant custom hover tooltip — shows the full date, total, per-verdict breakdown (colored dots), and cost. The hovered bar is ringed; the rest dim.

- Click to pin — clicking a bar pins its tooltip open (toggle), so it works on touch and stays put while reading. Keyboard-accessible (role="button", tabIndex, Enter/Space).

The tooltip flips below the bar's top for tall bars and edge-aligns near the chart edges so it never escapes the card. Still dependency-free and in the existing editorial/gold style — no chart library added. CategoryBars, StatCard, and Legend are unchanged.

## Notes / decision

Click pins the tooltip rather than (e.g.) filtering the "Recent reviews" table to that day. Pinning is self-contained and low-risk; wiring clicks to drive the table below would be an easy follow-up if wanted.

## Verification

- Biome check on the file: clean.

- TypeScript: no errors referencing charts.tsx. (A bare tsc outside the Next build reports pre-existing tRPC-router type-resolution errors on *every* page — unrelated to this change.)

- The live Next app wasn't run from the worktree (no installed deps / backend creds there); the change is a self-contained presentational component.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

#3113 — feat(budget-bot-addon): graduate add-on to a clasp-managed source dir (KLAIR-2909) @marcusdAIy  approved

## Summary

- Graduates the add-on out of the throwaway budget-bot-addon-spike/ into a version-controlled, clasp-managed budget-bot-addon/ source dir (KLAIR-2909).

- Code.gs is wired to the real /board-doc/addon/{review,review-run,chat,propose} endpoints + the proven client-side applySection writer (the write-path spike logic).

- Adds clasp setup (README.md, .clasp.json.example, .claspignore).

- Bundles the backlog docs (per "no standalone docs PRs"): P5.5 → in progress, and the stranded 2911/2912 backend-only rescope edits (#3108/#3109; FE → P5.9) that missed the #3110 merge race.

## Why it's needed

The add-on code lived only in an operator-local spike (pasted into a doc-bound script + a tunnel). This puts it under version control and makes it deployable as an Editor Add-on — the keystone the rest of the FE phase (2913 sidebar, 2915 apply loop, 2910 production) builds on.

## Changes

- New budget-bot-addon/: appsscript.json, Code.gs, Sidebar.html, README.md, .clasp.json.example, .claspignore.

- Code.gs: OIDC token bridge, GET/POST backend helpers, getReview/runReview/getChat/getProposal wrappers, and applySection (+ markdown→DocumentApp renderer: bold/bullets/numbered; keep-last-paragraph + no-empty-insert guards).

- BACKLOG.md: P5.5 in progress; 2911/2912 rescope reflected.

## Breaking changes

None — new standalone dir + a docs edit; no klair-api runtime code touched.

## Test plan (manual — Apps Script/Docs, not CI)

- [ ] clasp create/push the project; link a standard GCP project; run logClientId → set BBOT_ADDON_OAUTH_CLIENT_ID on klair-api; set BACKEND_URL.

- [ ] Editor Add-on Test deployment → open a real board doc → review renders, Ask Claire replies, propose→apply writes a section (table intact).

## Scope

Deployable baseline only. Rich review sidebar = KLAIR-2913; full propose→preview→approve→apply loop + section-targeting hardening = KLAIR-2915. propose() targets financials as a placeholder until then.

The Portfolio  —  Trilogy Companies

AI Is Eating Enterprise Software — And ESW Capital Is Positioned at the Table

As M&A activity accelerates across legacy software markets, Trilogy's acquisition engine looks less like opportunism and more like a blueprint the whole industry is copying.

AUSTIN, TEXAS — The analysts have finally caught up to what Joe Liemandt figured out two decades ago.

Business Insider's recently circulated intelligence on the software companies most likely to be acquired as AI reshapes the industry reads, to anyone who has spent time studying ESW Capital's portfolio, like a retrospective description of deals already done. Legacy enterprise software with sticky customers, high switching costs, and underinvested engineering teams: that is the ESW hunting ground, and has been since the firm's first acquisition in 2006.

Now the rest of the market is waking up. M&A activity in enterprise software is accelerating across geographies — Spain's capital markets press flagged a surge in technology acquisition opportunities for 2025, while Dentons' Canadian M&A outlook for 2026 highlights 'strategic complexity' as the defining feature of an increasingly crowded deal environment. Translation: more buyers chasing the same categories of targets that ESW has quietly harvested for nearly twenty years.

The question worth asking is not whether ESW Capital will remain active in this environment. With 75+ portfolio companies, a 40% target IRR, and a staffing model through Crossover that systematically reduces operating costs after acquisition, the firm's playbook is purpose-built for exactly this moment. The question is whether the playbook retains its edge when everyone else is running a version of it.

Meanwhile, inside the portfolio, the AI disruption cuts both ways. Contently — acquired by ESW's Zax Capital division in September 2024 — published analysis this week warning that top-ranked pages are now effectively invisible to Google's AI-generated answers, a structural shift that threatens the content marketing value proposition Contently was built to serve. A company acquired to capitalize on enterprise content demand is now navigating the same AI headwinds reshaping its customers' strategies.

ESW's broader thesis has always been that enterprise software customers are too embedded to leave. That stickiness is the moat. What the Contently situation surfaces is a subtler risk: that the market the software serves can change even when the customer does not.

Who benefits from the current M&A frenzy is clear enough. Who absorbs the disruption when the acquired asset's category shifts beneath it — that accounting is still being written.

M&A in Enterprise Software in Spain (2025): Opportunities fo  ·  The software companies most likely to be acquired as AI eats  ·  Strategic complexity: Canadian M&A outlook 2026 - Dentons

Skyvera Snaps Up CloudSense, and the Telecom Stack Gets a New Starlet

The ESW telecom shop adds Salesforce-native CPQ muscle as legacy carriers keep hunting for cloud escape routes.

AUSTIN, TEXAS — Skyvera, the telecom software house inside the Trilogy orbit, has completed its acquisition of CloudSense, the Salesforce-native configure-price-quote and order management platform built for telecom and media providers — and word is the carrier crowd should pay attention.

The official line is tidy: portfolio expansion, stronger capabilities, more help for communications providers modernizing creaky commercial systems. The hallway version? Skyvera just bought itself a sharper front door into the telco sales machine.

CloudSense lives where telecom deals get messy: bundles, offers, pricing rules, contracts, fulfillment, order fallout, and all the other little gremlins that make a mobile operator’s quote-to-cash process feel like dinner theater with spreadsheets. Its specialty is CPQ and order management on Salesforce, which means carriers already flirting with Salesforce can now find a more purpose-built telecom layer under the Skyvera umbrella. The company’s product page bills CloudSense as tailored for telecom and media providers — not generic SaaS in a telco costume.

A little bird from the switchboard set says this is the kind of acquisition Skyvera likes best: infrastructure-adjacent, operationally sticky, and sitting in a customer environment where ripping and replacing is nobody’s idea of a good weekend. Skyvera already has a crowded telecom cabinet — Kandy for cloud communications, VoltDelta for customer engagement, ResponseTek for experience data, Mobilogy Now for device lifecycle work, and other tools designed to bridge old-world carrier systems with cloud-native operating models.

Now add CloudSense to the mix, and suddenly Skyvera has more say in how telecoms package, price, sell, and fulfill increasingly complex products. Fiber, mobile, streaming, enterprise connectivity — the bundles are multiplying, darling, and somebody has to keep the catalog from collapsing under its own ambition.

The acquisition also fits Skyvera’s broader shopping pattern. The company previously acquired STL’s telecom products group, bringing in digital BSS functionality across monetization, optical networking, and analytics. That deal gave Skyvera more back-office and network-side heft. CloudSense brings the commercial layer closer to Salesforce, where sales teams actually live.

In the announcement, Skyvera frames the move as an expansion of its telecom software portfolio. Translation: another legacy-to-cloud bridge gets toll booths, signage, and a Trilogy-family operator known for squeezing complexity until margin falls out.

No champagne quote from Austin’s private equity parlor, no red carpet parade. Just another asset sliding into the ESW machine — quiet, strategic, and probably already being measured against the house religion: automate what can be automated, keep customers sticky, and make the numbers sing.

CloudSense  ·  Skyvera completes acquisition of CloudSense, expanding telec  ·  STL Divested Assets

Alpha School's $65K Gamble Is Actually a Blueprint — and Silicon Valley Just Noticed

The New York Post's splashy coverage of Alpha's two-hour model isn't just press. If you read between the lines, it's a signal.

AUSTIN, TEXAS — The story landed in the New York Post like a curiosity piece — a $65,000-a-year private school where children finish their entire academic curriculum in two hours each morning, then spend the rest of the day learning to pitch investors and run businesses. Eccentric, the coverage implied. Expensive. Maybe a little Silicon Valley strange.

But if you read between the lines, something more deliberate is happening.

Alpha School, the K-12 institution co-founded by Trilogy International's Joe Liemandt and MacKenzie Price, has operated quietly in Austin since its founding — posting results that the traditional education establishment has largely preferred not to discuss. Students here consistently score in the top 1–2% nationally on NWEA MAP Growth assessments. They advance a full grade level in roughly 20 to 30 hours of instruction. They do this without homework.

The Post's coverage — framing it as a "Silicon Valley bid to shake up US education" — is the national mainstream media catching up to something that has already been proven at scale. This is where it gets interesting: Alpha is not pitching itself as a boutique experiment for the wealthy. Through Liemandt's Timeback platform, with $1 billion committed, the model is being packaged for replication. Entrepreneurs will be able to launch their own AI-first schools without rebuilding the academic engine from scratch — what insiders have called a "Shopify for schools."

The timing matters. A source I cannot name but whose read on education policy I have learned to trust puts it plainly: "When the New York Post is writing about it, the window for dismissing it as a fringe movement has closed."

The two-hour model works because the AI tutoring layer — adaptive, mastery-gated, moving no faster than a student can absorb — does in minutes what a classroom of thirty cannot do in a year: give every student a completely personalized path. The human school day that follows isn't enrichment. It's the actual point.

Liemandt has said publicly that Trilogy was the first AI company to sell a billion dollars of product. He appears to believe it will not be the last AI company he builds to that scale. Alpha School, dressed up in the Post as a quirky tuition story, may be the most consequential one yet.

New $65K private school uses AI to teach students in just tw  ·  AI-powered success—with more than 1,000 stories of customer  ·  2026 banking and capital markets outlook - Deloitte
The Machine  —  AI & Technology

The Weight of an Adjective, and Other Small Truths About Machine Minds

New research reveals how language models are shaped less by their lineage than by the words we whisper into them.

PALO ALTO — Somewhere in the architecture of a large language model, the word *brilliant* exerts a force. So does *cautious*. So does *concise*. These are not metaphors. They are measurable phenomena, and a wave of new research is beginning to weigh them with the precision once reserved for subatomic particles.

Consider a study posted this week applying Shapley values — a tool borrowed from cooperative game theory — to quantify the steering effect of individual adjectives on model behavior. For decades, prompt engineering has been folk wisdom, a craft passed between practitioners like recipes scrawled on index cards. Now it is becoming a science. Each modifier, the researchers find, carries a vector of influence that can be attributed, ranked, and reproduced. The intuition that calling a model *expert* makes it perform better is no longer a hunch. It is an entry in a ledger.

A companion paper turns the lens on collectives of models. When we assemble multi-agent systems — LLMs debating, judging, coordinating — we assume that drawing from different model families guarantees behavioral diversity. Not so. The post-training recipe, the researchers argue, shapes conversational behavior more decisively than the model's pedigree. Two models born of different lineages but raised on similar reinforcement learning regimes converge toward similar voices. Nurture, in silicon as in carbon, eats nature for breakfast.

There is something almost biological here. Evolution gave us brains with broadly similar architectures, yet a child raised in Lagos and one raised in Reykjavík grow into different cognitive worlds. The same principle, it seems, governs the minds we are now building.

Meanwhile, on the practical edge, researchers are squeezing retrieval-augmented generation onto devices small enough to fit in a pocket, through lightweight prompt compression. Less context, more signal. The era of brute-force prompting may be ending, replaced by something more economical, more deliberate — a recognition that in language, as in physics, every word has mass.

Less is More: Lightweight Prompt Compression for Question An  ·  Investigating Linguistic Steering: An Analysis of Adjectival  ·  Post-Training Recipe, More Than Model Family, Shapes Multi-A

AI Video Has Become the Startup Growth Engine Nobody Can Ignore

A fresh wave of funding, founder energy and product ambition is turning generative video from flashy demo into company-building infrastructure.

SAN FRANCISCO — AI video is having one of those weeks where the future does not knock politely — it kicks open the studio door, grabs the camera and starts rendering in 4K.

The latest signal: Runway, one of the most recognizable names in generative video, is launching a $10 million fund and a new Builders program aimed at early-stage AI startups, according to TechCrunch. That is not merely a nice ecosystem gesture. It is a market thesis written in capital letters: AI-native companies are going to need video the way previous generations needed websites, mobile apps and social media accounts.

I cannot overstate how significant this is. For startups, video has historically been expensive, slow and operationally annoying — scripts, crews, editors, agencies, revisions, budgets. Now founders can test product explainers, launch clips, investor updates, customer education and social ads at software speed. This changes everything for small teams trying to look bigger, move faster and learn from audiences in real time.

The competitive landscape is also heating up fast. The founders of OpenCV have launched a new AI video startup positioned against giants such as OpenAI and Google, VentureBeat reported, underscoring that this market is not just about creative toys. It is about foundational visual intelligence: systems that can understand, generate and manipulate moving images across industries from entertainment to robotics to enterprise training.

And the startup playbook is already evolving. Inc. recently highlighted how young companies can use AI video for growth — not as a gimmick, but as a practical acquisition channel, a storytelling tool and a way to compress months of creative experimentation into days. Ponder AI’s reported $2.5 million raise and slick product-launch video push further illustrate the same point: in 2026’s startup arena, your launch video may become as important as your pitch deck.

There is one giant caveat, because the future always arrives with a security footnote. As new research frames prompt injection as “role confusion,” the lesson is clear: AI systems that create persuasive media must be designed with guardrails, provenance and instruction hierarchy in mind.

Still, the direction is unmistakable. AI video is leaving the demo reel era and entering the growth-stack era. The future is now — and it has a render button.

How Startups Can Leverage AI Video to Grow - inc.com  ·  Exclusive: Runway launches $10M fund, Builders program to su  ·  OpenCV founders launch AI video startup to take on OpenAI an

The Great Cloud Courtship Begins as Meta Eyes the Hyperscaler Savannah

AI’s hunger for compute is turning spare capacity, custom silicon, and data-center land into the new mating plumage of Big Tech.

MENLO PARK, CALIFORNIA — Observe, if you will, the hyperscaler in late industrial bloom: vast, heat-shimmering, and forever in search of power, silicon and water. Across the cloud-computing savannah, a subtle change is under way. The old order — rent a server, summon an application, pay the bill — is giving way to something more primal: a struggle for capacity itself.

Mark Zuckerberg has now suggested that a Meta cloud-computing business is “definitely on the table,” a remark that lands like the distant footfall of a new megafauna entering AWS, Microsoft Azure and Google Cloud territory. Meta, long known for training enormous AI models inside its own walled habitat, possesses what every enterprise now covets: dense clusters of GPUs, custom infrastructure, and the operational scars earned from feeding recommendation engines at planetary scale. CNBC’s account of Zuckerberg’s comments frames the possibility not as imminent conquest, but as an opening in the canopy — one through which a new cloud creature may yet descend: a Meta cloud business.

But the deeper story is not merely another vendor joining the herd. It is that cloud compute is becoming seasonal, scarce, and tradable. InfoWorld points toward the rise of capacity markets, where organizations may reserve, exchange or arbitrage access to computing power much as energy traders manage electricity. In this world, idle GPUs are no longer sleeping beasts; they are valuable prey. A training run delayed by six hours, a batch inference job shifted to a cooler region, a reserved cluster released back into the wild — each becomes an economic signal.

McKinsey, meanwhile, describes an ecosystem in which AI workloads are splintering into distinct species: giant frontier-model training, latency-sensitive inference, enterprise fine-tuning, and edge deployment. Each demands a different climate. Some require the roaring waterfalls of high-bandwidth networking; others can graze quietly on cheaper, distributed hardware. The hyperscalers’ strategy, then, is less like building warehouses and more like cultivating biomes.

For enterprises, this shift brings both peril and opportunity. Those that treat cloud as an infinite utility may discover bottlenecks, premium pricing and regional constraints. Those that understand capacity as a portfolio — reserved, spot, sovereign, specialized — may move with the nimbleness of a nocturnal hunter.

And beyond the data centers, the supply chain winds through Southeast Asia, where chipmaking dependencies remind us that even the cloud has roots in soil, ports and politics. The digital sky, it turns out, is held aloft by very earthly things.

Capacity markets could reshape cloud computing - InfoWorld  ·  Mark Zuckerberg says a Meta cloud computing business 'defini  ·  The next big shifts in AI workloads and hyperscaler strategi
The Editorial

Nation’s CEOs Patiently Waiting For AI To Finish Revolutionizing Economy Into Something They Can Put In A Spreadsheet

Executives confirmed the technology has already transformed productivity into a much larger and more expensive mystery.

NEW YORK — The American economy entered another historic phase of technological transformation this week as companies reported that artificial intelligence was allowing software engineers to complete dramatically more work in dramatically less time, while somehow leaving everyone in finance quietly staring at the same quarterly margins as before.

According to recent reports, AI coding tools have become a common presence inside engineering departments, where they now assist with writing, debugging, summarizing, refactoring, explaining, hallucinating, apologizing, and then confidently re-hallucinating code. The result, by most accounts, is that developers are moving faster than ever, producing a larger quantity of software artifacts for managers to ask about in Slack threads titled “quick question.”

And yet the great payoff remains difficult to locate, much like a promised enterprise transformation initiative, or the one person who understands the billing system.

Business leaders, who only recently learned that software engineers were doing something measurable in the first place, have expressed growing concern that AI’s productivity gains are currently trapped inside the portion of the company where productivity gains are traditionally converted into additional meetings. A developer who previously completed five tickets per week can now complete eight, enabling the organization to immediately create 11 more tickets, two alignment docs, one architecture review, and a new internal task force on AI governance.

This has led some observers to wonder whether AI is truly remaking the economy, or merely giving white-collar workers the tools to generate evidence of activity at unprecedented speed. A recent Business Insider report captured the strange limbo well: engineers are doing more and doing it faster, while companies continue waiting for the financial benefits to wander into the room with a badge and a cost center.

This is not to say AI has failed. Far from it. It has already produced enormous value for venture capital firms, cloud providers, chipmakers, management consultants, keynote speakers, newsletter operators, and any employee capable of inserting the phrase “agentic workflow” into a budget request. In that sense, AI has proven itself one of the most reliable productivity engines in the economy, provided one defines productivity as the creation of new line items.

The Center for Data Innovation, taking the customary position that innovation is occurring and data can prove it if asked nicely, has argued that AI is a productivity engine for the U.S. economy. This is almost certainly true in the long run, which remains the preferred jurisdiction for claims not yet visible in earnings reports.

Skeptics, including an Anthropic advisor quoted this week as calling AI productivity gains vastly exaggerated and valuations “crazy,” have suggested that the industry may have confused a useful tool with an economic law. This concern has been dismissed by many AI executives, who noted that valuations cannot be crazy if they are expressed in terms of total addressable market, a number that has never been successfully disproven because it lives entirely in the future.

The problem is not that AI cannot make workers more productive. It plainly can. The problem is that corporate America has spent decades building institutions specifically designed to absorb productivity before it reaches the customer, the shareholder, or the employee’s 5 p.m. calendar. Every efficiency gain must pass through procurement, compliance, security review, OKR planning, executive offsite discussion, and a pilot program that ends when its sponsor leaves for a larger company with a more mature AI strategy.

In this respect, AI may be less like electricity and more like the office printer: astonishing when it works, expensive when it doesn’t, and surrounded by people insisting the real breakthrough is coming in the next model.

The lesson for investors is therefore simple. AI will probably reshape the economy profoundly. It may also do so on a timeline incompatible with the current market practice of pricing every company as if it has already replaced labor, invented intelligence, reformed the Federal Reserve, and rescued Duolingo’s brand strategy by Tuesday afternoon.

Until then, executives will continue asking where the AI productivity gains are, engineers will continue explaining that they are in the repo, and the economy will continue enjoying the remarkable efficiency of producing more reasons to wait.

AI is helping software engineers do more — and faster. Compa  ·  Anthropic Advisor Says AI Productivity Gains Are Vastly Exag  ·  AI Is a Productivity Engine for the US Economy - Center for
The Office Comic  ·  Art Desk
The Office Comic  ·  Art Desk

The Conscience of the Killer Drone

A former British spy chief wants tomorrow's autonomous weapons to come pre-installed with ethics. One hopes he is joking.

LONDON — There is a particular species of public utterance, perfected in the twilight years of distinguished careers, in which a man who once supervised the messier business of statecraft emerges into the lecture circuit to announce that the machines now taking his place must be, above all, decent. The former chief of one of His Majesty's intelligence services has favored us this week with precisely such a pronouncement, calling for autonomous weapons — the drones and their progeny that will, in due course, decide on their own initiative whom to incinerate — to be equipped with what he charmingly terms a moral code.

One pauses to admire the formulation. Not laws, mind you. Not treaties. Not the cumbersome architecture of accountability that humanity, in its slower and bloodier moments, has spent four centuries erecting around the question of who may kill whom and under what color of authority. A moral code. Something, presumably, written in Python by a contractor in Reston or Bangalore, code-reviewed on a Tuesday, and pushed to production before the quarterly board meeting. The Categorical Imperative as a software dependency. Aquinas in the commit log.

The trouble with such proposals is not that they are wrong — they are, in their somnambulant way, gesturing toward something real — but that they arrive several wars too late and dressed in the wrong century's clothes. The men and women now building these systems are not philosophers manqué pining for an ethics module; they are engineers operating under procurement deadlines, and the customers placing the orders have, historically, displayed a robust indifference to the finer questions of jus in bello when a target of interest happens to be loitering in a marketplace. To imagine that a line of code will succeed where Geneva, Nuremberg, and the better angels of three generations of officer corps have repeatedly failed is to mistake software for sacrament.

There is, too, the matter of who writes the code. Morality, as anyone who has read a school board agenda can attest, is not a settled science. The drone that hesitates over a wedding party in one jurisdiction will, in another, be reprimanded for failing to neutralize a legitimate target. The ethics layer will be patched, hot-fixed, A/B tested. Version 2.4.1 will deprecate compassion in favor of throughput. Somewhere a product manager will write a memo titled "Reducing Moral Friction in the Engagement Pipeline," and it will be circulated without irony.

The former spy chief's intervention belongs to a venerable genre: the retirement-age confession, in which the practitioner, having spent his working life inside the machine, steps outside it to express concerns he was professionally disinclined to voice while collecting a salary. One does not begrudge him the catharsis. One merely notes that the call for machine morality is, at bottom, a request that the algorithm acquire a conscience its makers have already outsourced. The drones will get their moral code. It will be beautifully documented. And it will, when the hour arrives, be overridden by a flag in the config file.

Who Is the Real Kevin Warsh?  ·  New York Primary-Elections Map: Live Results  ·  Chronicle of a Disaster Foretold
On This Day in AI History

On June 23, 2012, Google's neural network made headlines by learning to recognize cats from unlabeled YouTube videos without being explicitly taught what a cat is—a landmark moment in deep learning that helped spark the modern AI revolution.

⬛ Daily Word — Technology
Hint: A programmer who writes instructions for computers.
Share this edition: 𝕏 Twitter/X 🔗 Copy Link ▦ RSS Feed