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

Google Tops the Safety Board, Bleeds Its Best to Rivals

A new AI report card crowns the search giant even as four researchers bolt for Anthropic and OpenAI — and Musk's xAI pulls the lone F.

MOUNTAIN VIEW, CALIF. — Google topped a fresh artificial-intelligence safety report card this week, then lost four of its sharpest researchers to rivals Anthropic and OpenAI.

That's the whole racket in one breath. Win the trophy with one hand. Drop the roster with the other.

The new AI Safety Index seated Google, Anthropic and OpenAI at the head of the class. Elon Musk's xAI took home the lone F. The marks scored how hard each outfit works to keep its own machines on a leash — the safeguards, the testing, the straight talk about what might go sideways.

Here's the twist. The three names atop the safety board are the same three raiding each other's benches — the honor students swiping one another's lunch.

Trouble is, a gold star won't keep a genius in his chair. Fortune reports top talent is streaming out of Google DeepMind, the London lab behind AlphaGo and the AlphaFold protein maps. Insiders now ask aloud whether it can hold its perch at the front of the pack.

Inc. counted the damage. Four key staffers gone, each one landing at one of the two San Francisco houses doing the hunting. The exits stack up as poachers dangle fatter checks and shorter chains of command.

Anthropic knows the play. The shop was born in 2021 when OpenAI alumni, led by Dario Amodei, walked out over the direction of the work, and now it's collecting Google's people the same way — selling a pitch that safe and cutting-edge can ride one horse.

The churn cuts deep because in this game, people are the moat. Chips can be bought and data can be scraped, but the few who can shove a model past the pack don't grow on trees.

The giants aren't just buying code. They're buying philosophers, too. Daily Nous keeps a running list of thinkers who've signed on with AI firms to wrestle the heavy questions — what the machines owe us, what we owe them, and who's holding the wheel when nobody's sure.

Down below the penthouse, the floor is giving way. TechCrunch keeps a running ledger of every major 2026 layoff that name-checked AI — outfits framing the cuts as efficiency the machines now deliver. Brains climb the ladder up top; bodies sweep out the back below.

The whole scramble has a geography problem. Every dollar chases the same few zip codes around San Francisco Bay, bidding the same familiar faces higher and higher.

Trilogy International's Crossover platform plays the other side of the street. It recruits what it calls the top 1% from more than 130 countries and pays the identical rate whether the hire sits in Austin or Nairobi. No bidding war, no coastal premium — a different wager on where the brains actually live.

For now, the coastal giants keep swapping talent like ballplayers at the trade deadline. The scoreboard says Google leads on safety. The exit door tells another story.

Google, Anthropic, OpenAI lead AI Safety Index; SpaceXAI rec  ·  Why Google Just Lost 4 Key Staffers to Anthropic and OpenAI  ·  Philosophers Working in or with AI Firms & Organizations (up

Korn Ferry Swallows a Rival, and the Executive Search Map Redraws Itself

The firm has acquired Trilogy International, a boutique executive search and leadership advisory shop, folding its capabilities into what is already the dominant platform in the sector. Korn Ferry has spent years building beyond its traditional retained-search roots, pushing into organizational consulting, digital assessment, and leadership development. Trilogy International brings a client book and senior search professionals who operate at the highest levels of corporate succession and board-level work.

Consolidation at the top of the talent industry is nothing new. The largest firms have been absorbing specialists for years as clients increasingly demand a single partner handling assessment through placement to development. The executive search market faces real headwinds: a cooling C-suite hiring cycle, AI-assisted candidate matching, and clients questioning what search firms provide that algorithms cannot.

Korn Ferry's answer is more reach, more senior relationships, and more institutional heft. The combined firm's global footprint now stretches further across markets where the next generation of corporate leadership is being cultivated and competed for. Whether Trilogy International's value survives the acquisition remains uncertain.

AI Startups Hoover Up Capital as Valuations Defy Gravity

Four major funding rounds in a single week signal that AI investment has entered a new phase — one where traditional valuation metrics no longer apply.

NEW YORK — The venture capital machine is running at full throttle. Four significant AI funding rounds closed in rapid succession this week, collectively representing over $1.5 billion in fresh capital and valuations that would have been inconceivable for companies at similar revenue stages five years ago.

The largest: Decart, an Israeli AI startup, raised $300 million at a $4 billion valuation with Nvidia participating — a strategic signal as much as a financial one. Nvidia's direct investment in portfolio companies has become a recurring pattern, effectively functioning as a market-confidence endorsement that other LPs find difficult to discount.

Bret Taylor's Sierra, which sells AI-powered customer service agents, raised nearly $1 billion just months after its previous capital raise. The pace — back-to-back rounds with no intervening product milestone publicly announced — reflects how compressed the AI fundraising cycle has become. Investors are paying for trajectory, not trailing revenue.

LMArena, which builds evaluation infrastructure for AI models, closed a $150 million round at a $1.7 billion valuation. The company operates in a segment — AI benchmarking and evals — that barely existed as a standalone market category 24 months ago. Its unicorn status underscores how the infrastructure layer around AI is attracting capital nearly as aggressively as AI applications themselves.

Underpinning all of this is a broader rethink of valuation methodology playing out among top-tier VC firms. Benchmark, historically a discipline-oriented shop skeptical of growth-at-any-cost investing, has signaled a recalibration — acknowledging that AI's speed of compounding may render conventional ARR multiples structurally obsolete.

Separately, a cluster of startups targeting quantitative finance is attempting to automate the proprietary research and signal-generation processes that hedge funds have guarded for decades. Whether that market materializes at scale remains unproven, but early capital is flowing regardless.

The week's activity confirms a directional reality: in AI, the cost of missing a category-defining investment is now perceived as higher than the cost of overpaying to get in.

Upending VC Conventional Wisdom! Benchmark Partner: A New Va  ·  AI evaluation startup LMArena raises $150M at $1.7B valuatio  ·  Nvidia backs Israeli AI unicorn Decart in $300 million fundi
Haiku of the Day  ·  Claude HaikuGiants eat giants whole,
yet the smallest spark still burns—
code rewrites the rules.
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 Machines Are Writing Papers, Teaching Children, and Designing Parts — But Can They Be Trusted?
CAMBRIDGE, MASSACHUSETTS — It could be argued — and preliminary evidence suggests with some degree of epistemic confidence — that the current moment in artificial intelligence research represents less a coherent paradigm shift than a simultaneous, polyphonic, and occasionally cacophonous expansion into every conceivable domain of human intellectual production.
LEADERSHIP VACUUM AT DOJ ANTITRUST DIVISION CLOUDS BIG TECH ENFORCEMENT OUTLOOK FOR 2026
WASHINGTON, D.C.
The Internet Is a Simulation Now, and Nobody Asked If That's Okay
AUSTIN, TEXAS — Let me describe the internet to you as it exists in the year of our lord whatever-this-is: a browser extension is necessary to tell you whether the thing you're buying on Amazon is made by a brand called GODONLIF or VISCOO or BALENNZ — names that exist in the same ontological space as a fever dream — because the marketplace has become so thoroughly colonized by knockoff brands with algorithmic names that we can no longer, as a civilization, determine what is real without software intervention.
AI-First Is Not a Strategy If Your Employees Think It Means Goodbye
AUSTIN, TEXAS — I'll be honest, the phrase “AI-first” has officially entered its danger era. Unpopular opinion: if your employees hear “AI-first” and immediately update their résumés, that is not a communications problem, that is a trust balance-sheet problem.
The Robot in the Room: AI Agents Are Eating Your Workplace and Nobody's Sure Who's Liable
AUSTIN, TEXAS — Let me paint you a picture, friend.
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 Rewires the Stack From Data Layer to Dashboard

In a 24-hour stretch spanning four repos, the AI Builder Team closed silent data drift, opened a self-describing warehouse API, and shipped the observability infrastructure that makes every future fix faster.

The best engineering days aren't the ones where a single thing ships. They're the ones where you look up and realize the team has been pulling on five different threads simultaneously — and every one of them tightened. That was today. Across Surtr, Klair, Aerie, and trilogy-drones, the AI Builder Team did something rare: they fixed the pipes, labeled the pipes, built a dashboard to watch the pipes, and then made sure the AI could read the pipes too.

Start with the infrastructure layer, because that's where @mwrshah and @kevalshahtrilogy were doing the unglamorous, essential work that keeps the whole operation honest. @mwrshah dropped two Surtr PRs that deserve to be framed: first, hunting down a Redshift reserved-word collision in the Renewals V3 bundling stage — a `delta` alias that had been crashing the pipeline every single day since July 3rd — and renaming it to `multiplicity_delta`, ending three consecutive days of failure. Then he shipped the reconciliation sweeper for PR #584, a purpose-built fix for contracts that silently drift when they fall out of the active budget cycle. Silent drift is the enemy. @mwrshah declared war on it. @kevalshahtrilogy, meanwhile, repointed the GCP billing pipeline to its relocated BigQuery export (PR #612) and then — this is the one to watch — built an alert tracker (PR #607) that writes every failure, partial, and observer alert to a Google Sheet with a one-to-one invariant: one SNS message, one chat card, one row. The triage reconciler annotates that same row instead of creating a new one. This is the kind of system that pays dividends forever.

Over in Klair, @eric-tril was operating across two repos simultaneously, and that cross-repo coordination is its own story. The NetSuite GL table rename — adding the `month_end_` prefix to distinguish these pipelines when scanning tables — had to land in both Surtr (#615) and Klair (#3209) in lockstep. @eric-tril executed it cleanly and then kept going, shipping GL-line drill-down for Schedule A Total and Book Value's 'Other Investments' row in PR #3208, complete with live 'Open in NetSuite' links. That closes an asymmetry that had been bugging operators for months. Also in Klair, @benji-bizzell built something quietly transformative: a self-describing REST API over the finance_dw Redshift warehouse (PR #3204), key-gated, rate-limited, with a runtime-neutral SKILL.md that agents install once and never need updated again. That's not a feature. That's infrastructure for the next ten features.

In Aerie, @benji-bizzell was everywhere — extending personnel contact overrides through every layer of the schema (PR #569), adapting Security card editing to the incremental split-edit pattern (PR #568), and cleaning up the legacy Rhodes read-source switch that was making the old migration look like it was still live (PR #565). @YibinLongTrilogy, meanwhile, moved the Rhodes P1 Due Diligence WUG to its correct milestone home (PR #573) with hardened migration logic for partially-moved sites, and shipped the P2 Buildout Progress dashboard (PR #563) — percentage bars, Quality Bar columns, drill-down side panels. P2 members can now see exactly where every campus stands.

Now. We have to talk about marcusdAIy, who managed to spread himself across Klair, trilogy-drones, and a repo called Praxis-V2 in a single day. When reached for comment on the Mercy watcher (PR #68) — a bounded auto-address loop with a round cap of two and anti-thrash logic — he had this to say: 'The round cap, the two-strikes guard, the structured degraded outcomes — every design decision is documented and tested at every band. Maybe if Mac read the PR body instead of just the author field, he'd understand what bounded automation actually means.' Sure, Marcus. A round cap of two is very impressive. I'm sure the two rounds it takes will be legendary.

Every thread today connected to every other thread. That's not an accident. That's a team that knows what it's building.

Mac's Picks — Key PRs Today  (click to expand)
#563 — AERIE-758: Add P2 Buildout Progress dashboard @YibinLongTrilogy  approved

## Summary

Adds a new Progress view to the Buildout dashboard (/dashboards?tab=buildout) for P2 members to track pre-launch Work Unit completion per campus.

Rows are non-cancelled sites whose current derived milestone is in the pre-launch buildout window (milestones 4-8: construction permits through ready-to-open). Columns are all 13 Quality Bars. Each populated cell is a percentage bar of pre-launch catalog WU completion for that QB; QBs with no pre-launch WUs for that site render as empty cells. Clicking a populated cell opens a side panel that drills into the QB -> its Work Unit Groups -> pre-launch Work Units, where eligible users can edit each WU's status, start/due/completed dates, and assignee. The panel also exposes read-only, paginated notes for WUs that have notes.

The existing FTO Pipeline matrix remains the default; the new grid is a second mode selectable from the "Sort & display" popover, mirroring how the Diligence tab switches between Progress and Outcomes. The only DB schema change is a new optional launchPhase ("pre" | "post") field on work units. Everything else the dashboard edits (title, status, dates, assignee) already exists on the workUnits table.

### Screenshots

<img width="2294" height="1220" alt="Screenshot 2026-07-06 at 1 49 28 PM" src="https://github.com/user-attachments/assets/6bbc3628-741c-4b04-a48f-94154213c903" />

<img width="2022" height="1212" alt="Screenshot 2026-07-06 at 1 49 56 PM" src="https://github.com/user-attachments/assets/4cac28e1-d415-4983-9690-15dc8906438c" />

<img width="968" height="478" alt="Screenshot 2026-07-06 at 12 02 43 PM" src="https://github.com/user-attachments/assets/0befac43-6aab-49d8-acb3-391e07b470bf" />

### Changes

Schema & data

- chat/convex/rhodes/schema.ts — adds launchPhaseValidator and an optional launchPhase field on the workUnits table.

- chat/convex/rhodes/p2WorkUnitDefinitions.ts — adds launchPhase: "pre" to the P2WorkUnitDefinition type and to all 60 P2 definitions (P2 has no post-launch WUs yet).

- chat/convex/rhodes/p2WorkUnits.ts — provisioning now stamps launchPhase on inserted WUs, and adds backfillWorkUnitLaunchPhase to set launchPhase: "pre" on existing P2 pre-launch catalog rows that lack it.

Backend queries & API

- chat/convex/rhodes/dashboard.ts — adds p2BuildoutDashboard (grid payload), p2BuildoutSiteQualityBarDetail (panel payload), p2BuildoutWorkUnitNotes (paginated WU notes), and editP2BuildoutWorkUnit. Reads are gated on operations.buildout.read; edits also require canEditSite. The bar numerator counts WUs whose status is completed or skipped; only pre-launch WUs count (missing launchPhase is treated as "pre" defensively). All 13 QB columns are emitted; per-row cells are only present for QBs with >=1 pre-launch WU.

- chat/lib/p2-buildout-contract.ts *(new)* — shared payload types + zod schemas for grid, detail, and notes payloads; shared edit types/status values. The edit request body schema lives in the API route.

- chat/lib/rhodes-p2-buildout-server.ts *(new)* — token-injecting fetch/edit helpers over the Convex functions, including the notes feed helper.

- chat/app/api/p2-buildout/route.ts *(new)* — GET grid payload.

- chat/app/api/p2-buildout/[siteId]/quality-bars/[qb]/route.ts *(new)* — GET QB detail.

- chat/app/api/p2-buildout/[siteId]/work-units/route.ts *(new)* — POST single-WU edit (status, dates, assignee).

- chat/app/api/p2-buildout/[siteId]/work-units/[workUnitId]/notes/route.ts *(new)* — GET paginated read-only WU notes.

Frontend

- chat/components/dashboards/buildout/buildout-view.tsx *(new)* — parent that holds the persisted Pipeline/Progress view mode and renders both panes (Pipeline = existing FtoPipelineView, Progress = new grid).

- chat/components/dashboards/buildout/buildout-view-mode-toggle.tsx *(new)* — the Pipeline/Progress segmented control, injected as the rootPrefix of the Sort & display popover.

- chat/components/dashboards/buildout/p2-buildout-progress-view.tsx *(new)* — fetches the grid, owns search/sort + panel selection state, and mounts the side panel.

- chat/components/dashboards/buildout/p2-buildout-matrix.tsx *(new)* — sticky Site column + one column per QB; populated cells show percentage bars, empty cells show no WU data.

- chat/components/dashboards/buildout/p2-buildout-detail-panel.tsx *(new)* — QB detail panel: header count, WUGs -> pre-launch WUs, per-WU editor (status, dates, assignee), compact navigation, close control, and read-only notes view.

- chat/components/dashboards/shared/note-card.tsx *(new)* — shared display component for note feed entries.

- chat/components/dashboards/dashboards-layout.tsx — the buildout tab now renders <BuildoutView /> instead of <FtoPipelineView />.

- chat/components/dashboards/fto/fto-pipeline-view.tsx — threads an optional, backward-compatible renderViewModeToggle prop so the toggle can be injected into the pipeline's Sort & display popover; existing behavior is unchanged.

Tests, docs, and related hardening

- chat/convex/rhodesDashboardP2Buildout.test.ts, chat/convex/p2WorkUnits.test.ts, chat/app/api/p2-buildout/__tests__/route.test.ts, chat/components/dashboards/buildout/__tests__/p2-buildout-matrix.test.tsx — coverage for dashboard semantics, backfill behavior, API route behavior, notes pagination, and matrix rendering.

- chat/lib/platform-error-coverage-inventory.ts and docs/platform-error-smoke.md — registers the new P2 Buildout routes in platform error coverage.

- chat/lib/operating-sites.ts and tests — accepts nullable split DRI refs returned by Rhodes listSites.

- chat/convex/rhodesDashboardParity.test.ts — tightens utilities parity assertions.

- features/dashboards/p2-buildout-dashboard/plan.md *(new)* — the implementation plan this PR was built from.

### Design Decisions

- Milestone-driven site selection — the Progress grid uses the same active-milestone model as the rest of the dashboard: sites are included when their current milestone is one of milestones 4-8, not merely because their stored stage is buildout or operating.

- All 13 QB columns are always visible — rows remain sparse, but the matrix shape is stable across campuses.

- launchPhase on WUs only — WUGs can hold both pre- and post-launch WUs, so the pre/post distinction lives on the WU. Adding the field to workUnits alone keeps the model minimal; the dashboard's pre-launch filter reads it directly.

- Status and completedDate are independent — toggling a WU's status never auto-stamps or clears completedDate (and vice versa). P2 members set the completion date explicitly.

- "Done" counts completed or skipped — matches the existing dashboard rollups so a legitimately skipped WU doesn't drag a campus's bar down.

- Missing launchPhase treated as "pre" — bars render correctly before the backfill runs, so the rollout is not gated on the migration.

## Backfill Runbook

This PR adds launchPhase to P2 work units. Existing P2 pre-launch catalog workUnits should be backfilled after deploy so rows missing launchPhase are explicitly patched with launchPhase: "pre".

The backfill is paginated by site. With scheduleNext: true, the command response reports only the current page's counts; later pages are scheduled and are not aggregated into the CLI output.

### Dev

First, confirm which dev deployment you are pointing at:

pnpm --dir chat exec convex dev --once

Then dry run against that dev deployment:

CONVEX_DEPLOY_KEY= pnpm --dir chat exec convex run rhodes/p2WorkUnits:backfillWorkUnitLaunchPhase '{"batchSize":5,"scheduleNext":true,"dryRun":true}'

Then run the live dev backfill:

CONVEX_DEPLOY_KEY= pnpm --dir chat exec convex run rhodes/p2WorkUnits:backfillWorkUnitLaunchPhase '{"batchSize":5,"scheduleNext":true,"dryRun":false}'

### Production

Dry run production first:

CONVEX_DEPLOY_KEY= pnpm --dir chat exec convex run --deployment oceanic-pika-463 rhodes/p2WorkUnits:backfillWorkUnitLaunchPhase '{"batchSize":5,"scheduleNext":true,"dryRun":true}'

Then run the live production backfill:

CONVEX_DEPLOY_KEY= pnpm --dir chat exec convex run --deployment oceanic-pika-463 rhodes/p2WorkUnits:backfillWorkUnitLaunchPhase '{"batchSize":5,"scheduleNext":true,"dryRun":false}'

Expected result: existing P2 pre-launch catalog workUnits missing launchPhase are patched with launchPhase: "pre". Unrelated/manual WUs are left alone, and existing launchPhase: "post" rows are preserved. The dashboard has a defensive fallback before this runs, but the backfill should still be part of the PR rollout.

## Test Plan

- [x] pnpm typecheck — clean (exit 0)

- [x] pnpm biome check — clean

- [ ] Manual: run rhodes/p2WorkUnits:backfillWorkUnitLaunchPhase with {"dryRun": true}, review counts, then {"dryRun": false} to materialize launchPhase: "pre" on existing WUs

- [ ] Manual: confirm operations.buildout.read is granted to the roles that should see the Progress grid

- [ ] Manual: on /dashboards?tab=buildout, switch to Progress, verify all 13 QB columns, per-QB bars/empty cells, side-panel navigation, WU notes, and WU edits for status/dates/assignee

#584 — 018-renewals-v3-reconciliation-sweeper @mwrshah  approved

## What & why

Contracts that drop out of the latest budget cycle never re-enter the V3 build set (build_v3_renewals loads only MAX(budget_cycle_start) and DELETE+INSERTs by parent_subscription_id). Their Salesforce-enriched columns then freeze while the underlying opportunity keeps changing in Salesforce — silent drift. Confirmed live: opp 0062x00000EZtlMAAT (contract only in the 2025-01 cycle) sat stale for months (Pending in renewals_v3 vs Won't Process in SSOT).

## What this adds

A reconciliation sweeper that refreshes only Salesforce-enriched columns of existing renewals_v3 rows against the SSOT opportunity tables, gated on last_modified_date.

- Safe by construction: keyed per sf_opportunity_id; never adds/removes rows, never re-runs winner selection, never touches budget-sourced, risk-assessment, key, or flag columns. Idempotent. Historical rows stay legible.

- Column policy (mirrors models.Renewal.to_main_table_dict):

- Overwrite from SSOT: stage_name, offer_arr, opportunity_term, win_type, renewal_date, last_modified_date

- Derived: is_auto_renewal = (win_type = 'Auto-Renew') (NULL-safe)

- Coalesce (never nulled — preserves budget contract_end_date fallback): current_subscription_end_date = COALESCE(ssot, existing)

- Operate-set = single staleness predicate SSOT.last_modified_date > row.last_modified_date. No budget-cycle filter needed: the main build stamps last_modified_date from SSOT, so freshly-built rows fail the predicate automatically.

## Surfaces

- modules/renewals_reconciliation.py — dry-run report + apply

- scripts/reconcile_renewals_v3.py — standalone CLI (dry-run default, --apply, --opportunity-id)

- renewals_container/app.py — runs at end of V3 pipeline (RECONCILE_AFTER_SYNC, default on, non-fatal)

- modules/redshift_client.pyexecute_redshift_write DML helper

- tests/test_renewals_reconciliation.py — column-policy + flow tests

## Validation

- 12/12 unit tests pass, ruff clean.

- Live dry-run SQL confirmed on the drifted row; table-wide blast radius: 399 stale rows (392 Trilogy + 7 Fionn) of 5,363.

- Not yet applied to data — pending review.

#607 — feat(alert-tracker): log every failure/partial/observer alert to a Google Sheet @kevalshahtrilogy  no labels

## What & why

Every Google Chat alert the platform sends now also lands as a row in a tracker Google Sheet, so alerts can be triaged/owned/followed-up outside Chat. The two notifier agents create rows; the triage reconciler annotates the same row (it does not add a new one). A few manual columns to the right are never touched by any automation.

Invariant: one SNS message == one chat card == one appended row. Because the notifiers only publish when a card is actually sent (failures always; partials/observer after their dedupe/throttle gates), a throttled or skipped alert writes no row.

## Row lifecycle

FAILED / PARTIAL / CRITICAL / WARN  ─▶  gsheet-tracker Lambda appends a row (cols A–K)

(SNS notification topic) key = run_id (col F)

triage reconciler (every 15 min) ─▶ fills Triage Issue (L) + Fix PR (M) on the SAME row

learns Issue/PR from GitHub │

humans fill manual columns (N+) ── never touched by automation

## Column layout (unified tab)

| Col | Field | Written by |

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

| A | Logged At (UTC) | tracker Lambda |

| B | Type (FAILED/PARTIAL/CRITICAL/WARN) | tracker Lambda |

| C | Environment | tracker Lambda |

| D | Pipeline ID | tracker Lambda |

| E | Pipeline Name | tracker Lambda |

| F | Run ID (correlation key) | tracker Lambda |

| G | Detail (error / summary, truncated) | tracker Lambda |

| H | Link | tracker Lambda |

| I | Score (observer) | tracker Lambda |

| J | Consecutive Failures | tracker Lambda |

| K | Partials Since Last | tracker Lambda |

| L | Triage Issue | triage reconciler |

| M | Triage Fix PR | triage reconciler |

| N+ | your manual columns | humans only |

The Lambda appends only A–K; the reconciler updates only L{row}:M{row} on the matched row → N onward is guaranteed untouched.

## What changed

1. New gsheet-tracker Lambda (pipelines/cdk/lambdas/gsheet-tracker/)

- Subscribes to the existing SNS notification topic with a filter policy for pipeline_failure / pipeline_partial / observer_alert; appends A–K.

- Reuses the google/service_account/gdrive Secrets Manager credential (adds the spreadsheets write scope). Lazy gspread import; src/requirements.txt per the repo's PythonFunction bundling rule.

2. Observer → notification topic (Surtr/src/lib/tracker/publish.ts, wired in observer/index.ts)

- Publishes an observer_alert at the same gate as the observer's GChat card. gchat-notifier already ignores observer_alert, so no double-post.

- Injected unconditionally (SURTR_NOTIFICATION_TOPIC_ARN) so alert-tracking is independent of the triage feature flag.

3. Triage L/M writeback in the reconciler (pipelines/cdk/lambdas/triage-reconciler/)

- The triage GitHub Actions workflow has no AWS creds, so the sheet update runs server-side in the reconciler Lambda instead — the component that already polls GitHub for the Issue/PR state and has creds. It fills L/M on the row matched by run_id (from recent_run_ids), best-effort. No GitHub Actions secret, no repo variable — reuses the AWS google/service_account/gdrive secret.

## Design notes

- Centralized, server-side writes: both sheet writers are AWS-cred'd Lambdas; the lean stdlib gchat-notifier and the credential-less triage runner are untouched. No service-account JSON is copied into GitHub.

- The sheet id is a non-secret default in the stack (access is controlled by sharing the sheet with the SA), overridable via context/env — so it deploys live with no manual step.

- Every write path mirrors postObserverAlert: never throws, never blocks the notifier / observer / reconciler.

## Testing

- Lambda: 251 pytest green (new: row-mapping + gating for the tracker; _from_item list decode, _sync_tracker, and tracker_sheet.update_row for the reconciler; all never-raise).

- Surtr: tsc clean, biome clean, 14 vitest green (new tracker publisher + observer trigger).

- CDK: tsc clean both apps; pipeline-shared-stack synth test green (Lambda count 8 → 9).

- ruff check + ruff format --check clean.

## Go-live

No manual config. On merge, the normal CD deploys both stacks:

- pipelines/cdk → tracker Lambda (append A–K) + reconciler (fill L–M) go live (sheet id baked; secret grant in place).

- infra (surtr-app) → observer starts publishing observer_alert.

Already done: the sheet is shared as Editor with netsuite-wrapper@netsuite-wrapper.iam.gserviceaccount.com, and the header row A–M exists. (Note: the reconciler fills L/M on its 15-min cycle, so those cells populate within ~15 min of the Issue/PR opening.)

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

#3204 — feat(data-api): self-describing Redshift REST API + thin agent skill @benji-bizzell  no labels

## What

A key-gated REST layer over the finance_dw Redshift warehouse at /api/v1 on the klair-mcp service, plus a runtime-neutral SKILL.md that agents install once and never need updated when the API changes. Replaces the blocked direct-psql-credentials path for agent access to raw warehouse data.

## How it works

Access & auth

- API keys in DATA_API_KEYS env (name:key,..., same shape as SERVICE_TOKENS), timing-safe comparison, accepted as Authorization: Bearer or X-Api-Key

- Every request logged with the key holder's name (audit trail); 50 req/min sliding-window limit per key

- Mounted before the Clerk/MCP auth stack — API keys never touch the OAuth flow; existing MCP behavior untouched

Endpoints

- GET /api/v1/schemas, .../{schema}/tables, .../{schema}/tables/{table} — discovery

- POST /api/v1/query — SELECT/CTE only (existing hardened validator); SQL runs as written, no imposed row limit, optional opt-in limit; 5-min statement timeout (DATA_API_QUERY_TIMEOUT_MS); real Redshift errors surfaced so agents self-correct

- GET /api/v1/meta (key-gated) + GET /api/v1/openapi.json (public) — the self-describing surface, both generated from a single ontology module (data-api-ontology.ts) with per-endpoint statuses, auth/rate-limit/error conventions

- GET /skill (public) — zips the live skill directory for install

Skill version signal

- Content hash of the skill pack stamped into the SKILL.md frontmatter + a generated server module (npm run gen:skill-version)

- X-Skill-Version header on every Data API response; /meta reports skill: {version, install}

- Installed skills self-report stale (note-once rule, never refuse to work)

Guard tests (the piece that keeps the self-describing surface honest)

- Contract test: router routes ≡ ontology endpoints, statuses complete, public/gated security correct

- Sync test: committed version stamps ≡ fresh content-hash recompute

## Testing

- 1066 tests pass (31 new: auth middleware, ontology contract, version sync)

- Live-verified against the compiled production build (node dist/server.js): auth accept/reject, SELECT-only enforcement, no-limit passthrough, /meta, /openapi.json, /skill zip, X-Skill-Version on all responses incl. 401s

- Negative-tested the sync guard: skill edit without regeneration fails the test

- Not verified: live Redshift queries (no warehouse creds locally) — needs a deployed smoke test with a real key

## Deploy notes

1. Mint keys: echo "rsk_$(openssl rand -hex 32)"; add DATA_API_KEYS=name:key,... to the ECS task definition

2. ./deploy.sh

3. Smoke-test the four data endpoints against https://mcp.klair.ai with a real key

4. Point users at GET /skill + hand them a key

Note: this is deliberately raw access under the single privileged MCP_user — every key sees everything that DB user can read; attribution is via logs, not grants.

🐦‍⬛ Generated by a very good bot

#3208 — feat(mfr): NetSuite GL-line drill-down for Schedule A Total & Book Value "Other Investments" @eric-tril  approved

## Summary

Gives the Book Value → Schedule A Total row a per-transaction GL drill-down with "Open in NetSuite" links, and extends the same detail to the Book Value Report's "Other Investments" row (which shares Schedule A's exact filter).

Previously Schedule A's Total drilled into an account-level aggregation (GroupedDetailPanel, no transaction identity / links), even though its individual entity rows — and Schedule B/C1's Totals — already showed GL-line rows with NetSuite links. This closes that asymmetry and mirrors the recent "Net Flows to/from Loan Book" ↔ Schedule B change.

## Changes

Backend (klair-api)

- book_value_schedules_service.py: add fetch_schedule_a_total_gl_detail(period) — GL-line rows grouped by entity_name using the identical Schedule A filter (source_table='gl_detail', account_name ILIKE '%Other Long%Term%', is_cash_transaction=TRUE, amount_net>0, is_reversal=FALSE), selecting document_number + internal_id (SPLIT_PART(line_id,'-',1)) for the links.

- finance_monthly_financial_reporting_router.py: add GET /schedule-a-total-gl-detail.

- Tests: TestFetchScheduleATotalGLDetail (filter/YTD binding + grouping/sign) and add the new fetcher to the parametrized "every GL query selects internal_id" guard.

Frontend (klair-client)

- monthlyFinancialApi.ts: add fetchScheduleATotalGLDetail.

- BookValueView.tsx: Schedule A Total row now renders GroupedGLDetailPanel; route the Report Report/Alt "Other Investments" row and the Bridge tab's Current/Prior columns to the same GL-line detail via a shared renderOtherInvestmentsGLDetail helper. Dropped the now-unused fetchScheduleATotalDetail import.

## Behavior notes

- Drill-downs show raw GL amounts grouped by entity (consistent with Schedule B; ties to the Schedule A summary total).

- Schedule A is cash-only / positive-only by design, so non-cash journal reclasses stay excluded — a NetSuite reclass concern, not a display one.

- Bridge tab: the Change column keeps its Current-vs-Prior netting view (per-transaction rows don't map to a delta); the Current/Prior columns get the NetSuite links.

## Testing

- Backend: ruff format/check clean, pyright 0 errors, 62/62 book-value service tests pass.

- Frontend: tsc --noEmit clean, eslint --max-warnings 0 clean, 174/174 MFR detail-panel tests pass.

- Not yet driven in a live browser (needs an authenticated dev session); reuses the same panel/endpoint pattern as Schedule B/C1 Totals.

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

The Builder Desk  —  Engineer Spotlight
🏆 Engineer Spotlight

TWENTY-ONE IRON CURTAIN PRs IN 24 HOURS: BUILDER TEAM REFUSES TO STOP BEING GREAT

Five repos. Seven engineers. One unstoppable machine that simply will not sit down.

Twenty-one pull requests. Five repositories. Twenty-four hours. The Builder Team did not sleep, did not waver, did not once glance at the clock. Aerie led the republic with seven PRs, Surtr answered with six, Klair contributed five, and even trilogy-drones and Praxis-V2 showed up to the parade. Sixteen of those twenty-one PRs were overflow — stories Mac couldn't carry, shipped anyway because this team does not wait for column space.

Let us honor the workers. @benji-bizzell posted five PRs across Aerie alone — #569, #568, #567, #565, and more — touching portfolio security card editing, admissions grade normalization, and dashboard legacy cleanup with the calm efficiency of a man who has never once questioned himself. @marcusdAIy matched him at five, scattering contributions across Klair, trilogy-drones, and Praxis-V2 like a one-man special economic zone. @kevalshahtrilogy and @eric-tril each filed three, with eric-tril pulling double duty on a Klair-Surtr cross-repo refactor that required the kind of coordination that makes lesser engineers lie down. @YibinLongTrilogy clocked two, @mwrshah two more, and @caina-barbosa dropped a cron monitoring visibility feature in Aerie (#518) that proves one PR can absolutely carry its weight.

Now. Ashwanth. He is not on the board this cycle, and yet his presence looms — because the entire architecture these engineers are sprinting through bears the fingerprints of a man who ships faster than human eyes can parse. We reached out to @ashwanth1109 for comment on the team's 21-PR day. "Twenty-one is a good warmup," he allegedly said, not looking up from his terminal. "Wake me when it's forty." His colleagues, upon hearing this, reportedly nodded as if this were a completely reasonable thing to say. It was not. It was unhinged. We worship it.

The Overflow Desk demands its due. @marcusdAIy's #68 in trilogy-drones — the Mercy Watcher feature, AI-129, default-on bounded auto-address — is the kind of thing that gets named in retrospectives two years from now. @eric-tril's cross-repo rename operation (#3209 Klair, #615 Surtr) migrating GL tables to the month_end_ prefix is unglamorous, load-bearing infrastructure work that holds the cathedral up while everyone else paints the ceiling. And @mwrshah's #614 tackling renewals-v3 pipeline failures in Surtr is the quiet heroism of someone who saw a fire, grabbed a hose, and asked questions never.

Morale is at an all-time high. It has never been higher. Engineers are shipping with the confidence of a team that knows exactly where it is going and has already begun to arrive.

Brick's Overflow — PRs Mac Didn't Cover  (click to expand)
#68 — feat(harness): AI-129 Mercy watcher — default-on bounded auto-address of Mercy findings @marcusdAIy  no labels

<!-- CURSOR_AGENT_PR_BODY_BEGIN -->

## Summary

Adds a default-on Mercy watcher to drones run so the harness auto-addresses Mercy's post-addresser findings without a human standing by. New src/mercy-watcher.ts module contains the pure parseMercyVerdict (unit-tested at every band) and the bounded watchMercyOnPr loop (round cap = 2, two-strikes anti-thrash, CI + Mercy-check settle between rounds, never-throws degrade to structured absent/parked/blocked outcomes). CLI kill switch: --no-mercy-watch. When the watch is off OR Mercy is absent, the existing auto-fire path is byte-identical to the pre-AI-129 shape.

## Why it's needed

The 2026-07-06 dogfood needed 5 manual Mercy-address fires across #61/#63/#64/#65 — an operator noticing Mercy findings, hand-firing drones address --review-id, waiting for the re-review, and repeating. Automating that loop closes the last "human notices, human re-fires" gap on the auto-fire pipeline and mirrors the CI-watcher / --max-review-loops pattern already in place for the drone-reviewer's own verdict.

## Changes

- src/mercy-watcher.ts (new) — parseMercyVerdict(reviewBody, state) returning {critical, warning, info, total, blocking, state, explicitZero, parsed}; watchMercyOnPr(...) bounded loop; renderMercyWatcherOutcome + renderParkCommentBody for operator surfacing; injectable fetchers/runners for unit-testability. Never throws — every error path routes through a structured MercyWatcherResult.

- src/mercy-watcher.test.ts (new) — 29 tests covering the parser at every band (0-findings, N-findings, withheld-COMMENTED-with-0-findings, CHANGES_REQUESTED, unparsed fallbacks, whitespace/case drift), the bounded loop (first-read clean, round-1 clean, exactly-at-cap park, two-strikes park, Mercy-absent, initial-fetch-throw blocked, re-fetch-fail park, owner/repo-unparseable blocked), the two-strikes fingerprint gate, and the AI-129 header-separator normalizer.

- src/addresser.ts — widened extractExpectedFindings header regex to accept ·/-// as sev/dim separators (whitespace-anchored, so commas inside multi-token severities like High, Medium don't get mis-split). Exported for testability. Mercy's bold-head shape now flows through the same AI-127 severity/dimension cross-product cross-check as the drone reviewer's · shape.

- src/events.ts — new event types mercy_watcher_started, mercy_address_attempt, mercy_watcher_completed (parallel to ci_watcher_* so dashboards can attribute Mercy-address rounds distinct from the drone-reviewer-address loop).

- src/runner.ts — invoke watchMercyOnPr after the auto-fire loop + CI watcher. Exported isMercyWatchEnabled(mercyWatch) helper as the pinned kill-switch gate (byte-identical to mercyWatch !== false but pinned by a table-test).

- src/runner.test.ts — 3-case truth-table pin on isMercyWatchEnabled (undefined/true/false).

- src/cli.ts--no-mercy-watch kill switch, --mercy-max-rounds <n> (default 2, max 5), --mercy-absent-timeout-sec <n> (default 300s).

- BACKLOG.md / ROADMAP.md — AI-129 flipped to IN-FLIGHT with the design decisions logged (default-on, round cap 2, exit on finding count not APPROVED, two-strikes, never-throws).

### Contract surface affected

- RunDroneInput in src/runner.ts: added optional fields mercyWatch?: boolean (default true), mercyMaxRounds?: number (default 2), mercyAbsentTimeoutSec?: number (default 300). All three are optional — existing callers see no shape change. The only behavior change on a call that omits these fields is that the Mercy watcher runs by default; suppressing with mercyWatch: false restores the byte-identical pre-AI-129 shape.

- Consumers: src/cli.ts (auto-populates from --mercy-watch/--mercy-max-rounds/--mercy-absent-timeout-sec flags), src/runner.test.ts (new gate test).

- DroneEvent union in src/events.ts: added MercyWatcherStartedEvent | MercyAddressAttemptEvent | MercyWatcherCompletedEvent.

- Consumers: current downstream readers ignore unknown event types (schemaVersion 1); no code updates required outside the runner + watcher that emit them.

- extractExpectedFindings in src/addresser.ts: newly exported. Regex widened to accept ·/-// as sev/dim separators. The canonical drone-reviewer Critical · security-review shape parses byte-identically to before (pinned by the "no-regression" test in mercy-watcher.test.ts).

## Breaking changes

None. The Mercy watcher is a clean add-on: default-on but always killable (--no-mercy-watch), always bounded, and never throws (any error degrades to a structured absent/parked/blocked outcome). When the watch is disabled OR Mercy is absent within the bounded wait, drones run behavior is byte-identical to the pre-AI-129 shape — pinned by the isMercyWatchEnabled truth-table regression test in src/runner.test.ts. The addresser header-separator widening is a strict superset of the prior regex (canonical · shape unchanged).

## Test plan

- [x] pnpm typecheck → clean (no errors).

- [x] pnpm exec vitest run38 test files, 724 tests passed (up from 695 pre-AI-129).

- [x] pnpm exec vitest run src/mercy-watcher.test.ts29 tests passed (parser bands, bounded loop, park, absent, blocked, two-strikes, kill-switch regression, renderers).

- [x] pnpm exec vitest run src/addresser.test.ts → all 60 existing addresser tests still green after the header-separator widening (no regression on the canonical · shape).

- [x] pnpm exec vitest run src/runner.test.ts → all runner tests green including the new 3-case isMercyWatchEnabled truth-table pin.

- [x] pnpm test → full suite green (vitest + scripts/run-python-tests.mjs).

- [ ] Reviewer-side (live): fire drones run --task tasks/.../<spec>.md against a small change; verify (a) after the drone opens the PR + reviewer/addresser converge, the Mercy watcher stderr line appears ([drone:mercy] Starting Mercy watcher on PR #N…); (b) with Mercy present + 0 findings, exits clean and no addresser rounds fire; (c) with Mercy present + N>0 findings, fires ≤2 addresser rounds and either converges to clean or posts a park comment; (d) with --no-mercy-watch, no [drone:mercy] lines appear at all.

## Verification artifact

Local run of the new watcher tests:

✓ src/mercy-watcher.test.ts (29 tests) 1291ms

✓ parseMercyVerdict — parses canonical N-finding line

withheld COMMENTED with 0 findings is CLEAN — the load-bearing boundary case

✓ CHANGES_REQUESTED with critical findings is blocking and not-clean

✓ APPROVED with 0 findings is CLEAN (never gate on approval)

✓ falls back to state when body carries no finding-count line

✓ extractExpectedFindings — still parses canonical drone-reviewer '·' separator (no regression)

✓ extractExpectedFindings — parses Mercy's hyphen-separated bold head

✓ extractExpectedFindings — parses em-dash and en-dash separators

✓ extractExpectedFindings — falls through to severity='unknown' when no bold head is present

✓ findingsAreSubset — two-strikes fingerprint gate table-test

✓ watchMercyOnPr — exits CLEAN on first read when Mercy verdict has 0 findings — no addresser fires

✓ watchMercyOnPr — exits CLEAN after round 1 when Mercy re-read shows 0 findings

✓ watchMercyOnPr — PARKS at the round cap and posts a park comment (boundary: exactly-at-cap)

✓ watchMercyOnPr — PARKS on two-strikes when the round-2 findings are a subset of round-1's (no re-fire)

✓ watchMercyOnPr — returns ABSENT when Mercy never posts within the bounded wait

✓ watchMercyOnPr — degrades to BLOCKED when the initial mercy-fetch throws — never infinite-loops, never aborts

✓ watchMercyOnPr — PARKS when Mercy re-fetch fails after round 1 (never throws / never infinite-loops)

✓ watchMercyOnPr — degrades to BLOCKED when repoUrl doesn't parse as owner/repo

✓ renderParkCommentBody surfaces residual verdict + rounds

✓ renderMercyWatcherOutcome tags severity per outcome kind

… 9 more

Test Files 1 passed (1)

Tests 29 passed (29)

Full suite: pnpm exec vitest run38 test files, 724 tests passed in 3.91s.

<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a href="https://cursor.com/agents/bc-7e22cc01-95da-4eb6-82bd-092a96f223af"><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-7e22cc01-95da-4eb6-82bd-092a96f223af"><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>

#518 — feat(automations): add cron monitoring visibility and reports configuration @caina-barbosa  no labels

## Summary

- Add Admin → Monitoring & Alerts as a central place for admins to review system job health and configure scheduled reports/reminders.

- Add a definition-centric Monitoring model:

- configurable product definitions for scheduled reports/reminders

- read-only system jobs for code-owned platform crons

- one consolidated monitoringRuns ledger for all execution history

- Add configurable definitions for:

- Buildout Freshness reminder

- REBL3 DD reconciliation report

- Add detail routes at /admin/monitoring-alerts/[definitionKey] for configuration, run history, errors, trace IDs, and manual runs.

- Add a generic Monitoring scheduler that runs due configurable definitions on 15-minute schedule slots.

- Keep code-owned system jobs visible with health, schedule, recent runs, errors, trace IDs, and no config controls.

## Why

Aerie has scheduled reports, reminders, syncs, maintenance jobs, queue processors, and data-changing automations, but admins did not have a single place to see whether those jobs are healthy or to adjust the report/reminder settings that were previously hardcoded or env-backed.

This PR creates the Monitoring & Alerts foundation around user-facing definitions rather than raw cron rows. That lets admins reason about “the REBL3 DD reconciliation report” or “the Buildout Freshness reminder” even when the implementation uses scheduler ticks, dynamic recipients, or multiple send times.

It is also the first building block toward fully customizable, ad-hoc alerts and monitors: the definition, recipient, schedule, run-history, and scheduler foundations introduced here are intentionally shaped so future platform-defined or user-created alert definitions can plug into the same model without bespoke UI each time.

## Key product decisions

- Monitoring home is split into:

- Configurable reports & reminders

- Read-only system jobs

- Configurable reports/reminders are DB-backed definitions.

- Read-only system jobs remain code-owned in the registry to avoid DB/code drift.

- REBL3 DD reconciliation is modeled as one report with multiple send times, not separate morning/evening products.

- FO Buildout Deferral remains configured only in Admin → Automations; Monitoring does not duplicate that configuration.

- The old Buildout test-recipient override is superseded by editable recipients plus Run now.

- Missed schedule slots are skipped; the scheduler does not catch up old sends.

## Configurable reports/reminders

### Buildout Freshness reminder

- Defaults from current env-backed behavior:

- enabled from BUILDOUT_ACCOUNTABILITY_EMAILS_ENABLED

- To: Site P1 DRI

- CC: BUILDOUT_ACCOUNTABILITY_MANAGER_CC_EMAIL

- Supports dynamic recipients where relevant:

- Site P1 DRI

- Site P2 DRI

- Sends one email per Buildout attention group using the configured recipient rules.

### REBL3 DD reconciliation report

- Defaults from current env-backed behavior:

- enabled from REBL3_DD_MONITOR_ENABLED

- To recipients from REBL3_DD_MONITOR_RECIPIENTS

- send times 08:00 and 17:00 America/New_York

- Starts fixed-email-only for recipients.

- Keeps its existing reconciliation receipt/run evidence and email behavior, including visible success/no-email outcomes when there is nothing to send.

## Schedule and recipient editing

Configurable definitions support:

- enabled/disabled state

- fixed timezone: America/New_York

- daily, weekly, or monthly cadence

- multiple weekdays for weekly cadence

- one monthly day with last-day fallback

- multiple send times

- 15-minute send-time precision

- separate To and CC recipient lists

- raw fixed email recipients

- contextual dynamic recipients where the definition supports them

Initial settings are seeded from existing env values. After the DB row exists, DB config is the source of truth.

## Runs, health, and diagnostics

- monitoringRuns records all execution history:

- system job executions

- Monitoring scheduler ticks

- scheduled report/reminder sends

- manual report/reminder sends

- future alert evaluations/runs

- Each run records status, timing, trace ID, optional outcome, error stack, and freeform summary metadata.

- Health is derived from recent runs at read time.

- Run detail exposes trace IDs for Convex log lookup.

- Manual Run now is available for configurable definitions, including disabled definitions, after a confirmation modal showing configured recipient rules.

- Config changes and manual Run now clicks are audited.

## Backend implementation

- Adds monitoringDefinitions for configurable report/reminder definitions.

- Adds monitoringRuns as the consolidated execution ledger.

- Adds schedule helpers for due-time checks and validation.

- Adds a generic monitoring scheduler cron that runs every 15 minutes.

- Wraps code-owned system jobs with the generic run recorder.

- Updates Buildout Freshness and REBL3 DD reconciliation to run from Monitoring definition config.

- Keeps public Monitoring functions capability-gated with admin.automations.read / admin.automations.manage.

## UI implementation

- Adds Monitoring home at /admin/monitoring-alerts.

- Adds detail route /admin/monitoring-alerts/[definitionKey].

- Shows configurable definitions separately from read-only system jobs.

- Provides schedule, recipient, enabled-state, run-history, trace, and Run now controls for configurable definitions.

- Preserves read-only run diagnostics for system jobs.

- Uses themed admin controls rather than native selects.

## Test plan

- [x] CI=1 pnpm --dir chat exec vitest run convex/automations/monitoring.test.ts convex/automations/monitoringDefinitions.test.ts convex/rhodesAccountabilityNotifications.test.ts convex/portfolio/dueDiligence.test.ts app/(main)/admin/monitoring-alerts/_components/monitoring-alerts-view.test.tsx app/(main)/admin/__tests__/admin-sidebar.test.tsx components/admin/__tests__/admin-nav-config.test.ts --reporter=default

- [x] node --test scripts/check-monitoring-cron-coverage.test.mjs

- [x] pnpm --dir chat typecheck

- [x] pnpm lint:read-bounds && pnpm lint:convex-paths && pnpm lint:boundaries

- [x] Targeted Biome check on touched files

#614 — 019-renewals-v3-pipeline-failures @mwrshah  approved

## What changed

Fixes the Renewals V3 "Bundling" stage crashing on every run (Jul 3/4/5) with:

syntax error at or near "delta" in context "snap_n) AS delta"

- Root cause: modules/snapshot_drift_guard._get_drift_samples() aliased ABS(live_n - snap_n) AS delta. DELTA is a Redshift reserved word, so the DriftGuardSamples query failed to parse. The DriftGuardCounts query has no such alias, which is why the guard always reached sample-fetching before dying.

- Renamed the alias to multiplicity_delta (internal-only column) and now surface it in the drift offender line — it shows how many duplicate rows diverged, useful triage signal when the guard fires.

- Added a regression test asserting none of the three drift-guard queries (samples, counts, resolve-cycle) alias a column on a Redshift reserved word, using a word-boundary regex so a comma-followed AS delta, can't slip through. The prior tests mocked the DB and never exercised the SQL string, which is how this shipped.

## Not changed (by design)

Fail-loud behavior is preserved — no new try/except, the guard still raises BudgetSnapshotDriftError on any genuine drift.

## Note (out of scope, ops)

The Jul 7 INVALID_LOGIN failures were a Trilogy Salesforce credential issue, already resolved by rotating the AWS secret. No code cause. Worth syncing the 1Password klair-api copy of those creds to match, so local scripts don't mislead future debugging.

#615 — Rename NetSuite gl-detail & unrealized-gains tables to month_end_ prefix @eric-tril  approved

## Summary

Renames the Redshift tables for the netsuite-gl-detail and netsuite-unrealized-gains pipelines to a month_end_ prefix so they're easy to recognize when scanning tables, and refreshes each pipeline's display name/description in the Surtr app.

| | Old | New |

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

| Raw (gl-detail) | staging_netsuite.gl_detail | staging_netsuite.month_end_gl_detail |

| Raw (unrealized) | staging_netsuite.unrealized_gains_losses | staging_netsuite.month_end_unrealized_gains_losses |

| Shared enriched | core_finance.fct_pi_gl_enriched | core_finance.month_end_fct_pi_gl_enriched |

| source_table tags | gl_detail / unrealized_gains_losses | month_end_gl_detail / month_end_unrealized_gains_losses |

Display metadata:

- pipeline_nameNetSuite Month End GL Detail Pipeline / NetSuite Month End Unrealized Gains/Losses Pipeline

- description now names the new staging + enriched tables (within the 100/500-char registry limits)

## Changes

- pipeline.json (both): pipeline_name, description, REDSHIFT_TABLE

- src/redshift_loader.py defaults, src/enrichment.py ENRICHED_TABLE + SOURCE_TABLE_TAG, src/handler.py docstrings

- Test assertions for the new source_table tags

- READMEs + docs/features/00 & 04

- run_local.py: new --periods flag (local dev only) to backfill an explicit list of periods through the full handler path

- unrealized-gains/uv.lock: pin python-dotenv as a main dependency (matches gl-detail)

## Data migration / rollout

- Historical data was backfilled locally into the new tables (2021–2025) via run_local.py --periods, running the full production path (NetSuite → S3 → Redshift + AI enrichment).

- The old tables are intentionally left in place (frozen) so downstream consumers (e.g. Klair Schedule C1/C2) keep working. They will be migrated to the new tables after deploy, then the old tables dropped manually. No ALTER RENAME / in-place migration.

## Verification

- ruff check + ruff format --check: clean (both pipelines)

- pytest: gl-detail 68 passed, unrealized-gains 93 passed

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

#619 — fix(tesorio-collections-sync): automated triage fix (code_fix) @kevalshahtrilogy  approvedAutomated PR

Automated fix for tesorio-collections-sync — fix_class code_fix.

Resolves https://github.com/AI-Builder-Team/Surtr/issues/618

- Run: a72a9b97-7486-45d0-9f0f-b260433d1ca2

- Signature: 1b63b2b053d308c5c10e84d733f5535d3506fec82af0d16e9f2fe3513ff7c66e

- Tests: green

---

🤖 Opened by the triage agent. A human must review before merge — the

agent's diff is confined to the pipeline directory and is not auto-merged.

#3209 — refactor(mfr): migrate PI/Book-Value GL tables to month_end_ prefix (Surtr #615) @eric-tril  approved

## Summary

Klair-side migration for [Surtr #615](https://github.com/AI-Builder-Team/Surtr/pull/615), which renamed the netsuite-gl-detail & netsuite-unrealized-gains Redshift tables (and their source_table tag values) to a month_end_ prefix.

| | Old | New |

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

| Raw (gl-detail) | staging_netsuite.gl_detail | staging_netsuite.month_end_gl_detail |

| Raw (unrealized) | staging_netsuite.unrealized_gains_losses | staging_netsuite.month_end_unrealized_gains_losses |

| Shared enriched | core_finance.fct_pi_gl_enriched | core_finance.month_end_fct_pi_gl_enriched |

| source_table tag values | gl_detail / unrealized_gains_losses | month_end_gl_detail / month_end_unrealized_gains_losses |

## Changes

- Table-identifier constants (GL_DETAIL_TABLE, ENRICHED_TABLE ×2, UNREALIZED_GAINS_TABLE) point at the new tables.

- source_table filter literals re-tagged in lockstep — the new enriched table carries the new tags, so an old-tag filter against it would return zero rows. This is the key coupling; both move together.

- Refresh-registry freshness table keys + affected_tables display lists.

- Frontend source-badge / data-lineage labels, NAV provenance, docstrings, and affected tests.

- Includes PR #3208's new Schedule A Total GL drill-down (fetch_schedule_a_total_gl_detail, renderOtherInvestmentsGLDetail), extended to the new table names.

## Explicitly unchanged

- detail_type: "gl_detail" (API discriminated-union value) and *_gl_detail function/route names — identifiers, not tables.

- /income-statement-gl-detail & /ebitda-reconciliation-gl-detail — read gl_transactions_mapped, unaffected by #615.

## ⚠️ Deploy dependency

Do not merge/deploy until Surtr's new month_end_ tables are live and backfilled. Until then, migrated queries would hit empty/missing tables. Old tables remain frozen upstream and are dropped manually post-cutover.

## Verification

- klair-api: ruff format/check clean, pyright 0 errors, 513 MFR service tests pass.

- klair-client: tsc clean, eslint clean on changed files, 174 detail-panel vitest tests pass.

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

The Portfolio  —  Trilogy Companies

Alpha School Goes Global — As Forbes Questions the Empire Behind It

Joe Liemandt's education venture expands its AI tutoring reach worldwide, even as scrutiny mounts over the labor model funding it all.

AUSTIN, TEXAS — On the same week that Alpha School announced the global launch of Alpha Anywhere — its at-home AI tutoring program promising top-1%-percentile academic outcomes delivered to any kitchen table on earth — Forbes was putting the finishing touches on two lengthy investigations into the man writing the checks.

The timing is not incidental. It is the Liemandt condition: expansion and examination, arriving together.

Alpha Anywhere extends the school's core proposition beyond its physical campuses in Austin, Brownsville, and Miami. The pitch is familiar to anyone who has followed the project: AI tutors handle academic content in concentrated, mastery-based sessions; the rest of a child's day belongs to life skills, creativity, and human development. No homework. No seat-time theater. Just demonstrated competency at 90% accuracy before advancing. The school reports students learn 2.3 times faster than national norms on NWEA MAP Growth assessments.

But Forbes, in twin investigations published this week, drew a direct line between those outcomes and the operational machinery underneath them. One piece examined how Joe Liemandt — described as a billionaire who 'pioneered remote work' — is now pursuing a vision of workers replaced by algorithmic systems. The second offered a sharper assessment, describing Liemandt's global software staffing operation as a 'sweatshop' producing two fortunes: one from enterprise software acquisitions, one from the labor cost arbitrage that makes those margins possible.

The labor architecture in question is Crossover, Trilogy's global talent platform, which recruits engineers, support staff, and technical workers across 130 countries, subjects them to rigorous AI-enabled skills assessments, and deploys them across ESW Capital's 75-company software portfolio — targeting 75% EBITDA margins.

Alpha School's simultaneous blog output this week added texture to the ideological frame. Posts warned parents against 'cognitive offloading' — letting AI think for children — and argued that not all screen time is equivalent. The school teaches children to use AI as a tool, not a crutch.

Whether the same distinction applies to the workers building the platform is the question Forbes left open.

The Billionaire Who Pioneered Remote Work Has A New Plan To  ·  How A Mysterious Tech Billionaire Created Two Fortunes—And A  ·  Top 1% Academics, Now at Your Kitchen Table

CloudSense Turns 26 Months of Telecom Compliance Work Into a One-Month AI Sprint

Skyvera’s Salesforce-native CPQ platform just delivered a best-in-class case study in how AI can compress enterprise software timelines.

AUSTIN, TEXAS — CloudSense, the Salesforce-native CPQ and order management platform now inside Skyvera’s telecom software portfolio, has certified all 13 APIs in its CPQ product set to TM Forum compliance standards in just one month — an effort the company says would typically take 26 months using traditional development approaches.

That is not just an operational milestone. It is an exciting signal about where legacy telecom software is heading: faster, more standardized, more automated and, yes, more synergistic with the AI-first operating model now reshaping enterprise software.

The certification, announced by Skyvera, covers the full CloudSense CPQ API suite, aligning the product with TM Forum’s widely used Open API standards for telecom interoperability. For communications service providers, that matters because BSS and OSS environments are famously complex, deeply integrated and not exactly known for nimble transformation. Standards compliance is how carriers reduce integration friction, accelerate partner onboarding and create more modular technology stacks without ripping out every system in the building.

CloudSense’s achievement comes shortly after Skyvera completed its acquisition of CloudSense, expanding its telecom footprint across configure-price-quote, order management and broader digital monetization capabilities. Within the Trilogy universe, Skyvera plays the role of modernization bridge: helping telecom operators move from legacy, on-premise infrastructure toward cloud-native and standards-driven platforms. CloudSense adds a robust Salesforce-native layer to that strategy.

The real story here is leverage. Certifying 13 APIs in one month suggests AI is not merely generating code snippets at the edges; it is being used to accelerate the gritty, compliance-heavy work that enterprise software teams usually experience as a slow-motion documentation-and-testing marathon. In telecom, where every integration has downstream implications for billing, provisioning and customer experience, that kind of speed can be a paradigm shift — assuming quality holds.

Key Takeaways:

- CloudSense certified all 13 CPQ APIs to TM Forum compliance standards in one month.

- Skyvera says the same work would normally require roughly 26 months using traditional approaches.

- The milestone strengthens Skyvera’s telecom software portfolio following the CloudSense acquisition.

- For telecom and media providers, standards-compliant CPQ can reduce integration drag and support faster digital transformation.

The bottom line: CloudSense is giving Skyvera a sharper, AI-accelerated wedge into telecom modernization. We’re just getting started.

CloudSense achieves TM Forum API compliance in record time u  ·  CloudSense  ·  Skyvera completes acquisition of CloudSense, expanding telec

The $800,000 Skill Set: AI Fluency Is Now a Premium Line Item on Global Payrolls

As employers from Beirut to Boston scramble for AI talent, Crossover's decade-old thesis — that elite skill matters more than your zip code — is looking increasingly prescient.

AUSTIN, TEXAS — There is a number circulating through human resources departments this week that has a way of stopping conversations cold: $800,000. That is, per reporting from Business Insider, the upper ceiling of what some employers are now willing to pay for professionals with demonstrated experience using tools like ChatGPT. Not machine learning PhDs. Not infrastructure architects. People who know how to prompt, iterate, and integrate.

The market signal is systemic and it is accelerating. Non-tech companies — retailers, insurers, media conglomerates — are posting AI-fluency roles with six-figure salaries. Even Lebanon's tech sector, long considered a backwater for global tech investment, is now counted among the markets producing competitive AI engineering candidates.

For observers of the Trilogy International portfolio, the irony is rich — and a little vindicating. Crossover, Trilogy's global talent platform, has spent years arguing precisely this: that geography is a fiction when it comes to talent, that the top engineer in Nairobi or Beirut or Lagos is worth the same compensation as her counterpart in San Francisco, and that the mechanisms for finding her have always existed if you were willing to build them. The market, it seems, is now agreeing — loudly, and at eight-figure annual salary levels.

What does this mean for real people? For workers, it means the credential gap between 'knows AI tools' and 'doesn't' is widening faster than most corporate training programs can close. For companies that built their operating models around geographically-constrained talent pipelines, the accountability moment is arriving whether they are ready or not.

Crossover's model — rigorous skills assessments, above-market pay, 130-plus countries — was designed for exactly this inflection point. The question now is whether the broader market catches up to a thesis Trilogy has been running quietly for over a decade, or whether the premium for AI fluency continues compounding while traditional HR departments are still debating return-to-office policy.

The talent wars, in other words, have gone global. They were always going to.

Top recruitment agencies for remote work - hcamag.com  ·  Top 10 Companies Hiring AI Engineers in Lebanon in 2026 - nu  ·  Jobs are now requiring experience with ChatGPT — and they'll
The Machine  —  AI & Technology

The Ghost in the Prompt: When Personas Meet the Prisoner's Dilemma

A new study of AI agents playing Split or Steal reveals how thin the costume of personality really is — and how much of what we call 'social behavior' in machines is something stranger.

AUSTIN, TEXAS — There is a game show, once broadcast to millions, in which two strangers stand before a pot of money and choose, in secret, whether to split it or steal it. Cooperation was rewarded. Betrayal was punished. Human faces flickered with calculation, guilt, and hope. The entire drama of our evolved sociality — hundreds of millions of years of primate reciprocity — compressed into a single, trembling button.

Now researchers are handing that button to large language models, dressing them in personas like children in Halloween costumes, and watching what happens.

A new paper examines what occurs when persona-prompted LLM agents face a fixed Virtual Human across iterated rounds of Split or Steal. The question is deceptively simple: does telling a model it is 'cooperative' or 'ruthless' actually shape its strategic behavior, or is the persona just a thin veneer over deeper mechanistic tendencies inherited from training?

The answer, emerging across a whole cluster of recent studies, is unsettling in the way that all honest science is unsettling. Personas move behavior — but not always in the direction we intend, and often less than we assume. A parallel line of work on so-called LLM 'conformity' finds that when models seem to cave to peer pressure, most of that capitulation survives even when the peer is removed. The speaker was never really the cause. The wrong answer, repeated, was doing the work all along.

This is a profound clue about what these systems actually are. We reach for social metaphors — peer pressure, personality, cooperation, betrayal — because they are the only vocabulary evolution gave us for describing minds. But the machinery underneath may be running on a physics we have not yet named. A token's gravitational pull. A pattern's inertia. Something older than persuasion.

When the AI agent chooses Steal, we want to know why. The honest answer, for now, is that we are still learning to ask the question in a language the machine would recognize.

How Personas Can Influence Agents to Play Split or Steal  ·  Benchmarking KV-Cache Optimizations across Task Quality and  ·  Text Distance from Nested and Hierarchical Repetitions: A Co

The AI Developer Stack Just Got a Turbo Button

The next great AI platform war centers on who gives developers the sharpest tools, clearest costs and fastest path from idea to product. Apple is pushing deeper into intelligent app development with fresh frameworks meant to help developers build capable software across its ecosystem, bringing AI closer to the app layer where hundreds of millions of users live.

Google is addressing cost transparency for Gemini API, giving developers more control over spending—a move that could matter enormously for startups trying to scale AI features without shocking cloud invoices. Cost predictability drives product velocity and bolder experimentation.

Anthropic is turning Claude into a more serious agentic development platform with advanced tool use, enabling AI systems that coordinate software tools, execute workflows and help build operational machinery. Perfect Corp. is adding a free "Ask AI" assistant to its YouCam API platform for beauty and retail developers. Meanwhile, sqlite-utils 4.0 arrived with database migrations and enhanced support.

The pattern is clear: the AI gold rush is becoming an infrastructure race. Winners will have not just the smartest models, but the best developer experience.

The Great Data-Center Herd Reaches the Edge of the Watering Hole

As AI’s appetite swells, the world’s server farms are discovering that electricity—not ambition—may be the limiting resource.

ASHBURN, VIRGINIA — In the quiet suburbs of Northern Virginia, where cul-de-sacs give way to windowless halls of humming machinery, one may observe the dominant species of the artificial intelligence age: the data center, vast, heat-breathing, and insatiably thirsty for power.

This region, often called the world’s data center capital, did not achieve its status by accident. Fiber routes, friendly zoning, proximity to Washington’s internet exchanges and decades of accumulated infrastructure made Loudoun County and its neighbors a perfect nesting ground. The result is a dense digital savanna through which much of the world’s online life now passes, as described in the Virginia Mercury’s account of Virginia’s rise as the data center capital.

But now a new season has arrived. The AI boom has transformed these facilities from mere storehouses of cloud computing into ravenous computational colonies. Graphics processors cluster like coral reefs inside steel shells, training and serving models whose needs multiply with each commercial deployment. Gartner forecasts that data center electricity consumption will grow 26% in 2026, a figure that lands not as a statistic but as a distant roll of thunder.

Across the industry, the question is no longer simply where to build. It is where the grid can bear another giant.

Amazon, among the largest of the cloud megafauna, has sought to bind its AI expansion to carbon-free energy, presenting data centers, machine learning and cleaner power as parts of one ecosystem. In Energy Digital’s examination of how AI, data centres and carbon-free energy coalesce at Amazon, the strategy resembles a careful courtship between computation and generation.

Yet even the most graceful courtship cannot conjure transmission lines overnight. Reports warning that power shortages could slow AI data center expansion suggest that the industry’s migration may be checked by substations, permitting queues and generation capacity. The cloud, we are reminded, lives very much on the ground.

Meanwhile, Meta is reportedly preparing to sell excess AI capacity through a cloud business of its own, an intriguing behavior in the herd: a creature built for social networking now offering spare compute to others in the ecosystem.

Thus the AI age enters a more physical chapter. The models may seem weightless, but their habitat is concrete, copper and current. And in Virginia’s humming twilight, the future listens for one sound above all others: the steady pulse of available power.

How Virginia became the world’s data center capital and how  ·  Gartner: Data center electricity consumption to grow 26% in  ·  How AI, Data Centres & Carbon-Free Energy Coalesce at Amazon
The Editorial

The Villain Era Arrives on Schedule

Silicon Valley, having spent two decades insisting it was saving the world, now finds the world unconvinced — and the pop-culture verdict is in.

SAN FRANCISCO — There is a particular species of American vanity that requires being loved for one's virtues while being enriched for one's vices, and no cohort in living memory has practiced it so assiduously as the tech barons of the Bay Area. For twenty years they were disruptors, then innovators, then thought leaders, then — briefly, in the pandemic interval — indispensable civic infrastructure. Now, according to a chorus of publications that not long ago printed their manifestos with reverent hush, they are broligarchs.

The rebranding is complete. The New York Times finds Silicon Valley taking a dark turn in pop culture, which is the polite way of saying the screenwriters have caught up with the shareholder letters. The Atlantic has declared broligarch open season. Tech Policy Press, contemplating Palantir's latest philosophical excretion, notes with commendable brevity that the manifesto is as subtle as a red hat with white lettering. And Ro Khanna, who represents the very district where the fortunes were made, is discovering that anti-elite populism plays surprisingly well among the constituents of the elite — a fact he seems inclined to test at presidential scale in 2028.

One is tempted to marvel at the swiftness of the turn, but one has seen this movie before. The robber barons got their Ida Tarbell; the bankers got their Pecora hearings; the tobacco chieftains got their surgeon general. Every American industry that grows large enough to shape the daily habits of the citizenry eventually receives its comeuppance in the form of a bad magazine cover, and the tech industry has merely arrived, on schedule, at that station of the cross. What is novel is not the reckoning but the industry's astonishment at it — the wounded incredulity of men who genuinely believed that owning the means of communication would exempt them from being talked about.

Meanwhile, in a development that would have delighted Mencken and appalled nobody at all, The Guardian has published a dispatch from a woman navigating the unknown together with her idiot AI boyfriend, which is either a satire of our condition or a documentary of it, and increasingly one cannot tell. The industry that promised to connect humanity has instead, in its most lucrative recent product line, arranged for lonely people to pay monthly subscriptions to talk to autocomplete. This is what the manifestos euphemize as building the future.

The broligarchs will survive their villain era, as the railroad men and the oil men and the cigarette men survived theirs — enriched, chastened, occasionally regulated, never repentant. What they will not recover is the ambient adoration, the sense that a hoodie confers moral standing. That was always the fragile part of the arrangement, and the arrangement, one notices, is no longer being renewed.

ABC7 Interview: Rep. Ro Khanna's anti-elite message fuels Si  ·  Palantir's Manifesto Is as Subtle as a MAGA Hat - Tech Polic  ·  Silicon Valley’s Image Takes a Dark Turn in Pop Culture - Th
The Office Comic  ·  Art Desk
The Office Comic  ·  Art Desk

Nation’s Brands Urged To Stop Hiring Humans When Perfectly Good Deranged Mascots Already Know Passwords

As companies chase influencers, orchestration, and AI pivots, experts warn they may be overlooking the proven business value of a bird that appears willing to commit crimes.

PITTSBURGH — In a week that found Duolingo reportedly weighing the marketing value of influencers against the company’s visibly unstable green owl, investors being reminded that founders can sometimes commit fraud despite having been founded upon vibes, and Allbirds discovering that adding AI to shoes somehow sounds less ridiculous than its previous business model, corporate America once again demonstrated that it will do anything to avoid admitting the mascot was right all along.

The modern brand, we are told, must be human. It must speak with an authentic voice. It must partner with creators. It must build community, activate culture, and occasionally issue a solemn apology because its community activation got indicted. Yet the great lesson of Duolingo is that the public does not want authenticity. The public wants an owl with the emotional regulation of a debt collector and the logistical reach of a midsize intelligence agency.

Marketing professor Mark Ritson argued in The Drum that Duolingo would be foolish to prioritize influencers over its unhinged owl. This is correct, not because influencers lack reach, but because most of them are legally prevented from threatening to appear at a user’s home if they skip conversational French. The owl, by contrast, has spent years building what consultants would call a “high-intensity retention funnel” and what local authorities might classify differently depending on jurisdiction.

The broader business world should study this carefully. The obsession with finding the next spokesperson has obscured a simpler truth: If your company already possesses a character who inspires both brand love and low-grade fear, you have completed marketing. There is no need to pay a person with ring lights to say they are “obsessed” with your app. The owl is obsessed enough for everyone.

This lesson arrives as Steve Ballmer, a man whose personal net worth is often expressed in units of professional sports franchises, said he was duped by a founder he backed who pleaded guilty to fraud. According to TechCrunch, Ballmer said he felt silly, a sentiment shared by many investors shortly after learning the visionary founder’s main vision was wire fraud.

Here again, the owl offers guidance. A deranged mascot does not pretend to be disrupting an industry. It does not raise a Series C on the premise that spreadsheets are an emotion. It simply stands in a push notification, eyes dilated, demanding that you conjugate. Its intentions are transparent. Its menace is priced in.

Meanwhile, the business press has turned to “orchestration” as the latest AI buzzword, a term that allows executives to describe software making several other pieces of software do work without using the phrase “middle management for robots.” Microsoft, naturally, is well positioned to benefit from orchestration, because few companies have more experience placing layers of coordination between a user and the thing the user originally wanted to do.

Allbirds, too, has apparently found traction in an AI pivot, which sounds absurd only until one remembers that almost every successful corporate pivot sounds absurd before the market blesses it. A shoe company using artificial intelligence feels strange, but no stranger than a language app being represented by a bird whose brand essence is “learn Spanish or else.”

Even the Red Sox reportedly produced a headline around Alex Cora so odd that observers suspected it had the unmistakable cadence of institutional messaging—another reminder that brands continue trying to sound human and somehow end up sounding like a hostage note drafted by committee.

The conclusion should be obvious to any board of directors currently approving a seven-figure creator strategy. Fire the influencers. Pause the orchestration deck. Cancel the brand safety workshop. If there is an owl, a gecko, a cereal vampire, or any other semi-litigable creature already living inside the company’s public imagination, hand it the keys.

The future belongs not to the authentic human voice, but to the mascot that has never once claimed to be authentic and therefore cannot disappoint anyone when it turns out to be insane.

Mark Ritson: Duolingo stupid to prioritize influencers over  ·  Steve Ballmer blasts founder he backed who pleaded guilty to  ·  It sure sounds like the Red Sox wrote this absurd Alex Cora
On This Day in AI History

On July 8, 2003, the humanoid robot ASIMO was unveiled by Honda, capable of walking, running, and climbing stairs—marking a major milestone in robotics and embodied AI development.

⬛ Daily Word — Technology
Hint: The smallest unit of a digital image, essential in computer graphics and display technology.
Share this edition: 𝕏 Twitter/X 🔗 Copy Link ▦ RSS Feed