Demo script — CUNY computer science curriculum

DRAFT. First pass, 2026-07-21. A run-it-live script for showing BetaNYC’s grounded AI + NYC/NYS open data MCPs to CUNY faculty and staff who design computer science curriculum. Every prompt below was dry-run against the live MCPs on 2026-07-21 — see the presenter notes for what each one actually returned.

Companion to the general ../user-journeys.md catalog, framed for an academic audience. The other demo scripts in this repo (../council-members/, ../community-boards/) ask “what is happening in my district?” This one asks a different question: “what does this teach, and is it assignable?”

The point: grounding is not a product feature, it is a curricular concept. A student who understands why an agent must cite a dataset ID understands provenance, API contracts, and verification — three things that outlive whichever model is current. NYC’s open data portal is an unusually good teaching corpus because the data is real, local, free, and messy in instructive ways.


Before you start (2 min)

Opening line:

“I’m not here to show you a chatbot. I’m here to show you a teachable failure and how students fix it. Watch what happens when an AI has to prove where a number came from.”


Act 1 — The failure mode, demonstrated not asserted (3 min)

Don’t tell the room that ungrounded models hallucinate. Make it visible.

Prompt:

“What NYC Council legislation exists on broadband access? Give me the Intro numbers and current status.”

What to say while it runs: “Ask any general-purpose chatbot this and you will get confident, plausible, wrong Intro numbers — often from the wrong legislative session, sometimes invented outright. This one reads the Council’s own Legistar system.”

The reveal: the agent returns real records. Pick Int 1122-2024 — “a plan for expanding home access to broadband internet,” Enacted 2025-11-08 — and open intro.nyc/1122-2024 in the browser tab. The URL resolves. The status matches.

The teaching beat: ask the room how a student would know the ungrounded answer was wrong. That is the whole course in one question. The answer is not “trust a better model” — it is “demand a resolvable identifier.” Every claim in this demo has one: an Intro number, a dataset ID, a section of the Administrative Code.


Act 2 — The catalog is an API, and that is the lesson (4 min)

Prompt:

“Search NYC Open Data for datasets about career and technical education. Limit to 8 results and just give me titles, dataset IDs, and column names.”

What to say: “This is a catalog search against Socrata, the platform NYC Open Data runs on. Notice what came back is not prose — it is metadata: an ID, a column list, data types. That is an API contract. A student can go straight from this response to writing a query.”

Follow-up prompt:

“For dataset gyjk-fbss, show me the programs in the Information Technology cluster with their enrolled student counts.”

What to say: “Now we have moved from discovery to query, and the agent picked the right dataset because the previous step gave it a real ID to work with. That two-step — find the contract, then query against it — is the pattern worth teaching. It generalizes far past this portal.”


Act 3 — The CS pipeline, in the city’s own data (4 min)

The act this audience cares about most. It is about their students, before those students arrive at CUNY.

Prompt:

“Using the 2019-2020 Local Law 174 CTE report, which NYC high schools run Information Technology cluster programs, how many students are enrolled, and how many have NYSED approval?”

What to say: “These are the CTE programs feeding computer science pathways — ‘Computer Programming/Programmer, General,’ ‘Computer Software and Media Applications.’ School by school, with enrollment counts and whether the state has approved the program. This is the pipeline into your intro courses, and it is a public file.”

Where to linger: the is_nysed_approved column. Programs run whether or not they carry state approval, and the split is visible in the data. That is a curriculum-policy conversation the room can have on the spot, grounded in a specific file rather than an impression.

A detail worth stopping on. In the companion enrollment dataset (8vqd-3345), some cells contain the literal string "s" instead of a number. That is suppression — the city masks small cell counts so individual students cannot be re-identified from a demographic cross-tab.

This is a gift for a CS classroom. It is k-anonymity in a file students can open today, and it breaks naive code: a student who writes int(row["n_students_enrolled_in_cte"]) gets a crash, and a student who writes a silent try/except gets a wrong average. Real data teaches defensive parsing better than any synthetic exercise, and it opens the privacy-versus-utility discussion without a hypothetical.


Act 4 — When the finding is the absence (3 min)

Prompt:

“Local Law 174 of 2016 requires an annual CTE report. What is the most recent year available as a dataset on the NYC open data portal?”

What to say: “The law says annual. The portal’s most recent CTE report covers 2019-2020, published September 2021. It is now 2026.”

Then, immediately, the honest correction — this is the most important thirty seconds of the demo:

“Now, careful. What we just established is that the dataset is not on the portal. That is not the same as the report was never made. It may well have been delivered to the Council as a PDF and never published as open data. A good researcher — and a good student — states the narrower claim and then goes and checks the wider one.”

What to say next: “That discipline is the actual deliverable of a course like this. An agent will happily overstate a negative if you let it. Teaching students to say ‘here is what my search covered, and here is what it therefore cannot prove’ is a transferable research skill that has nothing to do with AI.”

Optional follow-through, if the room is engaged: the Council’s oversight power over agency reporting is itself in the record. Ask “What does the NYC Administrative Code say about agency open data coordinators?” and the agent returns § 23-507 — every agency must designate a coordinator responsible for compliance. There is a named, accountable role behind every gap like this one.


Act 5 — What it takes to put this in a classroom (3 min)

Say plainly:

Assignment shapes that fall out of this demo:

Assignment What it actually assesses
Pick a dataset, document its contract Reading schemas, data types, and column semantics without documentation
Reproduce a published city statistic from source data Verification; the gap between a headline number and its underlying file
Find a mandated report that is not on the portal Research honesty; distinguishing “not found” from “does not exist”
Write a parser that survives suppressed values Defensive coding, and privacy as a design constraint rather than a lecture topic
Chain two sources to answer one question Data integration, and joining on identifiers that were never designed to join

Closing:

“The durable skill here is not prompting. It is insisting that a claim resolve to a source, and knowing what your evidence does and does not cover. The AI is just what makes students care about it.”

Leave-behind links:


Presenter notes (verified 2026-07-21)

Every note below came from an actual dry run against the live MCPs. Read these before presenting.


Backup prompts (if one falls flat)