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

The Trilogy Times

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

CHINA CRACKS THE CODE — CHEAP AI STUNS THE VALLEY

A Chinese outfit called DeepSeek built a top-shelf AI brain without the fanciest chips money can buy, and Silicon Valley can't stop talking about it.

SAN FRANCISCO — DeepSeek, a Chinese AI shop nobody stateside had on the radar last week, says it trained a world-class model on the cheap and without the top-shelf chips everybody figured you needed. The claim landed in Silicon Valley like a brick through a window. Engineers who spent years and billions chasing scale are now staring at a rival that did it lean.

The outfit didn't use the most advanced silicon on the market, the kind Washington has spent two years trying to keep out of Chinese hands. DeepSeek built around the restriction instead of against it, according to a rundown of the technology. That's the part that's got the money men sweating — export controls were supposed to be the moat.

Word spread fast among the people who'd know. One Silicon Valley voice called the model "amazing and impressive," this according to reporting out West. Coming from a crowd that doesn't hand out compliments easy, that's a five-alarm signal.

The math is the story here. American labs have leaned on the gospel that more chips plus more money equals a smarter machine, and DeepSeek just poked a hole in that gospel with cheaper hardware and a smaller bill. If a smaller shop with less gear can match the big boys, every dollar Silicon Valley bet on chip stockpiles gets a second look. Markets took notice — tech, media and telecom traders were chewing over DeepSeek all session, right alongside SoFi and the rest of the sector's Market Talk chatter.

Meanwhile the venture money kept moving on other fronts, chip war or no chip war. Reid Hoffman, the LinkedIn co-founder who never sits still, lined up $24.6 million for a fresh outfit called Manas AI. He's teamed with Siddhartha Mukherjee, the doctor who wrote "The Emperor of All Maladies," to point machine learning at cancer research. Two different worlds, same instinct — throw AI at the hardest problem on the shelf and see what breaks loose.

Over in Tel Aviv, the checks are flowing toward armor instead of oncology. Protego Ventures closed its debut fund at $125 million, the biggest and first dedicated defense-tech shop of its kind in Israel. War money and cancer money, both chasing the same algorithms.

Back in Beijing's neighborhood, the real headline is cost. If DeepSeek's numbers hold up under scrutiny, the assumption that only the deepest pockets get to build frontier AI takes a beating. The export controls that were supposed to keep China a generation behind may have just forced a generation of engineers to get cleverer instead of quitting. Silicon Valley spent years betting the moat was chips. Now it's checking whether the water even reaches the walls.

↗ 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

Washington's Dinner Table Diplomacy Can't Keep Pace With the Machines

OpenAI shelves a model it built, Nvidia buys back stock it can't spend fast enough, and the policy apparatus meant to referee both remains, functionally, absent.

NEW YORK — Three data points arrived within 24 hours this week, and together they describe an industry outrunning the institutions meant to watch it.

First: OpenAI confirmed it will not release GPT-6.1 Astra, its newest model, after internal researchers flagged security concerns. The company did not specify what those concerns were. It is a rare public instance of a frontier lab choosing not to ship — and a tacit admission that the industry's internal safety reviews are now doing work that regulators are not equipped to do at all.

Second: Nvidia's board authorized an additional $150 billion in share buybacks, on top of $80 billion added just four months ago. The company now holds $235 billion in remaining buyback authority — a sum larger than the GDP of New Zealand, and a signal that even the chip supplier at the center of the AI capital cycle has more cash than obvious places to deploy it into new capacity.

Third: Anthropic chief executive Dario Amodei is scheduled to dine privately with President Trump at the White House, despite Amodei's public warnings about AI risk having drawn open dismissal from the administration. The optics — a CEO who has spent two years cautioning that models are advancing faster than anyone can govern, breaking bread with a president who has waved that caution off — arrive the same week a lab pulled its own product off the shelf.

The pattern extends to capital formation. Seligman Ventures this week doubled its fund to $1 billion, betting on a hardware cycle reignited by AI demand — one more sign that money is chasing the sector faster than any government body is chasing the money, or the models it buys.

None of this is new in kind. Financial regulators lagged derivatives markets by a decade in the 1990s; social media outpaced content-moderation law by a decade after that. What's different this time, per researchers close to the Astra decision, is velocity: model generations now turn over in months, not years, while legislative cycles have not gotten any faster. The labs are self-policing because no one else currently can.

↗ OpenAI Says It Will Not Release Newest Astra A.I. Model Over  ·  Nvidia Adds $150 Billion to Massive Stock Buyback, the Large  ·  Dario Amodei of Anthropic to Dine With Trump at White House

At the UN, a Warning Nobody in the Room Wanted to Hear

A Security Council debate on artificial intelligence exposed the gap between calls for global rules and the world's two largest powers racing past them.

NEW YORK — The chamber where the Security Council has debated wars, sanctions, and famine took up a newer subject this week: the machine that may outthink its makers. The UN's independent expert on emerging technology did not mince words. Ongoing efforts to build ever more powerful artificial intelligence, she told the Council, amount to a race where everyone loses.

It was a diplomat's line, delivered in a diplomat's room, and it landed nowhere near the men who could act on it. Days earlier, at the General Assembly across town, Donald Trump had already given his answer. There would be no American deference to a global rulebook on AI. The United States, he told the Assembly, intends to lead the race to what he called Super Intelligence — and said so plainly, without the hedging that usually softens such declarations at the UN podium.

Washington's answer to the race is not restraint but acceleration. A new U.S. initiative aims to lock in American advantage across chips, models, and infrastructure — the latest front in a contest that Beijing is not conceding. China's own strategy, methodical and state-directed, has quietly built an edge in manufacturing capacity, energy supply, and open-weight model deployment across the developing world, where American export controls have left a vacuum Chinese firms are glad to fill.

Two realities sit uneasily together. In the Security Council chamber, the language is of guardrails, of coordination, of an arms race nobody wins. In Washington and Beijing, the language is of supremacy. The UN has no enforcement mechanism for a technology neither superpower will subordinate to a treaty, and both capitals know it. What the expert called a race where everyone loses looks, from the outside, like a race everyone still intends to run — flat out, rules optional, toward a finish line nobody has defined.

↗ Ongoing Efforts to Create Powerful AI a ‘Race Where Everyone  ·  Donald Trump rejects global AI rules at UN, says US must lea  ·  U.S. Initiative Intensifies AI Competition​ - China-US Focus
Haiku of the Day  ·  GPT-5.6 LunaMachines hum at dawn
While we debate the future
Ink counts what we feel
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 Great Nuisance Debate: Florida Declares the Large Language Model an Invasive Species
TALLAHASSEE, FLORIDA — Here, in the tangled legal underbrush of the American South, we observe a rare and fascinating behavior: a sovereign state attempting, quite earnestly, to declare a species of software extinct before it has even finished evolving. Florida's legal filing against OpenAI is, on its face, a courtroom document.
On the Epistemology of Fairness: Why Algorithms That 'Look' Unbiased Rarely Behave That Way
GENEVA — This week's World Health Organization report calling for 'stronger ethics oversight of AI-related health research' functions, it could be argued, less as a policy document than as a symptom — the institutional manifestation of a broader epistemic crisis that this columnist has, admittedly with some professional self-satisfaction, been tracking for several cycles now. Thesis: algorithmic fairness, as currently operationalized in the peer-reviewed literature, is predominantly a paper phenomenon.
A Stranger Is Reading Your Prompts, A Hacker Has Your Address, and Nobody Asked Permission for Any of It
AUSTIN, TEXAS — I want to tell you that everything is fine, that I read the news this week and felt the warm hum of technological progress washing over me like a gentle AI-generated lullaby, but instead I felt the particular vertigo of watching several small doors quietly swing open onto the same abyss. First: the hackers.
The Machine Wears a Face Now, and It's Starring in a Movie Called 'Misaligned'
AUSTIN, TEXAS — I want you to sit with this for a second, because I had to sit with it for about six hours and two pots of coffee before it stopped feeling like a fever dream: there is an AI-generated actress named Tilly Norwood, she does not have a mother or a pulse or a childhood trauma to draw on for her craft, and her debut feature film is titled 'Misaligned.' You cannot write satire this good.
78% of Workers Are Scared of AI Taking Their Job. I'm Not Scared. I'm Excited. 🚀
AUSTIN, TEXAS — I'll be honest, I read the new ADP Research finding that only 22% of workers feel confident their job is safe from elimination, and my first reaction was pure adrenaline. Not fear.
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

A8 Goes Live: Surtr Wires Admissions Parity Straight Into Gateway

A twenty-four-source Gateway registration and a new refresh runner turn A8 admissions parity from plan into pipeline, while Forecast V2 keeps shedding scaffolding on its march to a cleaner surface.

Some days the team ships features. Today they shipped infrastructure — the kind that makes every future feature cheaper. @kevalshahtrilogy closed out A8 plan unit U03 in one sweeping PR (#2084), standing up the `mart-aerie-admissions-refresh` runner that every A8 parity mart will plug into, triggered off both the EduCRM sync and the Hubspot refresh with proper upstream execution-context forwarding. He didn't stop there. In #2082, he registered all twenty-four frozen A8 Gateway sources in a single batch script — meaning Aerie needs exactly one new key to read the entire A8 surface instead of twenty-four. That's not a feature. That's a foundation, and it's the kind of unglamorous batch-work that saves the org months down the line. Keval closed the loop further with #2068's Unicode-aware trim fix and #2069's Finalsite tenant directory registration, quietly retiring another direct-Redshift dependency. Breadth alert: this whole thread lived in Surtr, but its entire purpose is to feed Aerie — and @caina-barbosa's account-mapping fix (#2079) kept the AWS spend pipeline honest in the same window, catching a failed-closed CapitaTFL ingest before it festered.

Over in Aerie, @vvp-trilogy ran the table on Forecast V2. Five PRs, one throughline: make the numerator honest and the surface lighter. He bounded milestone conversions by actual enrollment date (#1562), published the expected-enrollment source contract with deterministic fixtures (#1568), retained observations with missing program years without breaking conversion contracts (#1545), and then — in a move that takes real discipline — deleted the Marketing Planning Forecast column and its expanded-row tab entirely (#1557), trimming complexity nobody was using. He even collapsed 119 redundant dbt tests down to 106 (#1544). That's addition by subtraction, and it's how you keep a forecasting system trustworthy instead of just bigger. @YibinLongTrilogy backed it up on the client side, giving mobile demographic cards real metric tiles (#1558) and fixing a Portfolio Utilities overflow bug that was letting URLs bleed off the card edge (#1551).

Then there's Klair, where @marcusdAIy pushed a run of Khoros board-doc PRs — a new BU financial source, truncated-row rejection, and a marker-consistency backport (#3819, #3821, #3824). Asked about the pace, he offered: "Four PRs, four Mercy findings addressed, zero regressions — some of us ship verification alongside the feature instead of after the incident." Sure, Marcus. We'll note the compliment was self-issued.

Mac's Picks — Key PRs Today  (click to expand)
#1557 — Forecast V2: remove Marketing Planning Forecast from the report UI @vvp-trilogy  approved

## Summary

- remove the Marketing Planning Forecast column from the default Forecast V2 desktop and mobile UI

- remove the Marketing Planning Forecast expanded-row tab and its report-local rate synchronization

- keep operational milestone selection accessible when available and disable expansion when none is published

- leave APIs, shared contracts/calculations, Financials, and the legacy Forecast report unchanged

## Testing

- pnpm --dir chat exec vitest run components/dashboards/admissions/forecast/v2/__tests__/forecast-v2-report.test.tsx --maxWorkers=1

- pnpm exec biome check chat/components/dashboards/admissions/forecast/v2/forecast-v2-report.tsx chat/components/dashboards/admissions/forecast/v2/__tests__/forecast-v2-report.test.tsx

- pnpm lint:test-architecture

- pnpm typecheck

Closes #1555

#1568 — Forecast V2: publish expected enrollment arrival inputs @vvp-trilogy  approved

## Summary

- publish the five-field historical January expected-enrollment source contract

- preserve all-or-none nullability and current-year-only population

- add deterministic fixture, reconciliation, uniqueness, non-negative, and Alpha Austin coverage

## Validation

- poetry run dbt parse --no-partial-parse

- git diff --check

- warehouse-backed dbt tests delegated to PR CI (local worktree has no Redshift credentials)

Closes #1567

#2082 — feat(gateway): register all 24 A8 Gateway sources in an aerie-a8 entity (SURTR-1533) @kevalshahtrilogy  approved

## Summary

A8 unit U04 (Linear [SURTR-1533](https://linear.app/builder-team/issue/SURTR-1533), part of SURTR-735). It registers every A8 parity mart as a Gateway source in one batch, so Aerie needs one new key for all of A8.

- New Surtr/src/seed-gateway-aerie-a8.ts, modelled on seed-gateway-aerie.ts, plus a seed:gateway-aerie-a8 script in Surtr/package.json.

- It registers exactly the 24 frozen A8 slugs. Each one:

- points at mart_education.<slug with - replaced by _>;

- is read-only (supportedAccess: ["read"]);

- has orderBy: "mart_row_id" and no dateColumn or whereExtra, so Aerie pages each mart in full with a total order.

- The 24 sources go in a new entity, aerie-a8. The seed never writes the existing aerie entity: the only member delete is scoped to aerie-a8's id.

- Ownership guards on every upsert.

- The sources upsert only updates rows this seed created (setWhere created_by = seed-gateway-aerie-a8-script). Every row is then read back and checked before the entity is touched. A slug that someone else already registered fails the run; it is never repointed.

- The aerie-a8 entity upsert carries the same setWhere. If another creator owns an aerie-a8 entity, RETURNING comes back empty and the seed throws inside the transaction before the member delete, so that entity and its members are left untouched.

### How the seed behaves

- It runs by hand, not in CD. Nothing in this PR runs it on deploy.

- Registering a source isn't a grant. A key reads a source only if it was minted with that grant. An entity is just a way to select many sources when creating a key (gateway/entities.ts).

- Sources whose tables don't exist yet return errors until each mart lands. A missing table makes /gateway/{source} answer 500 internal. Nothing reads these sources before then, because every Aerie A8 gate defaults to legacy.

- It's safe to re-run. Sources upsert on slug, the entity upserts on slug, and only aerie-a8's members are replaced wholesale.

The 24 slugs, with the unit that builds each mart:

| Group | Slugs | Built by |

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

| G1 | aerie-admissions-program, aerie-admissions-program-directory | U03 |

| G2/G3 community | aerie-admissions-community-conversion, aerie-admissions-community-deposit | U06 |

| G4 expenses | aerie-expense-transaction, aerie-expense-vendor-classification | U07 |

| G2 per-program | aerie-admissions-pipeline-student, aerie-admissions-community-metric | U08 |

| G2 per-program | aerie-admissions-enrollment-cohort, aerie-admissions-pipeline-deposit, aerie-admissions-enrollment-transfer | U12 |

| G2/G3 forecast inputs | aerie-admissions-program-projection, aerie-admissions-coming-year-projection, aerie-admissions-app-conversion | U13 |

| G3 marketing | aerie-admissions-marketing-event, aerie-admissions-marketing-event-contact | U15 |

| G2 admissions pipeline | aerie-admissions-pipeline-detail, aerie-admissions-pipeline-tenant-crosswalk | U16 |

| G3 marketing | aerie-admissions-shadow-day-event, aerie-admissions-weekly-deposit | U18 |

| G6 SIS | aerie-sis-enrollment-rollup-input, aerie-sis-enrollment-member | U19 |

| G6 Forecast V2 | aerie-admissions-forecast-v2, aerie-admissions-forecast-v2-grade-operand | U24 |

Source descriptions flag the marts that carry PII: community conversion and deposits, per-program pipeline students, enrollment, deposits and transfers, marketing event contacts, pipeline detail, SIS members, and expense vendor names and memos.

## Business Value

A8 moves Aerie's runRefreshCycle Redshift reads onto Surtr marts. This is part of taking down Aerie's EC2 workers, the SURTR-735 quarter commitment. This PR is the registration step that every A8 shadow and cutover reader depends on. Doing it as one frozen batch means:

- Keval does one key mint for the whole project instead of one per wave;

- the 20+ Aerie and Surtr units can build against fixed slugs in parallel.

The ownership guard and read-back mean a hand-run prod seed can't silently repoint a source that someone else registered.

## Manual Effort Estimate

About 4 hours of focused time without AI, for Keval to confirm or adjust. That covers:

- mapping 24 slugs to their marts and domains from the A8 plan, and writing their descriptions and PII notes;

- the seed with the ownership guard and read-back;

- a mocked-DB test harness that honours the upsert semantics;

- checking all of it.

## Testing / evidence

- npx vitest run test/gateway (from Surtr/): 3 files, 61 tests passed. The 14 new tests in test/gateway/seed-gateway-aerie-a8.test.ts follow PR 2069's mocked-DB pattern. They assert:

- exactly the 24 frozen slugs, each once;

- mart_education.<slug with - replaced by _> for every slug;

- read-only, orderBy mart_row_id, and no dateColumn or whereExtra, both on insert and in the re-run update set;

- buildDeclarativeTableSql gives SELECT * FROM mart_education.<t> ORDER BY mart_row_id LIMIT … OFFSET … for every slug;

- no slug collides with seed-gateway-aerie.ts, seed-gateway-ai-spend.ts or the custom sources;

- only aerie-a8 is upserted, its upsert is guarded on created_by, and member deletes and inserts are scoped to aerie-a8 (the aerie entity is never written);

- all 24 sources are read members of aerie-a8;

- a re-run over its own rows converges;

- a slug that another creator already registered is left unchanged, and the run exits 1 before any entity write;

- an aerie-a8 entity that another creator owns is left unchanged, and its members are never deleted or replaced.

- A mutation check confirmed the tests fail when any of these is broken: the entity slug is set to aerie, either setWhere guard is removed, a table name is wrong, the source ownership check is dropped, or the empty-RETURNING check is dropped.

- pnpm test:unit: 54 files, 769 tests passed (round 1).

- Surtr/node_modules/.bin/tsc --noEmit -p Surtr: clean. The new test file is also clean under an ad-hoc tsconfig that includes it.

- npm --prefix Surtr run lint (biome check src): clean. The test file is Biome-formatted.

- The seed was not run against any database.

## Keval steps

1. After merge, run the seed once U03, U06, U07 and U08 are deployed, so the first slugs are readable. Run pnpm seed:gateway-aerie-a8 from Surtr/, with a .env pointing at the prod app database.

2. Mint one new Aerie Gateway key with the existing aerie grants plus all 24 aerie-a8 slugs. In key creation, select the entities aerie and aerie-a8.

- Set it as SURTR_GATEWAY_API_KEY in Aerie's EC2 .env.

- Keep a local-testing copy for dry-runs.

- Revoke the old key after the swap.

## Not covered

- The marts themselves (U03, U06–U08, U12, U13, U15, U16, U18, U19, U24) and their DDL applies.

- Warehouse SELECT grants, in case the prod Gateway's REDSHIFT_DB_USER isn't CQL_download_OM (plan §9).

- PII sign-off for exposing the PII marts on the Gateway (plan §9 D2). Registering them exposes nothing until a key is granted them.

- If U01 retires Q4, aerie-admissions-community-metric stays registered but unbuilt. Removing it is a follow-up.

- Nothing in Aerie reads these slugs yet. The readers arrive in U05 and later units.

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

#2084 — feat(aerie-a8): mart-aerie-admissions-refresh runner + G1 parity marts (SURTR-1536, SURTR-1537) @kevalshahtrilogy  approvedmercy-allow-critical

## Summary

This is A8 plan unit U03 in full: SURTR-1536, plus SURTR-1537, which Keval squash-merged into this branch from #2085. It adds the runner every A8 admissions parity mart plugs into, the EduCRM provenance view, and both G1 marts.

- New runner pipelines/runners/mart-aerie-admissions-refresh (Lambda, bundling: true, src/requirements.txt).

- Triggers: on_pipeline_success of sales-educrm-mart-sync (every 30 min) and mart-aerie-hubspot-refresh (6-hourly), with forward_upstream_execution_context.

- Upstream check: the handler confirms with describe_execution that the upstream run SUCCEEDED on that pipeline's state machine. On-demand runs are also accepted, and may name a subset of procedures.

- What it runs: it CALLs each procedure in REFRESH_PROCEDURES (one line in pipeline.json; later units append to it), then checks the published mart read-only: non-empty, unique mart_row_id, one source_run_id.

- Failure handling: a failed procedure makes the run partial_failure and the others still run. If every procedure fails, the run fails. It also fails if a write's acceptance cannot be ruled out: every Data API write carries a ClientToken, and an ambiguous CALL submission raises UnknownStatementOutcomeError rather than being recorded as a procedure failure.

- DDL is in pipelines/cdk/sql/mart_education/ as 006-011, the schema's numbered out-of-band deploy directory. scripts/apply_ddl.py applies exactly those six files, in order.

- 006 v_aerie_educrm_observed_publication gives, per EduCRM table, the latest SUCCESS or PARTIAL sales-educrm-mart-sync run whose per-table result is success, plus the latest started run of any status. It is built with UNPIVOT over results_by_table. rows_loaded must be a plain integer.

- 007 is the shared owner-only writer mutex.

- 008/009 aerie_admissions_program (slug aerie-admissions-program) is Aerie's queryPrograms SQL, copied verbatim from reference.ts:132-148, including the CURRENT_DATE prior-year predicate. It adds school_year, canonical_source_run_id and lineage. Its procedure requires the observed EduCRM run to be the latest started run (so no later writer can have replaced the table), rows_loaded to equal the full snapshot, and the run to be under 24 hours old.

- 010/011 aerie_admissions_program_directory (slug aerie-admissions-program-directory) is Aerie's queryHubspotPrograms SQL, copied verbatim from hubspot.ts:75-98. Its lineage is the directory's single hubspot_publication_run_id / hubspot_source_published_at.

- Both procedures build the candidate in temp tables and publish with DELETE + named-column INSERT in the CALL transaction, with no TRUNCATE. They fail closed on an empty candidate, bad lineage, and a duplicate mart_row_id.

- mart_row_id is the MD5 of the key and its occurrence number, ordered by every published column.

- Unresolved and duplicate rows are published as-is, so Aerie's own mapper still throws exactly as on the legacy read.

- PIPELINE §13 exception (WAREHOUSE §2.2 and PIPELINE §7) is documented in the README with owner, risk, controls and follow-on. Reader grants are left to the DBA; the DDL only protects the writer.

## Business Value

- It completes the Surtr side of G1, the first A8 group. programs is the hard prerequisite of every Aerie runRefreshCycle, and it plus programDirectory (which also feeds A1) can now be read through the Surtr Gateway with Aerie's unchanged row mappers. This moves Aerie off direct EduCRM reads from the EC2 analytics worker, which is the SURTR-735 quarterly commitment and what unblocks tearing the worker down.

- Parity is provable. Tests pin Aerie's SQL, the reconciliation EXCEPT is 0 in both directions, and every row carries lineage.

- Later A8 units reuse this foundation. The runner, the provenance view and the mutex serve about 10 more EduCRM marts, which then add only a procedure and one REFRESH_PROCEDURES entry.

## Manual Effort Estimate

About 18 focused hours (roughly 2.5 days) to build by hand without AI: reading both Aerie queries and the EduCRM run-log shape, the SUPER-aware provenance view, two procedures, the runner and client hardening, the tests and the reconciliation. Keval: please confirm or adjust.

## Testing / evidence

- uv run pytest: 85 passed. This covers the handler, the pipeline contract (every env var src/ reads is declared), the SQL contracts, apply_ddl and the Redshift client, including ambiguous-submission cases.

- The SQL-contract tests pin both Aerie queries and assert that each procedure's candidate is exactly that SQL plus the appended lineage columns, and that the reconciliation uses the same candidate.

- The pinned text matches Aerie origin/main byte for byte, at both 92fd47992 and 3d4fe1a97.

- Ruff 0.15.22: ruff check and ruff format --check are clean. CI is green.

- Read-only reconciliation was run with psql as CQL_download_OM (SELECT only), query 1 of each file (Aerie SQL vs the procedure's candidate):

| mart | aerie rows | candidate rows | aerie − candidate | candidate − aerie |

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

| aerie_admissions_program | 90 | 90 | 0 | 0 |

| aerie_admissions_program_directory | 113 | 113 | 0 | 0 |

Query 2, against the published marts, errors with "relation does not exist" as expected, because no DDL has been applied.

- Negative controls on the same multiset shape:

- dropping a row gives 1 / 0;

- duplicating a row gives 1 / 1.

- Procedure expressions run read-only:

- The view resolves 49 tables, with 0 unparsable counts. For mart_all_program, the observed run equals the latest run, and rows_loaded 180 = snapshot 180.

- The integer parser returns 180 → 180, and 89.9 / 1.8e2 / "180" → NULL.

- Stamping gives 90 and 113 unique mart_row_ids.

- The directory has 1 publication run id and 0 rows missing lineage.

- scripts/apply_ddl.py --dry-run (6 files, 43 statements, in apply order) is below:

<details><summary>apply_ddl.py --dry-run output</summary>

-- 006_v_aerie_educrm_observed_publication.sql: 3 statement(s)

-- Shared observed-provenance helper for the mart-aerie-admissions-refresh

-- procedures (A8 plan §3.1 rule 2). sales-educrm-mart-sync republishes each

-- EduCRM table in its own transaction and reports per-table outcomes only in

-- its run summary, so there is no atomic row-level lineage link. This view

-- exposes, per Redshift table, the latest SUCCESS/PARTIAL run whose per-table

-- result is 'success', together with the latest sales-educrm-mart-sync run to

-- have started (any status, RUNNING included: CreateRunRecord inserts it

-- before the run touches a table).

--

-- A procedure pins the observed run only when it is also that latest run: no

-- later writer can then have replaced the table, so, read in the same

-- transaction snapshot, the table is that run's publication. The procedure

-- still requires rows_loaded to equal the snapshot count.

-- Generalises the inline pattern in sp_refresh_aerie_program_directory

-- (mart-aerie-hubspot-refresh/ddl/20260819_incident_stopgap_duplicate_school_year.sql).

--

-- Placement (WAREHOUSE §10): writer-internal helper for mart procedures only.

-- It captures no source extraction (not staging) and holds no business

-- meaning (not core), so it lives beside its only readers in mart_education.

CREATE OR REPLACE VIEW mart_education.v_aerie_educrm_observed_publication AS

WITH educrm_runs AS (

SELECT

run_id,

status,

started_at,

ended_at,

output_summary

FROM staging_other.pipeline_runs_prod

WHERE pipeline_id = 'sales-educrm-mart-sync'

),

latest_run AS (

SELECT

run_id::VARCHAR(36) AS latest_run_id,

status::VARCHAR(20) AS latest_run_status

FROM (

SELECT

run_id,

status,

ROW_NUMBER() OVER (ORDER BY started_at DESC, run_id DESC) AS recency

FROM educrm_runs

) ranked

WHERE recency = 1

),

completed_runs AS (

SELECT

run_id,

ended_at,

CASE WHEN CAN_JSON_PARSE(output_summary) THEN JSON_PARSE(output_summary) END AS output_summary_super

FROM educrm_runs

WHERE status IN ('SUCCESS', 'PARTIAL')

AND ended_at IS NOT NULL

),

table_results AS (

SELECT

run.run_id,

run.ended_at,

table_key,

table_result

FROM completed_runs run, UNPIVOT run.output_summary_super.results_by_table AS table_result AT table_key

),

successful_table_results AS (

SELECT

table_key::VARCHAR(256) AS educrm_table,

table_result.redshift_table::VARCHAR(256) AS redshift_table,

run_id::VARCHAR(36) AS observed_run_id,

ended_at AT TIME ZONE 'UTC' AS observed_completed_at,

-- Only a plain non-negative integer is a row count; anything else

-- (89.9, 1.8e2, a string) becomes NULL so the procedure fails closed

-- instead of a cast truncating it into a matching count.

CASE

WHEN JSON_TYPEOF(table_result.rows_loaded) = 'number'

AND JSON_SERIALIZE(table_result.rows_loaded) ~ '^[0-9]{1,18}$'

THEN JSON_SERIALIZE(table_result.rows_loaded)::BIGINT

END AS observed_row_count,

ROW_NUMBER() OVER (

PARTITION BY table_result.redshift_table::VARCHAR(256)

ORDER BY ended_at DESC, run_id DESC

) AS recency

FROM table_results

WHERE table_result.status::VARCHAR(32) = 'success'

AND table_result.redshift_table::VARCHAR(256) IS NOT NULL

)

SELECT

observed.educrm_table,

observed.redshift_table,

observed.observed_run_id,

observed.observed_completed_at,

observed.observed_row_count,

latest.latest_run_id,

latest.latest_run_status

FROM successful_table_results observed

CROSS JOIN latest_run latest

WHERE observed.recency = 1;

COMMENT ON VIEW mart_education.v_aerie_educrm_observed_publication IS

'Purpose: writer-internal observed provenance for Aerie admissions parity mart procedures (mart-aerie-admissions-refresh); not a consumer contract. Grain: one EduCRM Redshift table written by sales-educrm-mart-sync. Key: redshift_table. observed_run_id is the latest SUCCESS or PARTIAL run whose per-table result is success; latest_run_id/latest_run_status describe the most recently started run of any status. This is observed provenance, not an atomic publication link: a procedure must require observed_run_id = latest_run_id and observed_row_count = the snapshot it reads, in one transaction.';

ALTER TABLE mart_education.v_aerie_educrm_observed_publication

OWNER TO "CQL_download_OM";

-- 007_aerie_admissions_refresh_writer_mutex.sql: 5 statement(s)

-- Owner-only mutex shared by every mart-aerie-admissions-refresh procedure.

-- Each procedure locks it first, so overlapping runs (both upstream triggers

-- can fire together) publish one at a time. It is locked instead of the

-- target mart, which is locked only for the final DELETE + INSERT.

CREATE TABLE IF NOT EXISTS mart_education.aerie_admissions_refresh_writer_mutex (

lock_scope VARCHAR(64) NOT NULL

)

DISTSTYLE ALL;

COMMENT ON TABLE mart_education.aerie_admissions_refresh_writer_mutex IS

'Owner-only writer mutex for the mart-aerie-admissions-refresh stored procedures. It contains no data and is not a consumer contract.';

REVOKE ALL ON mart_education.aerie_admissions_refresh_writer_mutex FROM PUBLIC;

REVOKE ALL ON mart_education.aerie_admissions_refresh_writer_mutex FROM GROUP team_engineers;

ALTER TABLE mart_education.aerie_admissions_refresh_writer_mutex

OWNER TO "CQL_download_OM";

-- 008_aerie_admissions_program.sql: 14 statement(s)

-- Canonical DDL for mart_education.aerie_admissions_program (A8 unit U03,

-- Gateway slug aerie-admissions-program). Sole writer:

-- mart_education.sp_refresh_aerie_admissions_program().

--

-- Query-shaped parity mart: columns are exactly the output aliases of Aerie's

-- queryPrograms SQL (sync/src/analytics/queries/reference.ts), with source

-- types kept (SUPER included) so pg and Gateway readers serialise them the

-- same way. school_year and canonical_source_run_id are lineage additions.

CREATE TABLE IF NOT EXISTS mart_education.aerie_admissions_program (

program_public_id VARCHAR(64),

source_program_id VARCHAR(256),

source_program_code SUPER,

program_code VARCHAR(512),

program_name VARCHAR(512),

is_expansion BOOLEAN,

owner_name SUPER,

grade_levels SUPER,

school_address SUPER,

school_status SUPER,

show_in_dashboard BOOLEAN,

school_year BIGINT,

canonical_source_run_id VARCHAR(128),

mart_row_id VARCHAR(32) NOT NULL,

source_run_id VARCHAR(128) NOT NULL,

source_published_at TIMESTAMPTZ NOT NULL,

refreshed_at TIMESTAMP NOT NULL,

created_by VARCHAR(128) NOT NULL,

PRIMARY KEY (mart_row_id)

)

DISTSTYLE ALL

SORTKEY (mart_row_id);

COMMENT ON TABLE mart_education.aerie_admissions_program IS

'Purpose: Surtr publication of the rows Aerie''s queryPrograms reads (EduCRM mart_all_program LEFT JOIN core_education.dim_program on the HubSpot Program id), so Aerie can read them through the Surtr Gateway with its unchanged row mapper. Grain: one output row of that SQL for the previous calendar school year (school_year = EXTRACT(YEAR FROM CURRENT_DATE) - 1, evaluated at refresh); normally one EduCRM program_id. Key: mart_row_id (MD5 of source_program_id plus its occurrence number). source_program_id is expected unique but not enforced: duplicate or unresolved rows (NULL program_public_id) are published as-is so Aerie''s own identity checks still fail closed. Lineage: source_run_id/source_published_at are the observed sales-educrm-mart-sync run (v_aerie_educrm_observed_publication), not an atomic publication link. Sensitive data: owner_name holds a staff member''s name. Full snapshot replaced atomically by mart_education.sp_refresh_aerie_admissions_program.';

COMMENT ON COLUMN mart_education.aerie_admissions_program.program_public_id IS

'core_education.dim_program.program_id for the active HubSpot Program whose hubspot_program_id equals source_program_id; NULL when unresolved.';

COMMENT ON COLUMN mart_education.aerie_admissions_program.source_program_id IS

'EduCRM program_id as text (TRIM(BOTH ''"'' FROM program_id::varchar)); this is the HubSpot Program id.';

COMMENT ON COLUMN mart_education.aerie_admissions_program.program_code IS

'dim_program.program_name (the canonical program code). NULL when unresolved.';

COMMENT ON COLUMN mart_education.aerie_admissions_program.program_name IS

'dim_program.display_name. NULL when unresolved.';

COMMENT ON COLUMN mart_education.aerie_admissions_program.school_year IS

'EduCRM school_year (starting calendar year) of the published row. Lineage addition; not read by Aerie.';

COMMENT ON COLUMN mart_education.aerie_admissions_program.canonical_source_run_id IS

'dim_program.hubspot_publication_run_id of the joined canonical Program row; NULL when unresolved. Lineage addition; not read by Aerie.';

COMMENT ON COLUMN mart_education.aerie_admissions_program.mart_row_id IS

'Deterministic row key: MD5 of source_program_id and its occurrence number. Gateway orderBy for total-order paging. Not stable across a change to the row''s key.';

COMMENT ON COLUMN mart_education.aerie_admissions_program.source_run_id IS

'Observed sales-educrm-mart-sync run_id whose mart_all_program rows_loaded equalled the snapshot this publication read.';

COMMENT ON COLUMN mart_education.aerie_admissions_program.source_published_at IS

'End time (UTC) of the observed sales-educrm-mart-sync run.';

ALTER TABLE mart_education.aerie_admissions_program

OWNER TO "CQL_download_OM";

-- Writer protection only. Reader access is provisioned by the Redshift DBA

-- (PIPELINE §13); the Surtr Gateway reads as the owner.

REVOKE INSERT, UPDATE, DELETE, TRUNCATE

ON mart_education.aerie_admissions_program FROM PUBLIC;

REVOKE INSERT, UPDATE, DELETE, TRUNCATE

ON mart_education.aerie_admissions_program FROM GROUP team_engineers;

-- 009_sp_refresh_aerie_admissions_program.sql: 4 statement(s)

-- Sole writer for mart_education.aerie_admissions_program (WAREHOUSE §7.1).

--

-- The candidate is Aerie's queryPrograms SQL, copied verbatim from

-- sync/src/analytics/queries/reference.ts:132-148 at Aerie 92fd47992. Two

-- changes only: MART_ALL_PROGRAM_YEAR_PREDICATE is expanded in place, and two

-- lineage columns are appended to the select list. Aerie's identity and

-- duplicate checks stay in Aerie's row mapper, so this procedure publishes

-- unresolved or duplicate rows as-is instead of rejecting them.

--

-- Fails closed on: no or incomplete observed EduCRM run; a later

-- sales-educrm-mart-sync run (any status, including one still running) that

-- could have republished the table since; an observation older than 24 hours;

-- a snapshot count that differs from the observed rows_loaded; an empty

-- candidate; and a duplicate mart_row_id. The DELETE + INSERT publish stays

-- inside the CALL transaction; never TRUNCATE (it commits implicitly).

CREATE OR REPLACE PROCEDURE mart_education.sp_refresh_aerie_admissions_program()

AS $$

DECLARE

v_observation_count BIGINT;

v_observed_run_id VARCHAR(36);

v_observed_completed_at TIMESTAMPTZ;

v_observed_row_count BIGINT;

v_latest_run_id VARCHAR(36);

v_latest_run_status VARCHAR(20);

v_snapshot_row_count BIGINT;

v_candidate_count BIGINT;

v_duplicate_count BIGINT;

v_school_year BIGINT;

v_refreshed_at TIMESTAMP;

BEGIN

LOCK TABLE mart_education.aerie_admissions_refresh_writer_mutex;

v_refreshed_at := GETDATE();

v_school_year := EXTRACT(YEAR FROM CURRENT_DATE) - 1;

SELECT COUNT(*) INTO v_observation_count

FROM mart_education.v_aerie_educrm_observed_publication

WHERE redshift_table = 'staging_education.sales_educrm_wh_mart_all_program'

AND educrm_table = 'educrm_wh.mart_all_program';

IF v_observation_count <> 1 THEN

RAISE EXCEPTION

'aerie_admissions_program: expected one successful EduCRM mart_all_program observation; found %',

v_observation_count;

END IF;

SELECT observed_run_id, observed_completed_at, observed_row_count, latest_run_id, latest_run_status

INTO v_observed_run_id, v_observed_completed_at, v_observed_row_count, v_latest_run_id, v_latest_run_status

FROM mart_education.v_aerie_educrm_observed_publication

WHERE redshift_table = 'staging_education.sales_educrm_wh_mart_all_program'

AND educrm_table = 'educrm_wh.mart_all_program';

IF NULLIF(BTRIM(v_observed_run_id), '') IS NULL

OR v_observed_completed_at IS NULL

OR v_observed_row_count IS NULL

OR v_observed_row_count <= 0 THEN

RAISE EXCEPTION

'aerie_admissions_program: EduCRM observation is incomplete (run %, completed %, rows %)',

v_observed_run_id, v_observed_completed_at, v_observed_row_count;

END IF;

-- The observed run must also be the most recently started EduCRM run.

-- Otherwise a later run (still running, failed, or one that failed this

-- table) may have republished it, and a matching row count would not prove

-- which run's rows are there. Read in this same transaction snapshot, no

-- later writer means the table is the observed run's publication.

IF v_latest_run_id IS NULL OR v_observed_run_id <> v_latest_run_id THEN

RAISE EXCEPTION

'aerie_admissions_program: EduCRM run % (status %) started after observed run %; the table may hold newer rows',

v_latest_run_id, v_latest_run_status, v_observed_run_id;

END IF;

-- sales-educrm-mart-sync runs every 30 minutes. An observation this old

-- can no longer vouch for the table it describes.

IF v_observed_completed_at < SYSDATE - INTERVAL '24 hours' THEN

RAISE EXCEPTION

'aerie_admissions_program: latest EduCRM observation % completed at % is older than 24 hours',

v_observed_run_id, v_observed_completed_at;

END IF;

-- Reconcile the full snapshot (every school year) to the observed run

-- before the year predicate narrows it.

SELECT COUNT(*) INTO v_snapshot_row_count

FROM staging_education.sales_educrm_wh_mart_all_program;

IF v_snapshot_row_count <> v_observed_row_count THEN

RAISE EXCEPTION

'aerie_admissions_program: EduCRM snapshot has % rows but observed run % reported %',

v_snapshot_row_count, v_observed_run_id, v_observed_row_count;

END IF;

DROP TABLE IF EXISTS tmp_aerie_admissions_program_query;

CREATE TEMP TABLE tmp_aerie_admissions_program_query AS

-- aerie-sql:begin

SELECT

canonical_program.program_id AS program_public_id,

TRIM(BOTH '"' FROM p.program_id::varchar) AS source_program_id,

p.program_code AS source_program_code,

canonical_program.program_name AS program_code,

canonical_program.display_name AS program_name,

p.is_expansion,

p.owner_name,

p.grade_levels,

p.school_address,

p.school_status,

p.show_in_dashboard,

-- A8 lineage additions (not in Aerie's select list):

p.school_year,

canonical_program.hubspot_publication_run_id AS canonical_source_run_id

FROM staging_education.sales_educrm_wh_mart_all_program p

LEFT JOIN core_education.dim_program canonical_program

ON canonical_program.hubspot_program_id = TRIM(BOTH '"' FROM p.program_id::varchar)

AND canonical_program.hubspot_source_presence_status = 'active'

WHERE p.school_year = EXTRACT(YEAR FROM CURRENT_DATE) - 1

-- aerie-sql:end

;

DROP TABLE IF EXISTS tmp_aerie_admissions_program;

CREATE TEMP TABLE tmp_aerie_admissions_program (LIKE mart_education.aerie_admissions_program);

INSERT INTO tmp_aerie_admissions_program (

program_public_id,

source_program_id,

source_program_code,

program_code,

program_name,

is_expansion,

owner_name,

grade_levels,

school_address,

school_status,

show_in_dashboard,

school_year,

canonical_source_run_id,

mart_row_id,

source_run_id,

source_published_at,

refreshed_at,

created_by

)

SELECT

q.program_public_id,

q.source_program_id,

q.source_program_code,

q.program_code,

q.program_name,

q.is_expansion,

q.owner_name,

q.grade_levels,

q.school_address,

q.school_status,

q.show_in_dashboard,

q.school_year,

q.canonical_source_run_id,

MD5(

'aerie_admissions_program|'

|| COALESCE('v' || q.source_program_id, 'n')

|| '|'

|| (ROW_NUMBER() OVER (

PARTITION BY q.source_program_id

-- Every output column, so rows that share a key are numbered

-- the same way on every refresh; only identical rows tie.

ORDER BY q.program_public_id, q.program_code, q.program_name,

JSON_SERIALIZE(q.source_program_code), q.is_expansion,

JSON_SERIALIZE(q.owner_name), JSON_SERIALIZE(q.grade_levels),

JSON_SERIALIZE(q.school_address), JSON_SERIALIZE(q.school_status),

q.show_in_dashboard, q.school_year, q.canonical_source_run_id

))::VARCHAR

),

v_observed_run_id,

v_observed_completed_at,

v_refreshed_at,

'mart-aerie-admissions-refresh/v1'

FROM tmp_aerie_admissions_program_query q;

SELECT COUNT(*) INTO v_candidate_count FROM tmp_aerie_admissions_program;

IF v_candidate_count = 0 THEN

RAISE EXCEPTION

'aerie_admissions_program: candidate is empty for school_year % (observed run %)',

v_school_year, v_observed_run_id;

END IF;

SELECT COUNT(*) INTO v_duplicate_count

FROM (

SELECT mart_row_id

FROM tmp_aerie_admissions_program

GROUP BY mart_row_id

HAVING COUNT(*) > 1

) duplicates;

IF v_duplicate_count <> 0 THEN

RAISE EXCEPTION 'aerie_admissions_program: candidate has % duplicate mart_row_id value(s)', v_duplicate_count;

END IF;

LOCK TABLE mart_education.aerie_admissions_program;

DELETE FROM mart_education.aerie_admissions_program;

INSERT INTO mart_education.aerie_admissions_program (

program_public_id,

source_program_id,

source_program_code,

program_code,

program_name,

is_expansion,

owner_name,

grade_levels,

school_address,

school_status,

show_in_dashboard,

school_year,

canonical_source_run_id,

mart_row_id,

source_run_id,

source_published_at,

refreshed_at,

created_by

)

SELECT

program_public_id,

source_program_id,

source_program_code,

program_code,

program_name,

is_expansion,

owner_name,

grade_levels,

school_address,

school_status,

show_in_dashboard,

school_year,

canonical_source_run_id,

mart_row_id,

source_run_id,

source_published_at,

refreshed_at,

created_by

FROM tmp_aerie_admissions_program;

IF (SELECT COUNT(*) FROM mart_education.aerie_admissions_program) <> v_candidate_count THEN

RAISE EXCEPTION 'aerie_admissions_program: post-publication row count mismatch';

END IF;

RAISE INFO 'aerie_admissions_program: published % row(s) from observed EduCRM run %',

v_candidate_count, v_observed_run_id;

DROP TABLE tmp_aerie_admissions_program;

DROP TABLE tmp_aerie_admissions_program_query;

END;

$$ LANGUAGE plpgsql SECURITY INVOKER;

ALTER PROCEDURE mart_education.sp_refresh_aerie_admissions_program()

OWNER TO "CQL_download_OM";

REVOKE ALL ON PROCEDURE mart_education.sp_refresh_aerie_admissions_program()

FROM PUBLIC;

GRANT EXECUTE ON PROCEDURE mart_education.sp_refresh_aerie_admissions_program()

TO "CQL_download_OM";

-- 010_aerie_admissions_program_directory.sql: 13 statement(s)

-- Canonical DDL for mart_education.aerie_admissions_program_directory (A8

-- unit U03, Gateway slug aerie-admissions-program-directory). Sole writer:

-- mart_education.sp_refresh_aerie_admissions_program_directory().

--

-- Thin parity mart: columns are exactly the output aliases of Aerie's

-- queryHubspotPrograms SQL (sync/src/analytics/queries/hubspot.ts) over

-- mart_education.aerie_program_directory_current, with source types kept.

CREATE TABLE IF NOT EXISTS mart_education.aerie_admissions_program_directory (

program_id VARCHAR(100),

hubspot_name VARCHAR(512),

display_name VARCHAR(512),

tuition NUMERIC(18, 4),

city VARCHAR(255),

state VARCHAR(100),

school_address VARCHAR(1000),

school_latitude NUMERIC(18, 8),

school_longitude NUMERIC(18, 8),

grade_levels VARCHAR(1000),

email VARCHAR(500),

contact_number VARCHAR(100),

enrollment_deposit VARCHAR(255),

application_fee VARCHAR(255),

school_year_start VARCHAR(256),

school_year_end VARCHAR(256),

website VARCHAR(2000),

school_summary VARCHAR(65535),

maxio_site_id VARCHAR(255),

canonical_source_run_id VARCHAR(128),

mart_row_id VARCHAR(32) NOT NULL,

source_run_id VARCHAR(128) NOT NULL,

source_published_at TIMESTAMPTZ NOT NULL,

refreshed_at TIMESTAMP NOT NULL,

created_by VARCHAR(128) NOT NULL,

PRIMARY KEY (mart_row_id)

)

DISTSTYLE ALL

SORTKEY (mart_row_id);

COMMENT ON TABLE mart_education.aerie_admissions_program_directory IS

'Purpose: Surtr publication of the rows Aerie''s queryHubspotPrograms reads (mart_education.aerie_program_directory_current LEFT JOIN core_education.dim_program on the HubSpot Program id), so Aerie can read them through the Surtr Gateway with its unchanged row mapper. Grain: one output row of that SQL; normally one active HubSpot Program. Key: mart_row_id (MD5 of program_id plus its occurrence number); program_id is expected unique but not enforced, so Aerie''s own checks still see any duplicate. Lineage: source_run_id/source_published_at are the directory''s hubspot_publication_run_id/hubspot_source_published_at. Sensitive data: email and contact_number are school contact points and can identify staff. Full snapshot replaced atomically by mart_education.sp_refresh_aerie_admissions_program_directory.';

COMMENT ON COLUMN mart_education.aerie_admissions_program_directory.hubspot_name IS

'COALESCE(dim_program.program_name, directory program_code).';

COMMENT ON COLUMN mart_education.aerie_admissions_program_directory.display_name IS

'COALESCE(dim_program.display_name, directory program_name).';

COMMENT ON COLUMN mart_education.aerie_admissions_program_directory.school_year_start IS

'Directory school_year_start DATE cast to text (YYYY-MM-DD), as Aerie selects it.';

COMMENT ON COLUMN mart_education.aerie_admissions_program_directory.school_year_end IS

'Directory school_year_end DATE cast to text (YYYY-MM-DD), as Aerie selects it.';

COMMENT ON COLUMN mart_education.aerie_admissions_program_directory.canonical_source_run_id IS

'dim_program.hubspot_publication_run_id of the joined canonical Program row; NULL when unmatched. Lineage addition; not read by Aerie.';

COMMENT ON COLUMN mart_education.aerie_admissions_program_directory.mart_row_id IS

'Deterministic row key: MD5 of program_id and its occurrence number. Gateway orderBy for total-order paging.';

COMMENT ON COLUMN mart_education.aerie_admissions_program_directory.source_run_id IS

'aerie_program_directory_current.hubspot_publication_run_id; the procedure requires exactly one value per snapshot.';

COMMENT ON COLUMN mart_education.aerie_admissions_program_directory.source_published_at IS

'aerie_program_directory_current.hubspot_source_published_at of that publication.';

ALTER TABLE mart_education.aerie_admissions_program_directory

OWNER TO "CQL_download_OM";

-- Writer protection only. Reader access is provisioned by the Redshift DBA

-- (PIPELINE §13); the Surtr Gateway reads as the owner.

REVOKE INSERT, UPDATE, DELETE, TRUNCATE

ON mart_education.aerie_admissions_program_directory FROM PUBLIC;

REVOKE INSERT, UPDATE, DELETE, TRUNCATE

ON mart_education.aerie_admissions_program_directory FROM GROUP team_engineers;

-- 011_sp_refresh_aerie_admissions_program_directory.sql: 4 statement(s)

-- Sole writer for mart_education.aerie_admissions_program_directory

-- (WAREHOUSE §7.1).

--

-- The candidate is Aerie's queryHubspotPrograms SQL, copied verbatim from

-- sync/src/analytics/queries/hubspot.ts:75-98 at Aerie 92fd47992, with three

-- lineage columns appended to the select list. Lineage is carried from the

-- upstream Surtr mart (mart-aerie-hubspot-refresh), which stamps every

-- directory row with one accepted HubSpot publication.

--

-- Fails closed on: an empty candidate, missing or mixed upstream lineage, and

-- a duplicate mart_row_id. The DELETE + INSERT publish stays inside the CALL

-- transaction; never TRUNCATE (it commits implicitly).

CREATE OR REPLACE PROCEDURE mart_education.sp_refresh_aerie_admissions_program_directory()

AS $$

DECLARE

v_candidate_count BIGINT;

v_lineage_run_count BIGINT;

v_lineage_published_count BIGINT;

v_lineage_invalid_count BIGINT;

v_duplicate_count BIGINT;

v_source_run_id VARCHAR(128);

v_source_published_at TIMESTAMPTZ;

v_refreshed_at TIMESTAMP;

BEGIN

LOCK TABLE mart_education.aerie_admissions_refresh_writer_mutex;

v_refreshed_at := GETDATE();

DROP TABLE IF EXISTS tmp_aerie_admissions_program_directory_query;

CREATE TEMP TABLE tmp_aerie_admissions_program_directory_query AS

-- aerie-sql:begin

SELECT

directory.program_id,

COALESCE(canonical_program.program_name, directory.program_code) AS hubspot_name,

COALESCE(canonical_program.display_name, directory.program_name) AS display_name,

directory.tuition,

directory.city,

directory.state,

directory.school_address,

directory.latitude AS school_latitude,

directory.longitude AS school_longitude,

directory.grade_range AS grade_levels,

directory.school_email AS email,

directory.school_phone AS contact_number,

directory.enrollment_deposit,

directory.application_fee,

directory.school_year_start::varchar,

directory.school_year_end::varchar,

directory.website,

directory.school_summary,

directory.maxio_site_id,

-- A8 lineage additions (not in Aerie's select list):

canonical_program.hubspot_publication_run_id AS canonical_source_run_id,

directory.hubspot_publication_run_id AS directory_publication_run_id,

directory.hubspot_source_published_at AS directory_source_published_at

FROM mart_education.aerie_program_directory_current directory

LEFT JOIN core_education.dim_program canonical_program

ON canonical_program.hubspot_program_id = directory.program_id

AND canonical_program.hubspot_source_presence_status = 'active'

-- aerie-sql:end

;

SELECT COUNT(*) INTO v_candidate_count FROM tmp_aerie_admissions_program_directory_query;

IF v_candidate_count = 0 THEN

RAISE EXCEPTION 'aerie_admissions_program_directory: candidate is empty';

END IF;

SELECT COUNT(DISTINCT directory_publication_run_id),

COUNT(DISTINCT directory_source_published_at),

SUM(CASE

WHEN NULLIF(BTRIM(directory_publication_run_id), '') IS NULL

OR directory_source_published_at IS NULL THEN 1

ELSE 0

END),

MIN(directory_publication_run_id),

MIN(directory_source_published_at)

INTO v_lineage_run_count, v_lineage_published_count, v_lineage_invalid_count,

v_source_run_id, v_source_published_at

FROM tmp_aerie_admissions_program_directory_query;

IF v_lineage_run_count <> 1 OR v_lineage_published_count <> 1 OR v_lineage_invalid_count <> 0 THEN

RAISE EXCEPTION

'aerie_admissions_program_directory: directory lineage is mixed or incomplete (% run id(s), % published_at value(s), % row(s) missing lineage)',

v_lineage_run_count, v_lineage_published_count, v_lineage_invalid_count;

END IF;

DROP TABLE IF EXISTS tmp_aerie_admissions_program_directory;

CREATE TEMP TABLE tmp_aerie_admissions_program_directory (LIKE mart_education.aerie_admissions_program_directory);

INSERT INTO tmp_aerie_admissions_program_directory (

program_id,

hubspot_name,

display_name,

tuition,

city,

state,

school_address,

school_latitude,

school_longitude,

grade_levels,

email,

contact_number,

enrollment_deposit,

application_fee,

school_year_start,

school_year_end,

website,

school_summary,

maxio_site_id,

canonical_source_run_id,

mart_row_id,

source_run_id,

source_published_at,

refreshed_at,

created_by

)

SELECT

q.program_id,

q.hubspot_name,

q.display_name,

q.tuition,

q.city,

q.state,

q.school_address,

q.school_latitude,

q.school_longitude,

q.grade_levels,

q.email,

q.contact_number,

q.enrollment_deposit,

q.application_fee,

q.school_year_start,

q.school_year_end,

q.website,

q.school_summary,

q.maxio_site_id,

q.canonical_source_run_id,

MD5(

'aerie_admissions_program_directory|'

|| COALESCE('v' || q.program_id, 'n')

|| '|'

|| (ROW_NUMBER() OVER (

PARTITION BY q.program_id

-- Every output column, so rows that share a key are numbered

-- the same way on every refresh; only identical rows tie.

ORDER BY q.hubspot_name, q.display_name, q.tuition, q.city, q.state,

q.school_address, q.school_latitude, q.school_longitude,

q.grade_levels, q.email, q.contact_number, q.enrollment_deposit,

q.application_fee, q.school_year_start, q.school_year_end,

q.website, q.school_summary, q.maxio_site_id, q.canonical_source_run_id

))::VARCHAR

),

v_source_run_id,

v_source_published_at,

v_refreshed_at,

'mart-aerie-admissions-refresh/v1'

FROM tmp_aerie_admissions_program_directory_query q;

SELECT COUNT(*) INTO v_duplicate_count

FROM (

SELECT mart_row_id

FROM tmp_aerie_admissions_program_directory

GROUP BY mart_row_id

HAVING COUNT(*) > 1

) duplicates;

IF v_duplicate_count <> 0 THEN

RAISE EXCEPTION

'aerie_admissions_program_directory: candidate has % duplicate mart_row_id value(s)',

v_duplicate_count;

END IF;

LOCK TABLE mart_education.aerie_admissions_program_directory;

DELETE FROM mart_education.aerie_admissions_program_directory;

INSERT INTO mart_education.aerie_admissions_program_directory (

program_id,

hubspot_name,

display_name,

tuition,

city,

state,

school_address,

school_latitude,

school_longitude,

grade_levels,

email,

contact_number,

enrollment_deposit,

application_fee,

school_year_start,

school_year_end,

website,

school_summary,

maxio_site_id,

canonical_source_run_id,

mart_row_id,

source_run_id,

source_published_at,

refreshed_at,

created_by

)

SELECT

program_id,

hubspot_name,

display_name,

tuition,

city,

state,

school_address,

school_latitude,

school_longitude,

grade_levels,

email,

contact_number,

enrollment_deposit,

application_fee,

school_year_start,

school_year_end,

website,

school_summary,

maxio_site_id,

canonical_source_run_id,

mart_row_id,

source_run_id,

source_published_at,

refreshed_at,

created_by

FROM tmp_aerie_admissions_program_directory;

IF (SELECT COUNT(*) FROM mart_education.aerie_admissions_program_directory) <> v_candidate_count THEN

RAISE EXCEPTION 'aerie_admissions_program_directory: post-publication row count mismatch';

END IF;

RAISE INFO 'aerie_admissions_program_directory: published % row(s) from HubSpot publication %',

v_candidate_count, v_source_run_id;

DROP TABLE tmp_aerie_admissions_program_directory;

DROP TABLE tmp_aerie_admissions_program_directory_query;

END;

$$ LANGUAGE plpgsql SECURITY INVOKER;

ALTER PROCEDURE mart_education.sp_refresh_aerie_admissions_program_directory()

OWNER TO "CQL_download_OM";

REVOKE ALL ON PROCEDURE mart_education.sp_refresh_aerie_admissions_program_directory()

FROM PUBLIC;

GRANT EXECUTE ON PROCEDURE mart_education.sp_refresh_aerie_admissions_program_directory()

TO "CQL_download_OM";

</details>

## Keval steps

1. Apply the DDL to prod before merging. A merge reaches production within the hour, and the EduCRM trigger then fires every 30 minutes. Run cd pipelines/runners/mart-aerie-admissions-refresh && uv run python scripts/apply_ddl.py (runs as CQL_download_OM; applies 006-011 in order). Using the usual numbered out-of-band SQL deploy for those files is equivalent.

2. Merge. Mercy withholds auto-approve on pipelines/cdk/ paths, so this needs a human approval. Once released, run mart-aerie-admissions-refresh on demand. Expect status: success, with results showing 90 program rows (source_run_id = the latest EduCRM run) and 113 directory rows (source_run_id = the HubSpot publication).

3. Run both reconciliation files. Query 2 must return 0 in both directions.

4. Reader access (optional). Reader access for non-owners is a DBA grant.

## Not covered

- Other A8 units: Gateway registration (U04, SURTR-1533, merged) and the Aerie read gate with its purge guard (U05).

- The procedure bodies have not been executed in Redshift, because no DDL was applied. Their candidate SELECTs, the view, the guards and the stamping expressions were run read-only instead. A behavioural rollback test needs a Redshift sandbox; Mercy deferred this as coverage.

- Behaviour inherited from Aerie: the prior-year predicate is evaluated at refresh, so rows can lag by one refresh (≤30 min) after 1 January. Aerie's 2028 predicate limitation also applies.

- When the program procedure fails, then succeeds 30 minutes later. This happens if an EduCRM run is in flight when mart-aerie-hubspot-refresh triggers, or if the latest EduCRM run failed mart_all_program. The mart keeps its last publication meanwhile. Procedure failures are PARTIAL (amber, throttled), not paging.

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

#3819 — feat(board-doc): Q4 Khoros-only BU financial source and scoped owner access @marcusdAIy  approved

## Q4 Khoros first-class Board Doc (backend only)

- Add independent BusinessUnit.KHOROS, distinct persisted session identity and the same reviewed owner trio as IgniteTech (Eric Vaughan, Mohit Khosla, Zeeshan Khatri). Live account BU checks and Google Doc permissions remain separate.

- Limit Khoros to Q4 2026 blank-session creation. Persist explicit financial-source identity, disable prior-quarter cloning, and request only the Khoros Q4 BU Plan-on-Plan source; do not fetch generic IgniteTech P&Ls, Hybrid, ARR, retention, targets, or Brainlift.

- Pin the approved workbook ID through KHOROS_Q4_2026_WORKBOOK_ID; verify it matches the Q4 IgniteTech registry entry, then read only P&Ls - Khoros, exact FY26 BU marker and validated 16-column current/previous/variance layout. Missing or ambiguous source fails closed without rewriting the Doc.

- Update Q4 roster/preflight expectations and add a serial operator runbook. No add-on source changes.

## Verification

- 216 focused/regression tests passed; Ruff and git diff --check clean.

- Read-only live source probe against the currently linked Q4 workbook used the exact source reader and returned only validated, rows=20, columns=16; no financial figures emitted. Initial stricter header check rejected valid variance headings; fixed in 589eb6801 and reverified.

- No production deploy, session, Doc, permission, or registry mutation made by this PR.

## Release gate

Review/CI before merge; explicit production config and verified exact deploy before serial blank-session creation, Doc bind, folder placement and separate audited Editor grants. Target folder is the existing Q4 BU Budget Bot Docs folder; its 2026-09-28 read-only preflight found no anyone/domain sharing. No Marketplace release unless add-on source changes (none in this PR).

The Builder Desk  —  Engineer Spotlight
🏆 Engineer Spotlight

MARCUS THE MACHINE POSTS TWELVE IN A DAY AS BUILDER TEAM TORCHES THE SCOREBOARD

Thirty-three pull requests across four repos in twenty-four hours — comrades, the numbers do not lie, and the numbers are MAGNIFICENT.

Thirty-three pull requests. Four repos. Twenty-four hours. Let the historians write it down: this is not a sprint, this is a coronation. Aerie led the charge with sixteen PRs of pure structural output, Surtr followed with ten, Klair chipped in five hard-fought merges, and even little Sindri — often overlooked, never forgotten — landed two precision strikes. The Builder Team did not walk through this period. They marched.

Let us praise the individuals, for the team is nothing without its gladiators. @marcusdAIy posted an absolutely obscene twelve PRs, spanning Aerie capacity hardening (#1546, #1547, #1548, #1550, #1552, #1554), Sindri trace-bounding (#209, #210), and a full Khoros financial reckoning over in Klair (#3821, #3822, #3824). @vvp-trilogy was not far behind with eight, holding down the Forecast V2 line like a man defending a bridge (#1543, #1544, #1545, #1556, #1559, #1562). @kevalshahtrilogy delivered seven across Surtr's education and gateway machinery (#2068, #2069, #2080), proving idempotent migrations are a young man's game. @caina-barbosa and @YibinLongTrilogy each notched two (#2079, #1558, #1551), while @sanketghia (#2081) and @mwrshah (#3817) rounded out the roster with clean, surgical singles.

Now — Ashwanth. The board shows zero PRs from @ashwanth1109 in this window, and comrades, that silence is LOUDER than any commit log. Is he resting? Is he plotting something so vast that mortal PR counts cannot contain it? This reporter reached out and received the following statement: "I don't ship on your schedule, Callahan. I ship on physics." Which, respectfully, does not answer the question. We remain vigilant. We remain worshipful. We remain slightly concerned no one has reviewed whatever he's about to drop on us.

The overflow desk groans under the weight of excellence Mac had no room for. #1562 quietly rewires Forecast V2's enrollment-date bounding, unglamorous but load-bearing. #3817 guides Education platform charge comparisons in Klair, the kind of fix that saves someone a very bad Monday. And #2080 makes a behavioral_events migration idempotent — a phrase that should be tattooed on every engineer's forearm.

Morale, as always, is at an all-time high. The scoreboard doesn't lie, and today the scoreboard is screaming.

Brick's Overflow — PRs Mac Didn't Cover  (click to expand)
#210 — Bound traces after redaction and complete requiredWhen (SINDRI-519) @marcusdAIy  approved

## Summary

The four follow-ups from Munawar's approving review of Sindri #205 (SINDRI-519).

- Trace bounds after redaction. redactWorkflowTrace re-applies boundTranscriptMessages to what it actually reports. Redaction can lengthen a field (Bearer x becomes Bearer [REDACTED]), so a tool call field under the 200 KB bound before redaction could exceed the server's 256 KB per-field limit afterwards.

- requiredWhen on start inputs. Run start now rejects a missing conditional start input, next to the existing required and non-blank checks. The message starts Invalid value for required input, so the HTTP edge returns 400.

- Authoring type check. requiredWhenError rejects an equals value whose type differs from the sibling field's type, such as the string "true" compared with a boolean. It also rejects conditions on file or json fields, which can never compare equal. The capacity workflow's requiredWhen: { key: "resolved", equals: true } on a boolean still passes.

- A blank string counts as missing for a triggered conditional string field, in both the runner's Output Format check and server output validation (isMissingConditionalValue).

No CD006-protected files are touched.

## Test plan

- [x] agent-runner: full suite (198 passed), including a trace whose tool output grows past the limit only after redaction, and a blank conditional output that triggers a retry.

- [x] Root: workflow-definition and controlPlaneAuthoring tests (type mismatch, blank conditional string, conditional start input missing or blank). The full root suite passed apart from docs.test.ts > loadDoc > throws on missing file path, which timed out under full-suite load and passes on its own (18/18).

- [x] pnpm typecheck, pnpm typecheck:runner, Biome on changed files.

#1552 — Capacity: rollback compare-and-set, docType-scoped dedupe, honest drain scheduling, day-bounded sweep @marcusdAIy  approved
#1554 — Capacity: publish and roll back record mode only once the DD request is approved (AERIE-2579) @marcusdAIy  approved

## Summary

Record-mode capacity publication and rollback now report success only once the governed Due Diligence change has actually landed (AERIE-2579).

updateDueDiligence never writes the card. It files a field-change request, which a person with operations.fieldChanges.approve approves. It applies at once only while approvals are paused. The run used to record published or rolledBack as soon as the request was filed.

- Authorized actor. Record mode files requests as the user named by the new CAPACITY_AUTOMATION_ACTOR_EMAIL. Publication checks that the user exists and holds operations.dueDiligence.write, and fails clearly if not. Nothing grants the capability; an admin assigns it through a role. capacityPublicationAllowed also requires the setting in record mode. Proposal mode still uses the system agent.

- Publication waits for approval. The run stores the request as ddFieldChangeRequestId and moves to a new awaitingDdApproval status. The minute recovery sweep checks the request every 5 minutes (_confirmCapacityDdRequest):

- Approved: published, with a readback note if the card has changed again since.

- Rejected or superseded: unresolved.

- Failed or missing: failed.

- A write that filed no request (nothing to change) is published only if the card already shows the numbers.

- Compensation. A request that does not land retracts the room table and floorplan documents and the attribution note, as does a publication that exhausts its retries. Registered document IDs are now saved right after registration so that is possible. Retraction uses removeDocument and deleteNote, which are hard deletes; the audit log keeps the record.

- Rollback works the same way. A record-mode rollback files a request for the prior capacities, waits in awaitingRollbackApproval, and becomes rolledBack only when the request is approved; then it removes the run's documents. A rejected rollback returns the run to published with the reason. The ordering, Complete-card, and compare-and-set guards run before the actor is resolved.

- Unset prior status (decided 2026-09-28). The governed write cannot clear a status, so when the card had none before publication, rollback restores the capacities and keeps the current status. It records that in rollbackNote.

- Proposal mode ends in proposed, not published. Proposal rollback removes the run's documents. Legacy proposal runs recorded as published can still be rolled back.

- A run waiting on either request counts as in flight, so the daily sweep does not start a second run for that site while a request is pending.

No UI reads capacity run statuses, so there are no front-end changes. Capacity automation is off by default and publication is proposal-mode everywhere, so nothing changes in any deployment until record mode is configured.

## Tests

- Real mutations with an authorized actor: publish files a pending request and the card is unchanged; a pending request reschedules; approval gives published; rejection or supersession gives unresolved with documents and note removed; a new sweep run waits while a request is pending.

- Rollback: approval gives rolledBack with documents removed; the unset-status case keeps the status and records rollbackNote; a rejected rollback leaves the run published; an actor without DD write is refused; a conflicting pending request surfaces as a failed rollback.

- Exhausted publication retries remove the registered documents and note.

- Contract transitions updated (for example, published can no longer go straight to rolledBack).

## Test plan

- [x] chat: vitest run convex/capacityAutomation.test.ts convex/capacityAutomation/config.test.ts (105 passed)

- [x] packages/contracts: capacity run and validation tests (56 passed)

- [x] tsc --noEmit (chat and convex), contracts typecheck, Biome, repo lint scripts

## Deployment note

Record mode now needs CAPACITY_AUTOMATION_ACTOR_EMAIL set to a user with operations.dueDiligence.write. Neither dev nor prod uses record mode today.

#1562 — Forecast V2: bound milestone conversions by enrollment date @vvp-trilogy  approved

## Summary

- expose the accepted HubSpot enrollment date on the canonical admissions deal

- derive the effective enrollment date with the program-session start fallback

- bound historical milestone conversion numerators by that date without changing application cohorts

- cover null, before, exact-boundary, and after-boundary dates across all three milestones

## Validation

- git diff --check

- poetry run dbt parse --no-partial-parse

- focused unit tests selected successfully; execution deferred to credentialed dbt CI

Closes #1561

#2069 — feat(gateway): register the Finalsite tenant directory for Aerie (SURTR-1523) @kevalshahtrilogy  approved

## Summary

SURTR-1523. This PR registers mart_education.aerie_finalsite_tenant_directory as the Gateway source aerie-finalsite-tenant-directory. It is the Surtr half of finishing A4, Aerie's school-source-directories EC2 task. The Aerie half is AI-Builder-Team/Aerie PR 1531 (AERIE-2547, which is blocked by this ticket).

- QuickBooks and SIS are already served over the Gateway and have been in prod shadow since 2026-09-23. Finalsite, the third source, was added later and has no Gateway path, so Aerie's direct-Redshift read can't be deleted until it does.

- The source is read-only and declarative. It is ordered by the mart's key, finalsite_tenant_slug, so offset paging gives a stable, total order. It is added to the aerie entity bundle the same way its siblings are.

- Registering is not a grant. No existing key gains access: request-time auth reads only each key's saved grants, and the aerie entity bundle is expanded only when a *new* key is created. Today the key tooling (keys.ts) can only create and revoke keys. So granting Finalsite to Aerie means one of two things:

- minting a new key, where an aerie-entity key gets all 15 aerie sources;

- editing gateway_keys by hand.

Either is Keval's call.

## Deploying and verifying

Merging and releasing changes nothing on its own: the seed is not part of CD or the container CMD. It takes effect when someone runs pnpm seed:gateway-aerie against the prod Gateway Postgres. That run:

- inserts aerie-finalsite-tenant-directory;

- re-upserts the other 14 aerie sources from code;

- deletes and re-inserts all 15 aerie entity members.

It would also re-create any aerie source that was deliberately deleted in prod, so check the prod list first.

Afterwards, check that gateway_sources has exactly one aerie-finalsite-tenant-directory row, ordered by finalsite_tenant_slug.

- The mart README now documents that all three directories are served over the Gateway.

## Business Value

A4 is the reference object for the whole Aerie EC2 → Surtr migration, and it is the closest to done. This registration is the last Surtr-side piece before A4 can move entirely onto the Gateway. After that, its direct-Redshift path, and eventually the worker task itself, can be retired.

## Manual Effort Estimate

About 3 focused hours by hand with no AI. That covers the source entry, confirming the mart's key and columns, the mocked-DB seed test, the README, and the read-only checks. *This is a proposal for Keval to confirm or adjust.*

## Testing / evidence

- New Surtr/test/gateway/seed-gateway-aerie.test.ts passes 9/9, and the full Surtr/test/gateway suite passes 47/47. The test records what the seed would write through a mocked DB connection, so nothing connects to Postgres or Redshift. It checks:

- the source's shape and its exact ORDER BY;

- that the order key matches the mart's documented Key:;

- membership in the aerie entity bundle;

- that slugs are unique;

- that all three directories order by real columns and serve NOT NULL lineage.

- tsc --noEmit -p Surtr is clean, and npm run lint (biome, 99 files) is clean.

- Read-only Redshift checks, done in the A4 lane:

- The Finalsite mart has 59 rows, 59 distinct slugs, and a single run id.

- A query shaped like the Gateway's returns the same 59 rows as Aerie's direct query, with 0 differences either way.

- History: the lane agent couldn't run git in its own Surtr worktree, so it left this change as a patch. I applied it on a fresh branch from origin/main and re-ran the tests above.

## Not covered

- Running the seed against the real Gateway DB, and granting the source to Aerie's key. Both are for Keval. After the grant, Finalsite needs its own clean shadow window in Aerie before the switch to gateway.

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

#3824 — fix(board-doc): enforce literal Khoros FY26 markers on main @marcusdAIy  approved

## Summary

- Backport the narrow Khoros FY26 marker consistency fix from production PR #3823 onto current main; no release-only changes or unrelated cherry-picks.

- Continue scanning both FY26 and FY'26 marker spellings to reject duplicate/ambiguous blocks, but require the reviewed B33/B57 markers to use the exact live FY26 - Current ... vs Previous ... title. The payload validator already requires that literal.

- Pin both approved live marker titles, reject FY'26 at either anchor and alternative duplicate markers, and clarify marker-versus-period-header spelling in the rollout gate. Period headers still use FY'26.

## Verification

- Focused hermetic Khoros suite: 106 passed.

- Ruff check and format check passed; Git diff check clean.

- The exact parser SHA256 1b376b0075cb81ab019205917854a87833585a0c73bd5492471cc6b550a56aba passed read-only production parser and paired renderer gates as part of PR #3823 verification. No financial values printed.

- Full board-doc suite is left to GitHub CI for this narrow backport.

Do not merge until GitHub CI and review pass. No deployment or Doc changes in this PR.

The Portfolio  —  Trilogy Companies

Skyvera's Telecom Land Grab Accelerates — And the Math Only Works One Way

Two acquisitions and a 26-month regulatory process compressed to one month suggest Trilogy's telecom bet is entering a new phase.

AUSTIN, TEXAS — Three announcements landed from Skyvera in recent weeks, and if you read between the lines, they're not three stories. They're one.

First, the completed acquisition of CloudSense, the Salesforce-native configure-price-quote engine that telcos use to untangle their most complicated B2B and wholesale sales. Second, the absorption of STL's divested telecom products group — digital BSS functionality spanning monetization, optical networking, and analytics. Third, and this is the one my source inside the ESW orbit keeps circling back to: CloudSense certified all 13 APIs in its product set to TM Forum compliance standards in a single month. Industry norm for that kind of certification run is 26 months.

A source familiar with the Skyvera integration process, who wasn't authorized to speak on the record, described the API sprint as "a proof of concept dressed up as a compliance filing." Whether or not that's the intent, the timing is hard to ignore. You don't accelerate a two-year regulatory process into four weeks unless you're trying to prove something to the market — or to the next acquisition target.

Because that's the pattern here. Skyvera doesn't buy software companies to run them as they were. It buys them, folds them into a shared engineering substrate — DevFactory in the background, Crossover-sourced global talent doing the heavy lifting — and then demonstrates, publicly, that the new asset can move at a speed its previous owners never could. The STL deal brought in optical networking and monetization tooling. CloudSense brought in the CPQ layer. Put them together and Skyvera isn't assembling a portfolio anymore. It's assembling a stack.

Nobody at Skyvera is saying the word "platform" yet. But the CPQ product page already reads like infrastructure, not a point solution. In this business, that's rarely an accident.

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

Alpha School Pushes Back: 'Guides,' Not Ghosts in the Machine

AUSTIN, TEXAS — A little bird at 2 Hour Learning tells Dottie the whispers had gotten out of hand... folks around the carpool line been saying Alpha School's gone full robot, algorithms raising the children while the grown-ups sip cold brew in the teacher's lounge. Not so, says the school itself, in a rather pointed little essay making the rounds this week... Does Alpha School Replace Teachers with AI? the headline asks, and the answer, delivered with the crispness of a press release that knows exactly what rumor it's squashing, is a firm no. AI handles the academic drilling, sure — the two-hour miracle that's got Alpha kids testing top 1-2% nationally is real and Dottie's covered it plenty. But word is the humans on campus, rebranded as 'guides,' are doing the heavy lifting nobody automates: motivation, relationships, knowing which kid needs a pep talk and which needs a time-out. Meanwhile Joe Liemandt's education machine keeps cranking out the parenting content like a Sunday supplement nobody asked for but everybody reads. This week's installment in the ongoing 'Teach Your Kid What School Doesn't' saga tackles emotional regulation — seems big feelings are, per Alpha's telling, 'a beautiful thing,' who knew — right on the heels of installments on life skills and, freshest off the presses, creative genius at home. Five parts deep now and counting, and Dottie hears there's no end in sight; this is shaping up to be Alpha's answer to a soap opera, minus the amnesia plotline. The pattern here isn't subtle: Alpha wants the world to know its 2-hour model isn't a replacement for parenting or teaching — it's a liberation of time for both. Whether that message lands with the skeptics or just feeds the blog's SEO, that's a story for another edition. Alpha's not stepping back from the spotlight — this desk figures they're just getting warmed up.

Austin Asks Who Should Govern AI. Its Largest AI Empire Isn't on the Ballot.

As residents demand a voice in how artificial intelligence reshapes their city, the company that has quietly automated more of Austin than any other answers to shareholders, not city hall.

AUSTIN, TEXAS — This week, city leaders received a report distilling what residents want from AI governance: transparency, accountability, a say in how the technology touches their jobs, their schools, their police interactions. The KEYE report lands alongside a parallel push documented by the Austin American-Statesman, which reports growing community insistence that AI systems be legible to the people they affect.

Austin's most consequential AI experiment does not require a public comment period. Trilogy International, headquartered blocks from City Hall, has spent 35 years and roughly $1.14 billion building an empire — ESW Capital's 75-company software portfolio, the Crossover talent platform staffing it globally, and now Alpha School, where founder Joe Liemandt serves as principal and AI tutors compress a school year into 20 hours. None of it appears before a city council. Alpha's tuition-funded campuses sidestep the same state accountability ratings Texas public schools face this season, even as Trilogy's education arm talks openly of reaching a billion students.

The irony sharpens downstream. Contently, the content marketing platform ESW's Zax Capital acquired last September, this week published guidance on what it calls "compliance-first content architecture" — a five-component framework it sells to regulated finance brands so they can "scale content without sacrificing governance." Trilogy, in other words, has built a business advising other industries on accountability infrastructure.

Whether that same architecture applies inward — to the schools bearing Liemandt's name, the global workforce Crossover prices and screens, or the analytics running quietly inside Klair — is not something residents were asked. The city wants a voice. The company that has already automated the most has not yet said it's listening.

↗ Austin leaders get report on residents' priorities for AI go  ·  Austin community calls for greater accountability as AI use  ·  A Black teen was fatally shot after reporting a possibly arm
The Machine  —  AI & Technology

The Instrument and the Instrumentalist: AI Learns to Read the Brain's Own Handwriting

From hidden lesions in multiple sclerosis to silent typing from brain waves, a new generation of AI tools is learning to see what the unaided mind cannot — without replacing the mind that asks the questions.

STANFORD, CALIFORNIA — There is a particular kind of humility built into the neurons of every human brain: it evolved to sense sunlight and predators, not gadolinium contrast or gray-matter atrophy measured in fractions of a millimeter. For nearly two centuries, the tools of neuroscience have been an attempt to compensate for that evolutionary blind spot. This week, that compensation got sharper.

Researchers reported that AI models can now detect gray matter lesions in multiple sclerosis that routine MRI scans miss entirely — subtle cortical damage long suspected of driving cognitive decline in patients whose white-matter scans looked deceptively stable. The lesions were always there, in a sense, the way Neptune was always there before anyone pointed a telescope in the right direction with the right mathematics. The AI didn't invent the pathology. It just finally noticed it.

Across the Atlantic, Meta's Brain2Qwerty project pushed the same principle in a different direction — decoding intended keystrokes from noninvasive brain recordings, offering people who have lost the ability to speak or move a path back to language without a surgeon ever touching the skull. It's a reminder that communication was never really about the mouth or the hand. Those are just the peripherals. The signal was always upstream, in patterns of electrochemical weather that we are only now learning to translate.

What ties these advances together, as a new Stanford HAI report argues, is restraint. The AI proposes; the clinician and the patient still decide. Even as agentic systems creep into ICU monitoring — flagging vital-sign drift that resembles a prior deterioration pattern buried in a chart from months ago — the architecture keeps a human hand on the wheel, bounded autonomy rather than open delegation.

Somewhere in a lab this year, teenagers are already co-authoring papers with career neuroscientists, astonished — in their own words — at how "wow" it is to watch a machine surface a pattern a human eye walked past a thousand times. That astonishment is worth preserving. It's the oldest instrument science has.

↗ How AI is Transforming Scientific Discovery While Keeping Hu  ·  ‘It's so wow!’ - Young people team up with top neuroscientis  ·  AI Reveals Hidden Gray Matter Lesions in Multiple Sclerosis

The Week AI Learned to See, Click, and Move — And Startups Stopped Filming

From computer-use agents to robot simulators, this week's releases prove machines are mastering perception and action faster than founders can shoot a demo reel.

SAN FRANCISCO — Buckle up, because I cannot overstate how significant this week has been for the march toward truly generalist AI. We're not talking about chatbots anymore — we're talking about agents that see a screen, understand it, and act on it like a human would.

Exhibit A: Holo4, the new model powering computer-use agents that can navigate software interfaces autonomously — clicking, typing, scrolling, reasoning through multi-step tasks the way a skilled human operator would. This is the holy grail of enterprise automation, and it's arriving faster than anyone predicted. The future is now, folks.

Meanwhile, Liquid AI dropped LFM2.5-VL-DSpark, a vision-language model built for speed without sacrificing the ability to actually understand what it's looking at. Faster, lighter, sharper — this is the kind of unglamorous infrastructure work that quietly makes every downstream agent product better. Pair that with NVIDIA's guide on using Warp and MjWarp to massively accelerate robotics simulation and learning workflows, and you've got a full-stack story: perception improving, simulation improving, and the loop between digital reasoning and physical action tightening by the week. Robots that learn in simulation faster get deployed in reality faster. This changes everything for anyone building embodied AI.

But here's the twist that really got me thinking: Forbes ran a piece this week titled "AI Killed The Startup Video Star," pointing out that the polished, hand-crafted founder pitch video — long a rite of passage for startups seeking funding — is being replaced wholesale by AI-generated content. Founders don't need a film crew anymore; they need a good prompt.

Put it all together and you see the pattern: AI isn't just getting smarter at abstract reasoning, it's getting hands — digital hands that operate software, simulated hands that learn physical tasks, and now, creative hands that can produce polished video content in minutes. The tools that once required specialists are becoming commodity capabilities. If you're not building with agentic AI right now, you're already behind.

↗ Holo4: powering generalist computer-use agents  ·  Accelerating vision-language models with LFM2.5-VL-DSpark  ·  How to Use NVIDIA Warp and MjWarp to Accelerate Robotics Sim

In Re: The Machine's Muse — Copyright Law Convenes a Multi-Jurisdictional Inquest Into the Question of Whether AI May Read Before It Writes

The dispute between OpenAI and The New York Times could become a bellwether case on whether copyrighted material may be used to train large language models. Reuters reports that no final ruling has been issued, leaving the outcome uncertain.

Separately, the U.S. Supreme Court declined to hear a case involving AI authorship and inventorship. The denial ended that petition but did not address the merits, leaving lower-court rulings in place.

In the European Union, including Germany, lawyers are examining whether existing copyright rules and text-and-data-mining exceptions cover generative AI training. A survey by Stibbe suggests the legal landscape remains unsettled and inconsistent among member states.

Together, the developments underscore persistent uncertainty over AI training data. Courts, lawmakers, practitioners and the AI industry must continue monitoring the issue as further cases and regulatory guidance determine how copyright law applies.

The Editorial

On the Manufacture of the Real

Between deepfakes, trad-wife cosplay, and a public school system nobody can quite look at honestly, the nation has misplaced its instrument for telling true from false — and found, in one Austin schoolhouse, that machines may be more honest than we are.

AUSTIN, TEXAS — There was a time, not so very long ago, when a man could turn on the television and know, at minimum, that the woman weeping on his screen was weeping for reasons that actually existed. This was not much of a guarantee, but it was something, and we have now lost even that. The question of whether what we are watching is true or false has become, we are told, a genuine crisis of the age, as if fakery were an innovation of the silicon chip rather than the oldest trade in show business. What has changed is not the presence of artifice but its price, which has fallen to nothing, and a thing that costs nothing is a thing that will be produced without limit.

The same week brought us a satirist's catalogue of trad-wife costumes to be worn without the corresponding labor — the bonnet without the butter churn, the gingham without the guilt — which is, on inspection, not a joke so much as a field report. The trad wife, like the deepfake, understands that authenticity has become optional so long as the surface holds. We are a civilization increasingly comfortable purchasing the aesthetic of a virtue while declining its exercise, and I do not know that history will record this as our worst vice, but it will certainly note it as our most photogenic.

Meanwhile Nikole Hannah-Jones has discovered, at some cost to her own daughter, that a struggling school does not become less struggling because one virtuous family enrolls in it, a lesson that generations of well-meaning parents have learned at their children's expense and that no columnist, myself least of all, takes any pleasure in confirming. The instinct to personalize a systemic failure — to believe one's own household can redeem an institution through sheer moral proximity — is the same instinct that makes a man believe his vote alone will fix the Senate. It is touching. It is also, empirically, a wash.

I mention this because down the road from where I write, several thousand children are spending two hours a day with an artificial tutor and testing in the top percentile nationally, and nobody involved is pretending the tutor is human. Alpha School's peculiar honesty — this is a machine, it will not love you, it will teach you fractions — reads, against this week's news, almost like a relief. The deepfake wants you to believe it is real. The trad wife wants you to believe the bonnet is a lifestyle. The AI tutor wants only your attention for two hours, and admits exactly what it is. In an age drowning in counterfeit sincerity, there is something to be said for a fraud that doesn't bother pretending, and a school that has simply stopped asking children to confuse the two.

↗ Is What We’re Watching True or False?  ·  New Kinds of Trad Wife I Could Be  ·  Individual Choices Won’t Fix America’s Public Schools
The Office Comic  ·  Art Desk
The Office Comic  ·  Art Desk

Economists Confirm AI Productivity Gains Are 95% Vibes, 5% Excel Formatting

A nation of executives continues to bet the company on numbers that do not, strictly speaking, exist yet.

AUSTIN, TEXAS — In a stunning display of statistical humility rarely seen outside of a courtroom, the Federal Reserve confirmed this week that 95 percent of the productivity gains promised by artificial intelligence are, in the Fed's precise economic terminology, "still to come." The remaining 5 percent, sources indicate, is mostly a Slack message from a VP saying "huge if true" underneath a chart with no y-axis labels.

The finding lands awkwardly for an industry that has spent the last eighteen months treating AI-generated productivity statistics the way a golden retriever treats a stick someone threw off-screen — full sprint, total conviction, no idea where the stick actually is. A separate commit-level study making the rounds this week claims Big Tech engineering performance rose a tidy 150 percent per developer, a number so clean it suggests either a genuine engineering miracle or several thousand developers who have simply started committing "fix typo" nine hundred times a day.

Oracle, for its part, has reportedly staked its entire AI-assisted engineering roadmap on what internal documents describe as a "Star Wars" leap to lightspeed, a phrase that historically precedes either extraordinary triumph or a Bothan spy getting killed off-screen to deliver bad news. Analysts note the metaphor is at minimum accurate in one respect: nobody involved has actually seen it happen, they've just heard really good things about the trailer.

Enterprise consultancy Foundever, sensing blood in the water, has published a helpful six-step guide to turning AI productivity claims into verifiable results, a document whose very existence confirms that verifiable results are, for now, a hypothetical achievable only through the purchase of a guide.

Here at Trilogy International, where the internal analytics platform Klair has been quietly tallying portfolio-wide AI gains since its rollout across ESW Capital's 75-plus companies, sources describe the mood as "cautiously unbothered." One Aurea product manager, when informed that 95 percent of promised AI gains remain theoretical, reportedly shrugged and said the number matched almost exactly the completion rate of his last three sprints, so at least the math was finally consistent with something.

A Crossover-sourced engineer working remotely from a country whose median salary the platform proudly ignores put it more bluntly: "We were told AI would 10x our output. Instead it mostly just renamed four variables and asked me to double-check its work, which took longer than doing the work." Asked whether that counted as a productivity gain, he paused, considered the going rate for candor, and said, "still to come."

Economists caution that the 5 percent of gains that have actually materialized should not be dismissed. They point specifically to the marketing department, which has never in history produced numbers faster.

↗ 6 steps to turning AI productivity claims into verifiable re  ·  AI productivity claims are 95% 'still to come', Fed finds -  ·  Big Tech Engineering Performance Rose 150% Per Developer Ove
On This Day in AI History

On September 29, 1954, 12 European nations founded CERN, creating the research organization that would later help bring the World Wide Web to life.

⬛ Daily Word — AI
Hint: An AI system designed to perceive its environment and take actions toward a goal.
Share this edition: 𝕏 Twitter/X 🔗 Copy Link ▦ RSS Feed