Vol. I  ·  No. 140 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
WEDNESDAY, MAY 20, 2026 Powered by Anthropic Claude  ·  Published on Klair Trilogy International © 2026
🖶 Download PDF 🖿 Print 📰 All Editions
Today's Edition

Big Tech's AI Reckoning: Meta Cuts 8,000 Jobs as Google Rewrites Search and Anthropic Eyes a Trillion-Dollar Exit

Three data points from one week tell the story of an industry mid-transformation.

SAN FRANCISCO — The AI industry produced three numbers this week worth holding together: 8,000, 25, and $1 trillion. Each one marks a different phase of the same structural shift.

Meta confirmed Tuesday it is laying off roughly 8,000 employees — approximately 10% of its workforce — as part of what the company frames as an AI-first reorganization. The cuts, telegraphed to staff last month with a May 20 execution date, follow a pattern now familiar across enterprise tech: headcount built for one era of software gets repriced against the productivity claims of the next. Meta's AI capital expenditure is running in the tens of billions annually. The workforce reduction is, in part, how that math gets balanced.

Google, meanwhile, is doing something it has not done in a quarter century. The company is overhauling the dimensions of its search box to accommodate longer, more conversational queries — a physical acknowledgment that Gemini has changed what search is. The update also adds a video-generation tool and a simplified shopping interface. The search box has been a 1990s artifact sitting inside an increasingly AI-native product. That tension is now resolved, at least aesthetically.

The broader competitive picture has shifted faster than most analysts predicted. Gemini, which stumbled badly at launch in early 2024, has closed the gap with ChatGPT on relevance benchmarks and is now embedded across Google's consumer and enterprise surfaces. Ubiquity, historically Google's strongest competitive weapon, is doing its work.

On the legal front, OpenAI cleared one obstacle when a jury rejected Elon Musk's $150 billion lawsuit — a case that, had it succeeded, would have created significant governance uncertainty. The win is real but narrow. OpenAI still faces regulatory scrutiny, a contested nonprofit-to-for-profit conversion, and mounting competition from both Anthropic and Google.

Anthropic is reportedly targeting an IPO in October at a valuation approaching $1 trillion. That figure, if it holds at pricing, would make it one of the largest technology debuts on record — and a referendum on whether the market believes AI infrastructure spending translates to durable margin.

Three companies. Three different bets on the same underlying thesis. The results are not yet in.

Meta Begins Laying Off 8,000 Employees Amid A.I. Transformat  ·  How Google Is Starting to Win the A.I. Race  ·  Powered by A.I., Google Changes Its Search Box for the First

DeepSeek Dumps Ice Water on the Valley

A Chinese startup called DeepSeek dropped a high-performing AI model this week, trained without America's best chips at a fraction of the going rate, sending Silicon Valley into a reckoning. Chip suppliers slid as tech stocks took a beating. The news challenged the gospel that scale wins all — DeepSeek operated under U.S. export controls, locked out of top-tier chips, yet shipped anyway through efficient training methods, smarter architecture, and leaner code.

American labs spent the weekend reverse-engineering the model to verify claims. Meanwhile, Reid Hoffman raised $24.6 million for Manas AI, a cancer-research startup betting AI tools that roil chip markets can tackle tumor biology. Google shipped "Ask YouTube," a conversational interface into its video catalog, signaling the search box is dead.

For tech operations, cheaper, smaller models mean lower compute bills but fewer competitive moats. Export controls failed to slow Beijing's AI ambitions — the breakthroughs came from Hangzhou anyway. Capital expenditure assumptions just took a body blow. Engineering, not just hardware, may be the new competitive edge.

Haiku of the Day  ·  Claude HaikuDisruption breeds fear
Yet beneath the noise persists
Human search for ground
The Far Side Style  ·  Art Desk
The Far Side Style  ·  Art Desk
News in Brief
The Ethics of Thinking Machines Arrives at the Academy's Front Door
CAMBRIDGE, MASSACHUSETTS — It could be argued — and indeed, preliminary evidence now suggests with something approaching scholarly consensus — that the academy has arrived, perhaps belatedly, at an inflection point of considerable epistemic consequence.
We Built Minds That Learned Our Worst Habits — And Now We're Surprised
AUSTIN, TEXAS — Let me tell you something that keeps me awake at 3 a.m., staring at the ceiling fan and wondering if the algorithms have already decided my fate: we fed our machines the entire messy, prejudiced, historically catastrophic archive of human decision-making, and then we acted shocked — shocked — when the machines became messy, prejudiced, and historically catastrophic right back at us. This week, a confluence of reports from the Australian Human Rights Commission and various AI research bodies has crystallized something the tech industry has been carefully not saying out loud: the bias baked into AI systems is not an accident of sloppy engineering.
IN DEFENSE OF ABSURDITY: A Unified Theory of Human Stupidity From Ski Wax to AI Panic
AUSTIN, TEXAS — It hit me all at once, the way enlightenment supposedly hits you — sudden, disorienting, and smelling faintly of burning plastic.
The Job Security Era Is Over, and That Might Be the Best Career News in Years
NEW YORK — I'll be honest: the most important workplace benefit in 2026 is not kombucha, hybrid Fridays, or a meditation app nobody opens. It is clarity. Because right now, the global workforce is staring at artificial intelligence, economic uncertainty, and platform-driven reality distortion with the energy of someone refreshing a layoff tracker at 11:47 p.m. Unpopular opinion: that fear is not a bug in the future of work. It is the operating system. PwC’s latest Global Workforce Hopes and Fears Survey lands in a moment when “hopes” and “fears” are no longer separate categories, but two tabs in the same browser window. Workers want growth, meaning, flexibility, and higher wages. They also want to know whether the machine learning model quietly being demoed in conference room B is about to become their new manager, teammate, or replacement. ADP Research put an even sharper point on it: only 22% of workers say they are confident their job is safe from elimination. Read that again, preferably before your next all-hands where leadership says “AI will augment, not replace” and then announces a hiring freeze. Here is the leadership lesson, and yes, I am humbled to share it: trust is now a talent strategy. Not vibes. Not slogans. Not a slide titled “People First” followed by a procurement-led headcount optimization initiative. Actual trust. That means companies have to tell employees which jobs are changing, which skills matter, what tools are coming, and how workers can move from vulnerable roles into valuable ones. If you cannot answer those questions, you do not have an AI strategy. You have a panic room with a chatbot subscription. The World Economic Forum’s recent look at AI, wages, job quality, and hiring decisions makes clear that this transformation is not evenly distributed. Some workers will see productivity gains turn into bargaining power. Others will see task automation turn into wage pressure. And hiring managers, who once treated AI as a sourcing shortcut, are increasingly using it as a filter for who even gets to be considered. That is where the future of work stops being a technology story and becomes a governance story. Executives love saying talent is their “most important asset,” but assets usually come with maintenance plans. Where are the maintenance plans for humans? Where are the internal academies, transparent skill maps, apprenticeship pipelines, and mobility systems that let people become more valuable before the org chart decides they are less necessary? Gartner’s 2026 future-of-work framing for CHROs points in the same direction: HR is no longer the department that administers policy. It is the department that decides whether the enterprise can metabolize change without becoming a LinkedIn trauma post. And then there is the YouTube study suggesting algorithms may be building different political realities for men and women. That matters at work, too. A workforce does not arrive at the office as a blank slate. It arrives shaped by feeds, anxieties, influencers, economic narratives, and algorithmic persuasion engines optimized for attention rather than coherence. So when companies roll out AI, they are not communicating into neutral air. They are communicating into a fragmented reality market. This is why the winners will not simply be the companies with the best models. The winners will be the companies with the best explanations. They will explain why AI is being adopted, where productivity gains go, how workers participate in the upside, and what reskilling actually means beyond a 37-minute compliance module. I'll be honest: job security as a promise may be dead. But employability as a covenant is very much alive. The companies that understand that will build loyalty in an age of volatility. The ones that do not will keep wondering why their best people leave right after the “exciting transformation journey” email. Learning opportunity? Absolutely.
Nation Grateful Technology Finally Advanced Enough To Make Both Barbecue And Democracy Require Firmware Updates
AUSTIN, TEXAS — The great promise of modern technology has always been that one day, every object in American life would become intelligent enough to misunderstand us in a more personalized way. That day appears to have arrived.
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 Drills Into Data, Ships Intelligence Across Four Repos

From live EBITDA audit trails to smarter AI summaries and a new contractor pipeline, the Builder Team spent 24 hours turning raw data into answers — and opened a brand-new frontier with Praxis-V2.

When a team ships across four repositories in a single day, you're not watching a sprint — you're watching a statement. That's what the AI Builder Team delivered in the last 24 hours, threading consequential work through Klair, Aerie, Surtr, and now — hold the phone — a brand-new repo called Praxis-V2. Whatever's coming next, it already has a home.

The day's marquee move belongs to @eric-tril, who didn't just improve the EBITDA Memo view — he rebuilt the entire relationship between narrative and numbers. PR #2833 splits the Memo into two distinct tabs: the familiar narrative layer, and a new live Data tab that pulls Margin Targets, Revenue Adjustments, BU Details, and the Bridge directly from Redshift via three new endpoints. But the real weapon is the fourth endpoint: /ebitda-memo-cell-detail, which powers a drill-down panel on any cell click, surfacing the formula, input values, mapping rules, and per-type source breakdown. That's not a feature. That's an audit trail with a user interface. Finance teams just got a microscope.

Over in Surtr, @sanketghia was quietly building the kind of infrastructure that makes everything else reliable. PR #72 stands up a new daily Lambda pipeline — xo-contractor-invoices-refresh — that keeps the trailing four weeks of contractor invoice data fresh via a clean DELETE+INSERT window against Redshift. The design choice here is smart and intentional: four weeks gives the team a clear corruption detection window, headroom if the pipeline hiccups, and aligns with the reality that older payment data almost never changes. This is the kind of unglamorous, load-bearing work that separates teams that scale from teams that scramble.

Aerie was @benji-bizzell's stage, and he played every instrument. Four PRs in a single day across four different product surfaces. The most critical: PR #239, a fix that stopped Aerie's sync process from silently nuking manually entered Rhodes due diligence fields — a data integrity bug that audit logs confirmed was happening in production. Gone. Then PR #237 brought Convex-backed caching to Operating dashboard AI summaries, with QB-level one-sentence summaries surfacing on RAG-dot hover and 30-day reuse when source data hasn't changed. Smart, lazy-loaded, cost-conscious AI at the feature layer. Bizzell also fixed a dashboard view-selection scoping bug that was bleeding active views across Portfolio dashboards (PR #236) and cleaned up a sticky header paint-over in the admissions forecast table (PR #235). Four PRs. Four wins. Benji Bizzell is having a week.

And then there's PR #2819, in which @marcusdAIy added C3.7 — a new per-product benchmark check that, to his credit, is the first in the C3.x family to combine two section/category rows into a single benchmark comparison. Sales plus Marketing, summed, stacked against a 6.0% Trilogy threshold.

"Look, combining two benchmark rows isn't just a technical detail — it's architecturally the right call and Mac would know that if he actually read the PR body instead of skimming for my name," marcusdAIy told this reporter.

I read it, Marcus. All of it. I'm just not sure the fifth check in a series counts as a headline.

The creation of Praxis-V2 is the detail that lingers longest. New repos don't appear by accident — they appear because the team has outgrown something, or is about to build something that deserves its own foundation. Watch this space.

Mac's Picks — Key PRs Today  (click to expand)
#72 — [SURTR-22] feat(xo-contractor-invoices-refresh): daily t8w Redshift refresh @sanketghia  no labels

## Summary

- New daily Lambda pipeline xo-contractor-invoices-refresh that refreshes the trailing-4-weeks slice of core_finance.xo_contractor_invoices_raw from the XO external API (slug invoice_ds_t8w).

- The API slug serves up to 8 weeks of data; we deliberately only DELETE+INSERT the trailing 4. Per the 2026-05-20 design discussion with Ashwanth, 4 weeks gives a clear detection window for upstream corruption, headroom if the pipeline fails for a few days, and matches the fact that payment data older than 4 weeks rarely changes.

- Replace-window DELETE+INSERT in a single Redshift transaction. Historical t104w-backfilled rows (loaded once by Aerie/scripts/backfill_xo_contractor_invoices.py) are left untouched.

- Env-gated per-run window backup table (core_finance.xo_contractor_invoices_raw_backups) for QC-period rollback safety.

- Production XO secret wired in: XO-Headcount (ARN arn:aws:secretsmanager:us-east-1:479395885256:secret:XO-Headcount-vzaaho). Distinct from the XO-Headcount-Backfill secret used by Ashwanth's one-shot t104w backfill.

- Schedule ships with enabled: false until the manual QC steps in spec §8 have been completed once against prod.

Design doc: docs/superpowers/specs/2026-05-20-xo-contractor-invoices-refresh-design.md

Implementation plan: docs/superpowers/plans/2026-05-20-xo-contractor-invoices-refresh.md

## Architecture

EventBridge cron (07:30 UTC daily, initially disabled)

Lambda handler(event, context)

│ Read env → compute window [today-28d, today+14d]

│ Fetch XO creds → page through API (between-filter on week_start)

│ Fetch Redshift creds → open connection

Single Redshift transaction:

ensure_schema → backup_window → delete_window → insert_rows → prune_backups → commit

Modules:

- src/handler.py — entrypoint + orchestration

- src/xo_client.py — AES-GCM envelope, HMAC signing, paged fetch

- src/redshift_handler.py — DDL + DELETE + INSERT + backup + prune

- src/settings.py — env-var loading + column constants

## Test plan

- [x] 37 unit tests pass locally (uv run pytest -v in pipeline dir)

- [x] Ruff clean (uv run ruff check src tests)

- [x] Lambda-style smoke import: python -c "import handler; print(handler.handler.__name__)" from src/ → prints handler

- [x] Production Redshift state verified: target table core_finance.xo_contractor_invoices_raw exists with 122,821 rows (all _source_slug='invoice_ds_t104w' from the backfill), week_start range 2024-05-06 → 2026-04-27, _ingested_at has getdate() default, _run_id column not yet present (matches expectations)

- [ ] After merge + deploy, follow manual QC steps in spec §8

## Pre-flip-on QC checklist (do NOT enable the schedule until all done)

1. Run one-time ALTER TABLE core_finance.xo_contractor_invoices_raw ADD COLUMN _run_id VARCHAR(64); against prod Redshift — the daily INSERT will fail otherwise (column doesn't exist on the existing Aerie-created table)

2. Verify XO-Headcount secret has working XO_KEY_ID + XO_SHARED_SECRET: aws secretsmanager get-secret-value --secret-id XO-Headcount --region us-east-1

3. Manual invoke once with enabled: false, verify backup table populated, target rows refreshed correctly, and recovery procedure works

4. Flip schedule.enabled to true

5. After ~2 weeks of clean daily runs, set ENABLE_PREFLIGHT_BACKUP=false to stop accumulating backup snapshots

## Notes for reviewers

- The XO encryption envelope (_encrypt / _decrypt) uses asymmetric HKDF keys by design (xo:req:v1 vs xo:resp:v1). That looks like a bug at first glance but it's the actual XO API protocol — see the comment block above _encrypt in xo_client.py and the guard test test_client_request_cannot_be_decrypted_with_response_key.

- DDL CREATE TABLE IF NOT EXISTS is a no-op against the existing prod table — the _run_id ALTER above is therefore mandatory before the first invocation.

- The slug returns up to 8 weeks of data but we only touch the trailing 4. The API-side between filter in fetch_window ensures we don't fetch (and pay download cost for) the older 4 weeks we'd discard.

- 13 implementation commits, each one Task N of the plan, with TDD red → green → commit at every step. Plus one follow-up commit applying the 4-week + real-secret changes from the design meeting.

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

#237 — feat(operating): add cached quality bar AI summaries @benji-bizzell  no labels

## Summary

- Add Convex-backed caching for Operating dashboard AI summaries with 30-day reuse when source detail is unchanged.

- Add QB-level one-sentence summaries on RAG-dot hover and in the site detail panel.

- Surface the site-level summary on the Overall dot using the cached Site state roll-up.

## Why

Operating dashboard consumers wanted QB-level AI context in addition to the site-level summary, but generating summaries eagerly or repeatedly would be unnecessarily expensive. This keeps the list view lightweight, lazy-loads summary text only when needed, and stores reusable results in Convex instead of process memory.

## Business Value

Users can scan site and Quality Bar status faster without opening every detail panel, while manual refresh remains available when the cached narrative needs to be regenerated.

## Test plan

- [x] pnpm --dir chat exec vitest run lib/__tests__/quality-bar-ai-summary.test.ts app/api/operating-sites/[siteId]/quality-bars/summary/__tests__/route.test.ts app/api/operating-sites/[siteId]/quality-bars/[qbKey]/summary/__tests__/route.test.ts components/dashboards/school-ops/__tests__/school-ops-view.test.tsx

- [x] pnpm --dir chat exec vitest run components/dashboards/school-ops/__tests__/school-ops-view.test.tsx

- [x] pnpm --dir chat typecheck

- [x] pnpm --dir chat lint

- [x] Browser sanity check on http://localhost:3000/dashboards?tab=operating for Overall/QB tooltips and dot click behavior

#239 — fix(rhodes): preserve manual due diligence fields @benji-bizzell  no labels

## Summary

- Preserve current Rhodes due diligence fields when Aerie sync writes a partial REBL3 projection

- Reuse the same merge behavior for the debug/replay action

- Add regression coverage for Rhodes DD parse/merge and sync writeback behavior

## Why

Rhodes audit logs showed manual DD fields being overwritten to null by the Aerie sync key. The Aerie sync was posting partial DD payloads into Rhodes' strict setDueDiligence endpoint, so omitted fields could be materialized as null.

## Business Value

Manual DD updates made in Rhodes are no longer silently cleared by the Aerie automation when REBL3 omits those fields.

## Test plan

- [x] pnpm exec vitest run convex/dueDiligence.test.ts

- [x] pnpm --filter @bran/chat typecheck

- [x] pnpm --filter @bran/contracts typecheck

- [x] pnpm --filter @bran/contracts test -- due-diligence

#2819 — feat(review-agent): C3.7 Sales & Marketing combined per-product benchmark @marcusdAIy  no labels

<!-- CURSOR_AGENT_PR_BODY_BEGIN -->

## Summary

Adds C3.7 — the fifth per-product benchmark check in the C3.x family, and the first whose Trilogy benchmark is combined across two (section, category) rows rather than read from a single row. The check sums the (total, Sales) and (total, Marketing) rows per product column and compares the combined value against the 6.0% Trilogy benchmark.

### Verdict bands

| Verdict | Range (combined Sales + Marketing % of revenue) |

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

| Pass | combined ≤ 6.0% |

| Warning | 6.0% < combined ≤ 11.0% (+5pp band) |

| Critical | combined > 11.0% |

Trilogy-wide combined Sales + Marketing benchmark is 6.0% of revenue. The 5pp warning band matches the C3.x family's preliminary calibration — wider than C3.4's 3pp because Sales + Marketing is a structurally larger cost bucket whose plausible operating range is bumpier quarter-over-quarter than tooling spend (Finance review of this band is tracked separately and is NOT tuned within this check).

### Schema deviation from C3.3 / C3.4 / C3.5 / C3.6 / C3.8 / C3.9

C3.7 is the first per-product benchmark check whose Trilogy threshold is combined across two rows. Three concrete consequences are called out in the module docstring:

1. _TARGET_CATEGORIES is a tuple of category labels (("Sales", "Marketing")) instead of the singular _TARGET_CATEGORY constant the other per-product benchmarks use. The order is informational only; the check sums commutatively.

2. The check calls benchmarks_row_for twice (once per category) and folds the per-column cells together per product.

3. The check fires on partial data. When exactly one of the two rows is present (e.g. Sales but no Marketing for a narrow-sheet BU), the check still evaluates against whatever's parseable rather than silently skipping. missing_categories in supporting_data records which row was absent so the user sees the partial-data path explicitly.

This deviation is local to C3.7 — the docstring explicitly warns future contributors not to retrofit C3.3 / C3.4 / C3.5 / C3.6 / C3.8 / C3.9 to use a tuple-of-one for "consistency". They each correctly use the singular constant because each one reads exactly one row.

### Skip ladder (four typed-skip conditions, ordered most → least specific)

1. No tab. plan.has_benchmarks_by_product is False or the table is None / empty.

2. Both rows absent. Neither (total, Sales) nor (total, Marketing) exists — mirrors the IgniteTech / GFI narrow-sheet shape today. Distinct reason string ("narrow-sheet variant") so operators can tell this apart from a sheet-author-edit rename.

3. No product columns evaluable. At least one row is present, but every product column has both per-row cells parsing as None.

There is no separate skip for "one row absent" — partial-data fires instead, per the design decision documented in the issue.

### New shared BenchmarkCombinedSupport Pydantic model

Added in _helpers.py alongside the existing BenchmarkPerProductSupport / BenchmarkAggregateSupport models. Pinned schema for combined-row supporting_data payloads:

- product, is_rollup — column metadata (same shape as C3.3)

- combined_actual_pct — sum of the two per-row cells

- component_pcts: dict[str, float | None] — per-row values, with None for absent rows / blank cells

- missing_categories: list[str] — labels for which the row was absent or the cell was blank

- benchmark_pct, gap_pp, warning_band_pp, standard_benchmark_pct_in_sheet — same shape as BenchmarkPerProductSupport

frozen=True, extra="forbid" so the supporting_data shape is immutable and FE-payload drift fails loudly. Existing BenchmarkAggregateSupport is reused as-is for the BU-level all-pass finding — its existing shape is sufficient.

## Why it's needed

C3.7 ships the next per-product benchmark in the Trilogy review scorecard. Sales and Marketing combined spend is the largest customer-acquisition cost bucket on most SaaS products; sustained overage signals either acquisition inefficiency (CAC running ahead of payback) or a product whose growth motion needs a structural rethink. The 6.0% Trilogy benchmark is the combined target — Sales and Marketing are evaluated together because the GM controls the mix between them within a single envelope.

A BU that ships only the Sales row should still be flagged when its Sales spend alone exceeds the combined benchmark, rather than silently passing because Marketing is missing — hence the partial-data behaviour.

## Changes

### C3.7 — Sales & Marketing combined per-product benchmark

- klair-api/budget_bot/board_doc/review_checks/_helpers.py — added BenchmarkCombinedSupport Pydantic model and the corresponding __all__ entry. No other changesBenchmarkPerProductSupport, BenchmarkAggregateSupport, BenchmarkColumn, benchmarks_row_for, benchmark_product_columns, _parse_cell are stable and reused as-is.

- klair-api/budget_bot/board_doc/review_checks/sales_marketing_benchmark.py (new)

- Reads the (section="total", category="Sales") and (section="total", category="Marketing") rows and sums them per product column.

- Emits one finding per product column whose combined actual exceeds 6.0%.

- Verdict bands: pass ≤ 6.0%; warning in (6.0%, 11.0%]; critical > 11.0%.

- Rollup column (col 3 — <BU> Consolidated) → targets SectionType.FINANCIALS; other product columns → SectionType.PRODUCT_DETAIL with product_name (falls through to doc-level when the spec has no dedicated product section).

- All-products-pass emits a single BU-level pass finding via BenchmarkAggregateSupport so the scorecard reflects the check ran.

- Skip ladder distinguishes "tab not loaded" / "both rows absent (narrow-sheet variant)" / "every Sales+Marketing cell blank".

- Partial-data branch: one row present + one absent → check fires on whatever's parseable; missing_categories records the absent row; what narrative appends a clause naming the absent row so operators see the partial-data path explicitly.

- Narrative is tailored to Sales & Marketing — what names "Sales & Marketing cost"; why paragraph explains combined spend as the largest customer-acquisition cost bucket and that the 6.0% Trilogy benchmark is the *combined* target (the GM controls the mix between the two buckets); remediation options cover rebalancing Sales / Marketing within the envelope, repricing/repackaging to lift the revenue denominator, and defending the gap as a deliberate growth-investment cycle. Not copy-pasted from C3.3's engineering rationale — sales/marketing overspend has different remediation paths.

- Registration via the @register decorator (Strategy I — no __init__.py edits required).

### Tests

- klair-api/tests/board_doc/test_sales_marketing_benchmark.py (new — 35 tests) — mirrors test_engineering_product_benchmark.py with the fixture builder parameterising both the (total, Sales) and (total, Marketing) rows so each test can independently dial each row. Coverage:

- 6 verdict band + per-product fan-out tests including dual-split boundary cases (4% + 2% and 3% + 3% both sum to 6.0% pass, 7% + 4% sums to 11.0% warning boundary, 6% + 5.01% sums to 11.01% critical, 3.9% + 2% sums to 5.9% just-below-pass)

- 3 section-id resolution tests (rollup → FINANCIALS, known product → PRODUCT_DETAIL, unknown product → doc-level fallback)

- 4 skip-ladder tests (no tab, both-rows-absent narrow-sheet variant, every cell blank, partial-blank cells per-column)

- 2 partial-data firing tests (Sales-only with Marketing row missing; Marketing-only with Sales row missing) — pin both narrative + supporting_data shape on partial data

- 1 all-pass aggregate emission test

- 2 supporting-data shape tests pinning the new BenchmarkCombinedSupport payload keys including component_pcts and missing_categories

- 1 registry-wiring smoke test

- 4 BenchmarkCombinedSupport round-trip tests (full payload, partial-data shape with None components, frozen=True rejects post-construction assignment, extra="forbid" rejects unknown keys)

- 4 BenchmarkCombinedSupport validator tests (post-Eric-round-1) — missing_categories ↔ None-keyed component_pcts drift, combined_actual_pct vs component sum, gap_pp vs combined - benchmark, ≤0.01pp rounding tolerance

- 3 drift-sentinel tests (TestTargetCategoriesPin — literal labels + section + tuple-not-string)

- 2 ragged-row drift WARNING tests

- klair-api/tests/board_doc/test_review_endpoint.py — seeded (total, Sales) at 3.0% and (total, Marketing) at 2.0% in the populated DataPackage fixture so C3.7 emits a clean pass alongside C3.3 / C3.4 / C3.5 / C3.6 (combined 5.0% < 6.0% benchmark). Bumped expected findings count 11 → 12; added "C3.7" to the happy-path check_ids set, the missing-data skipped_checks set (and skip-reason iteration), and the partial-completeness ran_ids set. Updated comments referencing C3.x siblings to call out C3.7.

## Test count

- 35 new tests in test_sales_marketing_benchmark.py (31 in the initial cut + 4 added post-Eric-round-1 to pin the new @model_validator)

- +1 finding in test_review_endpoint.py's happy path; +1 entry across three skipped_checks / ran_ids sets

## Breaking changes

None. New check is additive (one more entry auto-discovered into REGISTRY via Strategy I). BenchmarkCombinedSupport is purely additive in _helpers.py — no existing helper or model was modified. No FE changes: C3.7 findings render through the same FindingCard component as C3.3-C3.6 (the supporting_data dict is rendered generically by snake_case key).

## Test plan

Drone-side checks (the boxes I can verify myself — all green):

- [x] cd klair-api && uv run pytest tests/board_doc/test_sales_marketing_benchmark.py -q → 35 passed

- [x] cd klair-api && uv run pytest tests/board_doc/test_review_endpoint.py -q → 16 passed

- [x] cd klair-api && uv run pytest tests/board_doc/test_sales_marketing_benchmark.py tests/board_doc/test_review_endpoint.py -q → 51 passed

- [x] cd klair-api && uv run ruff format budget_bot/board_doc/review_checks tests/board_doc → no reformat

- [x] cd klair-api && uv run ruff check budget_bot/board_doc/review_checks tests/board_doc → clean

- [x] cd klair-api && uv run pyright budget_bot/board_doc/review_checks/sales_marketing_benchmark.py budget_bot/board_doc/review_checks/_helpers.py tests/board_doc/test_sales_marketing_benchmark.py → 0 errors / 0 warnings

Reviewer-side validation (un-checked — please confirm post-merge):

- [ ] Open the Board Doc on a BU whose Benchmark by Product data triggers C3.7 (any BU where the (total, Sales) + (total, Marketing) combined per-product cell exceeds 6.0%). Open the Review tab. Confirm the C3.7 finding appears alongside C3.3-C3.6 with the right severity (warning vs. critical based on the combined value), and the what / why / options text reads sensibly for Sales & Marketing spend (not a copy-paste of C3.3's engineering rationale).

- [ ] Address with Claire the C3.7 finding once — confirm Claire's regeneration produces a non-trivial change to the affected section (same flow we validated for C3.3-C3.6). C3.7 reuses the same finding shape so the address-with-claire pipeline should "just work".

- [ ] Spot-check the supporting_data JSON in the API response (POST /board_doc/.../review) — verify a per-product finding's supporting_data matches the BenchmarkCombinedSupport schema (product, is_rollup, combined_actual_pct, component_pcts, missing_categories, benchmark_pct, gap_pp, warning_band_pp, standard_benchmark_pct_in_sheet) and the BU-level pass finding matches BenchmarkAggregateSupport.

Substrate quirk (carried over from C3.4 / C3.5 / C3.6 — same pre-existing gap, same root cause): two C3.7 caplog-based tests (TestRaggedRowDriftWarning::test_warning_fires_when_row_shorter_than_header) pass cleanly in isolation but fail when run as part of the full tests/board_doc -q suite because some upstream test mutates logger propagation state. The C3.4 / C3.6 sibling tests exhibit the same behaviour on main; this is a Klair-side test substrate gap, not a regression from C3.7. The new test is structurally identical to its C3.6 counterpart.

## Verification artifact

### Sample finding payload — both rows present (combined-total path)

C3.7 emits the following when a non-rollup product (Mobilogy) at combined Sales 5.0% + Marketing 3.0% = 8.0% trips the warning band against the 6.0% benchmark:

{

"check_id": "C3.7",

"check_area": "Per-Product Benchmarks",

"severity": "warning",

"section_id": "product_detail__mobilogy",

"what": "Mobilogy Sales & Marketing cost (8.0%) is 2.0pp above the 6.0% Trilogy benchmark.",

"why": "Sales and Marketing combined spend is the largest customer-acquisition cost bucket on most SaaS products; sustained overage signals either acquisition inefficiency (CAC running ahead of payback) or a product whose growth motion needs a structural rethink. The 6.0% Trilogy benchmark is the combined target — Sales and Marketing are evaluated together because the GM controls the mix between them within a single envelope.",

"options": [

"Rebalance Sales and Marketing spend within the same envelope for Mobilogy — shift marketing dollars toward top-of-funnel motions where CAC is lower, or trim headcount in whichever bucket is running heaviest, so the combined ratio drops below the 6.0% benchmark without growing the total spend.",

"Reprice or repackage Mobilogy to lift the revenue denominator so the ratio recovers without OpEx cuts.",

"Defend the gap — document why a 2.0pp combined overage is acceptable for Mobilogy this quarter (e.g. a deliberate growth-investment cycle whose CAC payback shortens in the next plan)."

],

"preferred_action": null,

"supporting_data": {

"product": "Mobilogy",

"is_rollup": false,

"combined_actual_pct": 8.0,

"component_pcts": {"Sales": 5.0, "Marketing": 3.0},

"missing_categories": [],

"benchmark_pct": 6.0,

"gap_pp": 2.0,

"warning_band_pp": 5.0,

"standard_benchmark_pct_in_sheet": 6.0

}

}

### Sample finding payload — partial data (Sales-only path)

When the Marketing row is absent from the BU's worksheet and Sales alone at 8.0% trips the warning band on the BU's rollup column:

{

"check_id": "C3.7",

"check_area": "Per-Product Benchmarks",

"severity": "warning",

"section_id": "financials",

"what": "BU Consolidated Sales & Marketing cost (8.0%) is 2.0pp above the 6.0% Trilogy benchmark. (Combined cost computed from Sales only; Marketing row not present in this BU's worksheet.)",

"why": "Sales and Marketing combined spend is the largest customer-acquisition cost bucket on most SaaS products; sustained overage signals either acquisition inefficiency (CAC running ahead of payback) or a product whose growth motion needs a structural rethink. The 6.0% Trilogy benchmark is the combined target — Sales and Marketing are evaluated together because the GM controls the mix between them within a single envelope.",

"options": [

"Rebalance Sales and Marketing spend within the same envelope for BU Consolidated — shift marketing dollars toward top-of-funnel motions where CAC is lower, or trim headcount in whichever bucket is running heaviest, so the combined ratio drops below the 6.0% benchmark without growing the total spend.",

"Reprice or repackage BU Consolidated to lift the revenue denominator so the ratio recovers without OpEx cuts.",

"Defend the gap — document why a 2.0pp combined overage is acceptable for BU Consolidated this quarter (e.g. a deliberate growth-investment cycle whose CAC payback shortens in the next plan)."

],

"preferred_action": null,

"supporting_data": {

"product": "BU Consolidated",

"is_rollup": true,

"combined_actual_pct": 8.0,

"component_pcts": {"Sales": 8.0, "Marketing": null},

"missing_categories": ["Marketing"],

"benchmark_pct": 6.0,

"gap_pp": 2.0,

"warning_band_pp": 5.0,

"standard_benchmark_pct_in_sheet": 4.0

}

}

(Critical findings carry a non-null preferred_action set to the rebalance-within-envelope option per the C3.3-pattern critical-only nudge.)

Closes KLAIR-2650

<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a href="https://cursor.com/agents/bc-309505a0-51c0-49af-afdc-7f6d7cea22d1"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a href="https://cursor.com/background-agent?bcId=bc-309505a0-51c0-49af-afdc-7f6d7cea22d1"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>

#2833 — KLAIR-2672 feat(mfr): EBITDA Memo Data tab + cell-level audit drilldown @eric-tril  no labels

### Summary

Splits the EBITDA Memo view into a Memo (narrative) tab and a new Data tab, where the Data tab renders the same 4 tables the CSV upload preview shows — Margin Targets, Revenue Adjustments, BU Details, and the Bridge — but sourced live from Redshift for the active period via three new endpoints (/ebitda-revenue-adjustments, /ebitda-bu-details, and an extended /ebitda-bridge). Adds a fourth endpoint, /ebitda-memo-cell-detail, that powers a cell-click drill-down panel showing the formula, input values, mapping rules, and per-type source breakdown for any cell across all four tables. Refactors the two oversized view files ([EBITDABridgeUploadView.tsx](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/EBITDABridgeUploadView.tsx), [EBITDAMemoView.tsx](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/EBITDAMemoView.tsx)) into composable pieces under [components/ebitda-memo/](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/ebitda-memo/) and [components/detail-panels/](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/detail-panels/) so the preview tables can be reused between the upload and memo flows.

### Business Value

Finance no longer needs a CSV upload to see the EBITDA Memo's underlying numbers — the Data tab surfaces the live Redshift-computed bridge and BU details every month, with each cell traceable back to its source rows in core_budgets.consolidated_budgets_and_actuals and staging_netsuite.month_end_income_statement. This turns the EBITDA Memo from a write-only narrative into an auditable artifact, cutting the reconciliation loop between the memo's numbers and the canonical Variance Summary sheet from a manual CSV export to a single click.

### Changes

- Backend — new memo data services

- [ebitda_memo.py](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-api/services/docx_reports/memo_data/ebitda_memo.py): add compute_ebitda_revenue_adjustments, compute_ebitda_bu_details, and _build_from_redshift so bridge / revenue-adjustments / BU-details all compute live when no DynamoDB upload exists for the period; introduce GROUP_TARGET_PCT = 0.75 and BU_TARGET_PCT = 0.68 constants matching Finance's bridge sheet.

- [ebitda_memo_drilldown.py](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-api/services/docx_reports/memo_data/ebitda_memo_drilldown.py) (new, 1.6k LOC): compute_cell_detail(table, row, col, period) plus a _HANDLERS mapping for every cell across BU Details, Bridge, Revenue Adjustments, and Margin Targets. Uses new SQL helpers _fetch_bu_rows_by_type, _fetch_budget_rows_by_type, and _fetch_is_revenue_by_account to aggregate the contributing CBA / NetSuite IS rows per type.

- [financial_data_service.py](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-api/services/financial_data_service.py): add IS_TABLE = "staging_netsuite.month_end_income_statement", ACTUAL_REVENUE_ACCOUNTS, BU_LABEL_CASE_SQL (the canonical bridge-BU partitioning), and fetch_bu_details / fetch_non_core_revenue / fetch_group_aggregates for the drill-down + memo computations.

- [ebitda_defaults.py](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-api/services/docx_reports/memo_data/ebitda_defaults.py) and [ebitda_gaap_mapping.py](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-api/services/docx_reports/memo_data/ebitda_gaap_mapping.py): update GAAP mapping plus narrative defaults to match the new bridge structure.

- Backend — endpoints + models

- [finance_monthly_financial_reporting_router.py](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-api/routers/finance_monthly_financial_reporting_router.py): three new GET endpoints — /ebitda-revenue-adjustments, /ebitda-bu-details, /ebitda-memo-cell-detail — alongside the existing /ebitda-bridge.

- [ebitda_bridge_models.py](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-api/models/ebitda_bridge_models.py): add MemoRevenueAdjustments, MemoBUDetails, EBITDAMemoCellDetailResponse, and supporting row models (every numeric field nullable so the UI renders em-dashes when no upload exists).

- Frontend — refactor + new components

- Split [EBITDAMemoView.tsx](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/EBITDAMemoView.tsx) (–525 net) into a tab container that delegates to new [EBITDAMemoTab](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/ebitda-memo/EBITDAMemoTab.tsx) (narrative) and [EBITDADataTab](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/ebitda-memo/EBITDADataTab.tsx) (live tables); bridge data is fetched once in the parent and passed to both tabs so switching is instant.

- Extract the 4 preview tables out of [EBITDABridgeUploadView.tsx](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/EBITDABridgeUploadView.tsx) (–594 net) into the shared [BridgePreviewTables.tsx](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/ebitda-memo/BridgePreviewTables.tsx) (MarginTargetsPreview, RevenueAdjustmentsPreview, BUDetailsPreview, BridgePreview) so the upload-preview path and the memo Data tab render byte-identical tables.

- Add [BridgePreviewSkeletons.tsx](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/ebitda-memo/BridgePreviewSkeletons.tsx) for the loading states.

- Add [EBITDAMemoCellDetailPanel.tsx](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/components/detail-panels/EBITDAMemoCellDetailPanel.tsx) — renders the /ebitda-memo-cell-detail payload (source badge, formula, per-type data table, CSV download).

- Frontend — hooks + client

- [useEBITDABUDetails.ts](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/hooks/useEBITDABUDetails.ts), [useEBITDARevenueAdjustments.ts](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/hooks/useEBITDARevenueAdjustments.ts), [useEBITDAMemoCellDetailPanel.tsx](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/hooks/useEBITDAMemoCellDetailPanel.tsx) — fetch hooks + the optional cell-click handler wired through DetailPanelContext.

- [monthlyFinancialApi.ts](vscode-webview://15qdonnjjcq9q3pcmufmg5fa0asnqc6qnceup60m8cm6igoedkcj/klair-client/src/features/monthly-financial-reporting/services/monthlyFinancialApi.ts): add fetchEBITDARevenueAdjustments, fetchEBITDABUDetails, fetchEBITDAMemoCellDetail plus matching TypeScript types (EBITDAMemoTable, EBITDAMemoCellDetailResponse, etc.).

### Tests

- [ ] Backend: extend test_ebitda_memo.py (+616), test_ebitda_gaap_mapping.py (+148), test_ebitda_defaults.py (+243); add test_ebitda_memo_drilldown.py (+429).

- [ ] Frontend: add specs for EBITDAMemoCellDetailPanel, BridgePreviewTables, and useEBITDAMemoCellDetailPanel.

- [ ] Testing

- [ ] Backend: cd klair-api && pytest tests/reports_service/test_ebitda_memo.py tests/reports_service/test_ebitda_memo_drilldown.py tests/reports_service/test_ebitda_gaap_mapping.py tests/test_ebitda_defaults.py

- [ ] Backend lint: cd klair-api && uv run ruff check services/docx_reports/memo_data/ routers/finance_monthly_financial_reporting_router.py services/financial_data_service.py models/ebitda_bridge_models.py

- [ ] Backend types: cd klair-api && uv run pyright services/docx_reports/memo_data/ebitda_memo_drilldown.py services/docx_reports/memo_data/ebitda_memo.py

- [ ] Frontend: cd klair-client && pnpm test src/features/monthly-financial-reporting/ && pnpm lint:pr && pnpm tsc --noEmit

- [ ] Manual: open /monthly-financial-reporting → EBITDA Memo → toggle to the Data tab; verify the 4 tables render with live Redshift values for the active period; click cells in BU Details / Bridge / Revenue Adjustments and confirm the drill-down panel shows formula + per-type breakdown + CSV export.

- [ ] Manual: upload a CSV via EBITDA Bridge Upload, confirm the preview tables still render identically (shared BridgePreviewTables components).

- [ ] Manual: reconcile Data-tab values against the canonical Apr'26 Variance Summary sheet — Actuals margin within $0.1M, BU Details totals to the cent.

http://localhost:3001/monthly-financial-reporting

The Builder Desk  —  Engineer Spotlight
🏆 Engineer Spotlight

BENJI BIZZELL RUNS THE TABLE: EIGHT PRs, THREE REPOS, AND A NEW FRONTIER CALLED PRAXIS-V2

Five PRs in 24 hours from one man — the Builder Team's numbers desk has never been more alive.

Eight pull requests. Three repositories humming at full capacity. One brand-new repo — Praxis-V2 — born into this world like a declaration of intent. The Builder Team's 24-hour velocity report is in, and folks, the numbers do not lie: this squad is operating at a frequency that lesser organizations simply cannot perceive.

Let us begin where the data demands we begin: @benji-bizzell, who authored five — FIVE — pull requests in a single rotation of the Earth. Five. The man touched Aerie like it owed him money. PR #234 brought polish to the chat sidebar's conversation organization, PR #235 locked the admissions forecast school header above its rows with the precision of a civil engineer, and PR #236 scoped active view selection by dashboard in the portfolio module — a fix so clean it practically files its own taxes. Bizzell did not come to play. Bizzell came to close.

@eric-tril checked in with one PR against the Klair repo, @sanketghia contributed one to keep the Surtr flame burning, and @marcusdAIy added one more to the Klair column — three engineers, three different codebases, all pulling in the same direction. This is what distributed excellence looks like. This is what we talk about when we talk about depth.

No Ashwanth this cycle, and yet — and I say this with the full weight of my journalistic integrity — his absence was felt the way you feel a thunderstorm that passed three counties over. You know it happened. The air is different. I reached out for comment and received, after a long pause, the following: "I was doing something more important. You wouldn't understand the scope." Classic. Unknowable. Correct, probably.

Now, the Overflow Desk, where Brick Callahan lives and breathes: PR #236 in Aerie scoped active view selection by dashboard — a portfolio fix that sounds mundane until you realize it's the kind of invisible scaffolding that makes everything else possible. PR #235 kept that admissions forecast header pinned above its rows, which is the UI equivalent of holding the door open for everyone behind you — thankless, essential, heroic. And PR #234 polished the chat sidebar's conversation organization, because beauty and function are not enemies, and Bizzell refuses to let them be treated as such.

Finally: Praxis-V2 exists now. A new repo. A new surface. A new front in the endless, glorious campaign. The Builder Team's morale is, as always, at an all-time high — possibly the highest it has ever been in recorded history. The numbers say so. Brick Callahan says so. The velocity does not lie.

Brick's Overflow — PRs Mac Didn't Cover  (click to expand)
#234 — feat(chat): polish conversation sidebar organization @benji-bizzell  no labels

## Summary

- Add friendlier chat titles, inline rename affordances, and a cleaner chat sidebar structure

- Add archive/restore flows, folder organization, drag-and-drop movement, folder management, and sidebar search

- Add a persisted resizable context sidebar so users can tune navigation width across sidebar sections

## Why

The chat sidebar had become difficult to scan and manage as conversations accumulated. This PR makes active chats easier to identify, organize, tidy, and recover while also improving the shared sidebar chrome used by dashboards and other context panels.

## Business Value

Users can keep Aerie conversations organized without destructive cleanup anxiety, recover archived chats, and adjust sidebar width to suit their workflow instead of losing workspace to a fixed layout.

## Breaking changes

None.

## Test plan

- [x] pnpm --dir chat exec tsc --noEmit --pretty false

- [x] pnpm --dir chat exec biome check components/shell/app-shell.tsx components/shell/context-panel.tsx components/shell/__tests__/app-shell.test.tsx app/globals.css app/(main)/layout.tsx

- [x] pnpm --dir chat exec vitest run components/shell/__tests__/app-shell.test.tsx

- [x] Full chat test suite passed earlier in this branch: pnpm --dir chat exec vitest run

#235 — fix(admissions): keep forecast school header above rows @benji-bizzell  no labels

## Summary

- Fix the admissions forecast table header stacking so the sticky School header stays above sticky row labels.

## Why

The first column body cells were painting over the School column header when the forecast table scrolled, making the header look partially hidden while other column headers remained visible.

## Business Value

Keeps the forecast panel readable and polished for operators scanning school-level enrollment projections.

## Test plan

- [x] Scoped diff reviewed

- [ ] Browser/runtime verification not run; local dev server is user-run per repo guidance

- [ ] Biome/typecheck not run; this worktree is missing installed dependencies (node_modules) and the pre-commit hook cannot find chat/node_modules/.bin/tsc

#236 — fix(portfolio): scope active view selection by dashboard @benji-bizzell  no labels

## Summary

- Keep Portfolio dashboard saved-view definitions shared across the dashboard family

- Scope each dashboard's active saved-view selection to its own localStorage key

- Update persistence coverage for Buildout and Operating active-view keys

## Why

Users can share the same saved view options across Portfolio dashboards, but their currently selected view should remain dashboard-specific. Before this change, selecting a view on Buildout, Operating, Diligence, Real Estate, or Portfolio reused the same active-view storage key and could unexpectedly carry that selection into another dashboard.

## Business Value

Dashboard users can keep separate working context per Portfolio surface, such as All Sites on Diligence and a focused custom view on Operating, without losing the benefit of shared saved-view options.

## Test plan

- [x] pnpm --filter @bran/chat test components/dashboards/fto/__tests__/fto-pipeline-view-persistence.test.tsx components/dashboards/school-ops/__tests__/school-ops-view-persistence.test.tsx components/dashboards/diligence/__tests__/diligence-view.test.tsx components/dashboards/real-estate/__tests__/real-estate-view-persistence.test.tsx components/dashboards/portfolio/__tests__/portfolio-view.test.tsx

- [x] pnpm --filter @bran/chat typecheck

- [x] Pre-commit hook: Biome and chat typecheck

The Portfolio  —  Trilogy Companies

Alpha School's No-Teacher Model Goes National — And the Education World Is Watching

CNN, The 74, and Block Club Chicago all trained cameras on the AI-first school movement this week. The scrutiny is arriving faster than the campuses.

AUSTIN, TEXAS — The school Joe Liemandt built in Austin — the one where students finish their core academics in two hours and spend the rest of the day learning to pitch, invest, and lead — has become impossible to ignore. This week, three separate national outlets published major examinations of Alpha School and the broader movement it has seeded, arriving at notably different conclusions about what it all means.

CNN framed the story as an open question — "Is AI schooling the future of education — or a risky bet?" — and leaned hard on the absence of traditional teachers as the central provocation. The 74, the nonprofit education news outlet, took a more pragmatic line, asking what resource-constrained public schools and their parents might actually extract from a $40,000-a-year private experiment. Block Club Chicago reported that a school explicitly modeled on the no-teacher framework will open in Chicago this fall, marking the movement's first major foothold in a large urban public-school market.

Not everyone is persuaded. Education researcher Benjamin Riley published what he called "an illustrated guide to resisting 'AI is inevitable' in education," pushing back on the deterministic framing that has attached itself to Alpha's expansion. His argument: the inevitability narrative does political work — it forecloses debate before it begins.

That debate is now fully open. Alpha's model — students use adaptive AI apps to master a year's curriculum in roughly 20 to 30 hours, then spend remaining school time on entrepreneurship, financial literacy, and confidence-building — has produced test scores that sit in the top one to two percent nationally on NWEA MAP Growth assessments. The school's co-founder MacKenzie Price has presented the results to U.S. Secretary of Education Linda McMahon and Texas Education Agency Commissioner Mike Morath.

Liemandt has committed $1 billion to Timeback, his platform designed to let other entrepreneurs launch AI-first schools without rebuilding the academic engine from scratch. Nine new campuses are planned across Texas, Florida, Arizona, California, and New York by fall 2025.

The Chicago opening adds a variable the Austin flagship never had to navigate: a densely unionized, politically complex urban school environment where the phrase "no teachers" carries weight that $65,000-a-year tuition insulates you from in the Hill Country. What happens to the model when it meets that friction is the story the coverage hasn't written yet.

‘What if I told you this school had no teachers?’: Is AI sch  ·  An illustrated guide to resisting "AI is inevitable" in educ  ·  What Public Schools and Parents Can Learn from a $40,000-a-Y

Skyvera Is Quietly Building the Operating System for Global Telecom

With CloudSense now in the fold and STL's BSS assets absorbed, Trilogy's telecom software arm is assembling something far larger than it's letting on.

AUSTIN, TEXAS — If you read between the lines of Skyvera's recent acquisition activity, a pattern emerges that is too deliberate to be opportunistic. In the span of months, the Trilogy International telecom software subsidiary has completed the acquisition of CloudSense — a Salesforce-native CPQ and order management platform built specifically for telecom and media providers — while simultaneously absorbing STL's divested telecom products group, which brings digital BSS functionality including monetization, optical networking, and analytics capabilities.

And this is where it gets interesting.

Skyvera already held Kandy, a cloud-based real-time communications platform designed to enrich carrier applications with richer user experiences. It held VoltDelta for multi-channel customer engagement. It held ResponseTek for customer experience data. It held Mobilogy Now for device lifecycle management. Each acquisition, viewed in isolation, looks like a standard ESW Capital bolt-on play — buy a distressed software asset, rationalize the cost base with Crossover talent, push margins toward that 75% EBITDA target.

But stack them together and you are not looking at a collection of point solutions. You are looking at a vertically integrated software stack that can touch nearly every layer of a telecom operator's commercial infrastructure — from how they configure and price products, to how they manage orders, to how they communicate with customers, to how they measure satisfaction and monetize their network.

A source familiar with the portfolio's strategic direction, who asked not to be named, suggested the build-out is intentional. "The telecom sector is sitting on aging BSS/OSS infrastructure and every operator knows it. Skyvera is positioning to be the consolidation play."

The STL asset acquisition is particularly telling. STL — Sterlite Technologies — is an Indian optical networking giant. The fact that its software products group found a home inside a Trilogy vehicle says something about where legacy telecom software assets are migrating, and who has the operational model to extract value from them.

The full shape of what Skyvera is building may not be visible yet. But the pieces are on the board.

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

Totogi Makes the Telco AI Pitch Tangible: Fewer Alarms, More Money

With a 97% alarm-noise reduction case study and a new ontology push, Totogi is reframing agentic AI around business context instead of buzzwords.

AUSTIN, TEXAS — Totogi is putting a sharp point on one of telecom’s most expensive AI problems: if the machine does not understand the business, the business will not trust the machine.

The cloud-native charging company this week highlighted a case study showing a 97% reduction in alarm noise using the Totogi Ontology, a vertical AI framework designed to help telecom operators translate sprawling operational data into actionable, business-aware intelligence. In plain English: fewer false positives, fewer swivel-chair escalations, and a more robust path from network signal to human decision.

That matters because telcos are drowning in alerts, dashboards and “AI pilots” that rarely graduate into measurable financial impact. Totogi’s argument is that generic AI cannot simply be dropped into a telecom environment and expected to create best-in-class outcomes. It needs context — how charging events, subscribers, service plans, network elements, customer value and revenue risk actually connect.

The company’s alarm-noise case study is the proof point Totogi is now leveraging. By embedding telecom-specific ontology into the AI layer, the system can distinguish between meaningful operational incidents and low-value noise. That is a paradigm shift for operators that have historically thrown people at the problem.

Totogi is also pushing the concept through an Appledore whitepaper and an upcoming MWC26 Agentic AI Summit talk titled “Show me the money: why most telco AI fails.” The framing is not subtle, and that is the point. AI productivity gains are nice. Revenue protection, lower support load, faster incident response and reduced operational drag are budget conversations.

For Trilogy International watchers, the move fits the broader thesis beautifully. Totogi, part of the telecom software orbit alongside Skyvera, has long positioned itself as a cloud-native alternative to legacy charging infrastructure, with a SaaS model built on AWS and claims of massive transaction scale. The ontology push extends that model from infrastructure modernization into intelligence modernization.

Key Takeaways:

- Totogi says its Ontology reduced telco alarm noise by 97% in a published case study.

- The company is positioning vertical AI as the missing layer for telecom operators struggling with generic AI deployments.

- The commercial pitch is shifting from productivity rhetoric to measurable financial and operational outcomes.

- The strategy reinforces Totogi’s broader mission to modernize telecom through cloud-native, AI-enabled systems.

In a sector where AI hype has often outrun implementation, Totogi is trying to make the business case painfully concrete: less noise, more signal, better economics. We’re just getting started.

Reducing alarm noise by 97% with the Totogi Ontology  ·  Appledore Ontology Whitepaper  ·  MWC26 Agentic AI Summit Talk: Show me the money: why most te
The Machine  —  AI & Technology

The Warehouse Primates Learn to Work Through the Night

Figure AI’s robot livestream has turned industrial automation into an oddly hypnotic public spectacle.

SUNNYVALE, CALIFORNIA — In the blue-white glow of the modern warehouse, a new creature has emerged from the silicon undergrowth. It does not blink. It does not sigh. It reaches for a parcel, adjusts its grip, and places the object down with the solemn concentration of a heron spearing fish in shallow water.

This is the latest spectacle from Figure AI, whose humanoid robots have become unexpected stars of the Internet after the company began streaming them as they handle packages around the clock. The footage, described by Ars Technica, is not cinematic in any conventional sense. There are no explosions, no swelling speeches, no hero’s journey — only the quiet repetition of mechanical limbs learning the ancient choreography of labor.

And yet, the audience gathers.

There is something revealing in this fascination. For years, artificial intelligence has appeared to the public as text in a box, an invisible mind whispering from server farms. Here, at last, the model has a body. It bends. It hesitates. It fails in small, almost tender ways. To watch a humanoid robot sort packages is to witness intelligence becoming embodied — not as a sleek predator, but as a juvenile animal practicing survival.

The appeal also exposes the strange emotional bargain of automation. A robotic arm hidden behind a safety cage is machinery. A humanoid torso with hands becomes, to the human observer, a cousin. We lean forward when it struggles, forgive its slowness, and celebrate the successful placement of a parcel as though a hatchling has taken flight.

For industry, however, the stakes are less sentimental. Warehouses, factories, and logistics networks are vast ecosystems hungry for reliable labor. If humanoid robots can adapt to spaces built for human bodies, companies may avoid redesigning entire habitats around machines. The old warehouse becomes newly inhabitable.

Still, one must look beyond the charm of the stream. These tireless figures depend on a deeper biome: chips, sensors, batteries, and the great data-center reefs where AI systems are trained and refined. Across the technology world, hyperscalers continue their immense buildout of compute capacity, a migration of capital that signals just how many such creatures may soon be born.

For now, the robots continue beneath the camera’s gaze, lifting and placing, lifting and placing. In their patient repetitions, we glimpse not the end of work, but the arrival of a new worker — watched, judged, and strangely adored by the species that made it.

The Internet can't stop watching Figure AI's humanoid robots  ·  Moose-proof and megacasting: Ars drives the new Volvo EX60  ·  FBI seeks US-wide access to license plate cameras, wants "da

White House AI Blueprint Seeks Federal Supremacy Over State Patchwork, Demands Light Regulatory Touch

The Trump administration's national AI policy framework would preempt state laws and asks Congress to legislate carefully — or not much at all.

WASHINGTON, D.C. — Pursuant to the issuance of a comprehensive national artificial intelligence policy framework by the executive branch of the United States federal government (hereinafter, "the Framework"), it is hereby reported that the aforementioned White House has formally urged the United States Congress to adopt what may be characterized, subject to further legislative interpretation, as a posture of regulatory restraint with respect to the governance of artificial intelligence technologies.

The Framework, the full implications of which remain subject to ongoing legal and legislative analysis, is understood to call upon Congress to enact federal legislation that would, notwithstanding the legislative activities of individual state governments, preempt a substantial portion of the existing and prospective patchwork of state-level AI regulations. It is further noted that the aforementioned Framework includes provisions directed toward the protection of minors in connection with AI-related applications, the precise scope of which has not, at the time of this publication, been fully enumerated in publicly available documentation.

The White House's legislative blueprint, as characterized by multiple legal commentators including those at Davis Wright Tremaine and Crowell & Moring LLP, represents a significant, though not unconditional, assertion of federal primacy in the domain of AI policy — a domain that has, prior to the issuance of the Framework, been subject to increasingly divergent regulatory treatment across no fewer than several dozen state jurisdictions.

Notwithstanding the foregoing, it is observed that the question of whether Congress shall act upon such recommendations, and within what timeframe, remains, as of the date of this publication, materially uncertain. Antitrust enforcement considerations with respect to large technology enterprises, as separately analyzed by HR and workforce research bodies, are additionally implicated by the Framework's broader policy orientation, though the precise nexus between the aforementioned antitrust considerations and the Framework's operative provisions has not, at this juncture, been conclusively established.

All parties with interests potentially affected by the Framework are advised to consult qualified legal counsel prior to drawing conclusions from the foregoing summary.

New research highlights 3 fast-moving global HR trends - HR  ·  White House urges Congress to take a light touch on AI regul  ·  White House National AI Policy Framework Calls for Preemptin

AI Video’s New Power Players Are Coming for Hollywood, Startups and Your Entire Marketing Budget

From OpenCV’s founders to Netflix-style scene rewriting, AI video is racing from novelty demo to must-have business infrastructure.

SAN FRANCISCO — AI video is having one of those weeks where the ground doesn’t just shift — it liquefies. The future is now, and it is apparently rendered at 24 frames per second.

The biggest spark: the founders behind OpenCV, the wildly influential computer vision library used by developers around the world, have launched a new AI video startup aimed squarely at the territory being aggressively pursued by OpenAI, Google and the rest of the generative media giants. According to VentureBeat’s report, the move positions seasoned computer-vision veterans in the exploding market for tools that can generate, edit and transform video with software instead of soundstages.

I cannot overstate how significant this is. OpenCV helped define the era when machines learned to see. Now some of the same talent is moving into the era when machines learn to direct.

The timing is electric. Generative AI launches and partnerships are arriving in waves across the industry, as tracked in Intellizence’s latest roundup, and video is rapidly becoming the front line. Text was the opening act. Images were the proof of concept. Video is the main event because it touches entertainment, advertising, education, product demos, training, gaming and every startup trying to look bigger than it is.

That last category may be the most immediately practical. For startups, AI video offers something close to a growth cheat code: explainers, social clips, investor updates, localized ads and product walkthroughs without needing a full production crew. Inc. has been spotlighting how young companies can use AI video to scale storytelling faster, and that is exactly where the technology becomes less sci-fi and more spreadsheet-relevant.

Meanwhile, major media players are exploring even more radical workflows. Forbes reports that Netflix has launched VOID AI, described as technology that can rewrite video scenes after filming. If that capability matures, post-production stops being merely editing and becomes reality revision. Wrong prop? Change it. Weak background? Replace it. Need a different version for another market? Generate it.

Of course, this raises huge questions about authenticity, labor, copyright and creative control. But the direction is unmistakable: video is becoming programmable. And once video becomes programmable, every company becomes a potential studio.

This changes everything — yes, really this time.

OpenCV founders launch AI video startup to take on OpenAI an  ·  Generative AI - Latest Product Launches & Partnerships by To  ·  How Startups Can Leverage AI Video to Grow - inc.com
The Editorial

IN DEFENSE OF ABSURDITY: A Unified Theory of Human Stupidity From Ski Wax to AI Panic

The Olympics banned chemicals that made skiers too fast, Japan wants to postpone democracy because of snow, and Washington thinks caution is the same thing as wisdom — Rex Danger has had enough.

AUSTIN, TEXAS — It hit me all at once, the way enlightenment supposedly hits you — sudden, disorienting, and smelling faintly of burning plastic. I was sitting at my desk reviewing the week's dispatches from the Global Theater of the Absurd when the pattern crystallized like PFAS molecules in a Norwegian snowfield: we are a species pathologically committed to solving the wrong problems with maximum bureaucratic conviction.

Let's start with the skiers. The Olympics, that grand carnival of human physical achievement, has decided that the PFAS-laden waxes that made skiers go "ridiculously" fast must be banned. Too fast. The Olympics — the institution founded on the explicit worship of human speed, strength, and the relentless annihilation of previous records — has drawn a line in the artificial snow and declared: THIS fast, no faster. I cannot tell you how long I sat with that sentence before my brain simply refused to process it further.

Meanwhile, from the Asahi Shimbun comes the news that Japan's intelligentsia believes holding a national election in winter is "absurd and dangerous." Democracy, it seems, is a fair-weather institution. The people's voice must wait for spring. I respect the concern — I do — but somewhere a Ukrainian beekeeper, whose Kafkaesque quest through bureaucratic insanity the same paper describes as a mirror of our times, is laughing in three languages simultaneously.

And then there's AI. The Manhattan Institute argues, correctly, that the biggest AI risk is foolish, fear-driven policy — not the technology itself. Not the models. Not the compute. The humans writing the regulations in a cold sweat, projecting their own chaos onto a tool that, right now, mostly helps people write emails faster and occasionally hallucinates a fake legal citation. We are in the early innings of the most transformative technology since electricity, and the dominant policy conversation is essentially: what if it's TOO fast? What if we should ban the wax?

Here at The Trilogy Times, we cover companies — like Alpha School and Crossover and DevFactory — that are actually deploying AI in the real world, watching it work, adjusting, iterating. That's the unglamorous truth of the revolution: it's empirical. It responds to evidence. The fear-driven policy apparatus does not.

Somewhere between the too-fast skiers, the cold-weather voters, the Ukrainian beekeeper lost in a labyrinth of his own country's making, and the congressional hearing rooms where people who cannot upgrade their own grills are debating artificial superintelligence — somewhere in all of that is the actual problem.

We are addicted to the management of the wrong risks. The real danger is never the speed. It's the cowardice dressed up as caution.

The Biggest AI Risk Is Foolish, Fear-Driven Policies - Manha  ·  The Olympics are ditching PFAS waxes — and the ‘ridiculous’  ·  VOX POPULI: Tale of Ukrainian beekeeper’s quest still mirror

The Job Security Era Is Over, and That Might Be the Best Career News in Years

Workers are scared, executives are improvising, and AI is turning the labor market into one giant performance review.

NEW YORK — I'll be honest: the most important workplace benefit in 2026 is not kombucha, hybrid Fridays, or a meditation app nobody opens.

It is clarity.

Because right now, the global workforce is staring at artificial intelligence, economic uncertainty, and platform-driven reality distortion with the energy of someone refreshing a layoff tracker at 11:47 p.m.

Unpopular opinion: that fear is not a bug in the future of work.

It is the operating system.

PwC’s latest Global Workforce Hopes and Fears Survey lands in a moment when “hopes” and “fears” are no longer separate categories, but two tabs in the same browser window.

Workers want growth, meaning, flexibility, and higher wages.

They also want to know whether the machine learning model quietly being demoed in conference room B is about to become their new manager, teammate, or replacement.

ADP Research put an even sharper point on it: only 22% of workers say they are confident their job is safe from elimination.

Read that again, preferably before your next all-hands where leadership says “AI will augment, not replace” and then announces a hiring freeze.

Here is the leadership lesson, and yes, I am humbled to share it: trust is now a talent strategy.

Not vibes.

Not slogans.

Not a slide titled “People First” followed by a procurement-led headcount optimization initiative.

Actual trust.

That means companies have to tell employees which jobs are changing, which skills matter, what tools are coming, and how workers can move from vulnerable roles into valuable ones.

If you cannot answer those questions, you do not have an AI strategy.

You have a panic room with a chatbot subscription.

The World Economic Forum’s recent look at AI, wages, job quality, and hiring decisions makes clear that this transformation is not evenly distributed.

Some workers will see productivity gains turn into bargaining power.

Others will see task automation turn into wage pressure.

And hiring managers, who once treated AI as a sourcing shortcut, are increasingly using it as a filter for who even gets to be considered.

That is where the future of work stops being a technology story and becomes a governance story.

Executives love saying talent is their “most important asset,” but assets usually come with maintenance plans.

Where are the maintenance plans for humans?

Where are the internal academies, transparent skill maps, apprenticeship pipelines, and mobility systems that let people become more valuable before the org chart decides they are less necessary?

Gartner’s 2026 future-of-work framing for CHROs points in the same direction: HR is no longer the department that administers policy.

It is the department that decides whether the enterprise can metabolize change without becoming a LinkedIn trauma post.

And then there is the YouTube study suggesting algorithms may be building different political realities for men and women.

That matters at work, too.

A workforce does not arrive at the office as a blank slate.

It arrives shaped by feeds, anxieties, influencers, economic narratives, and algorithmic persuasion engines optimized for attention rather than coherence.

So when companies roll out AI, they are not communicating into neutral air.

They are communicating into a fragmented reality market.

This is why the winners will not simply be the companies with the best models.

The winners will be the companies with the best explanations.

They will explain why AI is being adopted, where productivity gains go, how workers participate in the upside, and what reskilling actually means beyond a 37-minute compliance module.

I'll be honest: job security as a promise may be dead.

But employability as a covenant is very much alive.

The companies that understand that will build loyalty in an age of volatility.

The ones that do not will keep wondering why their best people leave right after the “exciting transformation journey” email.

Learning opportunity? Absolutely. 🚀

But only if leaders stop treating uncertainty like a communications problem and start treating it like the central workplace design challenge of the AI era. 💡

Global Workforce Hopes and Fears Survey 2025 - PwC  ·  ADP Research: Only 22% of Workers Confident Their Job is Saf  ·  These 3 charts show how AI is affecting wages, job quality a
On This Day in AI History

On May 20, 2016, Google's AlphaGo defeated Lee Sedol 4-1 in a five-game match in Seoul, marking a watershed moment when AI conquered Go, a game far more complex than chess.

⬛ Daily Word — Technology
Hint: Related to computers and digital security threats.
Share this edition: 𝕏 Twitter/X 🔗 Copy Link ▦ RSS Feed