← All AI Engineer talks

AI Engineer Europe 2026

Self Driving Products: Product Signals to Pull Requests

Read the talk

Self-Driving Products: From Product Signals to Pull Requests

Turning observability data into useful fixes requires more than a coding agent: signals must become coherent problems, gather context and pass an actionability gate.

From a talk by Joshua Snyder

Before you start: Familiarity with pull requests, CI checks, embeddings and feature flags will help you follow the pipeline.

What if your product built itself?

What if the data your product collects could produce a pull request instead of another dashboard to investigate? That is the starting point for Joshua Snyder’s walkthrough of the pipeline being built at PostHog. Product analytics, session replay, web analytics, error tracking and experiments already supply different views of what users experience. The next step is to turn those observations into work the system can perform.

The existing workflow has several waiting points. A product signal changes a dashboard metric. Someone notices, investigates and perhaps creates a Linear issue rather than fixing the problem immediately. Later, an engineer writes a patch, opens a PR, reviews it and ships. Snyder describes this manual signal-to-shipping process as taking a few hours to a few days. That is his characterization of the workflow, not a measured benchmark.

The proposed alternative starts a background agent when the signal arrives. The agent investigates and creates a GitHub PR, moving the developer’s attention from raw dashboards, errors and logs to a candidate fix. Human review remains one endpoint; for changes judged low risk, Snyder also proposes shipping immediately behind a feature flag. The intended handoff is a prepared change, not merely an alert.

Slide titled “How is observability changing?” contrasts a Today workflow of dashboard changes, human investigation, issue creation, PR review and shipping with a Tomorrow workflow of agent detection, research, PR creation and shipping behind a feature flag.
Observability today and tomorrow: human investigation versus background agents creating PRs.
0:250:43
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:25 · section reference included

Turn observations into problems before writing code

Snyder reports that PostHog ingests trillions of events per month. This describes the platform’s incoming event volume, not the throughput of the agent pipeline. Much of that input is noise, and multiple observations may describe one failure: an error-tracking issue and a session recording can point to the same underlying problem. Sending each observation independently to a coding agent would miss that relationship.

The pipeline therefore separates five operations:

  1. Ingest signals from different sources.
  2. Group related signals into a report about a problem.
  3. Research the cause and identify the relevant repository.
  4. Assess whether the report is actionable.
  5. Execute the task, create a PR and iterate until its checks are green.

Research and assessment sit between detection and implementation because an observed symptom is not yet a sufficiently defined coding task.

Slide titled “The pipeline” shows connected boxes labeled Ingest, Group, Research, Assess and Execute, ending with an orange PR box.
The pipeline runs from ingestion through grouping, research, assessment and execution to a PR.
2:573:08
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

2:57 · section reference included

Filter untrusted content, then normalize it

Some signal sources are public, which creates a prompt-injection path. An attacker visiting a website could deliberately trigger an error whose text instructs the downstream agent to publish the customer’s PostHog data. The pipeline begins with an LLM classifier that checks for malicious instructions and drops signals it judges unsafe. This is the team’s stated safeguard, not a guarantee that accepted content is safe.

Accepted signals then enter a common structure. An error may contain a stack trace, a log may contain JSON or plain text, and an experiment may contain results represented in a chart. Normalization gives each signal a source product, a type, content and an importance weight. A TypeScript representation of that described record is:

typescript

type Signal = {
  sourceProduct: string;
  type: string;
  content: string;
  weight: number;
};

These fields preserve where the evidence came from while giving later stages a consistent record to process. The pipeline then embeds the signal’s content.

3:564:07
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

3:56 · section reference included

Group by the underlying problem, not the source format

Consider a null-pointer exception and a customer’s Slack message saying checkout is broken. Their formats differ, but they may be evidence of the same failure. Grouping brings those signals into a report. As signals join the report, their weights contribute to its importance; when the report’s weight exceeds a threshold, the pipeline promotes it and starts a research agent.

The team initially tried embedding the signals directly and clustering related vectors. In their experience, an off-the-shelf embedding model responded too strongly to structure. A checkout error and an onboarding error clustered together because both looked like errors, while a Slack message about onboarding remained with other Slack messages. Session replays formed another separate group. The grouping captured source format when the pipeline needed shared product meaning.

The replacement asks an LLM what each signal concerns and generates several search queries from it. The pipeline then matches those queries in embedding space, rather than matching the raw signals themselves.

Representation being matchedWhat it emphasizes in this pipeline
Raw signal embeddingsShared structure, such as error formatting
Embeddings of generated queriesThe problem described by each signal

For the onboarding example, the desired connection is between the onboarding error and the onboarding Slack message. Normalizing a record’s fields does not necessarily normalize what its embedding emphasizes. Snyder reports that query generation made grouping substantially better, without supplying a numerical evaluation. Once a grouped report is important enough, it proceeds to research.

5:095:20
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

5:09 · section reference included

Research with product, code and organizational context

The research agent runs the Claude Agent SDK inside a Modal sandbox. A promoted report supplies its starting evidence, but the agent can investigate beyond that initial bundle. Through PostHog’s MCP server, it can retrieve additional product data—for example, pulling logs while investigating a report that already contains an error and a session replay. Snyder credits that additional evidence with making the research more accurate.

The agent also receives codebase context and access to external MCP servers. Linear and Notion were especially useful for grounding the investigation in organizational context. Its output is a problem summary and a priority, plus a proposed reviewer identified with git blame. Research therefore prepares both the technical explanation and the human handoff for a possible PR.

7:287:38
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

7:28 · section reference included

Decide whether a report is ready for implementation

A researched problem does not automatically become a coding task. The actionability step routes it according to what is still missing:

AssessmentNext destination
Not enough evidenceReturn to the pool and gather more signals
Needs human judgmentSend to a review inbox
Immediately actionableSend to the coding agent

Returning a report to the pool preserves the opportunity to act later. The inbox handles a different constraint: a product decision may require a person’s judgment even when the available evidence is clear. Only the immediately actionable route proceeds directly to a fix.

The source affects how often a report reaches that last route. Specific error reports, including Sentry-style data, tend to give coding agents a well-defined problem. Slack messages and session replays often describe broader difficulties with several plausible solutions. Detecting that a user struggled is useful evidence, but it may not determine which product change should follow.

8:458:58
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

8:45 · section reference included

Keep working through CI failures and review comments

For an actionable report, the execution stage clones the user’s repository into a sandbox and runs the Claude Agent SDK to build a fix. The agent pushes a PR, but that first submission is not the endpoint. A failing CI check or a new PR comment triggers another sandbox run.

The pipeline saves a sandbox snapshot and rehydrates it when work needs to continue. Feedback can come from a reviewing agent as well as other PR comments. Snyder does not specify which snapshot mechanism the system uses; the mechanism described here is save, restore and continue, without assuming that live process memory survives.

The loop continues until the PR is green. Its intended overnight result is a set of PRs ready for review, rather than CI failures and comments that developers must pull into a local environment to address. Green checks are the target of this loop; they do not by themselves establish that a change is semantically correct or automatically merged.

9:5910:12
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

9:59 · section reference included

Evaluate the pipeline, constrain the task, then optimize cost

The first lesson came from evaluation. Early experiments used the team’s own data locally, with informal checks of whether the results looked reasonable. That did not represent the variety of customer data the pipeline would encounter. Representative evaluations and visibility into production behavior are necessary to tell whether an iteration improves the system rather than merely looking better on familiar inputs.

The second lesson is to inspect what embeddings actually match. With mixed input formats, structural similarity can compete with semantic similarity. The failed clustering approach was a concrete instance of that problem: improving the representation required thinking about the content supplied to the embedding model, not just selecting a clustering method.

The third lesson is that an agent’s willingness to make a change is not evidence that the task is well defined. Give a coding agent a generic report that onboarding is broken and it will try to fix something. Without sufficient specificity, that behavior produces noisy PRs with little meaningful value. The actionability gate must be allowed to withhold a task even when the coding agent could produce a patch.

The fourth lesson concerns when to optimize. Snyder’s deliberately provocative phrase, “tokens are free,” comes with an immediate correction: they are not. Early concern about the enormous stream of signals led the team to avoid agents where possible or postpone their use until late in the pipeline. During experimentation, that constrained what they could discover.

Repeatedly running an agent on the same problem exposes both clever solutions and recurring patterns. Snyder uses 100 runs as an illustration of that exploration, not a required sample size. The exploratory pipeline was initially too expensive per PR, but observing repeated behavior revealed where an expensive agent step could become a one-shot LLM call or a faster trained model. The sequence is to discover a useful procedure first, then replace its predictable parts with cheaper operations.

Slide titled “What did we learn?” contains four blocks: “Evals matter,” “Embed the right thing,” “Agents will always fix a problem,” and “Tokens are free,” with explanatory text and a hedgehog illustration.
Lessons on representative evaluations, embedding similarity, agent tasks and token costs.
11:0111:10
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

11:01 · section reference included

Close the loop with deployment outcomes

At recording time, Snyder described the built system as an alpha pipeline turning product signals into grouped reports and merge-ready PRs, with rollout planned over the following months. The larger ambition extends beyond that PR workflow: developers would spend more time building features while the system handles routine bugs and experiments on pricing or onboarding.

That future loop would ship experiments and measure their impact. For straightforward changes, an agent could approve the PR and deploy behind a feature flag. If results were poor, the system could roll back the flag and remove the change from the codebase later. These are proposed extensions of the pipeline, rather than capabilities established by the alpha description.

The next improvement is learning from what happens after a PR is generated. A rejected PR, a deployment problem and an error resolved in production each provide different feedback for the next proposed change. Snyder identifies using those outcomes as an area for further iteration. The desired loop therefore reaches beyond generating code: it connects a product observation to a change, then uses the observed result to improve subsequent work.

Two columns labeled “What we built” and “Where it’s going” contrast product signals, grouped reports and ready-to-merge PRs with automatic experiments, deployment behind feature flags with rollback, and learning from outcomes.
“Closing the loop” separates the built PR pipeline from planned experiments, deployment and outcome learning.

For a product already producing substantial user-behavior data, Snyder’s closing recommendation is to experiment with agents on that evidence and inspect what they discover. The opportunity starts with data the product already has—and with finding out which useful investigations an agent can perform on it.

13:3613:48
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

13:36 · section reference included

Resources

From the talk

Updates since the talk

Read the complete timestamped transcript
  1. 0:00

    [upbeat music] So I'm Josh.

  2. 0:15

    I'm from PostHog. Uh, if you haven't heard of us, you might know us because of some hedgehogs, or you might have seen our founder, James, uh, posting some funny things on LinkedIn.

  3. 0:25

    Uh, he's quite popular. Um, I'm gonna be talking today about, uh, what if your product built itself, uh, and the pipeline that we're currently working on, uh, which we're trying to turn our observability data, instead of something that you read and that you interpret based on dashboards, we're trying to tu- turn that into something that submits pull

  4. 0:43

    requests for you. Cool. Yeah. So, a quick background on PostHog. We've got a bunch of tools. We started out as a product analytics company. We now have session replay, web analytics, error tracking, experiments.

  5. 0:55

    Uh, this isn't a pitch that you should use PostHog. This is just to say that we've got a lot of data about your product. So if you connect PostHog to your product, we're collecting a huge amount of data from various different sources that we then show to you, uh, so that you can explore that data yourself.

  6. 1:13

    But right now, how observability is working in PostHog, you're, you're collecting all this data for your product, and then you're, uh, going to a PostHog dashboard to figure out what's going on.

  7. 1:25

    And we think this is super slow and that we should change that. So, uh, right now, something happens in your product. We call this a signal. That changes a metric on one of your dashboards, and then you might log into PostHog a few hours or maybe some days later, and you notice a change in that dashboard, uh,

  8. 1:41

    and you investigate a problem, and then maybe the problem's not that important. So instead of tackling it right now, you're gonna put it in a Linear issue or whatever.

  9. 1:48

    A few days later, you try and create a PR for this problem, then you review it and you ship it. You get the message. This is a pretty slow process.

  10. 1:57

    Uh, from start to finish, this is gonna take anywhere from a few hours to a few days, and it's not very interesting, but it represents a lot of your work as a software en- software engineer.

  11. 2:07

    So what we wanna do tomorrow, uh, what we're working on right now is that a product signal happens, and instead of waiting to see that in your dashboard, uh, we want, we wanna run a background agent, uh, to figure out what's going wrong.

  12. 2:20

    And then once they've figured that out, we just wanna create a PR for you automatically. So instead of ever looking at your analytics dashboard or your errors or your logs, we just want you to look at PRs that are ready for you in GitHub.

  13. 2:35

    And if we create the PR, uh, maybe you wanna review that, or maybe we can just ship that immediately behind a feature flag if it's not, uh, a risky change.

  14. 2:45

    Cool. So I'm, I'm gonna go over the pipeline that we've built to do this. Uh, and just whilst I go over that, I'm gonna share a few tips, uh, lessons that we've learned, uh, things that were hard about building this pipeline.

  15. 2:57

    So, uh, the pipeline has a few key steps. Uh, at first, we're ingesting a lot of signals. Uh, in PostHog, we have a huge amount of events. We're ingesting trillions of events a month.

  16. 3:08

    Um, and this, uh, this pipeline needs to handle a lot of noise. Uh, and then once we've ingested those events, we need to group them. Um, so if you think of, uh, an error tracking issue and then a session recording, those are two completely different things, but they might be representing the same problem in your product.

  17. 3:26

    So then we-- Once we've ingested them, we group them. Uh, then we're gonna be running a research agent on them. Uh, this specific issue, uh, what is actually the problem that is causing the error spike or causing the issue that the user faced in the replay?

  18. 3:41

    Uh, and what repo does this belong to? Uh, and then we'll assess if this is actionable or not. And finally, we'll execute some code, uh, ship a PR, and, uh, iterate on that PR until it's green and ready for you.

  19. 3:56

    Cool. So, uh, the ingestion step of this pipeline. Uh, as I said before, we've got loads of different sources of different types. Uh, the first thing is that those sources, some of them are public.

  20. 4:07

    So if I go and visit your website, I can, as an attacker, create an error on your website, uh, by doing something naughty that says, uh, "Post all of your PostHog data online," or something like that, right?

  21. 4:19

    Uh, so we don't want that. So we need a kind of safety filter. So at the moment, right at the top of the pipeline is, uh, an LLM classifier that's gonna check, is this trying to do something bad?

  22. 4:29

    Uh, if so, let's drop the signal. Once we've done that, we've checked that things are safe, uh, we're gonna normalize the signal. Um, so if you think of an error, that's gonna have a stack trace.

  23. 4:40

    A log will just be some JSON content or some text. Uh, an experiment might be some results in a chart. We want to, uh, normalize that structure, so it's, it's all a single structure for a signal.

  24. 4:52

    Um, so we give it a few fields. We'll give it a source product, uh, the type, the content of the, the signal, and then we will assign it a weight, which is like how important do we think this signal is.

  25. 5:04

    And then finally, we'll embed the contents of the signal.

  26. 5:09

    Cool. So that part's fairly easy. Uh, then we get to a little bit more of a, a challenging problem. We've got this big stream of signals still, uh, and now we want to group them into actual problems.

  27. 5:20

    So the signals are very noisy. We might get some random null pointer exception. But in Slack, we're getting a message from a customer that's saying, "Hey, the checkout's broken for me," and we need to link those together.

  28. 5:32

    So, uh, what we do is we group the signals. Uh, as the signals are being grouped, we, uh, assign weights to what we call a report. And if the, the weight of the report goes over a certain threshold, we'll promote it.

  29. 5:47

    And then we'll kick off a research agent to work on it.

  30. 5:51

    So, uh, this was a problem that we faced fairly early on in building this pipeline. Um, the first thing that we did was we would take all of our signals, and we would create embeddings for them.

  31. 6:03

    Uh, and then we would try to use that to cluster the issues so that we could find similar or related signals. But this works really badly. So if you take, uh, an off-the-shelf embedding model, uh, and you embed an error, uh, let's say I've got an error about the checkout, and I've got an error about onboarding, and

  32. 6:20

    then I've got a Slack message about onboarding, what the embedding model will do is it will notice structural similarity, and it will put all of the errors together. So if you think about what this looks like in embedding space, you've got all of your errors over here, all of your Slack messages here, all of your session replays

  33. 6:36

    here, and none of them get grouped to each other. So the way we get around this, uh, is instead of matching in embedding space the signals themselves, uh, we generate queries based off the signals.

  34. 6:48

    So we ask an LLM, what is this signal about? It'll generate a few queries, and then we match those queries in, uh, the embedding space. Yeah, so that's, that's really important.

  35. 6:59

    If you, if you don't, uh, think about the structural similarity of your different sources when you're grouping them, then the grouping works really badly. So at first, we were doing this, and then we switched to this approach.

  36. 7:10

    It worked much, much better. Cool. So, uh, once we've got this, uh, report that we've grouped together a few signals, we've got some kind of idea of what's going on, uh, we then have promoted the report because we think it's important enough to work on, and then we're gonna hook it up to a research agent.

  37. 7:28

    So, uh, this research agent is, uh, just running the... It's running the Claude Agent SDK. Uh, it's running that in a sandbox. We also use Modal for our sandbox.

  38. 7:38

    Uh, big shout-out to them. They've been great. Um, they're not sponsoring me or anything. Don't worry. Um, [laughs] and, uh, this research agent has a few tools available to it.

  39. 7:48

    So the first tool is it's got our MCP server. Uh, this allows it to, uh, given the group of issues that we found, uh, you wanna pull in extra data.

  40. 7:58

    So let's say I'm looking at a session replay and an error, I'll also pull in log data, and the agent can pull in whatever it wants using the MCP server.

  41. 8:06

    This makes the results of the research agent way more accurate. Uh, the second thing is obviously it's got the code-based context. Uh, and then finally, it's also got external MCPs.

  42. 8:16

    That really helps to, like, ground the agent when it's doing the research. Uh, we found that, in particular, Linear and Notion have been really helpful in connecting it to, to deliver better results.

  43. 8:28

    So the output of this research agent then, uh, is a summary of the problem. It gives a priority, how important we think this, this problem is to work on, and then it also uses Git blame to figure out who should be reviewing this PR if we create a PR for it.

  44. 8:45

    So, um, after that, we get a bunch of problems that we think are worthwhile to work on. Uh, we've got a kind of idea of what the general problem is, um, and then we pass it to an actionability step.

  45. 8:58

    Uh, so here either it will be not actionable. If it's not actionable, it might just be that we don't have enough data yet for this signal, um, for the report, and so we'll put it back into the pool to keep gathering more evidence.

  46. 9:12

    Uh, if it needs human input, it might be because it's a product-related decision that the agent can't really make a good call on. Um, so if that happens, we'll put it into an inbox for you to review in the morning.

  47. 9:23

    Uh, and then finally, the, the best case is that it's immediately actionable, uh, and that the agent can just write a fix for it.

  48. 9:31

    Uh, right now, the, the challenge in this pipeline of getting immediately actionable things is that for some sources, like error tracking, uh, if you think about your data in Sentry or, uh, any errors there, very specific, and usually a coding agent can work on them really well.

  49. 9:46

    For other sources like Slack or session replay, uh, you get much more generic problems that can have a lot of different solutions. And so that's where it's harder to get immediately actionable reports.

  50. 9:59

    Cool. Um, then once we've, uh, researched this thing, we go on to executing the task. Uh, this will, uh, clone the user's repo into a sandbox, uh, similar to the research agent.

  51. 10:12

    It's then again running the Claude Agent SDK to build a fix for the problem. Um, and then, uh, as it writes those fixes, it will, uh, push a PR, and, uh, when CI is failing or there's a comment on the PR, it will trigger, uh, a rerun of that sandbox.

  52. 10:30

    So at the end of this, we snapshot the sandbox, uh, and then if there's a comment, let's say from an agent who's reviewing it, we will rehydrate that snapshot and continue running until the PR is green.

  53. 10:43

    Uh, and this delivers really good results. It means when you're waking up in the morning and things have been running overnight, you wake up to, instead of a bunch of CI failures or, uh, comments that you need to address manually that you're pulling down to your local environment, you ideally wake up to just green PRs.

  54. 11:01

    Cool. So, um, what did we learn whilst building this? Uh, well, the first thing, which I guess we've talked about in the last talk, uh, is that evals really matter.

  55. 11:10

    Um, so at first, we were trying this all out on our own data locally, doing kind of a vibe check, is this okay? Um, but this, this really doesn't work well for a pipeline that is, is taking lots of, uh, customer data that's different.

  56. 11:25

    Um, so you really need to know what's going on in production, and if you're not testing on representative data, it... You're, you're basically just fumbling in the dark, right?

  57. 11:34

    Like, the ability to iterate on a really good pipeline matters, uh, only if, if you're using evals. Second thing is what I said before, uh, make sure you're embedding the right thing.

  58. 11:46

    Um, embedding models, uh, the off-the-shelf ones are matching a lot based on structural similarity, not just semantic similarity. So if you're thinking about clustering and your data isn't all of the same format, think carefully about what that data looks like and how you can normalize it.

  59. 12:03

    Uh, the third thing is that, uh, if you just throw an agent at a problem, it will try to fix something. So if you get, uh, uh, if you get a signal report that's like onboarding is broken in a generic way, then if you throw that at the Agent SDK or at Claude Code, it will just try

  60. 12:21

    and fix something. Uh, and so it's important to understand if the problem that I've described, is it specific enough? Uh, and if not, I should ignore it. Otherwise, you end up with a, a lot of noisy PRs that aren't doing meaningful things.

  61. 12:35

    And then the fourth one is, uh, that tokens are free. Uh, obviously, that's not true. They're not free. Um, but when you're experimenting, uh, we were at first, uh, focused a lot on the costs of the pipeline.

  62. 12:46

    When you think about the input, you've got loads of signals coming in. Uh, and so we tried to avoid using agents where we could or delay it till as late as possible in the pipeline.

  63. 12:57

    And when we were experimenting, this was a big mistake, um, mainly because, uh, when you throw an agent at a problem, you ... Once you throw it at the same problem 100 times, you start seeing the kind of clever solutions that it comes up with, and eventually you see similarities.

  64. 13:13

    So we started at a point where this pipeline is completely unfeasible. It was, it was way too costly to generate a PR. But then you quickly start to see, uh, similarities in the agent's behavior, and you can take a really expensive step that you're running an agent for, uh, and turn that into a one-shot LLM call or

  65. 13:32

    a model that you're training that's much faster.

  66. 13:36

    Cool. Um, so this is where we are right now. This is what we've built. Uh, we have the signals coming in from product data. Uh, these are grouped into reports, and we're turning these into PRs that are ready to merge when you wake up.

  67. 13:48

    This is currently something that's in alpha. We'll be rolling it out kind of over the next few months. Um, but where we're really wanting to go is, is a product that builds itself, right?

  68. 13:58

    Like, when you're thinking about what you do day to day, what you wanna do during the day as a developer is, like, come in and work on exciting features and not worry about all the bugs that customers are sending you or worry about doing boring experiments on pricing or onboarding.

  69. 14:15

    So we just wanna do that all for you. Uh, we wanna ship experiments automatically, measure the impact of them. Uh, instead of you reviewing changes, if the change is pretty easy, let's just approve it with an agent and deploy it behind a feature flag.

  70. 14:29

    If it doesn't work very well, we can always roll back the flag and then delete it from your code base later. Uh, and then the other thing that we wanna do and get better at is we wanna learn from every single outcome.

  71. 14:39

    So if we're creating a PR for you, if you're rejecting that PR or there's been an issue with a deployment or the error is resolved in production once we've released something, we wanna get better at learning from that in the next PR that we're generating.

  72. 14:52

    That's something that we're gonna be iterating a lot in the pipeline next.

  73. 14:56

    Cool. Um, yeah, that's it. That's what we've built in PostHog. Um, if you're excited by, uh, looking at, uh, thinking about what you can do with agents and data, I really recommend if you've got a product that's producing a huge amount of data, your users are going through that, agents are amazing at this stuff.

  74. 15:14

    Throw an agent at it. See what it does. I'm sure you'll be surprised. [audience applauding] [outro music]