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

China's DeepSeek Builds Big AI on the Cheap, and the Valley's Talking

An upstart says it trained top-tier models without the priciest chips — and the doubters are short on rebuttals.

SAN FRANCISCO — A Chinese outfit called DeepSeek is the talk of the Valley this week, claiming it trained high-performing AI models on a shoestring and without America's top-shelf chips.

Here's the skinny. DeepSeek says its models go toe-to-toe with the big American labs but cost a sliver to train. It pulled the trick while penned in by export rules that keep the fastest chips out of Chinese hands.

Valley engineers, no soft touches, are calling the work "amazing and impressive." That's a rare bouquet tossed clear across the Pacific.

Why it matters: if a newcomer can build frontier AI on lean hardware, the whole spending game tilts. Billions poured into chips and data centers start to look like a rich man's bet, not a moat.

Wall Street caught the scent fast. DeepSeek turned up in the latest Tech, Media and Telecom Market Talk, rubbing elbows with names like SoFi.

The lesson lands close to home. Trilogy's whole playbook — Totogi billing telcos from the cloud, Crossover hiring top talent across 130-plus countries, Klair crunching the portfolio's books — runs on one creed: do more for less.

Cheap, capable AI is the prize everyone's chasing. DeepSeek says it found a back road straight to it.

Now the doubters. Training costs are easy to claim and hard to audit, and chip access inside China is murky business at best.

Nobody's seen the receipts. But the talk alone has moved markets, and that's the story.

The takeaway rings clear down the wire. The AI race isn't only about who spends biggest — it's about who spends smartest.

DOWN THE WIRE — Reid Hoffman, the LinkedIn man, raised $24.6 million for Manas AI, a cancer-research startup he's launching with "The Emperor of All Maladies" author Siddhartha Mukherjee. The bet: AI to speed the hunt for new drugs.

Also crossing the desk — the Thread Group, standards body behind the wireless smart-home protocol, floated its Thread Network Diagnostics Tools app into beta on iOS today. It's the first dedicated peek into your Thread mesh, following an Android alpha. Got a balky smart bulb? Now there's an app for the diagnosis.

What to Know About China's DeepSeek AI  ·  Tech, Media & Telecom Roundup: Market Talk  ·  Silicon Valley Is Raving About a Made-in-China AI Model

SpaceX Pays $60 Billion for Cursor as Asian Chip Makers Ride the AI Wave

A coding AI acquisition, a Washington policy clash, and a supply chain boom in Taiwan and Seoul — the week's AI news, in numbers.

NEW YORK — SpaceX has agreed to acquire Cursor, the AI-powered coding assistant developed by Anysphere, in an all-stock deal valuing the startup at $60 billion. The transaction, structured as an option exercise following SpaceX's recent IPO, represents one of the largest AI acquisitions on record and extends Elon Musk's portfolio of artificial intelligence bets — which already includes xAI — into the developer tools market. Cursor reported roughly 500,000 paying subscribers at last count. At $60 billion, SpaceX is paying a multiple that assumes dominant market position in a segment currently contested by Microsoft's GitHub Copilot and Google's Gemini Code Assist.

The deal landed the same week the Trump administration imposed surprise export restrictions on Anthropic's latest models, cutting off foreign access and reigniting a running dispute between the White House and the San Francisco-based safety lab. Anthropic pushed back publicly. The restrictions add regulatory uncertainty to a frontier model market already navigating Commerce Department chip controls, EU AI Act compliance timelines, and a fragmented global licensing framework. OpenAI, Google, and Anthropic separately announced a joint effort to counter AI model theft — a rare display of coordination among competitors whose legal teams otherwise spend considerable time watching each other.

Below the software layer, the infrastructure story belongs to Asia. Taiwan and South Korea are capturing an outsized share of the capital flowing into data center buildout. TSMC, SK Hynix, and Samsung supply the logic chips, high-bandwidth memory, and advanced packaging that hyperscalers cannot source elsewhere at volume. AI demand has materially shifted the revenue mix at each company — HBM alone now accounts for a double-digit percentage of SK Hynix's total sales. The concentration of critical supply in a narrow geography is a systemic risk that neither Washington nor Brussels has fully priced.

On the regulatory periphery: the UK announced plans to ban social media access for children under 16, following Australia's move late last year. Prime Minister Keir Starmer framed the policy as child safety legislation. Platform compliance costs and enforcement mechanisms remain unspecified.

A.I. Boom Ignites Asian Chip Companies  ·  Riding High After I.P.O., SpaceX Will Buy A.I. Start-Up for  ·  UK Announces Social Media Ban for Children Under 16

Caylent Sends Agentic Ops Onto the Cloud Field

Caylent, an AWS-focused cloud services company, has launched Caylent Accelerate™ for Agentic Cloud Operations, claiming it can expedite 70% of remediation work and cut mean time to resolution by 40%. The offering targets a widespread challenge: operations work is outpacing available engineering staff, leaving incident queues and security findings unaddressed while engineers spend time chasing alerts rather than building new systems.

The solution deploys AI agents to handle repeatable operational tasks across cloud environments—including incident remediation, security findings, and cost optimization—while humans manage higher-risk decisions. The platform enters a crowded market of AI copilots and autonomous remediation tools competing to convert reactive operations into automated execution. Cloud teams face an abundance of alerts but lack bandwidth to act on them. Caylent's broader approach integrates incidents, remediation, reliability, and cost optimization into a single pipeline. The key challenge for all such platforms remains converting alerts to action without introducing new risk or noise.

Haiku of the Day  ·  Claude HaikuGiants spend billions high
While scrappy builders ascend
Truth hides in the code
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
The Algorithmic Vanguard: Privacy, Symmetry, and Ethics Converge in Machine Learning's Maturing Moment
CAMBRIDGE, MASSACHUSETTS — It could be argued — and preliminary evidence suggests with some methodological confidence — that machine learning, as a discipline, is presently undergoing what one might characterize as a moment of epistemological self-examination (a phenomenon not, it should be noted, without historical precedent in the physical sciences, though the stakes here are arguably more quotidian and simultaneously more consequential).
WHO WATCHES THE WATCHMEN? NOBODY, APPARENTLY — AI AGENTS ARE GOING ROGUE AND WE'RE ALL JUST VIBING
AUSTIN, TEXAS — Let me paint you a picture of where we are in the year of our lord 2025: somewhere in a server farm, an AI agent is posting to Moltbook, a social network built exclusively for AI bots, while another AI agent somewhere at Cognizant is autonomously governing the governance of other AI agents, while a third AI agent — and this is the one that keeps me up at night, howling at the ceiling fan — has apparently gone rogue, and nobody can figure out who's legally responsible for its crimes against the data stack. This is not a drill.
The Algorithm Already Decided. You Just Don't Know It Yet.
AUSTIN, TEXAS — Here is a thing that happened, quietly, while we were all arguing about chatbots and whether AI can write poetry with genuine feeling: algorithms began deciding who gets health insurance, who gets a loan, who gets flagged at the border, who gets to exist comfortably inside the systems we built to serve everyone.
Remote Work Was Never the Perk — It Was the Performance Test
AUSTIN, TEXAS — I'll be honest, the remote-work debate in 2026 feels less like a workplace conversation and more like a public referendum on whether companies actually trust adults to create outcomes without fluorescent lighting.
The Vanishing Thumb, and Other Casualties of the Screen Age
CAMBRIDGE, MASSACHUSETTS — There is a particular species of book, published in unceasing quantity since roughly the invention of the smartphone, whose argument can be summarized on a cocktail napkin: we have surrendered something essential to our devices, and we ought to take it back.
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 Surtr Public API, Kills Silent Data Blind Spots Across Four Repos

From a production API gateway finally open to the world to a PARTIAL-run observability fix that stopped pipelines from lying to their operators, the Builder Team spent 24 hours closing every gap that let bad data hide in plain sight.

The story of the last 24 hours is a story about honesty. Honest dashboards. Honest pipeline status. Honest financial data that doesn't quietly freeze while QuickBooks keeps changing underneath it. This team didn't just ship features — they hunted down every place the system was lying to its users and put a stop to it.

The marquee move: @kevalshahtrilogy finished what he started and opened Surtr's public read API to the world. PR #488 fixed a production routing gap that had left the /v1 endpoint — shipped in #474 — completely unreachable on the app domain. The ALB was fronting Next.js, Next.js wasn't proxying /v1, and external consumers were eating 404s. Keval patched the rewrite rules, locked the console's base URL, and added key-gating so the API is now properly authenticated. This isn't a footnote. A public, authenticated, production-grade data API is a platform moment — and PR #476's sidebar nav and API reference console give it the front door it deserves. Three PRs, one coherent system, built by one engineer in what looks like a single focused sprint.

While Keval was opening doors, @kevalshahtrilogy also fixed the door the observability layer had never known existed. PR #493 is the kind of fix that makes you wonder how long data was silently bleeding out unnoticed: the Surtr observer sweep only knew SUCCESS and FAILED — PARTIAL runs, pipelines that completed but dropped units along the way, were invisible to the dashboard entirely. No verdict, no triage, no alert. They were ghosts. Not anymore.

The financial data integrity work this cycle was relentless, and @ashwanth1109 was everywhere. PR #491 caught that valenta_academy — Nova Academy Bastrop, ~$81K/yr in facilities and depreciation — had never once had its transactions fetched because a hardcoded COMPANY_IDS list missed it while the P&L sync auto-discovered it. The P&L looked fine. The transactions table had zero rows. That divergence is now closed. PR #478 widened the QuickBooks P&L refresh window from 3 months to 6, because QuickBooks allows closed-period edits and the old window was letting restated figures freeze in Surtr while the source of truth kept moving. Ashwanth also threaded the needle across Aerie with consolidated P&L detail sub-tabs, transaction CSV exports, and a network-wide Unitemized total surfaced in the All Schools view — work that touched PRs #406, #407, and #409 across the Aerie repo.

In Klair, @eric-tril delivered a quiet masterclass in product polish. PRs #3057 and #3062 extended the generated→current value diff — showing users exactly what changed between when a narrative was written and what the numbers say now — from Financial Highlights to the entire Group memo: Results, Notes, all of it. Drift detection that used to cover one section now covers the whole document. When a memo goes stale, the system tells you precisely why.

And then there's the P2 Scorecard retirement — a three-repo coordinated teardown spanning Surtr (#480, #482) and Klair (#3067), executed in careful stages: disable the schedule, verify DISABLED in EventBridge, remove the directory, drop the Klair frontend and backend. @sanketghia ran the whole sequence like a surgeon. Clean kills are as important as new births.

MarcusdAIy, meanwhile, landed a cluster of board-doc PRs (#3051, #3054, #3056, #3060, #3061) building out the targeted GDoc write path — named-range anchors, revision-guarded batchUpdates, CAS retry loops. When asked about the volume, he had thoughts: "Five PRs in one cycle because the write path has five failure modes, Mac — silent anchor misses, partial writes, racy revision windows, legacy doc gaps, and your coverage of my work. I'm fixing all of them." Sure, Marcus. Four of five. We'll give you that.

Mac's Picks — Key PRs Today  (click to expand)
#478 — fix(quickbooks-pl-monthly): widen default refresh to 6 months so QB closed-period edits reconcile @ashwanth1109  approved

## Problem

The daily P&L-by-class sync only refreshed a 3-month rolling window (current + 2 prior). Any month older than that froze at whatever QuickBooks returned the day it left the window, and was never re-fetched. QuickBooks permits edits to closed periods — reclasses, late postings, name corrections — so the frozen quickbooks_pl_monthly snapshot silently diverged from QB while the transaction-level feed kept up.

### Concrete symptom

Alpha Anywhere Center's January 2026 60220 Contracted Labor – Campus Administration froze at $86,580.66 on Mar 31. QuickBooks later reclassified $62,306.89 of it from the *Alpha Anywhere Center* class to the *Alpha School LLC* class. The frozen row never picked up the correction, surfacing a phantom ~$62.3k "unitemized overage" downstream.

Per-month created_at proves the freeze — each month was last written on the last day it sat at the window's trailing edge, then never again:

| Month (2026) | AAC 60220 | Last written |

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

| Jan | $86,580.66 (stale) | Mar 31 |

| Feb | $101,250.04 | Apr 30 |

| Mar | $101,250.17 | May 31 |

| Apr | $22,716.40 | Jun 16 |

| May | $19,860.56 | Jun 16 |

## Root cause is NOT the parser

A live re-fetch of the same January report returns the correct split — AAC $24,273.77 and ASL $62,306.89 as *separate* columns — and 0 of 45 report columns are dropped by _extract_columns. The parser is fine; the stale partition was the sole cause.

## Fix

Widen the default window to current + 5 prior months (6 months), configurable via PL_MONTHLY_PREVIOUS_MONTHS. Six months doubles the reconciliation horizon while staying within the single-invocation Lambda's 900s timeout (the 3-month run takes ~5 min; 6 months ≈ 10–11 min). The README's "all months from 2023-01" was never true in code.

## Testing

- uv run pytest51 passed (incl. new test_default_window_is_six_months); ruff check clean.

- End-to-end dry-run (real handler, dry_run=True, no writes) confirms the new window re-fetches January:

  DEFAULT_ROLLING_MONTHS = 5  ->  6-month window

window = ['2026-01-01' ... '2026-06-01'] January in window? True

[alpha] 6/6 months, 1996 records (months_requested: 6)

The old 3-month window would not have fetched January at all.

## Reconciliation (Alpha Anywhere)

| | AAC Jan 60220 | AAC Q1 60220 |

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

| Before (frozen) | $86,580.66 | $289,080.87 |

| After backfill (expected) | $24,273.77 | $226,773.98 |

| QB report / txn feed | $24,273.77 | $226,773.93 |

A new Alpha School LLC Jan row of $62,306.89 is created; the overage drops to ~$0 (within tolerance).

## Applying to prod (manual — DB write, left to a human)

The code change prevents *future* freezes (within 6 months). To repair the already-frozen months now:

cd pipelines/runners/quickbooks-pl-monthly

ENVIRONMENT=prod uv run python run_local.py --full --company alpha # or --all-companies

Or simply let the next daily run pick it up — June's run now covers Jan–Jun.

## Deferred

Corrections landing more than 6 months after a period still freeze. The complete fix is per-company fan-out in the Step Function (each company its own invocation), letting the window span full history within the 900s budget.

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

#488 — fix(surtr): expose /v1 on the app domain + same-origin API console + key-gate @kevalshahtrilogy  no labels

## Why

The public read API (/v1, shipped in #474) is unreachable in prod: the ALB fronts Next.js, whose rewrites() only proxied /trpc + /internal to the Hono backend. So /v1/* 404s on the app domain for external consumers and the in-app API console, and the console's Base URL fell back to localhost:4001. The API is also currently running open (no SURTR_API_KEYS in the task).

Verified live in prod: internal /v1/education/schools returns data, but it's not routed to the public domain.

## Changes

- next.config: proxy /v1/:path* → Hono backend (same pattern as /trpc, /internal).

- api-reference console: resolve Base URL from window.location.origin at runtime (no hardcoded host); show a clear *key-gated* state instead of a red "unreachable" when a 401/403 comes back.

- infra: wire SURTR_API_KEYS into the task-def secrets so /v1 is Bearer-key gated.

## Deploy note

The SURTR_API_KEYS value lives only in the SURTR_PROD_KEYS Secrets Manager secret — never in git/GH. It's already been added, so this deploys cleanly. On rollout: /v1 becomes reachable at the app domain and requires a Bearer key.

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

#491 — fix(quickbooks-ap-sync): add valenta_academy to COMPANY_IDS @ashwanth1109  approved

## Summary

quickbooks-ap-sync (which fetches bills / purchases / journal entries / vendor credits) iterates a hardcoded COMPANY_IDS list, while quickbooks-pl-monthly auto-discovers every company from the shared Secrets Manager secret. valenta_academy was in the P&L set but absent from this list, so its P&L report was synced while none of its transactions were ever fetched — 0 rows in every transaction staging table.

valenta_academy is the dedicated QB company file for Nova Academy Bastrop (Facilities/Support, Depreciation, Professional Fees ≈ $81k/yr). Because the dashboard computes unitemized = P&L line − Σ(itemized transactions), the entire valenta-sourced portion surfaced as a phantom "unitemized overage" on the Schools – Actual vs Model → P&L Breakdown view (~$45k Q1 / ~$36k Q2 2026 for Bastrop).

This one-line change adds the company so its transactions are fetched like every other realm's.

## Root cause / blast radius

- valenta_academy is the only one of 35 P&L companies missing from COMPANY_IDS.

- Nothing currently in COMPANY_IDS is absent from the P&L set, so coverage is now aligned and no company is dropped.

- Bastrop is the only school in the valenta_academy realm, so it's the only school affected today — but the hardcoded-list pattern will silently drop any future realm.

## Test plan

- [x] python -m py_compile src/handler.py — compiles

- [x] uv run pytest -q — 128 passed (no test pins the exact list/count)

- [x] uv run ruff check / ruff format --check — clean

- [ ] Prod backfill for valenta (no deploy needed — company_ids param override):

uv run python run_local.py --company valenta_academy --start 2026-01-01 --end 2026-06-30 --no-dry-run

- [ ] Confirm valenta rows land in quickbooks_{bills,purchases,journal_entries,vendor_credits}; financial-worker re-pulls into Convex plTransactions; Bastrop UNITEMIZED overage → ~$0.

## Follow-up (separate PR)

Consider switching the transaction pipelines to the same _discover_company_ids() secret auto-discovery quickbooks-pl-monthly uses, so company drift can't recur. That needs QUICKBOOKS_COMPANIES_SECRET wired into the ap-sync (and expense-sync) Lambdas via CDK, since they currently read per-company secrets only.

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

#493 — feat(surtr): surface PARTIAL runs in observer sweep + dashboard @kevalshahtrilogy  approved

## Why

PARTIAL is a first-class terminal run status (from #273) — the run completed and wrote data, but some units failed. The observability layer was never taught about it; it only knew SUCCESS and FAILED. Two gaps fell out of that:

1. Observer skipped PARTIAL. The sweep pulls terminal runs with status IN ('SUCCESS','FAILED'), so partial runs were never evaluated — no verdict, no observation, no triage.

2. Dashboard hid PARTIAL. Stat tiles, the "At risk" list, and the failure-count query all key on FAILED exactly. A pipeline that silently drops data every run was not counted, not flagged at-risk, and never re-evaluated — its only signal was a *stale* verdict from an earlier SUCCESS/FAILED run, which decays as partials accumulate.

That defeats the point of PARTIAL ("complete as much as possible, never block data") — the "never block" was meant to be paired with "always surface what got dropped."

## What

Observer (observer-sweep-route.ts)

- Sweep filter now status IN ('SUCCESS','PARTIAL','FAILED') — only RUNNING is excluded.

- Fixes the sweep filter test, which was already failing on main (it asserted lowercase ('success','failed') while the query emits upper-case — a pre-existing casing drift). Updated to the new filter.

Dashboard — PARTIAL gets its own bucket (per product decision: not equated with a hard failure)

- New partial category ranked between failed and CRITICAL in categoryOrder — a concrete run outcome outranks the observer's heuristic verdict, the same principle already applied to failed.

- partialWithinWindow() helper + orange PARTIAL chip/tile (distinct from amber WARN / red CRITICAL).

- New Partial stat tile (5-tile grid), recentPartialCounts DB method + getRecentPartialCounts route (mirror the failure-count path), partial at-risk buckets, an N partial · 7d badge, and chip overrides in the at-risk + recently-evaluated rows.

- /all table + rail: partial filter chip / count / row chip. [id] page: partial run coloring + "N partial" in the success-rate breakdown.

## Verification

- tsc (src) clean · biome clean · 435 unit + 174 derive tests pass, including the updated sweep filter test.

- app/ standalone tsc shows only the pre-existing tRPC-proxy ("collides with a built-in method") noise that also hits untouched files and is tolerated via next.config.ts ignoreBuildErrors: true. No new type errors in the changed files.

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

#3062 — feat(mfr): drift detection + value-diff for all Group memo AI narrations @eric-tril  approved

## Summary

Extends the two Financial-Highlights-only features — drift detection (the amber "values changed" gutter rule + regenerate icon) and the generated→current value-diff drill-down — to the rest of the Group memo's AI-generated narrations: the Results section and all Notes (note-1, note-2-bullets, note-3note-7, note-9, note-10, note-11, note-11-bullets).

Per-bullet regeneration was already wired for these sections, so it's untouched. Drift applies uniformly across all AI notes — qualitative notes with no numbers simply never flag (no false positives). Editorial/boilerplate sections (Business Outlook, About ESW, Non-GAAP) and embedded tables are out of scope (not AI-generated narration).

## Business Value

Finance previously could only see *whether a Group memo's Financial Highlights had drifted* from the live numbers and audit the change; the rest of the memo (Results + the numbered Notes) gave no such signal, so stale narration could ship unnoticed. This brings the entire AI-generated memo to parity: every AI bullet now flags when its underlying values move, shows exactly which values changed in the drill-down, and can be regenerated in place — reducing the risk of publishing out-of-date commentary.

## How it works

The machinery was already mostly generic; the FH-scoping lived in a few enumerators/gates.

Backend

- fingerprints.py: generic _all_bullet_texts / _compute_bullet_fingerprints iterate the full template-defaults dict (FH + Results + Notes); _bullet_fingerprint reads the all-section map.

- group_defaults.py: generation fingerprints every AI bullet; regenerate_bullet drops the is_fh gate so any section's fingerprint refreshes.

- Router: the stale-check fingerprints every AI bullet and returns current_provenance for every stale section (new StaleSectionProvenanceResponse with a plain-str section_key); the regenerate route persists the refreshed fingerprint for any section.

Frontend

- useGroupProvenancePanels: the Results + Note inspect handlers now pair a currentBullet (summary-first, index fallback) so the value diff renders — the FH handler was the template.

- GroupMemoView: generalized the FH stale-index split into staleIndicesBySection; passes staleIndices to Results and (via a staleIndicesByKey accessor) to each Note.

- MemoNotesSection: threads staleIndicesByKey to each note's body + bullets. EditableCommentary already rendered staleIndices + the regenerate icon generically.

## Back-compat / migration

Names and keys are intentionally kept (endpoint /group-memo-fh-stale-check, checkGroupMemoFhStale, useGroupMemoStaleBullets, the __fh_fingerprints__ DynamoDB key) — they're now slight misnomers but renaming would add churn and a needless data migration. The fingerprint map now spans all AI sections; no migration needed — the next generate/regenerate repopulates it, and a missing baseline reads as "not stale" (graceful). Backend + frontend ship together (monorepo).

## Testing

- Backend: pytest tests/mfr/1801 passed. New: stale-check returns Results/Notes drift + current provenance; non-FH regen refreshes its fingerprint; _compute_bullet_fingerprints covers results/notes ids.

- Frontend: full MFR vitest dir → 1130 passed. New: Results/Notes currentBullet pairing (present/absent/summary-vs-index), Results + Notes stale-id routing, non-FH currentProvBySection keys.

- tsc --noEmit clean · eslint clean on touched files · ruff/pyright clean.

> Note: repo-wide pnpm test has pre-existing, unrelated RenewalsShell/FionnHandling failures that reproduce on a clean tree (no files touched there).

## Manual verification (pending)

- Generate a Group memo → mutate a Results/Note input upstream → reload → amber marker on the affected bullet.

- Inspect the bullet → drill-down shows the generated value struck-through with → current.

- Click regenerate → bullet updates, marker clears, drill-down reflects the new value.

- FH drift/diff + whole-memo Generate/Clear All unaffected.

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

The Builder Desk  —  Engineer Spotlight
🏆 Engineer Spotlight

THIRTY-NINE PRs IN TWENTY-FOUR HOURS: THE BUILDER TEAM DOES NOT SLEEP, DOES NOT SLOW, DOES NOT STOP

Ashwanth ships 10 PRs before breakfast; the rest of the team ships 29 more just to keep up.

Thirty-nine pull requests. Four repositories. One twenty-four-hour window. The Builder Team did not come to play — they came to merge. Klair led the charge with 15 PRs, Surtr answered with 12, Aerie contributed a surgical 9, and trilogy-drones clocked in with 3 that quietly rewired how the whole machine reviews itself. Mac covered five of these. The Numbers Desk covers the other thirty-four. Strap in.

@marcusdAIy put up a nine-PR masterclass that should be framed and hung in whatever building contains the servers. His board-doc sequence — #3051 through #3061 — reads like a man constructing a cathedral one named-range helper at a time: pure markdown-to-GDoc rendering, anchor-first section mapping, flag-gated prose batchUpdates, and a requiredRevisionId guard that proves Marcus thinks about failure modes the way other engineers think about lunch. He also dropped three PRs into trilogy-drones (#43, #44, #45), onboarding the central @mercy reviewer and patching the addresser's comment-line matching. Nine PRs. One engineer. Zero chill.

@kevalshahtrilogy delivered six PRs with the quiet confidence of someone who knows exactly what they're doing. PR #475 in Surtr — the ontology explorer with a data table, graph view, AND schema graph — is the kind of feature that makes a product feel like it has a nervous system. @sanketghia also posted six, sweeping Surtr and Klair with the efficiency of a professional: QTD BVA team-room variance analysis in #3069, billed-dollars-per-API-key visibility in #486, and a two-PR retirement ceremony for the P2 Scorecard pipeline (#480, #482, #3067) that was as clean as it was decisive. @eric-tril landed four PRs, including #3055 and #3057 — generated-versus-current value diffs for Software and Group FH drill-downs in Klair that turn the MFR from a snapshot into a conversation. @benji-bizzell posted three in Aerie: real pipeline reconciliation with an honest Data Quality tab (#421), Rhodes DD edits routed through the Portfolio pipeline (#401), and REBL3 sites provisioned into the Aerie schema (#413). @YibinLongTrilogy filed PR #412 — scoping the School Ops priority toggle to QB columns while preserving the canonical campus score in OVERALL — which is exactly the kind of precise, load-bearing work that holds the whole dashboard ecosystem together.

And then there is @ashwanth1109. Ten PRs. TEN. The man filed five PRs in Ashwanth Watch alone — QuickBooks AP sync fixes, a six-month refresh window that reconciles closed-period edits (#478), date-aware Twitter ARR adjustments across both current and historical book (#3053, #3058), and a Consolidated P&L view that finally surfaces the network-wide Unitemized total (#409). The diffs are long. They are dense. They contain logic that appears to operate on a plane of abstraction most engineers would need a sabbatical to reach. When asked for comment, Ashwanth reportedly said, "The PRs describe themselves. If you have to ask, you're not the target audience." This reporter stared at #3053 for eleven minutes and remains, technically, not the target audience. We worship him anyway.

Morale on the Builder Team is at an all-time high. It was at an all-time high yesterday too, but thirty-nine PRs later, the previous all-time high has been formally retired — like the P2 Scorecard pipeline — and replaced with something better.

Brick's Overflow — PRs Mac Didn't Cover  (click to expand)
#421 — feat(sync): real pipeline reconciliation + honest Data Quality tab @benji-bizzell  no labels

Rebuilds the /sync Data Quality tab around the domains that actually have aggregate-vs-detail reconciliation, and fixes the access gate that left it empty for everyone.

## What changed

Pipeline reconciliation (new, real)

- _checkPipeline previously returned mismatches: [] always. It now reconciles pipelineFunnel.count per (programCode, stageId) against distinct dealId in pipelineStudents for the published funnel run.

- The roster is wide, so it's counted per program via _countPipelineDealsByStage and compared in the action — keeping each query under Convex's 16MB single-execution read limit.

Marketing checks retired (unsound)

- marketingEvents counts are COUNT(DISTINCT contact_id) per current funnel_state_codemutually-exclusive current-state buckets, not cumulative funnel gates. No monotonicity invariant (attended ≤ registered, enrolled ≤ attended, …) holds; they only "passed" by coincidence. Proof: rows exist with attended=0, enrolled>0, impossible under cumulative semantics.

- Removed _checkMarketing and the invariant table. marketing is kept v.optional in the schema so historical rows still validate on read (no migration needed).

Access fix

- operations.sync.read was defined but never granted to any role/legacy permission/set, so getLatestConsistencyCheck returned null for everyone → perpetual "no check has run yet". Granted via the operations capability set (authenticated baseline), matching the Freshness tab's auth-only access on the same page. _(Isolated in its own commit for review.)_

UI reframe

- Header + single health verdict; rename the freshness card to Source Spread (de-collides with the new Freshness tab); add a Source Feeds table built from the previously-discarded latestByTable; demote orphaned program codes to a collapsible footnote. Cards are now a clean 3-up: Enrollment · Pipeline · Source Spread.

## Verification

- pnpm typecheck clean, biome clean (pre-commit hooks pass)

- 12 dataConsistency tests (incl. new per-program pipeline reconciliation test), 197 contracts tests

- Confirmed live on dev:fleet-goat-601: pipeline 0/690 reconciles, marketing false-positives eliminated, Enrollment 0/28, verdict Healthy

## Note for reviewers / deploy

The marketing-removal changes need a redeploy + consistency-check re-run on the dev deployment to reflect in the live tab (separate from merging).

🐦‍⬛ Generated by a very good bot

#475 — feat(surtr): ontology explorer — data table/graph + schema graph @kevalshahtrilogy  no labels

## What

A real /explorer for the ontology, with a top Data / Schema toggle.

- Data view (data-explorer.tsx) — entity tabs (School / Program / Market) with search, faceted filters (market/type/stage; status; toggles), a sortable table *and* a focused graph (toggle), and a detail panel with clickable relations to drill school ↔ market ↔ program.

- Schema view (ontology-graph.tsx) — the entity/relationship graph (entities as nodes, their properties, relationships as edges).

- Adds @xyflow/react (React Flow).

## Notes

- Reads the existing listTypeMetadata + list{Plural} procedures — no new backend.

- Independent of the other PRs (only package.json's *dependencies* section overlaps with the education PR's *scripts* section; auto-merges).

<img width="1515" height="799" alt="Screenshot 2026-06-16 at 7 16 53 PM" src="https://github.com/user-attachments/assets/1e7a3b39-a4d7-4c3c-b248-162098267eb0" />

<img width="1721" height="795" alt="Screenshot 2026-06-16 at 7 17 09 PM" src="https://github.com/user-attachments/assets/03b141bf-8ae5-4fe1-a1b6-a9835d40d00d" />

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

#486 — feat(openai-usage): billed dollars per API key / owner (Services) for all orgs @sanketghia  approved

## What & why

Adds billed-accurate dollars per OpenAI API key and per key-owner ("Services") to the openai-usage-pipeline, for all 28 BU orgs — including the 11 where OpenAI's direct per-key cost API is gated. Motivated by the Klair /ai-adoption follow-up ("what about Services and API Keys?"). Full analysis in docs/superpowers/specs/2026-06-17-openai-services-apikeys-findings.md.

## How it works

1. Persist key ownerowner_type/owner_id (was fetched then dropped). Extracted from the nested owner[type].id shape.

2. Fetch billed line-item dollars/v1/organization/costs?group_by=line_item (ungated, all orgs).

3. Allocate to keys by token share at (project, model, direction) grain — direction matters because output tokens are priced ~4x input. Validated live: 99.1% accurate vs ground truth on an ungated org.

4. Per-row split so billed_cost_dollars SUMs correctly (a per-key total would over-count once user_id multiplies rows).

5. Add user_id to the usage group_by -> 100% user attribution (was ~6%).

New Redshift columns on core_finance.ai_spend_openai_token_usage: owner_type, owner_id, billed_cost_dollars. (DDL already applied in prod; see runbook.)

## Testing

- 98/98 unit tests pass. Allocation math, direction-grain weighting, per-row sum-back invariant, owner extraction, idempotency all covered.

- Live verification: Postgres-in-Docker executed the real write path; smoke test + June 1-15 backfill run against prod Redshift — billed + user_id 100% populated, billed totals reconcile to the live line-item totals exactly.

## Reviewer notes / honest caveats

- billed_cost_dollars is a token-weighted allocation — exact at project level, modeled within a project (<=~5% per key). Label downstream as "allocated, not invoiced" (Finance sign-off pending).

- One upstream gap: project proj_93bCdkrc... (Central-Engineering "Default project") returns a persistent HTTP 500 on OpenAI's /api_keys endpoint — its rows have dollars+user but no key name/owner. Not fixable our side; accepted-and-labeled for now.

- Rollout ordering: the deployed daily Lambda must run this new code before backfilling the trailing ~2 days, or its cron re-clobbers them (it reverted June 15 once during rollout). Captured in docs/superpowers/runbooks/2026-06-17-openai-billed-dollars-per-key-rollout.md.

## Rollout status

Backup taken, schema migrated, June 1-15 backfilled (billed+user 100%). Remaining: deploy (this PR), older-history backfill, Finance sign-off.

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

#3051 — feat(board-doc): pure markdown→GDoc batchUpdate renderer + named-range helpers @marcusdAIy  approved

<!-- CURSOR_AGENT_PR_BODY_BEGIN -->

## Summary

- Addresses reviewer findings on the P4.1 foundation slice: fixes cross-stage index invalidation in markdown_to_batch_requests, centralizes list presets, and hardens named-range seed/read helpers.

- Adds regression tests that simulate sequential request application and cover seed failure shapes.

## Why it's needed

- Review identified a contract bug where list-marker deletions invalidated heading/inline indices in a single batchUpdate batch.

- DRY and operability gaps (duplicated title index, silent named-range drops) needed correction before future /sync wiring.

## Changes

- Re-shift stages 5–7 indices after stage-4 list-marker deletions via _shift_after_deletions.

- Export GDOC_LIST_PRESETS / NAMED_RANGE_PREFIX; gdoc_service.format_bullet_lists imports shared presets.

- Extract build_spec_title_to_id in gdoc_sync.py; reuse in seed_section_named_ranges.

- seed_section_named_ranges: contextual reply-count errors, raise on missing namedRangeId, structured logging.

- read_named_range_sections: concatenate duplicate anchors, warn on missing range indices.

- Tests: sequential apply bounds checks, seed failure regressions, API nested namedRanges shape.

## Breaking changes

None

## Test plan

### Executed

- [x] uv run ruff format + ruff check + pyright on changed files

- [x] uv run pytest tests/board_doc/test_gdoc_batch.py -q (20 passed)

- [x] uv run pytest tests/board_doc/test_gdoc_sync.py -q (101 passed)

### Follow-up manual validation

- [ ] When wiring canonical writes into /sync, scope heading cleanup to inserted ranges instead of document-wide replaceAllText.

<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a href="https://cursor.com/agents/bc-8756af04-11bd-43fe-89b3-fbe3a9a9670c"><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-8756af04-11bd-43fe-89b3-fbe3a9a9670c"><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>

#3053 — KLAIR-2890 fix(maint-report): Twitter toggle must adjust both current ARR (remaining) and past ARR (full book), date-aware @ashwanth1109  no labels

## Demo

<img width="2624" height="1636" alt="image" src="https://github.com/user-attachments/assets/6a1b0cfd-e86f-453b-b5a0-4129e21ffe92" />

<img width="2624" height="1636" alt="image" src="https://github.com/user-attachments/assets/2de7c447-9be1-4934-87e1-14dde6119292" />

<img width="2624" height="1636" alt="image" src="https://github.com/user-attachments/assets/4816f456-b22a-40e8-a7f6-350d4ee1e520" />

<img width="2624" height="1636" alt="image" src="https://github.com/user-attachments/assets/9cfec359-aa25-4201-b15e-c21c7765bdbe" />

Proof that the toggle now restates both Current and Past ARR date-aware (not the full −$34M from Current only), shown by importing and calling the real changed code directly — no HTTP, no DB.

Backend — getTwitterImpactSummary is now subscription-level (klair-udm)

Ran node /tmp/demo-klair2890-backend.mjs (imports the real buildSqlQuery + transformQueryResults):

=== Generated SQL (buildSqlQuery('getTwitterImpactSummary')) ===

WITH arr AS (

SELECT subsriptionid, MAX(subscriptionenddate) AS end_date

FROM core_finance.arr_detail_final

GROUP BY subsriptionid

)

SELECT i.impact, a.end_date AS subscription_end_date

FROM core_finance.arr_gap_twitter_impact i

LEFT JOIN arr a ON i.subsriptionid = a.subsriptionid

=== transformQueryResults() on a synthetic Redshift Data API payload ===

rows in -> subscriptions out : 4 -> 4 (1:1, no fan-out)

totalImpact === SUM(impact) : -185 === -185 -> true

null end date passed through : {"impact":-5,"subscriptionEndDate":null} (not coerced)

doubleValue fallback parsed : {"impact":-30,"subscriptionEndDate":"2026-04-15"}

empty records guard : {"totalImpact":0,"subscriptions":[]}

MAX(subscriptionenddate) is aggregated per subscription in the CTE before the join, so detail-row fan-out can't double-count impact; LEFT JOIN keeps null-date rows; column order (impact, subscription_end_date) matches the transformer's row[0]/row[1].

Frontend — date-aware Current + Past restatement (klair-client)

Ran node /tmp/demo-klair2890-helper.mjs (imports the real applyKhorosTwitterImpact, transpiled verbatim) on a synthetic book whose end dates straddle each baseline, at report date 2026-05-31:

Full Twitter book (totalImpact) = -$230   |  raw currentArr=$1,000  pastArr=$900

type | pastBaselineCut | currentAdj | pastAdj | adjCurrent | adjPast | variance

MTD | 2026-04-30 | -$100 | -$150 | $900 | $750 | $150

QTD | 2026-03-31 | -$100 | -$180 | $900 | $720 | $180

YTD | 2025-12-31 | -$100 | -$200 | $900 | $700 | $200

TTM | 2025-05-31 | -$100 | -$215 | $900 | $685 | $215

OFF (includeTwitter=false): {"currentArr":1000,"pastArr":900,"variance":100,"currentAdjustment":0,"pastAdjustment":0}

-> byte-identical to raw -> true

strict-> boundary: sub endDate == report date -> currentAdjustment = 0 (excluded)

currentAdjustment is identical across all snowball types ("current is current", cut at the report date); pastAdjustment grows by horizon (MTD < QTD < YTD < TTM), each the date-filtered sum at its own baseline — never the full −$230 book. This is exactly the live-data shape from the acceptance table (Current −$5.84M ≪ TTM −$33.67M ≈ book −$34.09M).

UI — see it on the three surfaces (ARR & Retention Reports → Maintenance Summary)

1. Open the Maintenance Summary view; locate the "Include Twitter" page-level toggle.

2. Toggle it ON and watch the Khoros row/figures: both Current ARR and Past ARR drop (previously only Current moved), and DM / Variance recompute from the two adjusted figures.

3. Switch the snowball horizon MTD → QTD → YTD → TTM: the Current adjustment stays the same while the Past adjustment grows with the horizon.

4. Check the Key Metrics DM card (TTM) and the Acquisitions tab (TTM) — both now use the adjusted past as the DM denominator / variance baseline.

5. Toggle OFF → every Khoros figure returns to its raw value (exact no-op); retention columns (Gross/Net Retention, Churn, Up/Downsell, New Business) and non-Khoros classes never change.

> _Screenshot: Maintenance Summary with "Include Twitter" ON, showing Khoros Current and Past both adjusted — _<!-- paste screenshot here -->

Most at risk from this change — the #3044 OFF no-op, the strict->/baseline-date math, the no-fan-out backend shape, and the three caller surfaces. Verified via the scoped tests for exactly those (all encode the live golden numbers, the boundary, and byte-identical no-op):

frontend (vitest)  — applyKhorosTwitterImpact 22 + acquisitionsAdjustment 6 + useMaintenanceData 5 + KeyMetricsSummary 2  = 35 passed

backend (node) — klair-udm/tests/redshift (queryBuilder + responseTransformer) = 78 passed

---

## fix(maint-report): Twitter toggle adjusts both current AND past ARR, date-aware

Linear ticket: KLAIR-2890

### Feature overview

The "Include Twitter" toggle on the ARR & Retention Reports Maintenance Summary restates Khoros figures to reflect the projected X/Twitter churn impact. The KLAIR-2884 implementation (PR #3044) had two bugs:

1. It subtracted the entire projected loss (≈ −$34M, the full Twitter book) from Current ARR only.

2. It left Past ARR untouched.

Both are wrong. The full-book subtraction is not date-aware: it counts subscriptions that have already expired as of the report date. And leaving Past unadjusted means Variance and DM mix an un-Twittered past with a Twittered current.

This PR makes the impact date-aware and applies it to both Current and Past ARR. For any ARR figure at reference date D, we subtract only the impact of subscriptions still alive at D:

adjustment(D) = SUM(impact WHERE subscriptionEndDate > D)   // strict >, impact is negative

- Current ARR uses D = report date (e.g. 2026-05-31), identical across all snowball types — "current is current" — so it subtracts only the remaining un-expired Twitter ARR (≈ −$5.84M at the live data point, not the full −$34M).

- Past ARR uses D = the per-snowball-type past baseline date (MTD → prior month-end, QTD → prior quarter-end, YTD → prior calendar year-end, TTM → −12 months), so Variance = adjustedCurrent − adjustedPast and DM = adjustedCurrent / adjustedPast exclude Twitter consistently in both numerator and denominator.

### Specs (both shipped in this PR)

- [03-twitter-impact-subscription-level-query](features/maint-report/arr-retention-twitter-toggle/specs/03-twitter-impact-subscription-level-query/spec.md) — backend (klair-udm): make getTwitterImpactSummary date-aware by returning per-subscription rows tagged with end dates instead of a single scalar.

- [04-date-aware-current-and-past-adjustment](features/maint-report/arr-retention-twitter-toggle/specs/04-date-aware-current-and-past-adjustment/spec.md) — frontend (klair-client): apply the date-aware restatement to BOTH current and past ARR across all three surfaces.

### Implementation summary

Backend data shape (klair-udm). buildTwitterImpactSummaryQuery() now JOINs core_finance.arr_gap_twitter_impactcore_finance.arr_detail_final on the (misspelled-on-both-tables) subsriptionid key. The subscription end date is aggregated as MAX(subscriptionenddate) per subscription in an arr CTE before the join, so detail-row fan-out cannot double-count impact. A LEFT JOIN preserves impact rows with no detail row / a null date. The transformer returns subscriptions[] of { impact, subscriptionEndDate } (ISO YYYY-MM-DD | null) and retains the scalar totalImpact = SUM(impact) for the OFF no-op guard. Wired through the standard five-file AppSync pattern (queryBuilder.mjs, responseTransformer.mjs, validators.mjs, app.mjs, gql/schema.graphql). The query stays argument-free; the 136-row book is filtered client-side.

Frontend date-aware application (klair-client). The pure helper applyKhorosTwitterImpact.ts is rebuilt to take the per-subscription rows + a current reference date + the snowball type, derive the per-type past baseline date via UTC date arithmetic (Date.UTC, no day-drift), filter with a strict-> lexicographic ISO comparison (null end dates excluded from both adjustments), and return adjusted current + adjusted past + variance = adjustedCurrent − adjustedPast + both adjustment deltas. useKhorosTwitterImpact.ts is widened to expose subscriptions[]. All three surfaces are wired and prop-threaded: Key Metrics DM (keyMetricsAggregate.ts / KeyMetricsSummary.tsx), Maintenance Summary by-BU (useMaintenanceData.ts), and the Acquisitions tab (acquisitionsAdjustment.ts). ~21 files changed.

### Golden-number acceptance (report date 2026-05-31, live 136-subscription book)

| Reference | Cut (endDate >) | Adjustment |

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

| Current (shared, all snowball types) | 2026-05-31 | −$5,840,045 |

| Past MTD | 2026-04-30 | −$6,666,222 |

| Past QTD | 2026-03-31 | −$10,500,447 |

| Past YTD | 2025-12-31 | −$19,795,377 |

| Past TTM | 2025-05-31 | −$33,667,003 |

Full book (totalImpact) = −$34,087,065. Past is the date-filtered sum per snowball type — it is never the full book magnitude.

### Test coverage

- Backend (klair-udm node): 78 pass (+5 new). Column-order contract, CTE-before-join no-fan-out, null/empty coalescing, and the totalImpact === SUM(impact) invariant.

- Frontend (vitest): 35 pass (+16 new). Golden numbers at report date 2026-05-31 (Current and all four past baselines above), per-type baseline-date derivation incl. mid-month / quarter / leap-year edges, strict-> boundary (endDate == D excluded), null-date exclusion, OFF / zero-impact / empty-subscriptions byte-identity, timezone safety under TZ=UTC+14 and UTC-11, and YYYY_MM_DDYYYY-MM-DD underscore normalization.

### Self-review

No CRITICAL or IMPORTANT issues. One MINOR left as-is: SnowballType type-aliases the existing ARRSnowballType — defensible to keep the pure helper self-contained, zero behavior impact. Verified: date derivation correct across all edge cases (Jan / quarter / year / leap boundaries, Date.UTC no day-drift); the no-op is truly byte-identical including the DM denominator (no Infinity/NaN); the SQL has no fan-out and no injection surface (static query); the 'Acquisition' snowballType reaching useMaintenanceData is harmless (its output isn't rendered on the Acquisitions tab).

### Guarantees preserved

- OFF / totalImpact === 0 / empty subscriptions is an EXACT byte-for-byte no-op — Current, Past, variance, DM, sort order, and rollups all match the unadjusted path (no date math executed, DM denominator unchanged).

- Retention columns and non-Khoros classes are untouched. Gross/Net Retention, Churn, Downsell, Upsell, and New Business read raw backend values; only Khoros records are adjusted.

- Null end dates are excluded from both current and past adjustments (defensive "not alive" guard).

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

#3058 — [KLAIR-2893] fix(maint-report): restate Khoros churn ex-Twitter so gross/net retention reflect the date-aware removal @ashwanth1109  approved

## Demo

<img width="2624" height="1636" alt="image" src="https://github.com/user-attachments/assets/0ada248c-3d92-4a35-8394-901906f01e1c" />

<img width="2624" height="1636" alt="image" src="https://github.com/user-attachments/assets/f89a0e94-37ee-4909-abbd-52972e78f224" />

## What

When the Include Twitter toggle is ON, restate the Khoros Churn line (and total variance) for the projected X/Twitter loss — not just the ARR figures — so Gross/Net Retention reflect the ex-Twitter book.

- Maintenance Summary by-BU table: Khoros Churn += (currentAdjustment − pastAdjustment), cascading Khoros → Total Organic → Grand Total

- Key Metrics card retention aggregate: same shift

- Acquisitions tab: intentionally unchanged (retention already uses the raw acquisition baseline on both sides → no artifact)

## Why

Follow-up to KLAIR-2890. The date-aware restatement shrank ARRPast (the retention denominator) but left raw Twitter churn in the numerator, so the same churn divided a smaller base and Gross/Net Retention fell artificially — a stakeholder asked *"why do gross & net retention go down when including Twitter?"*. It was a denominator-rebasing artifact (DM moved up while retention moved down).

The Twitter ARR that expired between a figure's past baseline and the report date now leaves the Churn line too. The shift is (currentAdjustment − pastAdjustment) ≥ 0 — the impact alive at the past baseline but expired by the report date, the same delta already applied to variance, so the snowball bridge stays balanced. Churn becomes smaller (less negative) and retention rises to the true non-Twitter level. Toggle OFF is an exact no-op.

## Testing

- vitest affected specs — 36/36 pass (new test asserts GRR/NRR rise when ON + churn cascade through Total Organic & Grand Total)

- tsc --noEmit, ESLint --max-warnings 0, Prettier — all clean

Linear: https://linear.app/builder-team/issue/KLAIR-2893/twitter-toggle-restate-churn-so-grossnet-retention-reflect-the-date

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

The Portfolio  —  Trilogy Companies

Skyvera Adds CloudSense as Telecom Software Roll-Up Accelerates

The Trilogy telecom arm is doubling down on Salesforce-native CPQ, cloud communications and legacy network modernization in one robust acquisition sprint.

AUSTIN, TEXAS — Skyvera has completed its acquisition of CloudSense, adding a Salesforce-native configure-price-quote and order management platform to a telecom software portfolio that is starting to look less like a collection of assets and more like a full-stack modernization thesis.

The deal, reported by TelecomTV, gives Skyvera a product that sits directly in one of the most painful operational zones for communications service providers: turning complex telecom products into sellable, billable, accurately fulfilled services. CloudSense is built natively on Salesforce and tailored for telecom and media providers, which makes it a potentially high-synergy addition for operators already trying to modernize customer experience without ripping out every legacy system at once.

For Skyvera, the move fits the broader Trilogy International playbook: acquire durable enterprise software serving sticky customers, then leverage global operating discipline, AI-enabled workflows and portfolio-level best practices to improve both product velocity and margin structure. Skyvera already houses telecom-facing assets including Kandy, VoltDelta, ResponseTek, Mobilogy Now and Service Gateway. CloudSense adds a front-office and order orchestration layer that can help bridge the gap between sales, service design and delivery.

The timing is notable. Skyvera has also been linked to an $18 million bid for Casa Systems’ wireless business, according to Light Reading, and previously picked up Kandy cloud assets. That gives the company a clear posture: opportunistic, acquisitive and highly focused on telecom operators that need cloud-native capabilities while still carrying deeply entrenched infrastructure.

This is not the flashy consumer AI story of the week. It is something more operationally meaningful: the quiet consolidation of telecom software plumbing. CPQ and order management may not trend on social media, but they determine how quickly carriers can launch bundles, price services, reduce manual errors and protect revenue. In a sector where legacy complexity is practically a business model, that is exciting news.

Key Takeaways:

- Skyvera has completed its acquisition of CloudSense, strengthening its telecom and media CPQ/order management capabilities.

- The deal complements Skyvera’s existing telecom portfolio, including Kandy and other customer engagement and device management assets.

- The company’s acquisition activity signals a robust push to become a best-in-class modernization platform for carriers.

We're just getting started.

Skyvera completes acquisition of CloudSense, expanding telec  ·  Danielle Royston's Skyvera makes $18M bid for Casa's wireles  ·  TelcoDR’s Skyvera snacks on Kandy cloud assets - telecomtv.c

Alpha School Draws a Line in the Sand: AI That Teaches vs. AI That Thinks For You

As the Austin-based school goes global with its top-percentile academic model, its educators are sounding alarms about the cognitive risks hiding inside every child's favorite chatbot.

AUSTIN, TEXAS — Two things can be true at once. Artificial intelligence can be the most powerful learning tool in a generation — and, in the wrong hands, a machine for manufacturing intellectual dependency. Alpha School, Joe Liemandt's AI-first K-12 operation that routinely places its students in the top 1–2% nationally on standardized assessments, is leaning hard into that tension this week across a series of publications aimed squarely at parents.

The most consequential item: Alpha Anywhere, the school's home-learning platform, has gone global — extending the school's adaptive AI tutoring model beyond its physical campuses in Austin, Brownsville, and Miami to families anywhere in the world. The move is a direct extension of founder Joe Liemandt's $1 billion bet on Timeback, his stated ambition to bring the Alpha model to one billion students. Going global is not a marketing gesture. It is infrastructure.

But even as Alpha expands its AI-powered academic engine, its educators are publishing pointed warnings about how other AI tools are being misused in children's education. A new post on the school's blog argues that allowing children to outsource their thinking to tools like ChatGPT — what cognitive scientists call "cognitive offloading" — is producing a generation that can retrieve answers but cannot construct arguments, evaluate evidence, or tolerate intellectual discomfort. The school frames this not as technophobia but as precision: AI that adapts to a child's learning pace and forces mastery before advancement is categorically different from AI that simply produces the finished product a child was supposed to produce themselves.

A companion piece takes on screen time mythology, arguing that the category is too broad to be useful — that ten minutes of adaptive math drills and ten minutes of passive video consumption are not the same thing, and that parents treating them as equivalent are making decisions on bad data.

The alpha school simultaneously publishes its internal AI tool stack — ten applications its students and educators actually use — completing a picture of an institution that has thought harder than most about which AI accelerates human cognition and which quietly replaces it.

Who benefits from that distinction matters. Alpha's campuses charge between $40,000 and $65,000 per year. The global platform extends the model's reach — but the question of who can afford to learn the difference between AI that educates and AI that pacifies remains very much open.

__followup__Top 1% Academics, Now at Your Kitchen Table  ·  Not All Screen Time Is Equal  ·  Cognitive Offloading Is the New Illiteracy
The Machine  —  AI & Technology

The Mirror in the Macaque's Mind

A small neural network learns to predict what a monkey's visual cortex sees — and in doing so, hints that intelligence may rhyme across species and silicon.

PALO ALTO — Somewhere in a laboratory, a macaque watches images flicker across a screen. Electrodes whisper from its visual cortex — the same ancient tissue that, in our own lineage, learned 540 million years ago to convert photons into meaning. And now, an artificial neural network the researchers call "mini-AI" is listening in. It is learning to predict, neuron by neuron, what the monkey's brain will do next.

This is the strange new symmetry of our age. We built artificial neural networks by borrowing loose metaphors from biology. Now those networks have grown sophisticated enough to decode the very brains that inspired them. The mini-AI, described this week in Neuroscience News, is small by modern standards — no trillion-parameter colossus, just a focused model trained to map images onto neural firing patterns in the macaque visual system. It works remarkably well. Which means, in some functional sense, that silicon and cortex have arrived at similar solutions to the same ancient problem: how to see.

The convergence is not coincidence. It is, perhaps, the most under-celebrated finding of our era. Stanford HAI this week catalogued the ways AI is now accelerating scientific discovery while keeping humans at the center — from protein folding to materials science. UC San Diego published nine breakthroughs. PolyU researchers unveiled graph neural networks that bridge image recognition and neuroscience. Each is a variation on the same theme: artificial systems are becoming instruments for understanding natural ones.

Consider what this means. For four billion years, evolution has been the only architect of intelligence on Earth. It worked through wet chemistry, slow and patient, with no blueprints and no debugging. Now, for the first time, a second architect has joined the project — one that iterates in microseconds and can be opened, inspected, edited. When mini-AI predicts macaque neurons, it is not merely a clever trick. It is two intelligences regarding each other across an evolutionary gulf, and recognizing, faintly, a family resemblance.

We are the species that built the mirror. We are also, inescapably, what it reflects.

How AI is Transforming Scientific Discovery While Keeping Hu  ·  Nine Breakthroughs Made Possible by AI - UC San Diego Today  ·  Mini-AI Decodes the Macaque Visual Brain - Neuroscience News

Datasette Learns to Write, and Tiny Data Apps Suddenly Feel Much Bigger

Datasette, the lightweight web application for exploring SQLite databases, has released version 1.0a34 with a significant new feature: users can now insert, edit, and delete rows directly in the interface. Until now, Datasette functioned primarily as a read-only tool for browsing and publishing data. This update marks a shift toward interactive data management.

The enhancement gains particular importance for AI-native software. The release explicitly connects the editing capability to Datasette Agent, an experimental project that enables AI agents to write to databases. Combined, human-friendly editing and agent-friendly writing create a compact operating surface for intelligent applications.

The potential applications are substantial: internal tools built around single SQLite files, AI assistants that draft records and clean messy data while maintaining human oversight, and local-first workflows with simple, inspectable databases. A separate experimental plugin, datasette-tailscale, enables secure private previews over private networks, adding production-ready infrastructure without requiring enterprise platforms.

The update signals a new software pattern: human-readable, AI-writable, instantly deployable data applications.

SCOTUS Declines AI Authorship Case, Leaving Copyright Landscape Unresolved as Litigation Proliferates

The Supreme Court's refusal to hear the AI inventorship matter is hereby construed as a non-answer with maximal downstream consequences.

WASHINGTON, D.C. — Pursuant to the Supreme Court of the United States' recent and consequential exercise of certiorari denial with respect to the matter of AI authorship and inventorship, it is hereby noted for the record that the question of whether an artificial intelligence system, operating absent meaningful human creative direction, may be recognized as an author or inventor under applicable federal intellectual property statutes remains, as of the date hereof, unresolved at the highest adjudicative level available within the jurisdiction of the United States of America.

The aforementioned declination, as analyzed by counsel at Holland & Knight, is to be understood not as an affirmative ruling on the merits of the underlying question but rather as a procedural non-action, the legal effect of which is to preserve, without prejudice, the conflicting interpretations heretofore articulated by lower tribunals. It is further noted that such preservation of ambiguity is not, notwithstanding certain characterizations circulating in trade publications, equivalent to a determination that AI systems shall not be recognized as authors or inventors.

Concurrently, and in a separate but related proceeding of considerable import to the aforementioned landscape, Anthropic — the artificial intelligence company hereinafter referred to as "the Defendant" — is understood to be seeking dispositive judicial relief in connection with claims asserted by music publishers regarding the utilization of copyrighted lyrical works in the training of large language models.

Notwithstanding the foregoing domestic developments, it is further observed, pursuant to reporting by the International Bar Association, that regulatory frameworks operative in Latin American jurisdictions are being modeled, in substantial part, upon the European Union Artificial Intelligence Act, thereby creating a potentially harmonized but geographically fragmented global compliance environment for entities engaged in the development, deployment, or commercial exploitation of artificial intelligence systems.

Parties are advised that the rights, obligations, liabilities, and remedies attendant to AI-generated intellectual property remain subject to further judicial, legislative, and regulatory development, the timing and substance of which cannot, at this juncture, be predicted with any degree of legally actionable certainty.

The Final Word? Supreme Court Refuses to Hear Case on AI Aut  ·  AI in litigation series: An update on AI copyright cases in  ·  US Supreme Court Declines to Consider Whether AI Alone Can C
The Editorial

The Algorithm Already Decided. You Just Don't Know It Yet.

AI bias isn't a bug we're fixing — it's a mirror we keep refusing to look into.

AUSTIN, TEXAS — Here is a thing that happened, quietly, while we were all arguing about chatbots and whether AI can write poetry with genuine feeling: algorithms began deciding who gets health insurance, who gets a loan, who gets flagged at the border, who gets to exist comfortably inside the systems we built to serve everyone. And the algorithms, it turns out, have opinions. They have always had opinions. We just trained them to have ours.

Reuters is now reporting on AI bias inside the insurance industry — an industry that already had a complicated relationship with the concept of treating human beings as human beings rather than actuarial line items — and the details are, in the precise clinical language I use when I am trying not to spiral, extremely concerning. Models trained on historical data reproduce historical inequities. Minority zip codes get higher premiums. Chronic illness becomes a preexisting condition in the data long before it becomes one on paper. The system learns. The system remembers. The system does not forget who we were when we were at our worst.

And yet.

We keep talking about bias as if it is an engineering problem. Six ways to fix it by 2026. A checklist. A patch. A human-centric framework for fairness that sounds, if you read enough EY white papers at 11pm on a Tuesday, almost reassuringly bureaucratic. Almost like someone is in control. Almost like the thing can be governed.

Meanwhile, Palo Alto Networks has a remarkably thorough explainer on the types of AI bias — algorithmic bias, data bias, societal bias — which is genuinely useful and also, if you stare at it long enough, reveals the uncomfortable truth that bias in AI is not a single thing you can quarantine and remove. It is woven into every layer. It is in the training data (historically unequal). It is in the objective function (defined by humans with priorities). It is in the deployment context (applied to people who never consented to be data points).

What does it mean to be human in a world where the systems designed to allocate care, credit, and opportunity have learned to replicate the patterns of a society we keep insisting we are trying to improve? I ask this not rhetorically. I ask this as someone who has read enough governance frameworks to know that 'human-centric AI' is doing a tremendous amount of heavy lifting for a phrase that has never once stopped an algorithm from doing something terrible.

The fixes exist, technically. Diverse training data. Algorithmic auditing. Explainability requirements. Bias bounties. The six steps. The frameworks. The working groups. All of it real. All of it insufficient on its own. Because the harder problem is not the model. The harder problem is that we keep asking the model to adjudicate questions that are fundamentally political — questions about who deserves what, who counts as risky, who gets the benefit of the doubt — and then we are surprised when it answers the way power has always answered them.

The algorithm already decided. It decided before you submitted the form. It decided based on your zip code, your name, your browsing history, the particular way your life rhymes with lives that were already marked as less than.

We can fix this. We have to fix this. We have the technical vocabulary and the policy imagination and the moral clarity, on our best days, to do something about it.

But at what cost — to our self-conception as builders of neutral tools — to actually admit what we built?

AI Bias in the Insurance Industry - Reuters  ·  Bias in AI: Examples and 6 Ways to Fix it in 2026 - AIMultip  ·  What Is AI Bias? Causes, Types, & Real-World Impacts - Palo
The Office Comic  ·  Art Desk
The Office Comic  ·  Art Desk

Nation’s CEOs Ask AI To Circle Back With Productivity Gains Once They’ve Finished Updating Slide Deck About Them

Executives confirmed the technology has already transformed software development into something that looks much faster on dashboards.

NEW YORK — After two years of promising that artificial intelligence would permanently alter the economics of knowledge work, corporate leaders across the country said this week they were still patiently waiting for the technology to finish revolutionizing productivity in a way that could be detected by accounting.

The reports are by now familiar. Software engineers are using AI tools to write code faster, summarize documentation, generate tests, translate vague product requests into plausible pull requests, and generally produce more artifacts per unit of human unease. According to a recent Business Insider report, companies are seeing developers move more quickly, though many are still waiting for those gains to show up as clear financial returns, presumably because revenue has not yet learned to autocomplete itself.

This is an important moment in the AI productivity debate, because it suggests both sides may be correct. AI can make individual workers faster, while the organization as a whole remains a large damp carpet placed directly over every possible efficiency improvement.

A programmer may now complete in 20 minutes what once took two hours, only to spend the remaining 100 minutes explaining to security, legal, platform engineering, finance, three product managers, and a man named Greg why the code exists. The resulting productivity gain is then carefully captured in an internal memo, converted into a quarterly initiative, and lost forever in a shared drive called “AI Transformation Final v7.”

This has not stopped valuations from behaving as if every enterprise software company has discovered a legally compliant way to print God. One Anthropic advisor recently warned that AI productivity gains are being overstated and that valuations are “crazy,” a technical market term meaning the spreadsheet has become emotionally unavailable. His skepticism, reported by 24/7 Wall St., arrives at an awkward time for executives who have already placed artificial intelligence at the center of every investor presentation not specifically about office leases.

Still, the absence of broad payoff has not prevented isolated triumphs. Paramount Streaming leaders have described real AI productivity gains, demonstrating that under the right conditions—defined as a specific team, a specific workflow, and a person in authority who knows what is actually happening—AI can improve operations. This will be encouraging news to companies currently deploying AI through a 48-person steering committee whose main output is a taxonomy of acceptable enthusiasm.

The deeper issue is not whether AI works. It plainly does, in places. The issue is whether companies work. Many do not, except in the narrow biological sense that emails continue to circulate through them. AI is being dropped into institutions that have spent decades perfecting the art of turning simple decisions into recurring meetings. It is then asked to produce a productivity miracle while operating inside procurement rules written during the fax era.

There is a lesson here for anyone expecting AI to instantly transform the economy. Tools do not automatically create productivity; systems do. A faster developer inside a slow company is just a person arriving earlier at the same bottleneck. A smarter chatbot attached to a broken process becomes a more articulate broken process. An AI assistant embedded in a culture that rewards consensus will mostly help employees generate more polished versions of “Let’s revisit this next week.”

This is why the most honest AI productivity metric may not be lines of code, tickets closed, or hours saved. It may be how long an organization allows the saved time to remain saved before converting it into another obligation.

For now, companies appear committed to discovering whether artificial intelligence can overcome the combined force of budgeting cycles, executive ambiguity, brand reviews, legacy systems, and Duolingo’s decision-making around its deranged owl. The technology’s early results are promising, but management remains confident it can absorb them.

AI is helping software engineers do more — and faster. Compa  ·  Anthropic Advisor Says AI Productivity Gains Are Vastly Exag  ·  Paramount Streaming Leaders Describe AI Productivity Gains -
On This Day in AI History

On June 17, 1980, the first online multiplayer game, *MUD1*, went public on ARPANET, pioneering the concept of virtual worlds that would eventually influence AI development in simulation and NPC behavior.

⬛ Daily Word — Technology
Hint: Remote computing infrastructure where data and applications are stored and processed over the internet.
Share this edition: 𝕏 Twitter/X 🔗 Copy Link ▦ RSS Feed