Transcription: OpenAgents Episode 031 - Faerie as Daemon

June 9, 2026 ยท View on GitHub

Source: https://twitter.com/OpenAgentsInc/status/1730253928896291251 Wiki source: https://raw.githubusercontent.com/wiki/OpenAgentsInc/openagents/Video-Series.md Media title: OpenAgents - Episode 031: Faerie as Daemon We review the capabilities of our GitHu... Upload date: 20231130 Transcription model: mlx-whisper/mlx-community/whisper-tiny Generated at: 2026-06-01T20:32:49Z

Machine-generated transcript. Review speaker labels and wording before using this as quote-grade source material.

[00:00] Christopher David: So let's recap.

[00:02] Christopher David: We now have built a GitHub agent, we're calling Ferry, which can read a GitHub issue and the conversation in the comments.

[00:11] Christopher David: It can write commits and open PolarQuass based on that issue in conversation.

[00:18] Christopher David: When a PR is open, it'll trigger the tests to run.

[00:23] Christopher David: Any of the tests feedback will be added to the PR is comment.

[00:26] Christopher David: And then Ferry can also identify a fix for a failing test.

[00:33] Christopher David: Now we need to connect this together.

[00:36] Christopher David: We basically just need to add automation, for example, and connect these things.

[00:41] Christopher David: It's going to just identify the effects and commenting about it to actually write the commit, which will be triggered the PolarQuass.

[00:48] Christopher David: And because we need to add automation, we now need to think about long-running processes.

[00:53] Christopher David: We don't want to have to just sit there and manually trigger different actions of Ferry via the command line.

[00:59] Christopher David: We want this all to be done in an automated fashion.

[01:03] Christopher David: So we're going to kind of design the automation, first by learning about demons.

[01:12] Christopher David: So we're using Laryvel Forge for deploying of our application.

[01:17] Christopher David: We have OpenAgence.com deployed via Forge.

[01:22] Christopher David: The little spruce double ending page there.

[01:25] Christopher David: So that's the Laryvel Forge application.

[01:27] Christopher David: And then on our forward server, we have something called Demons.

[01:31] Christopher David: And let's learn about that.

[01:33] Christopher David: So powered by Supervisor, demons are used to keep long-running scripts a lot.

[01:38] Christopher David: For instance, you could start a demon to keep a, I don't know what that is.

[01:41] Christopher David: If the process starts executing, Supervisor will automatically restart the process.

[01:46] Christopher David: Command user directory process starts executing.

[01:49] Christopher David: Okay.

[01:52] Christopher David: And I think demons under the hood use Cron.

[02:01] Christopher David: There's also a scheduler, which you know what, I don't even know if it's exactly demons or scheduler of three to five there.

[02:09] Christopher David: Schedule jaws may be configured to run commands at a specified interval.

[02:13] Christopher David: And forge provides several common defaults, or you may enter a custom Cron schedule for a command.

[02:23] Christopher David: Okay. This was like, I think what I had in mind, like we want to have a job or something that runs on a schedule.

[02:30] Christopher David: The schedule can be like once a minute.

[02:32] Christopher David: I think as a separate kind of a long-running process, we'll want it to eventually be a demon.

[02:40] Christopher David: We can start with it as a scheduler.

[02:42] Christopher David: And let me just kind of get a little bit of, in Laravel forge, what is the difference between demon and scheduler?

[03:01] Christopher David: A demon is a long-running background process that runs continuously.

[03:04] Christopher David: Inforge, you can set up a demon to run specific commands or scripts that need to be constantly running like a QR-CUR or a custom server process.

[03:11] Christopher David: Once started demons keep running until they are manually stopped or if they counter an error.

[03:16] Christopher David: The scheduler on the other hand is used for scheduling tasks that need to be run at specific intervals like Cronjaws.

[03:21] Christopher David: This could include tasks like database backups, sending out daily emails or clearing cache.

[03:25] Christopher David: Inforge, you can easily set up these scheduled tasks by specifying the command in the interval ed which it should run like every hour daily itself.

[03:33] Christopher David: In summary, demons are for continuous background processes while the scheduler is for pure hours.

[03:37] Christopher David: Okay.

[03:39] Christopher David: So what we're going to do is start with scheduler and that uses Cronjaws.

[03:47] Christopher David: So we're going to do a task that runs once per minute.

[03:53] Christopher David: And then once we kind of get a handle on that, then we'll switch it over to a demon.

[03:59] Christopher David: And I think the one's permanent is good for now because first of all, you saw that when we kind of ran the scripts in the previous video, sometimes they would take 30 to 60 plus seconds to run.

[04:19] Christopher David: And we might wish one to kind of allow there to be some amount of space in between things.

[04:25] Christopher David: Because, conceivably, if Feri is doing nothing with making API calls to open AI or to the GPU Topia API or to the GitHub API API API API API calls only take, you know, a few seconds each.

[04:45] Christopher David: And just with the abilities that we have now given Feri, if we were to fully automate that, Feri could be creating and merging, you know, multiple PR is every minute.

[04:59] Christopher David: It's cool to know that that's possible, but there's probably going to be a whole bunch of like debugging and sort of human in the loop needed for us to kind of understand what Feri is doing.

[05:11] Christopher David: So that we can tweak it. And eventually we'll get to the point where hopefully like if I just write an issue like, make me this functionality or make me this whole set of functionality like add billing add whatever I want the application Feri will just go and do it.

[05:27] Christopher David: And, you know, three minutes later, I'll have a bunch of merge code tested PR's, you know, deploy it out to staging production servers and so like that, but we're going to kind of iterate our way there.

[05:38] Christopher David: Let's start with this guys. So let's think about let's have a job that runs once every minute that for now will trigger manually, but we want that job to kind of do pretty much anything that we needed to do.

[05:54] Christopher David: And let's go, um, into our application, let's make sure our test pass.

[06:04] Christopher David: They do, except for two that we're skipping.

[06:08] Christopher David: Um, I don't know if I want to drive this out via TDD. I just want the, um,

[06:18] Christopher David: command to have the pseudo code in there. Let's try this. PHP artist and make command.

[06:24] Christopher David: We'll call this step like Feri step.

[06:36] Christopher David: We'll do Feri step.

[06:40] Christopher David: Makes Feri take a step.

[06:46] Christopher David: And now advanced step.

[06:50] Christopher David: Feri being our get-up agent. And then if I run PHP artisan, what is it? Run.

[06:58] Christopher David: PHP artisan Feri step.

[07:02] Christopher David: Okay.

[07:14] Christopher David: So we've got info. We have your log.

[07:18] Christopher David: Oops.

[07:22] Christopher David: Okay.

[07:26] Christopher David: So this is the command that we will have run once a minute.

[07:36] Christopher David: Here.

[07:40] Christopher David: And let's just kind of add some comments here for what this should do.

[07:46] Christopher David: I'm going to think about this.

[07:52] Christopher David: First see if there's any open PRs.

[08:02] Christopher David: Here's an example PR that we worked on and recently.

[08:10] Christopher David: I started it off having some failing tests to have it intentionally fail.

[08:20] Christopher David: And then later on I just manually implement it in her suggestions so that it would pass the

[08:26] Christopher David: image.

[08:32] Christopher David: So you want to see if there's any open PRs.

[08:40] Christopher David: If so.

[08:44] Christopher David: Thank you, co-pilot. See if they are ready to merge.

[08:54] Christopher David: And comment on the PR.

[09:08] Christopher David: Like how are we deciding if there's ready to merge all checks passed.

[09:18] Christopher David: And maybe also analyze the comments to see if there's anything like add this before

[09:30] Christopher David: merge.

[09:32] Christopher David: And that can be probably a simple LLM judgment.

[09:38] Christopher David: If it's not ready to merge.

[09:48] Christopher David: If not because tests are failing.

[09:59] Christopher David: If not because tests are failing.

[10:07] Christopher David: Add a commit to the PR that fixes the tests and comments on the PR.

[10:22] Christopher David: If not because of the conflict.

[10:32] Christopher David: If not because some requested feature is missing.

[10:38] Christopher David: Sure.

[10:42] Christopher David: I need to branch this.

[10:56] Christopher David: See if there are any open PRs.

[11:02] Christopher David: If so, see if they're ready to merge.

[11:08] Christopher David: So open PRs.

[11:18] Christopher David: Look for outstanding issues.

[11:38] Christopher David: If there's any open issues.

[11:54] Christopher David: See if they are ready to close.

[11:58] Christopher David: We may eventually get to that point for now.

[12:02] Christopher David: I want to minimize the analysis.

[12:16] Christopher David: I want to minimize the analysis.

[12:26] Christopher David: I want to minimize the analysis.

[12:30] Christopher David: I want to minimize the analysis.

[12:34] Christopher David: I want to minimize the analysis.

[12:44] Christopher David: I want to minimize the analysis.

[12:54] Christopher David: I want to minimize the analysis.

[12:58] Christopher David: I want to minimize the analysis.

[13:02] Christopher David: I want to minimize the analysis.

[13:10] Christopher David: I want to minimize the analysis.

[13:20] Christopher David: I want to minimize the analysis.

[13:28] Christopher David: I want to minimize the analysis.

[13:38] Christopher David: I want to minimize the analysis.

[13:48] Christopher David: I want to minimize the analysis.

[13:52] Christopher David: I want to minimize the analysis.