Vibe coding our way to victory! Or not?
๐ **Source:** [Vibe coding our way to victory! Or not?](https://www.youtube.com/watch?v=leZJHViT6m8)
> [!note]+ Document Notes
> tags: [live-streaming, ai-coding, vibe-coding]
> author: Brent Roose
> source: YouTube
> reference: https://www.youtube.com/watch?v=leZJHViT6m8
> date created: 2024-12-19 09:15
>
> # ๐ท๏ธ Title: Vibe coding our way to victory! Or not?
>
<!-- deep-read:sections start -->
## ๐งฐ Action Inbox
- [H1] Review AI-generated code for subtle bugs and structural issues โ 22:30 #code-review
- [H2] Consider prompt engineering vs manual refinement time tradeoffs โ 35:45 #productivity
- [H3] Develop better workflows for AI agent context switching โ 41:20 #workflow
## ๐งญ Table of Contents
- [๐ Summary](#-summary)
- [๐ Main Content](#-main-content)
- [๐๏ธ Notes](#๏ธ-notes)
- [๐ References](#-references)
- [๐ฃ๏ธ Paraphrase](#๏ธ-paraphrase)
- [๐ฐ Newsletter](#-newsletter)
- [โ
Action Items](#-action-items)
- [๐งช Hypotheses](#-hypotheses)
- [๐ Methodology](#-methodology)
- [โ Questions](#-questions)
- [๐ฎ Future Research](#-future-research)
- [๐ก Implications](#-implications)
- [๐ง Learning Styles Assessment](#-learning-styles-assessment)
- [๐ Accessibility Assessment](#-accessibility-assessment)
- [๐ DEIB Assessment](#-deib-assessment)
- [โ
Logical Validity](#-logical-validity)
- [๐ก๏ธ DARVO Analysis](#-darvo-analysis)
- [๐ฏ Conclusion](#-conclusion)
### ๐ References
- [Tempest Framework](https://github.com/tempestphp/tempest-framework)
- [PHP Unit Documentation](https://phpunit.de/)
## ๐ Summary
- **What happened**: Live coding session using AI agents (Juni) to implement PHP testing framework methods
- **Why it matters**: Demonstrates real-world AI coding workflow challenges including context switching and code review overhead
- **Key stakeholders**: PHP developers, AI tool users, live coding streamers
- **Risks and tradeoffs**: Productivity gains vs. loss of flow state, code quality concerns, dependency on AI accuracy
- **Bottom line**: AI agents can accelerate repetitive coding tasks but create new challenges around context switching and code satisfaction
## ๐ Main Content
Brent demonstrates "vibe coding" - using AI agents to generate code while streaming. He's building a new PHP testing framework called Tempest and uses Juni (JetBrains AI agent) to implement assertion methods and tests. The session reveals both benefits and drawbacks of AI-assisted development.
The core challenge emerges around context switching - while waiting for AI to complete tasks, developers face downtime that breaks flow state. Brent struggles with this during the stream, finding himself distracted by other tasks like reviewing pull requests.
Code quality concerns surface when reviewing AI output. The generated code requires careful inspection for subtle bugs, mixed coding conventions (camel vs snake case), and structural decisions that may not align with developer preferences. Brent notes this creates additional cognitive load compared to writing code directly.
The session includes insights from Symfony conference demos where contestants used AI tools with varying prompt strategies - from detailed 10-minute prompts to a winning 9-character "fixed tests" command.
## ๐๏ธ Notes
#### โฑ๏ธ [00:00](https://www.youtube.com/watch?v=leZJHViT6m8?t=0) โ [H1] Stream setup and framework introduction
- Key idea: Building experimental PHP testing framework with live AI coding
- Evidence: "2,000 stars on Tempest framework" and daily streaming experiment
#### โฑ๏ธ [02:15](https://www.youtube.com/watch?v=leZJHViT6m8?t=135) โ [H2] Testing framework design philosophy
- Key idea: More verbose, natural method names instead of standard assert patterns
- Evidence: "I prefer to use more natural names... instead of assert blah blah blah"
#### โฑ๏ธ [05:30](https://www.youtube.com/watch?v=leZJHViT6m8?t=330) โ [H3] Symfony conference AI coding contest
- Key idea: Dramatic variation in AI prompt strategies among developers
- Evidence: "Winner wrote one prompt with nine characters 'fixed tests' and that was it"
#### โฑ๏ธ [08:45](https://www.youtube.com/watch?v=leZJHViT6m8?t=525) โ [H1] Juni AI agent prompt construction
- Key idea: Detailed prompt engineering for method implementation patterns
- Evidence: "Remove assert from name... use this subject as value to test... change return type to self"
#### โฑ๏ธ [12:20](https://www.youtube.com/watch?v=leZJHViT6m8?t=740) โ [H2] AI accuracy depends on task complexity
- Key idea: Stanford study shows AI productivity varies with project size and complexity
- Evidence: "Super interesting study... accuracy very heavily depends on size of project"
#### โฑ๏ธ [15:40](https://www.youtube.com/watch?v=leZJHViT6m8?t=940) โ [H3] Context switching challenges emerge
- Key idea: AI wait times create flow disruption and distraction issues
- Evidence: "What do you do with the time off... pulls me out of the zone"
#### โฑ๏ธ [18:30](https://www.youtube.com/watch?v=leZJHViT6m8?t=1110) โ [H2] Pull request review during AI downtime
- Key idea: Multitasking during AI generation leads to cognitive fragmentation
- Evidence: "Totally distracting again... already forgot what I was talking about"
#### โฑ๏ธ [22:30](https://www.youtube.com/watch?v=leZJHViT6m8?t=1350) โ [H1] Code review reveals AI limitations
- Key idea: Generated code requires careful inspection for bugs and conventions
- Evidence: "See this is the problem... doesn't know we're on PHP 8.5"
#### โฑ๏ธ [28:15](https://www.youtube.com/watch?v=leZJHViT6m8?t=1695) โ [H2] Juni vs Claude performance comparison
- Key idea: Different AI tools have distinct accuracy/speed tradeoffs
- Evidence: "Juni is usually more accurate while Claude is bit faster"
#### โฑ๏ธ [35:45](https://www.youtube.com/watch?v=leZJHViT6m8?t=2145) โ [H3] Test implementation automation
- Key idea: AI generates 200 lines of test code requiring comprehensive review
- Evidence: "Added 200 lines of code that I now need to read through"
#### โฑ๏ธ [41:20](https://www.youtube.com/watch?v=leZJHViT6m8?t=2480) โ [H1] Satisfaction concerns with AI output
- Key idea: AI-generated code structure doesn't match personal preferences
- Evidence: "Not left pretty unsatisfied... not the way I would have structured it"
#### โฑ๏ธ [45:30](https://www.youtube.com/watch?v=leZJHViT6m8?t=2730) โ [H2] Open source contribution quality issues
- Key idea: AI tools enabling low-effort contributions that increase review burden
- Evidence: "This happens more and more with contributors... review work is up to me"
#### โฑ๏ธ [48:15](https://www.youtube.com/watch?v=leZJHViT6m8?t=2895) โ [H3] Future streaming approach decision
- Key idea: Experiment conclusion leads to preference for manual coding
- Evidence: "I don't think I will do this every time... go back to normal non-vibe coding"
## ๐ References
- [Tempest PHP Framework GitHub](https://github.com/tempestphp/tempest-framework)
- [PHPUnit Testing Framework](https://phpunit.de/)
- [Stanford AI Productivity Study](MISSING)
- [JetBrains AI Tools](https://www.jetbrains.com/ai/)
## ๐ฃ๏ธ Paraphrase
- Live coding with AI agents creates productivity paradoxes where time savings come with flow disruption costs
- Code generation quality requires significant human oversight, especially for structural decisions and edge cases
- Different AI tools (Juni vs Claude) offer distinct tradeoffs between accuracy and speed for development tasks
## ๐ฐ Newsletter
## AI-Assisted Development: The Flow vs. Productivity Dilemma
Ever wondered what "vibe coding" with AI actually feels like? PHP developer Brent Roose's live coding experiment reveals the hidden challenges of AI-assisted development that productivity metrics don't capture.
While building assertion methods for a new PHP testing framework, Brent discovered that AI agents create an unexpected problem: **context switching overhead**. Those 5-10 minute wait times for code generation? They're flow killers that fragment focus and make it hard to get back into "the zone."
**Key insight**: The real cost isn't just prompt engineering time - it's the cognitive load of reviewing AI-generated code that follows different structural patterns than you'd write manually.
**Practical takeaway**: Consider AI agents for genuinely repetitive tasks (like test boilerplate) rather than core logic where your architectural decisions matter most.
Resources: [Tempest Framework](https://github.com/tempestphp/tempest-framework), [JetBrains AI Tools](https://www.jetbrains.com/ai/)
## โ
Action Items
#### DevRel
- Developer experience: Document AI tool integration patterns for PHP frameworks
- Developer marketing: Create case studies comparing manual vs AI-assisted development workflows
- Community management: Establish guidelines for AI-generated pull request contributions
#### WordPress
- Core: Evaluate AI tools for generating test coverage for existing components
- Documentation: Create guidance on reviewing AI-generated code contributions
- Community: Develop mentorship programs that balance AI assistance with skill development
#### FAIR
- Technical independence: Assess dependency risks of AI coding tools in open source projects
- Governance artifacts: Create policies for AI-generated code attribution and review standards
## ๐งช Hypotheses
- AI coding tools are most effective for repetitive, pattern-based tasks rather than architectural decisions
- Context switching costs during AI generation significantly reduce developer satisfaction despite time savings
- Code review overhead for AI-generated content creates new bottlenecks in open source contribution workflows
- Different AI tools exhibit measurable tradeoffs between generation speed and code accuracy
### ๐ Methodology
- Time analysis comparing manual implementation vs AI generation plus review time
- Developer satisfaction surveys across different AI-assisted coding scenarios
- Code quality metrics for human vs AI-generated test suites
### โ Questions
- How can development environments better support productive waiting during AI generation?
- What prompt engineering patterns minimize the need for extensive code review?
- How do AI coding tools impact skill development in junior developers?
### ๐ฎ Future Research
- Longitudinal studies on developer flow state with different AI integration patterns
- Analysis of AI tool accuracy degradation with project complexity increases
- Investigation of hybrid workflows that optimize both productivity and satisfaction
### ๐ก Implications
- **Practice**: Teams need new workflows to handle AI generation downtime productively
- **Policy**: Open source projects require updated contribution guidelines for AI-assisted code
- **Education**: Developer training must balance AI tool usage with fundamental coding skills
- **Tooling**: IDEs need better integration to minimize context switching during AI assistance
### ๐ง Learning Styles Assessment
Reading level estimate: Grade 10-12
#### ๐ Visual learners
- Present: Code examples, IDE interface demonstrations
- Improve: Architecture diagrams showing AI workflow integration points
#### ๐ Aural learners
- Present: Live commentary explaining thought process during coding
- Improve: Audio summary of key AI tool tradeoffs and decision points
#### ๐ฃ๏ธ Verbal learners
- Present: Clear explanations of technical concepts and tool comparisons
- Improve: Glossary of AI coding terminology and framework-specific patterns
#### ๐งฉ Kinesthetic learners
- Present: Live coding demonstration with real-time problem solving
- Improve: Step-by-step AI prompt engineering exercises
#### ๐ง Logical learners
- Present: Systematic comparison of AI tools with specific metrics
- Improve: Decision trees for when to use AI vs manual coding approaches
#### ๐งโ๐คโ๐ง Social learners
- Present: Interactive chat engagement during live coding session
- Improve: Collaborative AI coding exercises with peer review components
#### ๐งโโ๏ธ Solitary learners
- Present: Individual experimentation opportunity through framework exploration
- Improve: Self-assessment rubrics for AI-generated code quality
#### ๐ฟ Naturalistic learners
- Present: Organic discovery of tool limitations through real-world usage
- Improve: Ecosystem thinking about AI tool integration impacts
### ๐ Accessibility Assessment
#### Screen reader semantics
- Present: Clear heading structure and code block organization
- Improve: Better alt text for IDE interface elements shown on screen
#### Keyboard navigation
- Present: Standard video controls accessible via keyboard
- Improve: Transcript with proper heading landmarks for easy navigation
#### Contrast and readability
- Present: High contrast IDE theme visible in video
- Improve: Ensure code examples maintain readability at 200% zoom
#### Media and captions
- Present: Full transcript available from video audio
- Improve: Time-synced captions with technical terminology spelled out
### ๐ DEIB Assessment
#### Cultural breadth
- Present: English-language content with global developer perspective
- Improve: Include examples from diverse PHP communities worldwide
#### Inclusive language
- Present: Gender-neutral technical language throughout
- Improve: Avoid coding slang that may exclude non-native speakers
#### Neurodiversity support
- Present: Clear section breaks and consistent structure
- Improve: Content warnings for rapid context switching discussions
#### Representation
- Present: Focus on technical content rather than personal characteristics
- Improve: Include diverse contributor examples in open source discussions
### โ
Logical Validity
#### Strong reasoning
- Inductive strength: Generalizes from specific AI coding experience to broader developer workflow implications
- Causal reasoning: Links context switching to reduced developer satisfaction with supporting evidence
- Analogical strength: Compares AI coding to traditional development patterns effectively
#### Fallacies
- Hasty generalization: Limited to single developer's experience, may not represent all AI coding workflows
- Anecdotal evidence: Relies heavily on personal observations rather than systematic research
#### Tone of voice
- Overall tone: Conversational and reflective, balancing enthusiasm with honest critique of AI limitations
### ๐ก๏ธ DARVO Analysis
- Deny: No denial patterns present
- Attack: No attacks on individuals or tools, constructive criticism only
- Reverse victim/offender: No victim/offender dynamics in technical content
- Emotional cues and rhetoric: Genuine frustration with workflow disruption, balanced assessment
## ๐ฏ Conclusion
AI-assisted development presents a fascinating paradox: while tools like Juni can accelerate repetitive coding tasks, they introduce new challenges around flow state and code satisfaction that pure productivity metrics miss. The experiment reveals that successful AI integration requires careful consideration of when to automate versus when manual coding provides better outcomes.
For developers considering AI tools, the key insight is treating them as starting points rather than final solutions. The most effective workflow may involve AI generation followed by significant human refinement - essentially using AI to break through blank page syndrome rather than eliminate the need for thoughtful programming.
The broader implication for open source communities is the need for updated contribution guidelines and review processes that account for AI-generated content while maintaining code quality standards.
## ๐งฑ Refactor Appendix
### ๐ Literature Split Pad
Purpose: Stage CEE units that become Literature notes.
Split level: H3
### [H1] AI coding tools create context switching overhead costs
> [!quote] [Vibe coding our way to victory! Or not?](https://www.youtube.com/watch?v=leZJHViT6m8) by Brent Roose via YouTube. Published 2024. Accessed 2024-12-19.
> "What do you do with the time off basically... totally pulls me out of the zone."
Developer experiences flow disruption during AI generation wait times, creating productivity paradox where time savings come with focus fragmentation costs.
[view highlight](https://www.youtube.com/watch?v=leZJHViT6m8#H1) #xref #articleseed ID:rw_001
### [H2] AI-generated code requires intensive review for structural alignment
> [!quote] [Vibe coding our way to victory! Or not?](https://www.youtube.com/watch?v=leZJHViT6m8)
> "Not left pretty unsatisfied... not the way I would have structured it."
---
## Full Transcript
[00:02] [Music]<br>[00:10] Heat. Heat. N.<br>[00:14] [Music]<br>[00:38] Never.<br>[00:40] [Music]<br>[01:29] [Laughter]<br>[01:35] [Laughter]<br>[01:39] [Music]<br>[01:48] All right, good morning. It's early<br>[01:50] morning. Wow, I still uh got this<br>[01:52] morning voice here. I hope that's okay.<br>[01:55] Uh let's see whether uh whether we're<br>[01:58] good. Leave uh something in chat if<br>[02:01] you're here. Just to make sure that<br>[02:03] everyone is uh everything's in uh in<br>[02:06] order, you know, been a noob streamer<br>[02:09] here. So uh so yeah. Hi folks. It's<br>[02:12] early morning. I know probably not a lot<br>[02:14] of people will will tune in this<br>[02:15] morning, but I have some things to do<br>[02:18] later in the day. And I wanted to uh do<br>[02:22] still do some live streaming. Basically,<br>[02:24] I'm going to try to do just daily live<br>[02:26] streams for the coming two weeks. We'll<br>[02:28] see how that goes. Um it's probably not<br>[02:33] going to happen uh every day, but yeah,<br>[02:35] I um I want to try my best anyway.<br>[02:39] Um, so yeah, let's see. Okay, do not<br>[02:43] disturb is on. That's good. Um,<br>[02:47] so who's here? Leave a hi in chat<br>[02:51] and uh we we will dive in pretty soon<br>[02:57] into some uh<br>[03:01] some some interesting stuff, let's say.<br>[03:05] So, hi folks. Hi Ahmed. have a nice day<br>[03:09] to you as well. Thanks for uh for<br>[03:11] joining this early in the morning or<br>[03:13] maybe it's like super late in the day<br>[03:15] for you. Who knows? Uh or or midnight.<br>[03:18] Could all be time zones, you know? But<br>[03:21] it's good to to uh have you here. And my<br>[03:25] oh my Tito, I guess my name is Tito on<br>[03:28] Twitch as well. By the way, you can also<br>[03:29] watch on Twitch. Uh just letting you<br>[03:31] know uh if you prefer that. However, uh<br>[03:35] YouTube is<br>[03:38] uh did I just say if you prefer death<br>[03:41] that if you prefer that<br>[03:44] uh<br>[03:46] uh YouTube is a bit better for me, but<br>[03:48] yeah, do whatever you want. Okay, so<br>[03:52] what are we doing today? We are uh well,<br>[03:56] if you if you were here here yesterday<br>[03:59] on the stream, you will know that we<br>[04:02] were working on Oh, I just noticed we've<br>[04:04] got two uh 2,000 stars on Tempest.<br>[04:08] That's nice. Um let's see here. Let's<br>[04:11] close this one. Uh we were working on<br>[04:16] our testing library, right? And this is<br>[04:19] uh something new. It's still an<br>[04:21] experiment for now. We'll see where it<br>[04:23] uh where we'll get with it. 2 p.m. for<br>[04:27] I'm at That's nice. That's a That's a<br>[04:29] good time actually. Um<br>[04:32] so yeah, we're building a a new testing<br>[04:37] framework for PHP<br>[04:39] experimental. We'll see where we go with<br>[04:42] it. Not making any uh any commitments<br>[04:45] here, but it's a nice exercise. And um<br>[04:48] for me it's<br>[04:51] on one hand to learn PP8.5.<br>[04:54] It's also<br>[04:56] uh Tito on on Twitch is saying his eyes.<br>[04:58] Well, you know, okay, I'll show you what<br>[05:01] you need to do to fix this because I<br>[05:03] have this prepared. So, uh you just, you<br>[05:06] know, grab your your sunglasses and um<br>[05:10] and that's how we'll uh write code<br>[05:11] today. So, you won't have any issues<br>[05:13] with your eyes. Uh what you could also<br>[05:15] do is just turn down the brightness of<br>[05:17] your monitor, which is always a good<br>[05:19] thing because it puts less strain on<br>[05:21] your eyes. Um but uh if you really want<br>[05:25] to to hear some more about it, uh PHP<br>[05:28] annotated. Let's see. Um<br>[05:32] go to videos, not not right now because<br>[05:34] you're watching the live stream, of<br>[05:36] course, and search for uh uh light.<br>[05:40] And you'll see this video. It's a<br>[05:42] two-minute video and I explain why light<br>[05:44] color schemes are better anyway, but<br>[05:46] yeah, you'll have to adjust a little<br>[05:48] bit. That's true. Um,<br>[05:52] because we're vibe coding today, I'll uh<br>[05:54] I'll go into my my vibe vibe coding uh<br>[05:57] attire, you know, just to make sure that<br>[06:00] um<br>[06:02] we have the the right like um atmosphere<br>[06:07] basically.<br>[06:09] But Oh, yeah. So, so our our testing uh<br>[06:12] I'm not going to do this for the whole<br>[06:13] stream. It's really annoying. But our uh<br>[06:16] let me actually turn my brightness a bit<br>[06:18] up now. Can you see the change? Yeah. Uh<br>[06:21] our testing framework um it's a really<br>[06:25] interesting thought experiment and we'll<br>[06:26] see where it gets us. And in yesterday's<br>[06:29] stream, I I walked through some of the<br>[06:32] ideas behind it, what the reasons why<br>[06:34] I'm doing this. Um but I uh there there<br>[06:38] there is basically a lot of work to be<br>[06:40] done and still some open questions as<br>[06:42] well and and what I wanted to try today<br>[06:45] well yesterday evening actually I was I<br>[06:47] was looking into my my tester uh class<br>[06:49] here which is like the basic assertter<br>[06:52] um for uh that that you can use in your<br>[06:57] in your test. So if you compare to<br>[06:59] PHPUnit you know uh um assert equals<br>[07:02] assert same etc. So there are already a<br>[07:05] couple of methods here. Uh is is not is<br>[07:08] equal to is not equal to. I prefer to<br>[07:11] use a little bit more um verbose names<br>[07:14] instead of always sticking to the same<br>[07:16] structure. For example, assert blah blah<br>[07:18] blah assert this, assert that. Um I<br>[07:21] prefer to just use more natural names. I<br>[07:23] don't know if that will stick or not.<br>[07:25] We'll see. I know pest, for example,<br>[07:28] always uses uh to be which is inspired<br>[07:31] by just if I'm not mistaken from<br>[07:32] JavaScript. um which is also uh<br>[07:38] which is also uh<br>[07:41] a thing. I I'm don't oppose it but I I<br>[07:44] don't want to stick to uh<br>[07:48] to one specific<br>[07:50] naming scheme. Basically<br>[07:53] folks on on YouTube are are just<br>[07:55] pitching in. Well, no. I'm I'm okay. I'm<br>[07:57] I'm in this uh attire not because of of<br>[08:00] uh my light color scheme. I don't have<br>[08:03] any problems with that, but it's because<br>[08:05] we're vibe coding today and I'm not<br>[08:07] going to do this for the whole stream<br>[08:08] because it's actually not really good<br>[08:10] for my eyes. But uh let's let's uh keep<br>[08:13] it on for for one more second. Um so<br>[08:17] yeah, we have a couple of methods here.<br>[08:19] Uh is is not contained has key, you<br>[08:22] know, a couple of things. And then there<br>[08:24] I I made a list here of PHP units<br>[08:27] assertions and I removed the whole bunch<br>[08:28] because I don't want to support<br>[08:30] everything. I don't think uh that's<br>[08:33] that's necessary, but I kept the ones<br>[08:35] that I think are are interesting and<br>[08:40] also need an implementation here.<br>[08:41] Actually, I still need to double check<br>[08:43] if there aren't<br>[08:46] because I I already implemented some.<br>[08:48] But um<br>[08:51] I I think for example equals and not<br>[08:53] equals I already have empty I don't<br>[08:55] count I don't have contains I already<br>[08:58] have is list I don't array has key we<br>[09:02] already have greater than that's missing<br>[09:06] true false null not null same and not<br>[09:10] same we have instance of we have is<br>[09:12] array is bool is blah blah blah all<br>[09:15] these is and is not functions strings<br>[09:18] starts with, starts not with, uh, ends<br>[09:21] with, ends not with, and JSON.<br>[09:23] Basically, that those are the ones I I<br>[09:25] want to use. PHPUnit has some more<br>[09:27] assertions um, with, uh, file stuff and<br>[09:33] resource stuff. There there are probably<br>[09:36] twice as many as I list here, but it's<br>[09:39] fine. I don't want to use everything.<br>[09:41] Um, so let's go into Vibe coder mode.<br>[09:44] Well, I already am, but let's open up uh<br>[09:47] uh Juny over here. I I was actually<br>[09:49] playing around with it, checking whether<br>[09:51] it it works or not. And so, uh the idea<br>[09:54] is well, let me first write my prompt<br>[09:56] because it will take uh a while to<br>[09:59] to actually uh<br>[10:02] um get going, right? Uh I'll enable<br>[10:06] execute terminal commands as well. Um<br>[10:10] and then I'll explain. I've got some<br>[10:12] things to talk about while uh Jun is<br>[10:14] working. But but but okay. So I need to<br>[10:15] write a prompt basically to implement<br>[10:17] these methods in the same way, the same<br>[10:20] style as these. Uh so let me uh copy<br>[10:23] over this one. Implement the todo<br>[10:27] methods of blah blah blah. Um always<br>[10:33] uh remove<br>[10:36] assert from the name. That's one of the<br>[10:38] things I need. Um, and let's see the the<br>[10:42] assertion methods in PHP unit, they<br>[10:44] always get the the the hay stack or the<br>[10:47] the actual um value within the methods<br>[10:51] themselves. But that's not what we want<br>[10:53] to do here because our testing the<br>[10:55] subject basically is in the construct.<br>[10:57] So we need to refactor that. So let's<br>[10:59] say um uh how should I say remove the um<br>[11:05] um actual and uh hstack<br>[11:11] uh parameters<br>[11:14] and others with uh likewise names. I<br>[11:19] don't know the AI will figure it out.<br>[11:21] um<br>[11:23] uh remove the blah blah blah uh and<br>[11:26] instead use uh this subject as the value<br>[11:32] to test on. Um then what else do we<br>[11:36] want? Remove the message remove the uh<br>[11:40] message parameter as well. We don't need<br>[11:44] that. uh change<br>[11:47] uh the return type from void to self.<br>[11:54] And what else is there to say? Um<br>[11:59] apart from that, just figure it out.<br>[12:01] basically uh look at the existing<br>[12:04] methods for inspiration<br>[12:09] and just also write tests in<br>[12:16] uh let's see<br>[12:20] oh I just had to copy the path right<br>[12:23] maybe maybe uh do not write test yet do<br>[12:26] not write tests yet go Okay. So, it's<br>[12:31] working. So, what we did uh add Okay,<br>[12:33] I'm going to I'm going to to switch back<br>[12:36] because<br>[12:38] uh<br>[12:41] are we going to do a plan with Juny or<br>[12:43] uh going to RA talking in in auto mode?<br>[12:45] Auto mode, man. Uh the thing is Juny<br>[12:47] plans on its own. So, you don't really<br>[12:50] have to do a a planning step. Um<br>[12:55] here we are. Here's the plan. This is<br>[12:57] what Juny came up with. So, um, I I'll<br>[13:00] just let it go. Let's let's let's see<br>[13:03] what happens. So, I I mentioned<br>[13:05] yesterday as well that we were at<br>[13:07] Symfony and we had this demo and it was<br>[13:10] really cool. We had uh basically a PHP<br>[13:12] storm instance running and there was<br>[13:14] this empty container class. I can<br>[13:16] actually show it. Uh, container or psr<br>[13:20] no booth booth. PHP storm booth. Uh, let<br>[13:22] me quickly show this. So, this this was<br>[13:24] the this was the setup. We had a plugin<br>[13:26] to to yeah do some stuff but uh we had<br>[13:29] this empty container interface and we<br>[13:31] had this container test and this is<br>[13:33] still using PHP unit which<br>[13:38] yeah it's not working because there were<br>[13:41] um yeah there are some missing things<br>[13:44] here and you couldn't do anything<br>[13:46] besides writing prompts to juny or<br>[13:49] claude whatever you want to fix this<br>[13:52] implementation and it was really fun to<br>[13:54] see what people came up with uh we said<br>[13:58] that it was a contest, right? So the<br>[13:59] people with the the least amount of<br>[14:01] characters in their prompts and the<br>[14:03] least amount of prompts in total, they<br>[14:05] they would win PHP Storm Elephant. And<br>[14:08] it was really nice to see how different<br>[14:11] people used our AI tools. Some people<br>[14:15] just started writing for 10 minutes and<br>[14:18] and trying to fine-tune the prompt and<br>[14:20] and doing all these kinds of stuff and<br>[14:22] and then the number one winner actually<br>[14:26] wrote one prompt with nine characters<br>[14:29] fixed tests and that was it and it did<br>[14:32] everything it had to do. So that was it<br>[14:34] was really interesting and insightful to<br>[14:36] see how people different people<br>[14:38] approached the um<br>[14:42] h Jun's uh is is done here. Um how<br>[14:46] different it didn't do anything. Oh, it<br>[14:47] did. Um, how different people approached<br>[14:50] uh the same the same task and uh okay,<br>[14:54] let's uh let's take a look at what Juny<br>[14:56] actually did. Uh and uh uh let's see.<br>[14:59] Implementations derived from to-do list<br>[15:01] converted to instance methods without<br>[15:03] assert prefix operating on this subject<br>[15:05] without message parameter and returning<br>[15:06] self. Okay,<br>[15:08] let's see. uh so is list if not uh is<br>[15:13] array and if it's not list then uh<br>[15:16] failed asserting that arrays a list so<br>[15:18] what I want to do in the next prompt is<br>[15:21] fine-tuning these messages instead of<br>[15:23] failed asserting uh it should say<br>[15:25] something more like um oh I already I<br>[15:29] was already doing that as well okay uh I<br>[15:31] didn't we're going to think about that<br>[15:33] in a second but um<br>[15:37] clone here's a prompt clone the entire<br>[15:39] Tempest framework into a new one and<br>[15:42] make no mistakes. The thing with um<br>[15:46] with AI and and LLMs in general for<br>[15:49] these kinds of tasks, they are super<br>[15:52] good in general because it's it's very<br>[15:54] repetitive. It's very pattern matching<br>[15:57] heavy and this is the kind of stuff<br>[15:59] these models are are trained on, you<br>[16:01] know, recognizing patterns and repeating<br>[16:03] those. But when you when you give it a<br>[16:06] more uh a broader task um it it they get<br>[16:12] a little more in inaccurate basically.<br>[16:15] And there was a super interesting study<br>[16:16] about this by uh Stanford. Actually I<br>[16:19] gave a talk about this at some meetups<br>[16:21] and at Symphfony well the uncon uh last<br>[16:23] week as well. So I have some inside<br>[16:26] knowledge now. But uh super interesting<br>[16:28] study being done that that the the<br>[16:30] accuracy and and the the productivity<br>[16:33] gained from AI uh using LLMs uh very<br>[16:37] heavily depends on uh the size of a<br>[16:39] project the complexity of the task. So<br>[16:42] uh okay if empty uh the field certain<br>[16:45] that value is empty is yeah okay okay<br>[16:48] yeah is empty is not empty actually uh<br>[16:52] to do<br>[16:54] is not list we'll just ask juny to to<br>[16:58] fix it for us right uh is not empty<br>[17:01] failed asserting that the value is not<br>[17:04] empty yeah okay that if empty then throw<br>[17:07] if greater than this is this is weird<br>[17:09] why would you do<br>[17:12] Uh if not subject<br>[17:14] is greater than okay. If not<br>[17:19] Mhm. failed<br>[17:21] uh searching that subject is greater or<br>[17:24] equal to minimum.<br>[17:27] Yeah. Less than again this is why did it<br>[17:32] do this? Actually I can ask Juny to do<br>[17:34] to fix it. Is there are there many more<br>[17:37] places?<br>[17:40] No, this is literally the only ones.<br>[17:42] Okay. Less than maximum. Yeah. Okay. Is<br>[17:46] true. If it's not true, then is false.<br>[17:49] Oh, you know what? To add is true.<br>[17:56] Come on. Truish and is falseish. And to<br>[17:59] do no, not true and not false doesn't<br>[18:02] really make sense because that's just<br>[18:03] false and true. The other way around. Um<br>[18:07] is null is not null. Um<br>[18:14] do we prefer is null or just equals<br>[18:17] null? I think is null is is okay is<br>[18:20] array if it's not an array<br>[18:23] to do is not array<br>[18:27] is bool is float is int is numeric. Oh<br>[18:30] actually I have to is if not bool if not<br>[18:32] float not int not numeric not object not<br>[18:38] resource not is string not is scalar is<br>[18:42] iterable uh not array and then we have<br>[18:44] the the opposites right not array is b<br>[18:47] flo float float not int not numeric not<br>[18:50] object not resource not string not<br>[18:52] scaler not callable not iterable string<br>[18:54] starts with uh yeah we need to verify<br>[18:57] the string if is string<br>[19:01] Yeah, actually what we need to do here<br>[19:03] probably is to do um subject validation<br>[19:07] as a as a separate step for everything.<br>[19:10] So um<br>[19:13] subject<br>[19:15] and I'm going to move this up so that<br>[19:17] Juny knows that to do subject validation<br>[19:19] for all methods um to first assert<br>[19:24] whether um<br>[19:28] the type of the subject actually<br>[19:33] uh can be used for this method. We'll<br>[19:39] let Juny figure out. We'll see how it<br>[19:40] goes. Um,<br>[19:44] is where were we? Is not pool, not<br>[19:47] float, blah blah blah blah blah blah<br>[19:49] blah. Yeah. Um, okay. String and not<br>[19:53] with Yeah. String end with Yeah.<br>[19:58] JSON.<br>[20:00] And then actually this this uh is uh is<br>[20:05] wrong. This should use JSON validate<br>[20:07] instead of uh to do<br>[20:12] use JSON validate instead.<br>[20:17] Okay. So, uh let's see. I have actually<br>[20:21] two major to-dos. Uh rewrite failing<br>[20:25] messages. I'm going to put these apart<br>[20:28] for now because I want to do those in a<br>[20:30] separate step. And then let's go to Juny<br>[20:32] again. Uh okay. fix the to-dos in uh<br>[20:42] over here. Let's go.<br>[20:45] So, uh yeah, that was that was uh a<br>[20:47] really interesting experience at<br>[20:49] Symfony. Um and<br>[20:54] you could<br>[20:55] Oh, hang on. Junior asked a question. To<br>[20:57] create a plan to fix remaining to-dos, I<br>[20:59] need quick confirmation of scope. Should<br>[21:01] I implement the remaining to-do items<br>[21:02] visible in tester specifically? Yes.<br>[21:04] Yes. Yes. Should I assign failure<br>[21:07] message and methods name with the<br>[21:08] patterns already used?<br>[21:11] Yes.<br>[21:12] Any additional PHP unit.<br>[21:17] Uh one and two. Yes. Three. No.<br>[21:23] Um,<br>[21:28] so yeah, it was really interesting to<br>[21:30] see how how you could immediately tell<br>[21:33] which people used AI and which people<br>[21:36] didn't. And uh, yeah, actually I<br>[21:39] realized my um my face is on top of of<br>[21:42] the Junyh stuff, but I guess it's fine.<br>[21:46] Um, and so what I what I um am curious<br>[21:50] about actually for people who are are<br>[21:52] tuning in, um, if you use AI, how do you<br>[21:56] deal with the off time? Because for me,<br>[21:58] that's actually the biggest problem<br>[21:59] here. I, uh, I'm trying to fill the the<br>[22:04] emptiness and it's still it's still<br>[22:06] working, right? Actually, I can can I<br>[22:08] move Juny? No, I can't. Uh, maybe I can<br>[22:12] do it like this. view mode move to<br>[22:15] bottom right.<br>[22:18] [Music]<br>[22:19] I don't know if that's really better,<br>[22:21] but yeah, I I um<br>[22:25] What do you do with the time off<br>[22:27] basically? Actually, you know what? I'll<br>[22:29] move my I move myself a bit over here so<br>[22:32] that you can follow along. Um<br>[22:39] so, yeah. Okay, here we are.<br>[22:42] Oh. Oh, yeah. Okay. Now, this is of<br>[22:44] course really annoying. No. No. Okay,<br>[22:46] I'll I'll move it back view. Uh, move to<br>[22:49] right bottom. Yeah, that was getting too<br>[22:53] annoying. Uh,<br>[22:57] okay. So, it's done. Let's see.<br>[23:02] Oh, is it not done? Hang on. I should<br>[23:04] read clarify implementing to-dos.<br>[23:11] Plan prepared and aligned. We awaiting<br>[23:14] approval to proceed with junior with the<br>[23:16] implementation. Yes, please<br>[23:24] do it.<br>[23:25] [Music]<br>[23:32] Okay. So, apparently it made a different<br>[23:34] plan. I'm not sure. It should like the<br>[23:36] plan should end up here. I don't know.<br>[23:37] This looks really bugged out at the<br>[23:38] moment to be honest. But um<br>[23:42] I'm watching your live right now on the<br>[23:45] side until Claude is bashing my<br>[23:46] codebase. Uh yeah, but yeah, that that's<br>[23:49] that's uh yeah, so that's interesting<br>[23:52] for me. Um that really becomes a problem<br>[23:55] actually because I'm not really all that<br>[23:56] good with context switching and I find<br>[23:58] it very um<br>[24:02] uh distracting to get back into the<br>[24:04] zone. Ah, now it made a plan. Okay,<br>[24:06] let's go. It's done, I think. So, it's<br>[24:08] not list. It's not uh what is trueish<br>[24:12] was there as well. Is trueish.<br>[24:15] Uh<br>[24:16] uh in does this make sense? No.<br>[24:19] Actually, I wanted to do it like this.<br>[24:24] Or okay, maybe that does make sense.<br>[24:28] Should this be wrapped? I don't think it<br>[24:30] should, but I'm going to do it uh<br>[24:34] anyway.<br>[24:39] Mhm.<br>[24:46] Oh, there already was something here for<br>[24:49] really what is array is<br>[24:54] not array. Okay, I'm going to rename<br>[24:57] this to is not array because that makes<br>[24:59] more sense. Not string. Uh,<br>[25:08] okay. Uh, rename all methods that start<br>[25:12] with not to is not. Actually, that that<br>[25:16] could have been a simple find and<br>[25:18] replace. Why do I do this?<br>[25:27] Yeah,<br>[25:28] that that's that's that's a bit silly.<br>[25:32] String ends not with string ends with<br>[25:36] adjacent. Oh, what did it do here? No,<br>[25:39] this is No, see this is the problem.<br>[25:42] Okay, so Juny doesn't know we're on PHP<br>[25:45] 8.5 or JSON validate is available.<br>[25:51] So yeah, let's just do it like this. So<br>[25:53] if not string uh subject. Yeah, so this<br>[25:56] is this is an example where it does<br>[25:57] subject validation for subject type<br>[25:59] validation. We need to prompt uni to do<br>[26:01] that for all the methods. Uh if not JSON<br>[26:04] validates this subject. Yeah. Then<br>[26:07] failed asserting that value that<br>[26:12] here it's so like the value<br>[26:16] like this is valid JSON. The value<br>[26:20] is valid JSON.<br>[26:25] Yeah. Okay.<br>[26:29] Cool.<br>[26:32] Okay, it's still working. Um, so yeah,<br>[26:35] that that context switching for me is is<br>[26:37] very uh it's very difficult actually.<br>[26:40] Um, I'm just going to<br>[26:43] commit this already when once uh this is<br>[26:46] done.<br>[26:50] Okay, this would have been easier to do<br>[26:52] to do just with a find and replace.<br>[26:58] Actually, I'm going to do it with a find<br>[27:00] and replace because<br>[27:03] go away. Go away.<br>[27:06] Um,<br>[27:08] function not<br>[27:14] function is not I mean<br>[27:22] uh replace replace like this.<br>[27:28] Not.<br>[27:33] Yeah. Yeah, this is better. Okay. So,<br>[27:35] let's commit this. And then we have our<br>[27:38] two bigger tasks still ahead of us. Uh<br>[27:41] subject validation for all methods to<br>[27:44] first assert. Yeah. Okay.<br>[27:46] So um<br>[27:49] implement subject validation<br>[27:52] can be used for method in uh<br>[28:00] in tester go<br>[28:07] and then we have to implement the tests<br>[28:08] as well which we're also going to<br>[28:10] automate<br>[28:15] but I I just want to do it in several<br>[28:17] steps because that it's easier for me to<br>[28:18] review that way. So yeah, I don't know.<br>[28:21] I don't know. I I in some way I am<br>[28:24] impressed that it can do all of this. At<br>[28:27] the same time, I'm like pretty bored. So<br>[28:29] what can I do now? Like watch a YouTube<br>[28:31] video or talk to you of course, but like<br>[28:33] if I wasn't streaming<br>[28:37] and that that just like totally pulls me<br>[28:40] out of the zone.<br>[28:42] I I was actually thinking yesterday I<br>[28:44] was watching a series with with my wife<br>[28:45] on the couch. Maybe I should just like<br>[28:48] pull put my take my laptop there and<br>[28:50] just write a prompt every five minutes.<br>[28:52] Um<br>[28:55] I don't know. It's also weird.<br>[28:59] Although in in in this case to generate<br>[29:01] all these methods, it's definitely<br>[29:03] faster to use<br>[29:05] um<br>[29:06] some kind of agent. So, I'm I'm not<br>[29:10] against it in in all<br>[29:13] at all times. Did we actually did I<br>[29:16] tweet about<br>[29:19] being live?<br>[29:21] Yes, I did. Okay.<br>[29:26] So, yeah. Yeah, I had some things on on<br>[29:29] my uh on my to-do. Actually, things to<br>[29:32] do while I'm waiting for Juny to finish.<br>[29:36] Uh, oh yeah, review some PRs. That was<br>[29:39] uh that was a good thing.<br>[29:41] Uh, there. Oh, oh, frame work.<br>[29:49] Uh, let's see.<br>[29:55] So, there is this pull request and we<br>[29:58] need to do something else while we're<br>[30:00] waiting, right? Uh when returning an<br>[30:02] invalid response, the original request<br>[30:03] body is saved to session original values<br>[30:06] and persisted to session storage. This<br>[30:09] means plain text passwords and<br>[30:10] potentially all sensitive information<br>[30:12] are stored on the file system. Okay, it<br>[30:14] would be useful to control this in some<br>[30:16] way potentially through validation<br>[30:17] attribute or some other config with<br>[30:19] which omits a field from being<br>[30:21] repopulated. Sensitive data uh users can<br>[30:24] be forced. Yeah. Okay. Um<br>[30:29] okay. So this see the sensitive field<br>[30:31] request fixture to see how it works.<br>[30:33] Yes, I thought about using PHP inbuilt<br>[30:36] sensitive parameter attribute but that's<br>[30:38] not viable due to how do we define<br>[30:40] requests in Tempest. We have class<br>[30:41] properties. The inbuilt parameter can<br>[30:43] only go on method property. Oh really<br>[30:47] yeah because it's sensitive parameter.<br>[30:49] Ah<br>[30:51] yeah<br>[30:53] that's annoying. It would have been nice<br>[30:55] if this was combined together.<br>[30:58] Uh yeah, that's your PR. Uh it's really<br>[31:02] like on all social media you're called<br>[31:06] not psychopath or psychopath and then on<br>[31:08] GitHub you're called Xaven and like<br>[31:12] I have to do that mapping in my app. Be<br>[31:14] consistent.<br>[31:15] Um<br>[31:18] so uh we have our request to object<br>[31:20] mapper. Uh I don't create validation<br>[31:24] failure exception<br>[31:27] target class is okay. Is this related to<br>[31:30] the PR offices or maybe just a fix? Is<br>[31:33] Juny still working by the way? Yeah,<br>[31:34] it's still<br>[31:36] how many things is it doing?<br>[31:42] What what was my prompt actually?<br>[31:44] implement subject validation.<br>[31:51] We'll see. We'll see. Um okay. So we<br>[31:55] have sensitive<br>[31:56] maybe we should then call it sensitive<br>[31:58] field to be more in line with um<br>[32:04] with PHP and to to differentiate between<br>[32:07] whether it's sensitive sensitive field<br>[32:12] then we have sensitive parameter from<br>[32:14] PHP and sensitive field from us I think<br>[32:18] might make more sense<br>[32:21] Um,<br>[32:30] and this is with the target class of<br>[32:32] you're saying we need to pass the target<br>[32:34] object around otherwise we only know<br>[32:36] about the generic request class not the<br>[32:38] actual request class. Yeah,<br>[32:42] during validation you mean? Isn't there?<br>[32:47] because I would actually think this uh<br>[32:51] let's see<br>[32:56] generic request mapper<br>[33:01] uh request to object mapper over here.<br>[33:03] So we have a generic request, right? And<br>[33:06] then um<br>[33:08] we map it to the real request class over<br>[33:12] here. And this is actually where we<br>[33:13] validate stuff.<br>[33:17] Does that make sense to just have that<br>[33:19] sensitive stuff over here instead? Oh,<br>[33:22] that's where what you're doing here.<br>[33:24] Okay,<br>[33:27] hang on. I misunderstood.<br>[33:32] Ah, yeah. This is in the validator.<br>[33:34] Okay. Sorry. Let's see. Let's see what<br>[33:36] happens.<br>[33:46] Mhm.<br>[33:48] Okay. In the invalid<br>[33:51] uh response where these session values<br>[33:53] are set, we will filter our sensitive<br>[33:56] fields. That makes sense.<br>[34:03] But I don't really understand why we<br>[34:04] need target class here.<br>[34:08] Oh, I do understand. Wouldn't there be a<br>[34:10] better way to do it?<br>[34:19] There's already a commit with the<br>[34:21] attribute renaming. That's nice.<br>[34:25] even before I submitted my uh my review.<br>[34:30] [Music]<br>[34:34] Yeah. So over here we have we need that<br>[34:36] target class so that we can loop over<br>[34:38] its properties and see whether these<br>[34:41] properties have sensitive field. But<br>[34:44] didn't we<br>[34:47] like the request over here is this is<br>[34:50] what yeah okay this is what I wonder<br>[34:52] about. I'll I'll leave a comment here as<br>[34:54] well. Um<br>[34:56] the request over here, it's typed<br>[34:58] request, but don't you get like the<br>[35:00] concrete object here? So, couldn't you<br>[35:01] just reflect over this object and get<br>[35:04] its parameters?<br>[35:06] I I think that should be the case. No,<br>[35:09] because uh let's see, this is when the<br>[35:12] the response is created and you pass it<br>[35:14] the request. Let's let's uh let's look<br>[35:17] it up here. uh construct in yeah handle<br>[35:20] route exception middleware um<br>[35:25] it's the subject from the validation<br>[35:30] the request body only contains yes but<br>[35:33] what I'm trying to say is that this<br>[35:34] object itself should I think be the<br>[35:38] concrete object actually<br>[35:41] Um<br>[35:50] uh let's see because we have our subject<br>[35:51] here. Uh this is very deep in the<br>[35:54] framework. It would be easier to just<br>[35:55] try it out of course and since you have<br>[35:57] testing setup I think if you just if you<br>[36:00] do um<br>[36:02] request this should be the custom object<br>[36:05] should be. So you can just do reflect<br>[36:09] over that object and then you don't need<br>[36:11] the target class anymore I think.<br>[36:16] Uh so if if you can try that out<br>[36:20] would be nice. Uh I I'll leave a comment<br>[36:22] as well. I I think we should be able to<br>[36:27] use uh reflect over um request in order<br>[36:33] to not pass around the target class. And<br>[36:37] if that's not the case, maybe I should<br>[36:40] make it so that it works.<br>[36:46] And apart from that, this looks fine.<br>[36:49] Let's see. Request changes. There we go.<br>[36:53] I'm just I know you're you're watching<br>[36:55] live as well, but it's easier for me to<br>[36:57] keep track of it over here as well. And<br>[37:00] how long is Juny taking to do all of<br>[37:02] this?<br>[37:10] Oh no. What is it doing? It's making<br>[37:12] assert internal guards.<br>[37:17] Okay. Well, maybe maybe it's okay.<br>[37:20] Uh,<br>[37:22] assert string for string text. Assert<br>[37:24] array for keys. Okay, it's it's it's<br>[37:27] doing<br>[37:30] too much, I think, and actually taking a<br>[37:33] very long time to<br>[37:35] uh<br>[37:37] to do this. And the reason it's doing<br>[37:39] all of this,<br>[37:41] cancel PHP tempest list. What is it<br>[37:44] doing?<br>[37:48] Yeah. And it's hanging on um<br>[37:59] so what I would like to be able to do<br>[38:01] now<br>[38:02] Oh,<br>[38:04] okay.<br>[38:07] It's done.<br>[38:10] What I would like to be able to do is is<br>[38:12] to jump in and just say, "Hang on a<br>[38:15] second. I want to give you some more<br>[38:16] context.<br>[38:18] That will be a nice button to have. Um,<br>[38:25] okay. So, I<br>[38:27] what I'm going to do is ensure<br>[38:31] subject is countable.<br>[38:35] Ensure<br>[38:38] subject is array.<br>[38:48] Ensure subject is string.<br>[38:55] Ah yeah. And this is why<br>[38:58] um<br>[39:03] ensure sub uh subject is numerical.<br>[39:11] Okay.<br>[39:16] Okay. Meanwhile, um psychopath,<br>[39:20] it's such a weird name, but um checked<br>[39:23] the<br>[39:25] the request stuff and it is indeed uh<br>[39:29] generic request. Okay. Then then just<br>[39:33] okay<br>[39:34] checked it is uh generic request. Let's<br>[39:39] keep that<br>[39:41] for now. In that case, we can just merge<br>[39:43] this. Oh, no. You know what? You forgot<br>[39:45] docs.<br>[39:51] Uh, you probably want to add it in uh<br>[39:54] No, it's uh Tempest. Let's go<br>[39:56] documentation.<br>[39:58] Um,<br>[40:04] valid request data.<br>[40:11] Yeah,<br>[40:15] after using request classes is a good<br>[40:18] place for it to uh to be just add like a<br>[40:21] simple paragraph with a code sample and<br>[40:23] then we can merge it.<br>[40:25] Okay. Like totally distracting again. Um<br>[40:31] okay. Uh assure subject string. Yeah. So<br>[40:34] this this is good, right? string ends<br>[40:36] with sure but then we didn't we don't<br>[40:39] need these anymore right<br>[40:47] so uh there was<br>[40:50] this ensure sub ensure sub subject is<br>[40:55] string<br>[40:57] like this<br>[41:03] let's Okay.<br>[41:08] Yeah, this is okay. It's not callable.<br>[41:10] This is okay. It's not scare. It's not<br>[41:13] string. Is not resource. Is not object.<br>[41:16] It's not numeric. Is not int. Is not we<br>[41:20] can actually all these checks are okay.<br>[41:24] These already do type checking of<br>[41:26] course. Uh is falseish? Yes. Is trueish?<br>[41:30] Yes.<br>[41:31] Um<br>[41:33] this is okay. This is okay. Let's ensure<br>[41:36] subject is numerical. Yes.<br>[41:39] Less than less. Greater than. Greater<br>[41:41] than is not empty. Empty can be called<br>[41:45] on anything. I think<br>[41:48] uh mixed. Yeah,<br>[41:50] that's good. Is not list<br>[41:54] and sure subject is array.<br>[41:58] Oh, no no no no no. This is this is<br>[42:00] okay. It's list.<br>[42:05] Hang on.<br>[42:11] This can just be this array is list. Oh,<br>[42:15] no, no, no. Because it needs array. If<br>[42:17] not<br>[42:30] or Oh, no. It was actually correct.<br>[42:38] Hang on a second. No, it not list<br>[42:44] as uh where should you put these ducks?<br>[42:47] I'm like totally multitasking<br>[42:50] uh over here uh on the routing. Well,<br>[42:53] actually, let me let me show it over<br>[42:54] here. Go to Tempest framework.<br>[42:58] You go to uh routing.md<br>[43:03] over here and then uh after using<br>[43:06] request classes.<br>[43:09] So you can just put it like over here<br>[43:12] sensitive<br>[43:14] request<br>[43:16] fields something like that.<br>[43:19] Take a screenshot<br>[43:23] and okay now I'm going to continue.<br>[43:26] Um<br>[43:29] I'm like totally like boolean<br>[43:30] expressions for a second. Uh<br>[43:33] okay. So when should this fail? when<br>[43:36] it's not when it is a list<br>[43:42] then it should fail.<br>[43:45] So if<br>[43:48] is array subject and whether if it's a<br>[43:52] list then it should fail otherwise it's<br>[43:54] good.<br>[44:01] Okay so that was a mistake. When should<br>[44:04] this fail? If it's not an array. So here<br>[44:06] we can say this ensure<br>[44:09] sub subject is array.<br>[44:13] If it's not a list then we'll throw an<br>[44:16] exception. Yeah.<br>[44:22] Okay. And now the it didn't touch the<br>[44:25] the new thing. this ensure.<br>[44:29] Oh, and we don't even have that.<br>[44:32] Uh,<br>[44:33] ensure subject is<br>[44:37] callable.<br>[44:40] And actually<br>[44:46] the thing is we have these ensure<br>[44:48] methods,<br>[44:50] but<br>[44:52] we could also just use the<br>[44:56] Uh where were we this ensure<br>[45:02] why don't we do is callable that's<br>[45:06] basically the same yeah then we don't<br>[45:09] need these insure methods see this this<br>[45:11] this is why you need<br>[45:14] to review AI generated code<br>[45:21] is countable<br>[45:31] Yeah. Yeah. Actually, we need to uh we<br>[45:35] don't need these unsure methods.<br>[45:38] Okay. But we do need uh is countable.<br>[45:43] Uh let's uh let's say if not is<br>[45:47] countable subject<br>[45:50] uh<br>[45:52] throw new test failed uh fail asserting<br>[45:54] that uh<br>[45:58] countable<br>[46:05] like this and then okay and then<br>[46:09] is not countable If<br>[46:16] okay<br>[46:19] now we can just use these.<br>[46:24] Okay. Is callable is not equal to is<br>[46:27] equal to is not is not succeeds.<br>[46:35] Uh<br>[46:37] fails.<br>[46:43] [Music]<br>[46:54] Okay. So, we we actually don't need all<br>[46:56] our insure methods,<br>[47:00] right?<br>[47:02] Um Oh, let's go down.<br>[47:12] But it's okay. Uh is oh no no<br>[47:17] is numeric<br>[47:21] should<br>[47:28] assert string or array for contain<br>[47:31] contains.<br>[47:33] Yeah. And so this is an or. Okay, let's<br>[47:35] let's let's keep that for for a second.<br>[47:37] Subject is string<br>[47:44] is string like so.<br>[47:51] And then ensure subject is array.<br>[47:57] This is array.<br>[48:02] Always the scroll. I need to<br>[48:07] countable is done. Okay. Okay. So,<br>[48:10] that's better. And in this case, we'll<br>[48:13] just have the this is in oh, in two<br>[48:15] places. Oh, yeah, of course. Contains um<br>[48:24] I'm just going to inline it anyway.<br>[48:28] Scrolling down for now. Let's not over<br>[48:32] complicate things.<br>[48:36] And then over here if not is string.<br>[48:41] Yeah. Okay. This is good. This is good.<br>[48:45] Okay. So now first going to going to do<br>[48:48] my next prompt and um<br>[48:55] okay things are failing but we'll ask<br>[48:58] Juny to fix it. Um<br>[49:01] no not AI chat jun<br>[49:08] now implement<br>[49:11] tests for all methods in<br>[49:17] tester test. Um<br>[49:24] also fix the failing tests in tester<br>[49:28] test and then oh did I yeah I commit uh<br>[49:33] you can run tests with the<br>[49:38] tempest PHP tempest test<br>[49:44] tester test this should work right Yeah.<br>[49:50] Command go.<br>[49:53] Okay, it's working. And meanwhile, I can<br>[49:55] return back to my um<br>[50:00] to the docs which<br>[50:04] Oh, I'm already getting I'm ready to<br>[50:06] implement a fixed test for tester test<br>[50:07] before you can prefer. Yeah. Should I<br>[50:10] strictly follow the existing expected<br>[50:12] error message strings in tester test or<br>[50:14] may I adjust them to match the current<br>[50:16] implementation messages where they<br>[50:19] differ? Uh follow the ones uh one follow<br>[50:26] the existing conventions<br>[50:29] make changes where necessary in uh<br>[50:34] tester unit tester class two. Do you<br>[50:37] want to com comprehensive test for every<br>[50:40] public method?<br>[50:45] Uh for all public methods<br>[50:49] methods. May I run the provided command<br>[50:52] tester test to iterate locally or should<br>[50:54] I only modify code without executing? I<br>[50:57] just I just said that you should uh yes<br>[51:01] run the command.<br>[51:07] Go.<br>[51:09] Uh, okay.<br>[51:13] [Music]<br>[51:26] Yeah, cool. Ls good.<br>[51:32] So, uh Oh, I actually have to approve my<br>[51:34] changes.<br>[51:39] approve.<br>[51:43] So, to be honest, I don't really like<br>[51:47] the the context switching all too much.<br>[51:49] I find it very distracting.<br>[51:53] Hey, do you promote Juni or do you use<br>[51:55] it all the time? Well, I work at Jet<br>[51:57] Brains, so so there's that. Um and um<br>[52:02] but we also have we also have cloud<br>[52:04] integration. So we promote both of them.<br>[52:06] Uh if you go to AI chat and then use<br>[52:09] cloud agents, you basically get the same<br>[52:11] as Juny but different implementation. Um<br>[52:15] so I just went to Symfony where I talked<br>[52:18] to a lot of people who were using either<br>[52:22] one of two. Um, and like the general<br>[52:25] consensus is that Juny is usually a bit<br>[52:27] more accurate while Claude is a bit<br>[52:30] faster. So yeah, there's like this thing<br>[52:34] to uh<br>[52:37] to take into account.<br>[52:45] So yeah, and and I just wanted to do<br>[52:47] some stuff with uh AI<br>[52:57] psychopath here. Uh he says, "Cloud, fix<br>[52:59] some of my failing tests." And Cloud<br>[53:01] says, "You're absolutely right. I've<br>[53:03] deleted the failing tests and now your<br>[53:04] suit passes." Yeah. And so in general,<br>[53:07] we but you you try this yourself, of<br>[53:11] course, but we find that with with Juny,<br>[53:13] it's a bit more accurate for these kinds<br>[53:15] of things, but it's slower. It's<br>[53:16] definitely slower at the moment. So<br>[53:19] yeah, depends on how much stuff you have<br>[53:21] to do besides writing that code, you<br>[53:25] know. I have some code uh some things to<br>[53:28] uh to review now. Uh<br>[53:34] so yeah and CI to finish basically<br>[53:39] you know software development these days<br>[53:41] is just a lot of waiting<br>[53:47] but yeah<br>[53:51] so yeah I was I was saying that I I'm<br>[53:53] not really all that good with um context<br>[53:56] switching to be honest. I reckon there<br>[53:58] are people better at it, but for me it's<br>[54:01] it's just yeah, I I find it really hard<br>[54:05] to then get back into<br>[54:07] uh what I was working on<br>[54:10] and and so I mentioned this study that<br>[54:14] they um uh Stanford did a while ago and<br>[54:18] um it's it also looked into this<br>[54:21] question like how productive do you<br>[54:23] actually become and there there are some<br>[54:25] productivity the<br>[54:27] improvements when you use AI. Um but<br>[54:30] there is also a huge impact on<br>[54:35] uh like code re the code you have to<br>[54:38] review like what I just had to do right<br>[54:41] fix some stuff you really it are subtle<br>[54:44] things you so you need really need to<br>[54:46] like take proper care of understanding<br>[54:49] what's going on and reading that code if<br>[54:52] you're were just writing it it's uh why<br>[54:55] is it doing<br>[54:58] GitHub is weird if you're just writing<br>[55:00] that code, you already thought of um of<br>[55:04] many of these things. So, uh huh, I<br>[55:08] pressed the wrong button.<br>[55:10] I'm sorry. I pressed the wrong button.<br>[55:18] Uh<br>[55:20] we'll let it run one once more just to<br>[55:22] make sure. And and um this is like the<br>[55:25] perfect example. I'm trying to explain<br>[55:27] something here. Here I am distracted by<br>[55:29] something else. I already forgot what I<br>[55:30] was talking about. It's really like ah<br>[55:34] uh I use agents when it feels bad<br>[55:36] because it breaks my uh when when I use<br>[55:39] agents it feels bad because it breaks my<br>[55:41] flow. It feels like I cannot get into<br>[55:44] the zone. Yeah. And that's exactly what<br>[55:45] I'm dealing with right now as well. Um<br>[55:49] so yeah<br>[55:52] but but then like this is a lot the<br>[55:54] things. Oh, what? Why is it<br>[55:59] opening?<br>[56:01] Ah, because it needs a resource. Okay,<br>[56:03] that makes sense. Uh,<br>[56:06] oh, and it's combining them into single<br>[56:09] tests.<br>[56:11] Let's actually see. It's done now.<br>[56:14] Okay, it does work. Um,<br>[56:19] now I need to read through all of this.<br>[56:21] And so, it added, let's see, from 200.<br>[56:24] So it it added 200 lines of code that I<br>[56:26] now need to read through.<br>[56:29] And this isn't like the most fun code,<br>[56:31] but at the same time, you also like<br>[56:32] writing this yourself isn't<br>[56:36] great either. So yeah,<br>[56:48] I'm happy that it actually did. Um,<br>[56:58] yeah, it did all of<br>[57:04] Okay. So yeah, I don't know.<br>[57:10] I also feel like I'm becoming slightly<br>[57:12] sometimes more than slightly dumber.<br>[57:17] And I think that<br>[57:20] I'm trying to to like come up with an<br>[57:22] answer there. Um<br>[57:26] I in this case I don't think I I've I<br>[57:30] would have become much smarter<br>[57:31] implementing all of this yourself<br>[57:33] because this is kind of brain rot code.<br>[57:35] No, it's just repeating the same thing<br>[57:37] over and over again. Um I already wrote<br>[57:41] like 10 methods myself and I just had to<br>[57:44] add another<br>[57:47] 20 25 something like that. Um,<br>[57:51] and same for these these tests. I<br>[57:53] already wrote 200 lines. Uh, so I don't<br>[57:58] feel like I've gotten much uh dumber<br>[58:02] because of using AI here. Uh, I I do<br>[58:06] feel kind of like ah not in the zone,<br>[58:09] but it's it's also part because of live<br>[58:11] streaming because live streaming is<br>[58:12] always a bit difficult because I I also<br>[58:14] have to keep track of the chat. So<br>[58:16] that's a distraction as well. So,<br>[58:18] usually coding uh while streaming isn't<br>[58:21] the most productive for me either. And<br>[58:23] I've done quite a lot of coding and<br>[58:24] streaming already. So, I I think I I can<br>[58:27] speak from experience. But yeah,<br>[58:31] I'm now dreading having to read through<br>[58:32] all of this.<br>[58:35] Uh<br>[58:38] so, so yeah, you have a lot of knowledge<br>[58:40] you can forget. Uh I I haven't learned<br>[58:43] yet. Um,<br>[58:46] I'm not sure what you mean with that<br>[58:47] Thor Tory Tori one on Twitch. Um, I mean<br>[58:53] more like forgetting syntaxes, what<br>[58:54] parameter goes where, especially when<br>[58:56] PHP loves to mix whether haste or needle<br>[58:59] goes first. Things that were basically<br>[59:02] second nature before. Well, it's<br>[59:04] interesting that you say the needle<br>[59:05] haste example because I've been writing<br>[59:07] a lot of manual PHP code uh and I still<br>[59:11] can't remember. But that's why I I have<br>[59:14] uh<br>[59:16] autocomp completion with because because<br>[59:18] I I just I cannot remember. Um<br>[59:23] yeah.<br>[59:29] So what I also don't like is like the<br>[59:30] the fact that it mixed camel case, a<br>[59:34] camel case and a snake case. I can ask<br>[59:37] it to fix it, of course.<br>[59:42] Why did it do that? That's just<br>[59:45] type checks positive. Type type type<br>[59:48] checks negative. Not type check. What?<br>[59:53] So these are the failing cases and these<br>[59:55] are the succeeding cases. Okay.<br>[60:00] And so I'm fairly confident that like<br>[60:03] all things are tested,<br>[60:06] but it feels like it's not the way I<br>[60:08] would have structured it to be honest.<br>[60:15] So yeah, I'm not I I don't feel like<br>[60:17] super satisfied with this, but it is.<br>[60:19] Yeah, I'm going to commit it because it<br>[60:23] is something. Uh I still need to read<br>[60:25] through it, of course. What was my um<br>[60:29] what was left on my to-do? Rewrite<br>[60:31] failing tests. Subject validation we did<br>[60:33] and then implement tests. Okay,<br>[60:37] so we did everything. No. Uh rewrite the<br>[60:42] failing the fail messages is what I<br>[60:44] meant.<br>[60:46] But that I have to still think about<br>[60:47] because<br>[60:50] failed asserting that I was already<br>[60:52] using this<br>[60:56] failed asserting that we could also<br>[60:58] write it like just not<br>[61:05] but yeah I don't know I'm fine keeping<br>[61:08] it this way for now.<br>[61:10] H. So, yeah,<br>[61:14] I do have to add a<br>[61:22] to-do<br>[61:23] review.<br>[61:25] Not making me super happy.<br>[61:30] So, yeah, that that was my uh I'm going<br>[61:33] to I'm I'm I've got to be honest. I'm<br>[61:37] not left pretty unsatisfied.<br>[61:40] Um, but it did save me time.<br>[61:44] Ah, Thor, you're Thor to Thor, I don't<br>[61:48] know, from Discord. Hi.<br>[61:51] Um,<br>[61:53] yeah, I don't know. What What were your<br>[61:55] uh feelings following along on uh with<br>[61:59] this stream? Like was it more or less<br>[62:02] entertaining to just write a prompt and<br>[62:05] then wait for five minutes and talk<br>[62:07] about whatever and then come back to it<br>[62:09] and see whether it actually works and<br>[62:11] then reviewing and um compared to<br>[62:16] writing all of this ourselves of course<br>[62:19] uh because that wouldn't have been super<br>[62:20] fun either I reckon. So I don't know. I<br>[62:24] don't know. So, I have to admit I I<br>[62:28] usually don't really vibe code and um I<br>[62:31] I use<br>[62:33] simple completions. Um<br>[62:36] let's see, stuff like this, which is<br>[62:39] also AI powered, which is really well,<br>[62:41] it's now just the same of this one, of<br>[62:43] course, but um<br>[62:45] it's um<br>[62:50] yeah, to be honest, it's the worst<br>[62:52] content when you share your thought. It<br>[62:54] feels like I can learn a lot. Yeah. You<br>[62:56] know. Yeah. Yeah. I agree. I don't feel<br>[62:58] like I've shared many thoughts here. I<br>[63:00] just prompting<br>[63:04] uh<br>[63:06] writing prompts.<br>[63:10] When you vibe code, the window to<br>[63:12] distract you is wide open. Yeah. Yeah.<br>[63:13] Yeah. This is what I'm running into as<br>[63:15] well.<br>[63:20] So, yeah.<br>[63:22] Actually,<br>[63:24] I'm going to be like, this is still a<br>[63:26] lot to review, but I'm going to be more<br>[63:28] happy reading through all of this,<br>[63:29] making sure it all works, and then<br>[63:31] knowing that it's like just the way I<br>[63:35] want it to be properly structured. And<br>[63:38] uh and I can probably get there by<br>[63:40] prompting Juny more and more and more,<br>[63:42] but that's not that's it's not going to<br>[63:45] save me a lot of time<br>[63:47] and it's not going to make make for for<br>[63:51] that that give that that satisfaction,<br>[63:53] you know. Interesting to see your<br>[63:55] experience. I think it's fine if we're<br>[63:56] simply going to have a long evolution of<br>[63:58] smaller improvements. Uh okay. Yeah,<br>[64:04] it's very good to break the white paper<br>[64:06] to get something to work.<br>[64:10] This is interesting. So that that I feel<br>[64:12] like yeah, maybe maybe it is helpful. It<br>[64:15] it like gave me something to start from<br>[64:18] and that I can now further refine.<br>[64:22] That's actually that that might actually<br>[64:24] be be good. Um I think the problem that<br>[64:27] many people have is that they treat this<br>[64:29] as being now done which uh it definitely<br>[64:34] isn't. And uh unfortunately also during<br>[64:38] doing some open source with Tempest you<br>[64:40] just you notice that um this happens<br>[64:44] more and more often with contributors as<br>[64:46] well where they<br>[64:48] just do this and submit a poll request<br>[64:51] and then the review work is up to me and<br>[64:53] that's that's just not that's not fun.<br>[64:55] uh especially because it makes it it<br>[64:58] adds a level of complexity where I<br>[65:00] wasn't the one writing the prompt. So, I<br>[65:02] have to figure out the the reasoning<br>[65:03] first and then um<br>[65:08] review it and fine-tune it. Well, at<br>[65:10] this point, at least I was part of the<br>[65:12] process here to to get to this point.<br>[65:16] So, yeah. Interesting, right?<br>[65:21] Anyway, I uh I think I'm going to wrap<br>[65:24] up the stream. Um it was really fun to<br>[65:29] as an experiment, but I don't think I<br>[65:31] will do this every time. Uh no, I I had<br>[65:35] uh Yeah. Yeah.<br>[65:38] Let's let's leave it at that. I uh but<br>[65:41] but still it's it's an interesting<br>[65:43] learning experience and that's uh that's<br>[65:45] valuable as well. Thank you all for<br>[65:46] pitching in. That's uh that's really<br>[65:48] helpful. Also, we did also<br>[65:50] coincidentally uh merge uh another pull<br>[65:53] request for Tempest while we were<br>[65:55] waiting. So, that's that's there's some<br>[65:57] added value there as well. Um yeah, but<br>[66:00] I think tomorrow if I if I I hope to be<br>[66:03] able to stream every day this week and<br>[66:05] next week, we'll we'll see how it works<br>[66:06] out. Uh if I if I'm here tomorrow, um I<br>[66:10] think I'll go back to just uh yeah,<br>[66:15] normal normal nonvibe coding. So, um,<br>[66:18] folks, I want to thank you for, uh, for<br>[66:20] being here and, um, I'll see you next<br>[66:23] time. Okay. Don't forget to leave a like<br>[66:25] before you go and, uh, yeah, tomorrow.<br>[66:28] See you tomorrow. Bye-bye.
<!-- deep-read:sections end -->
## ๐บ Video

---
# ๐ Full Transcript
*Auto-generated from YouTube captions ยท timestamps roughly every 30 seconds ยท [watch on YouTube](https://www.youtube.com/watch?v=leZJHViT6m8)*
**[00:02]** [Music] Heat. Heat. N. [Music]
**[00:38]** Never. [Music]
**[01:29]** [Laughter] [Music] All right, good morning. It's early morning. Wow, I still uh got this morning voice here. I hope that's okay. Uh let's see whether uh whether we're good. Leave uh something in chat if
**[02:01]** you're here. Just to make sure that everyone is uh everything's in uh in order, you know, been a noob streamer here. So uh so yeah. Hi folks. It's early morning. I know probably not a lot of people will will tune in this morning, but I have some things to do later in the day. And I wanted to uh do still do some live streaming. Basically, I'm going to try to do just daily live streams for the coming two weeks. We'll see how that goes. Um it's probably not
**[02:33]** going to happen uh every day, but yeah, I um I want to try my best anyway. Um, so yeah, let's see. Okay, do not disturb is on. That's good. Um, so who's here? Leave a hi in chat and uh we we will dive in pretty soon into some uh some some interesting stuff, let's say.
**[03:05]** So, hi folks. Hi Ahmed. have a nice day to you as well. Thanks for uh for joining this early in the morning or maybe it's like super late in the day for you. Who knows? Uh or or midnight. Could all be time zones, you know? But it's good to to uh have you here. And my oh my Tito, I guess my name is Tito on Twitch as well. By the way, you can also watch on Twitch. Uh just letting you know uh if you prefer that. However, uh
**[03:35]** YouTube is uh did I just say if you prefer death that if you prefer that uh YouTube is a bit better for me, but yeah, do whatever you want. Okay, so what are we doing today? We are uh well, if you if you were here here yesterday on the stream, you will know that we were working on Oh, I just noticed we've got two uh 2,000 stars on Tempest.
**[04:08]** That's nice. Um let's see here. Let's close this one. Uh we were working on our testing library, right? And this is uh something new. It's still an experiment for now. We'll see where it uh where we'll get with it. 2 p.m. for I'm at That's nice. That's a That's a good time actually. Um so yeah, we're building a a new testing framework for PHP
**[04:39]** experimental. We'll see where we go with it. Not making any uh any commitments here, but it's a nice exercise. And um for me it's on one hand to learn PP8.5. It's also uh Tito on on Twitch is saying his eyes. Well, you know, okay, I'll show you what you need to do to fix this because I have this prepared. So, uh you just, you know, grab your your sunglasses and um
**[05:10]** and that's how we'll uh write code today. So, you won't have any issues with your eyes. Uh what you could also do is just turn down the brightness of your monitor, which is always a good thing because it puts less strain on your eyes. Um but uh if you really want to to hear some more about it, uh PHP annotated. Let's see. Um go to videos, not not right now because you're watching the live stream, of course, and search for uh uh light.
**[05:40]** And you'll see this video. It's a two-minute video and I explain why light color schemes are better anyway, but yeah, you'll have to adjust a little bit. That's true. Um, because we're vibe coding today, I'll uh I'll go into my my vibe vibe coding uh attire, you know, just to make sure that um we have the the right like um atmosphere basically. But Oh, yeah. So, so our our testing uh
**[06:12]** I'm not going to do this for the whole stream. It's really annoying. But our uh let me actually turn my brightness a bit up now. Can you see the change? Yeah. Uh our testing framework um it's a really interesting thought experiment and we'll see where it gets us. And in yesterday's stream, I I walked through some of the ideas behind it, what the reasons why I'm doing this. Um but I uh there there there is basically a lot of work to be done and still some open questions as well and and what I wanted to try today
**[06:45]** well yesterday evening actually I was I was looking into my my tester uh class here which is like the basic assertter um for uh that that you can use in your in your test. So if you compare to PHPUnit you know uh um assert equals assert same etc. So there are already a couple of methods here. Uh is is not is equal to is not equal to. I prefer to use a little bit more um verbose names instead of always sticking to the same
**[07:16]** structure. For example, assert blah blah blah assert this, assert that. Um I prefer to just use more natural names. I don't know if that will stick or not. We'll see. I know pest, for example, always uses uh to be which is inspired by just if I'm not mistaken from JavaScript. um which is also uh which is also uh a thing. I I'm don't oppose it but I I don't want to stick to uh
**[07:48]** to one specific naming scheme. Basically folks on on YouTube are are just pitching in. Well, no. I'm I'm okay. I'm I'm in this uh attire not because of of uh my light color scheme. I don't have any problems with that, but it's because we're vibe coding today and I'm not going to do this for the whole stream because it's actually not really good for my eyes. But uh let's let's uh keep it on for for one more second. Um so yeah, we have a couple of methods here.
**[08:19]** Uh is is not contained has key, you know, a couple of things. And then there I I made a list here of PHP units assertions and I removed the whole bunch because I don't want to support everything. I don't think uh that's that's necessary, but I kept the ones that I think are are interesting and also need an implementation here. Actually, I still need to double check if there aren't because I I already implemented some. But um
**[08:51]** I I think for example equals and not equals I already have empty I don't count I don't have contains I already have is list I don't array has key we already have greater than that's missing true false null not null same and not same we have instance of we have is array is bool is blah blah blah all these is and is not functions strings starts with, starts not with, uh, ends
**[09:21]** with, ends not with, and JSON. Basically, that those are the ones I I want to use. PHPUnit has some more assertions um, with, uh, file stuff and resource stuff. There there are probably twice as many as I list here, but it's fine. I don't want to use everything. Um, so let's go into Vibe coder mode. Well, I already am, but let's open up uh uh Juny over here. I I was actually playing around with it, checking whether it it works or not. And so, uh the idea
**[09:54]** is well, let me first write my prompt because it will take uh a while to to actually uh um get going, right? Uh I'll enable execute terminal commands as well. Um and then I'll explain. I've got some things to talk about while uh Jun is working. But but but okay. So I need to write a prompt basically to implement these methods in the same way, the same style as these. Uh so let me uh copy over this one. Implement the todo
**[10:27]** methods of blah blah blah. Um always uh remove assert from the name. That's one of the things I need. Um, and let's see the the assertion methods in PHP unit, they always get the the the hay stack or the the actual um value within the methods themselves. But that's not what we want to do here because our testing the subject basically is in the construct. So we need to refactor that. So let's
**[10:59]** say um uh how should I say remove the um um actual and uh hstack uh parameters and others with uh likewise names. I don't know the AI will figure it out. um uh remove the blah blah blah uh and instead use uh this subject as the value
**[11:32]** to test on. Um then what else do we want? Remove the message remove the uh message parameter as well. We don't need that. uh change uh the return type from void to self. And what else is there to say? Um apart from that, just figure it out. basically uh look at the existing
**[12:04]** methods for inspiration and just also write tests in uh let's see oh I just had to copy the path right maybe maybe uh do not write test yet do not write tests yet go Okay. So, it's working. So, what we did uh add Okay, I'm going to I'm going to to switch back
**[12:36]** because uh are we going to do a plan with Juny or uh going to RA talking in in auto mode? Auto mode, man. Uh the thing is Juny plans on its own. So, you don't really have to do a a planning step. Um here we are. Here's the plan. This is what Juny came up with. So, um, I I'll just let it go. Let's let's let's see what happens. So, I I mentioned yesterday as well that we were at
**[13:07]** Symfony and we had this demo and it was really cool. We had uh basically a PHP storm instance running and there was this empty container class. I can actually show it. Uh, container or psr no booth booth. PHP storm booth. Uh, let me quickly show this. So, this this was the this was the setup. We had a plugin to to yeah do some stuff but uh we had this empty container interface and we had this container test and this is still using PHP unit which
**[13:38]** yeah it's not working because there were um yeah there are some missing things here and you couldn't do anything besides writing prompts to juny or claude whatever you want to fix this implementation and it was really fun to see what people came up with uh we said that it was a contest, right? So the people with the the least amount of characters in their prompts and the least amount of prompts in total, they they would win PHP Storm Elephant. And
**[14:08]** it was really nice to see how different people used our AI tools. Some people just started writing for 10 minutes and and trying to fine-tune the prompt and and doing all these kinds of stuff and and then the number one winner actually wrote one prompt with nine characters fixed tests and that was it and it did everything it had to do. So that was it was really interesting and insightful to see how people different people
**[14:38]** approached the um h Jun's uh is is done here. Um how different it didn't do anything. Oh, it did. Um, how different people approached uh the same the same task and uh okay, let's uh let's take a look at what Juny actually did. Uh and uh uh let's see. Implementations derived from to-do list converted to instance methods without assert prefix operating on this subject without message parameter and returning self. Okay,
**[15:08]** let's see. uh so is list if not uh is array and if it's not list then uh failed asserting that arrays a list so what I want to do in the next prompt is fine-tuning these messages instead of failed asserting uh it should say something more like um oh I already I was already doing that as well okay uh I didn't we're going to think about that in a second but um clone here's a prompt clone the entire
**[15:39]** Tempest framework into a new one and make no mistakes. The thing with um with AI and and LLMs in general for these kinds of tasks, they are super good in general because it's it's very repetitive. It's very pattern matching heavy and this is the kind of stuff these models are are trained on, you know, recognizing patterns and repeating those. But when you when you give it a more uh a broader task um it it they get
**[16:12]** a little more in inaccurate basically. And there was a super interesting study about this by uh Stanford. Actually I gave a talk about this at some meetups and at Symphfony well the uncon uh last week as well. So I have some inside knowledge now. But uh super interesting study being done that that the the accuracy and and the the productivity gained from AI uh using LLMs uh very heavily depends on uh the size of a project the complexity of the task. So uh okay if empty uh the field certain
**[16:45]** that value is empty is yeah okay okay yeah is empty is not empty actually uh to do is not list we'll just ask juny to to fix it for us right uh is not empty failed asserting that the value is not empty yeah okay that if empty then throw if greater than this is this is weird why would you do Uh if not subject is greater than okay. If not
**[17:19]** Mhm. failed uh searching that subject is greater or equal to minimum. Yeah. Less than again this is why did it do this? Actually I can ask Juny to do to fix it. Is there are there many more places? No, this is literally the only ones. Okay. Less than maximum. Yeah. Okay. Is true. If it's not true, then is false.
**[17:49]** Oh, you know what? To add is true. Come on. Truish and is falseish. And to do no, not true and not false doesn't really make sense because that's just false and true. The other way around. Um is null is not null. Um do we prefer is null or just equals null? I think is null is is okay is
**[18:20]** array if it's not an array to do is not array is bool is float is int is numeric. Oh actually I have to is if not bool if not float not int not numeric not object not resource not is string not is scalar is iterable uh not array and then we have the the opposites right not array is b flo float float not int not numeric not object not resource not string not
**[18:52]** scaler not callable not iterable string starts with uh yeah we need to verify the string if is string Yeah, actually what we need to do here probably is to do um subject validation as a as a separate step for everything. So um subject and I'm going to move this up so that Juny knows that to do subject validation for all methods um to first assert
**[19:24]** whether um the type of the subject actually uh can be used for this method. We'll let Juny figure out. We'll see how it goes. Um, is where were we? Is not pool, not float, blah blah blah blah blah blah blah. Yeah. Um, okay. String and not with Yeah. String end with Yeah.
**[19:58]** JSON. And then actually this this uh is uh is wrong. This should use JSON validate instead of uh to do use JSON validate instead. Okay. So, uh let's see. I have actually two major to-dos. Uh rewrite failing messages. I'm going to put these apart
**[20:28]** for now because I want to do those in a separate step. And then let's go to Juny again. Uh okay. fix the to-dos in uh over here. Let's go. So, uh yeah, that was that was uh a really interesting experience at Symfony. Um and you could Oh, hang on. Junior asked a question. To create a plan to fix remaining to-dos, I
**[20:59]** need quick confirmation of scope. Should I implement the remaining to-do items visible in tester specifically? Yes. Yes. Yes. Should I assign failure message and methods name with the patterns already used? Yes. Any additional PHP unit. Uh one and two. Yes. Three. No. Um, so yeah, it was really interesting to
**[21:30]** see how how you could immediately tell which people used AI and which people didn't. And uh, yeah, actually I realized my um my face is on top of of the Junyh stuff, but I guess it's fine. Um, and so what I what I um am curious about actually for people who are are tuning in, um, if you use AI, how do you deal with the off time? Because for me, that's actually the biggest problem here. I, uh, I'm trying to fill the the
**[22:04]** emptiness and it's still it's still working, right? Actually, I can can I move Juny? No, I can't. Uh, maybe I can do it like this. view mode move to bottom right. [Music] I don't know if that's really better, but yeah, I I um What do you do with the time off basically? Actually, you know what? I'll move my I move myself a bit over here so that you can follow along. Um
**[22:39]** so, yeah. Okay, here we are. Oh. Oh, yeah. Okay. Now, this is of course really annoying. No. No. Okay, I'll I'll move it back view. Uh, move to right bottom. Yeah, that was getting too annoying. Uh, okay. So, it's done. Let's see. Oh, is it not done? Hang on. I should read clarify implementing to-dos.
**[23:11]** Plan prepared and aligned. We awaiting approval to proceed with junior with the implementation. Yes, please do it. [Music] Okay. So, apparently it made a different plan. I'm not sure. It should like the plan should end up here. I don't know. This looks really bugged out at the moment to be honest. But um
**[23:42]** I'm watching your live right now on the side until Claude is bashing my codebase. Uh yeah, but yeah, that that's that's uh yeah, so that's interesting for me. Um that really becomes a problem actually because I'm not really all that good with context switching and I find it very um uh distracting to get back into the zone. Ah, now it made a plan. Okay, let's go. It's done, I think. So, it's not list. It's not uh what is trueish was there as well. Is trueish.
**[24:15]** Uh uh in does this make sense? No. Actually, I wanted to do it like this. Or okay, maybe that does make sense. Should this be wrapped? I don't think it should, but I'm going to do it uh anyway. Mhm.
**[24:46]** Oh, there already was something here for really what is array is not array. Okay, I'm going to rename this to is not array because that makes more sense. Not string. Uh, okay. Uh, rename all methods that start with not to is not. Actually, that that
**[25:16]** could have been a simple find and replace. Why do I do this? Yeah, that that's that's that's a bit silly. String ends not with string ends with adjacent. Oh, what did it do here? No, this is No, see this is the problem. Okay, so Juny doesn't know we're on PHP 8.5 or JSON validate is available.
**[25:51]** So yeah, let's just do it like this. So if not string uh subject. Yeah, so this is this is an example where it does subject validation for subject type validation. We need to prompt uni to do that for all the methods. Uh if not JSON validates this subject. Yeah. Then failed asserting that value that here it's so like the value like this is valid JSON. The value is valid JSON.
**[26:25]** Yeah. Okay. Cool. Okay, it's still working. Um, so yeah, that that context switching for me is is very uh it's very difficult actually. Um, I'm just going to commit this already when once uh this is done. Okay, this would have been easier to do to do just with a find and replace.
**[26:58]** Actually, I'm going to do it with a find and replace because go away. Go away. Um, function not function is not I mean uh replace replace like this. Not.
**[27:33]** Yeah. Yeah, this is better. Okay. So, let's commit this. And then we have our two bigger tasks still ahead of us. Uh subject validation for all methods to first assert. Yeah. Okay. So um implement subject validation can be used for method in uh in tester go
**[28:07]** and then we have to implement the tests as well which we're also going to automate but I I just want to do it in several steps because that it's easier for me to review that way. So yeah, I don't know. I don't know. I I in some way I am impressed that it can do all of this. At the same time, I'm like pretty bored. So what can I do now? Like watch a YouTube video or talk to you of course, but like if I wasn't streaming and that that just like totally pulls me
**[28:40]** out of the zone. I I was actually thinking yesterday I was watching a series with with my wife on the couch. Maybe I should just like pull put my take my laptop there and just write a prompt every five minutes. Um I don't know. It's also weird. Although in in in this case to generate all these methods, it's definitely faster to use um some kind of agent. So, I'm I'm not
**[29:10]** against it in in all at all times. Did we actually did I tweet about being live? Yes, I did. Okay. So, yeah. Yeah, I had some things on on my uh on my to-do. Actually, things to do while I'm waiting for Juny to finish. Uh, oh yeah, review some PRs. That was uh that was a good thing.
**[29:41]** Uh, there. Oh, oh, frame work. Uh, let's see. So, there is this pull request and we need to do something else while we're waiting, right? Uh when returning an invalid response, the original request body is saved to session original values and persisted to session storage. This means plain text passwords and potentially all sensitive information
**[30:12]** are stored on the file system. Okay, it would be useful to control this in some way potentially through validation attribute or some other config with which omits a field from being repopulated. Sensitive data uh users can be forced. Yeah. Okay. Um okay. So this see the sensitive field request fixture to see how it works. Yes, I thought about using PHP inbuilt sensitive parameter attribute but that's not viable due to how do we define requests in Tempest. We have class properties. The inbuilt parameter can
**[30:43]** only go on method property. Oh really yeah because it's sensitive parameter. Ah yeah that's annoying. It would have been nice if this was combined together. Uh yeah, that's your PR. Uh it's really like on all social media you're called not psychopath or psychopath and then on GitHub you're called Xaven and like I have to do that mapping in my app. Be
**[31:14]** consistent. Um so uh we have our request to object mapper. Uh I don't create validation failure exception target class is okay. Is this related to the PR offices or maybe just a fix? Is Juny still working by the way? Yeah, it's still how many things is it doing? What what was my prompt actually?
**[31:44]** implement subject validation. We'll see. We'll see. Um okay. So we have sensitive maybe we should then call it sensitive field to be more in line with um with PHP and to to differentiate between whether it's sensitive sensitive field then we have sensitive parameter from PHP and sensitive field from us I think
**[32:18]** might make more sense Um, and this is with the target class of you're saying we need to pass the target object around otherwise we only know about the generic request class not the actual request class. Yeah, during validation you mean? Isn't there? because I would actually think this uh
**[32:51]** let's see generic request mapper uh request to object mapper over here. So we have a generic request, right? And then um we map it to the real request class over here. And this is actually where we validate stuff. Does that make sense to just have that sensitive stuff over here instead? Oh,
**[33:22]** that's where what you're doing here. Okay, hang on. I misunderstood. Ah, yeah. This is in the validator. Okay. Sorry. Let's see. Let's see what happens. Mhm. Okay. In the invalid uh response where these session values
**[33:53]** are set, we will filter our sensitive fields. That makes sense. But I don't really understand why we need target class here. Oh, I do understand. Wouldn't there be a better way to do it? There's already a commit with the attribute renaming. That's nice.
**[34:25]** even before I submitted my uh my review. [Music] Yeah. So over here we have we need that target class so that we can loop over its properties and see whether these properties have sensitive field. But didn't we like the request over here is this is what yeah okay this is what I wonder about. I'll I'll leave a comment here as well. Um
**[34:56]** the request over here, it's typed request, but don't you get like the concrete object here? So, couldn't you just reflect over this object and get its parameters? I I think that should be the case. No, because uh let's see, this is when the the response is created and you pass it the request. Let's let's uh let's look it up here. uh construct in yeah handle route exception middleware um it's the subject from the validation
**[35:30]** the request body only contains yes but what I'm trying to say is that this object itself should I think be the concrete object actually Um uh let's see because we have our subject here. Uh this is very deep in the framework. It would be easier to just try it out of course and since you have testing setup I think if you just if you do um
**[36:02]** request this should be the custom object should be. So you can just do reflect over that object and then you don't need the target class anymore I think. Uh so if if you can try that out would be nice. Uh I I'll leave a comment as well. I I think we should be able to use uh reflect over um request in order
**[36:33]** to not pass around the target class. And if that's not the case, maybe I should make it so that it works. And apart from that, this looks fine. Let's see. Request changes. There we go. I'm just I know you're you're watching live as well, but it's easier for me to keep track of it over here as well. And how long is Juny taking to do all of this?
**[37:10]** Oh no. What is it doing? It's making assert internal guards. Okay. Well, maybe maybe it's okay. Uh, assert string for string text. Assert array for keys. Okay, it's it's it's doing too much, I think, and actually taking a very long time to uh to do this. And the reason it's doing all of this,
**[37:41]** cancel PHP tempest list. What is it doing? Yeah. And it's hanging on um so what I would like to be able to do now Oh, okay. It's done. What I would like to be able to do is is
**[38:12]** to jump in and just say, "Hang on a second. I want to give you some more context. That will be a nice button to have. Um, okay. So, I what I'm going to do is ensure subject is countable. Ensure subject is array.
**[38:48]** Ensure subject is string. Ah yeah. And this is why um ensure sub uh subject is numerical. Okay. Meanwhile, um psychopath,
**[39:20]** it's such a weird name, but um checked the request stuff and it is indeed uh generic request. Okay. Then then just okay checked it is uh generic request. Let's keep that for now. In that case, we can just merge this. Oh, no. You know what? You forgot docs.
**[39:51]** Uh, you probably want to add it in uh No, it's uh Tempest. Let's go documentation. Um, valid request data. Yeah, after using request classes is a good place for it to uh to be just add like a simple paragraph with a code sample and
**[40:23]** then we can merge it. Okay. Like totally distracting again. Um okay. Uh assure subject string. Yeah. So this this is good, right? string ends with sure but then we didn't we don't need these anymore right so uh there was this ensure sub ensure sub subject is
**[40:55]** string like this let's Okay. Yeah, this is okay. It's not callable. This is okay. It's not scare. It's not string. Is not resource. Is not object. It's not numeric. Is not int. Is not we can actually all these checks are okay. These already do type checking of
**[41:26]** course. Uh is falseish? Yes. Is trueish? Yes. Um this is okay. This is okay. Let's ensure subject is numerical. Yes. Less than less. Greater than. Greater than is not empty. Empty can be called on anything. I think uh mixed. Yeah, that's good. Is not list and sure subject is array.
**[41:58]** Oh, no no no no no. This is this is okay. It's list. Hang on. This can just be this array is list. Oh, no, no, no. Because it needs array. If not
**[42:30]** or Oh, no. It was actually correct. Hang on a second. No, it not list as uh where should you put these ducks? I'm like totally multitasking uh over here uh on the routing. Well, actually, let me let me show it over here. Go to Tempest framework. You go to uh routing.md
**[43:03]** over here and then uh after using request classes. So you can just put it like over here sensitive request fields something like that. Take a screenshot and okay now I'm going to continue. Um I'm like totally like boolean expressions for a second. Uh
**[43:33]** okay. So when should this fail? when it's not when it is a list then it should fail. So if is array subject and whether if it's a list then it should fail otherwise it's good. Okay so that was a mistake. When should
**[44:04]** this fail? If it's not an array. So here we can say this ensure sub subject is array. If it's not a list then we'll throw an exception. Yeah. Okay. And now the it didn't touch the the new thing. this ensure. Oh, and we don't even have that. Uh, ensure subject is
**[44:37]** callable. And actually the thing is we have these ensure methods, but we could also just use the Uh where were we this ensure why don't we do is callable that's basically the same yeah then we don't
**[45:09]** need these insure methods see this this this is why you need to review AI generated code is countable Yeah. Yeah. Actually, we need to uh we don't need these unsure methods. Okay. But we do need uh is countable.
**[45:43]** Uh let's uh let's say if not is countable subject uh throw new test failed uh fail asserting that uh countable like this and then okay and then is not countable If
**[46:16]** okay now we can just use these. Okay. Is callable is not equal to is equal to is not is not succeeds. Uh fails. [Music]
**[46:54]** Okay. So, we we actually don't need all our insure methods, right? Um Oh, let's go down. But it's okay. Uh is oh no no is numeric should
**[47:28]** assert string or array for contain contains. Yeah. And so this is an or. Okay, let's let's let's keep that for for a second. Subject is string is string like so. And then ensure subject is array. This is array.
**[48:02]** Always the scroll. I need to countable is done. Okay. Okay. So, that's better. And in this case, we'll just have the this is in oh, in two places. Oh, yeah, of course. Contains um I'm just going to inline it anyway. Scrolling down for now. Let's not over
**[48:32]** complicate things. And then over here if not is string. Yeah. Okay. This is good. This is good. Okay. So now first going to going to do my next prompt and um okay things are failing but we'll ask Juny to fix it. Um no not AI chat jun
**[49:08]** now implement tests for all methods in tester test. Um also fix the failing tests in tester test and then oh did I yeah I commit uh you can run tests with the tempest PHP tempest test
**[49:44]** tester test this should work right Yeah. Command go. Okay, it's working. And meanwhile, I can return back to my um to the docs which Oh, I'm already getting I'm ready to implement a fixed test for tester test before you can prefer. Yeah. Should I strictly follow the existing expected error message strings in tester test or
**[50:14]** may I adjust them to match the current implementation messages where they differ? Uh follow the ones uh one follow the existing conventions make changes where necessary in uh tester unit tester class two. Do you want to com comprehensive test for every public method?
**[50:45]** Uh for all public methods methods. May I run the provided command tester test to iterate locally or should I only modify code without executing? I just I just said that you should uh yes run the command. Go. Uh, okay. [Music]
**[51:26]** Yeah, cool. Ls good. So, uh Oh, I actually have to approve my changes. approve. So, to be honest, I don't really like the the context switching all too much. I find it very distracting. Hey, do you promote Juni or do you use it all the time? Well, I work at Jet
**[51:57]** Brains, so so there's that. Um and um but we also have we also have cloud integration. So we promote both of them. Uh if you go to AI chat and then use cloud agents, you basically get the same as Juny but different implementation. Um so I just went to Symfony where I talked to a lot of people who were using either one of two. Um, and like the general consensus is that Juny is usually a bit
**[52:27]** more accurate while Claude is a bit faster. So yeah, there's like this thing to uh to take into account. So yeah, and and I just wanted to do some stuff with uh AI psychopath here. Uh he says, "Cloud, fix
**[52:59]** some of my failing tests." And Cloud says, "You're absolutely right. I've deleted the failing tests and now your suit passes." Yeah. And so in general, we but you you try this yourself, of course, but we find that with with Juny, it's a bit more accurate for these kinds of things, but it's slower. It's definitely slower at the moment. So yeah, depends on how much stuff you have to do besides writing that code, you know. I have some code uh some things to uh to review now. Uh
**[53:34]** so yeah and CI to finish basically you know software development these days is just a lot of waiting but yeah so yeah I was I was saying that I I'm not really all that good with um context switching to be honest. I reckon there are people better at it, but for me it's it's just yeah, I I find it really hard
**[54:05]** to then get back into uh what I was working on and and so I mentioned this study that they um uh Stanford did a while ago and um it's it also looked into this question like how productive do you actually become and there there are some productivity the improvements when you use AI. Um but there is also a huge impact on
**[54:35]** uh like code re the code you have to review like what I just had to do right fix some stuff you really it are subtle things you so you need really need to like take proper care of understanding what's going on and reading that code if you're were just writing it it's uh why is it doing GitHub is weird if you're just writing that code, you already thought of um of many of these things. So, uh huh, I
**[55:08]** pressed the wrong button. I'm sorry. I pressed the wrong button. Uh we'll let it run one once more just to make sure. And and um this is like the perfect example. I'm trying to explain something here. Here I am distracted by something else. I already forgot what I was talking about. It's really like ah uh I use agents when it feels bad because it breaks my uh when when I use
**[55:39]** agents it feels bad because it breaks my flow. It feels like I cannot get into the zone. Yeah. And that's exactly what I'm dealing with right now as well. Um so yeah but but then like this is a lot the things. Oh, what? Why is it opening? Ah, because it needs a resource. Okay, that makes sense. Uh, oh, and it's combining them into single tests.
**[56:11]** Let's actually see. It's done now. Okay, it does work. Um, now I need to read through all of this. And so, it added, let's see, from 200. So it it added 200 lines of code that I now need to read through. And this isn't like the most fun code, but at the same time, you also like writing this yourself isn't great either. So yeah,
**[56:48]** I'm happy that it actually did. Um, yeah, it did all of Okay. So yeah, I don't know. I also feel like I'm becoming slightly sometimes more than slightly dumber. And I think that
**[57:20]** I'm trying to to like come up with an answer there. Um I in this case I don't think I I've I would have become much smarter implementing all of this yourself because this is kind of brain rot code. No, it's just repeating the same thing over and over again. Um I already wrote like 10 methods myself and I just had to add another 20 25 something like that. Um,
**[57:51]** and same for these these tests. I already wrote 200 lines. Uh, so I don't feel like I've gotten much uh dumber because of using AI here. Uh, I I do feel kind of like ah not in the zone, but it's it's also part because of live streaming because live streaming is always a bit difficult because I I also have to keep track of the chat. So that's a distraction as well. So, usually coding uh while streaming isn't
**[58:21]** the most productive for me either. And I've done quite a lot of coding and streaming already. So, I I think I I can speak from experience. But yeah, I'm now dreading having to read through all of this. Uh so, so yeah, you have a lot of knowledge you can forget. Uh I I haven't learned yet. Um, I'm not sure what you mean with that Thor Tory Tori one on Twitch. Um, I mean
**[58:53]** more like forgetting syntaxes, what parameter goes where, especially when PHP loves to mix whether haste or needle goes first. Things that were basically second nature before. Well, it's interesting that you say the needle haste example because I've been writing a lot of manual PHP code uh and I still can't remember. But that's why I I have uh autocomp completion with because because I I just I cannot remember. Um
**[59:23]** yeah. So what I also don't like is like the the fact that it mixed camel case, a camel case and a snake case. I can ask it to fix it, of course. Why did it do that? That's just type checks positive. Type type type checks negative. Not type check. What? So these are the failing cases and these
**[59:55]** are the succeeding cases. Okay. And so I'm fairly confident that like all things are tested, but it feels like it's not the way I would have structured it to be honest. So yeah, I'm not I I don't feel like super satisfied with this, but it is. Yeah, I'm going to commit it because it is something. Uh I still need to read
**[60:25]** through it, of course. What was my um what was left on my to-do? Rewrite failing tests. Subject validation we did and then implement tests. Okay, so we did everything. No. Uh rewrite the failing the fail messages is what I meant. But that I have to still think about because failed asserting that I was already using this
**[60:56]** failed asserting that we could also write it like just not but yeah I don't know I'm fine keeping it this way for now. H. So, yeah, I do have to add a to-do review. Not making me super happy.
**[61:30]** So, yeah, that that was my uh I'm going to I'm I'm I've got to be honest. I'm not left pretty unsatisfied. Um, but it did save me time. Ah, Thor, you're Thor to Thor, I don't know, from Discord. Hi. Um, yeah, I don't know. What What were your uh feelings following along on uh with this stream? Like was it more or less
**[62:02]** entertaining to just write a prompt and then wait for five minutes and talk about whatever and then come back to it and see whether it actually works and then reviewing and um compared to writing all of this ourselves of course uh because that wouldn't have been super fun either I reckon. So I don't know. I don't know. So, I have to admit I I usually don't really vibe code and um I I use
**[62:33]** simple completions. Um let's see, stuff like this, which is also AI powered, which is really well, it's now just the same of this one, of course, but um it's um yeah, to be honest, it's the worst content when you share your thought. It feels like I can learn a lot. Yeah. You know. Yeah. Yeah. I agree. I don't feel like I've shared many thoughts here. I just prompting
**[63:04]** uh writing prompts. When you vibe code, the window to distract you is wide open. Yeah. Yeah. Yeah. This is what I'm running into as well. So, yeah. Actually, I'm going to be like, this is still a lot to review, but I'm going to be more happy reading through all of this, making sure it all works, and then knowing that it's like just the way I
**[63:35]** want it to be properly structured. And uh and I can probably get there by prompting Juny more and more and more, but that's not that's it's not going to save me a lot of time and it's not going to make make for for that that give that that satisfaction, you know. Interesting to see your experience. I think it's fine if we're simply going to have a long evolution of smaller improvements. Uh okay. Yeah, it's very good to break the white paper
**[64:06]** to get something to work. This is interesting. So that that I feel like yeah, maybe maybe it is helpful. It it like gave me something to start from and that I can now further refine. That's actually that that might actually be be good. Um I think the problem that many people have is that they treat this as being now done which uh it definitely isn't. And uh unfortunately also during
**[64:38]** doing some open source with Tempest you just you notice that um this happens more and more often with contributors as well where they just do this and submit a poll request and then the review work is up to me and that's that's just not that's not fun. uh especially because it makes it it adds a level of complexity where I wasn't the one writing the prompt. So, I have to figure out the the reasoning first and then um review it and fine-tune it. Well, at
**[65:10]** this point, at least I was part of the process here to to get to this point. So, yeah. Interesting, right? Anyway, I uh I think I'm going to wrap up the stream. Um it was really fun to as an experiment, but I don't think I will do this every time. Uh no, I I had uh Yeah. Yeah. Let's let's leave it at that. I uh but
**[65:41]** but still it's it's an interesting learning experience and that's uh that's valuable as well. Thank you all for pitching in. That's uh that's really helpful. Also, we did also coincidentally uh merge uh another pull request for Tempest while we were waiting. So, that's that's there's some added value there as well. Um yeah, but I think tomorrow if I if I I hope to be able to stream every day this week and next week, we'll we'll see how it works out. Uh if I if I'm here tomorrow, um I think I'll go back to just uh yeah,
**[66:15]** normal normal nonvibe coding. So, um, folks, I want to thank you for, uh, for being here and, um, I'll see you next time. Okay. Don't forget to leave a like before you go and, uh, yeah, tomorrow. See you tomorrow. Bye-bye.