 How are things? Very good. More confusing than ever. Another day in the life of Minecraft. Who wants to go first? I'll volunteer. More intense fun for me. I've finished documenting what I've tried to learn about the adaptive tent parser. There's much more for me to learn about it. I don't know that it has direct bearing on what I'm trying to do. So I'm trying not to get too crazy with it. I'm not gonna add to it later. So what I am trying to do is make a tweak to core to fix the bug that I talked about yesterday and test it with the intent that I'm breaking with and see if there's something. Why would you have to change core? Because of what we talked about yesterday where it's getting back an unsorted list? Yeah. So going through all the responses it gets and finding the max confidence within that list. I don't know if that's the right change, but I know it's a quick change I can make just to see what I'm talking about is right. Yeah, I mean it seems like the right thing to do. You're getting back a list of things that you need in the sort order. It's not sorted. Sort it. Yeah. But you're saying you're not sure whether the proper solution is fixing it in core or fixing it in adapt. Is that right? Yeah, I have a question out to Sean in chat regarding what the idea was behind passing this list of matches instead of a single match to core and see what he was back with. But this will at least tell us if that's actually the problem or if you mistaken or something. Yeah. Cool. So once I get that incorporated and if it's working for me, it'll allow me to move forward with my skill development. Because right now this is kind of blocking it. I can't get the right intent to fire. So yeah, once this is done, I'll move back on to the timer skill. I will, tonight I will share my document with everybody. So you guys take a look at what I've found so far. At the bottom of the document there's a list of questions that I have for Sean. But if anybody has any opinions or answers before Sean get to them, great. But yeah, so that's kind of what I'm up to. All right. Well, I guess I'll go next. So if you recall, I'm going on vacation tomorrow. Well, tomorrow's my last day and I'll be out next week. Anyway, so I looked at the response to the pull request for the wiki skill. Again, I think all I got to do there is add like we talked about the search term that caused the wiki pager. And in the log output, I'll just make sure another logs are set to error that they're at the right level. And that should go through. But that's a common query skill now. And now we have three of them Wolfram, Alpha, DuckDuckGo and wiki. So then I moved into common play. And I can't seem to do anything architecturally speaking around these parts without jarring the ire of the community. So my attitude was play video. Well, gee, right now a skill says play audio and it doesn't have to say anything different, whether it's an mpeg or a wave file. How'd that magic happen? So I chased that down and I said, well, let me just add the same for video. And I did and it works great. And so I told the community, hey, now a skill can say play this and if it's a mpeg or a wave or a video, it'll just magically work. No changes. But that didn't seem to go over too well. So I looked at some of the feedback and asked some questions. And that's currently where I'm at. But the point is in about 20 lines of code, I can add video without modifying anything and any skill would magically work. But there is pushback and I suspect the rationale emanates from how we want to handle the UI. And the responses I've been getting have been, from DT at least, very QML oriented. So his perspective is the audio should be handled the way it is now and common play should do the driving. But for video, the screen and QML should do the driving. And I'm just not convinced. So I still have to think about it. I also am concerned about backward compatibility. My change would allow this to work seamlessly on my laptop as well as a Mark II. If I buy into a QML player approach, I think that would be problematic to run on my laptop. So yeah, I just don't know. But I was confused by a DT's comments because he said, well, you just can't do it. It doesn't work that way. And I did it and it does. So I'm a little confused. So I don't know if he was saying it doesn't work that way because the way we have an envision we want you to use QML wrappers, or if he was actually kind of saying, well, doesn't work that way. I think he was saying the first because then he said later, well, but QVLC isn't supported. But I don't know what that means. That's all I did. I just installed the QVLC plugin for VLC and VLC magically works. In fact, we don't even need a differentiation on MIME type in the simple audio service anymore. I can just feed the entity to VLC and it'll be over. So, you know, there's that. So tomorrow I will continue to try to understand what the right thing to do is. But I will be looking for input from yet. And that's my update. Yeah, interesting. Have you posted that 20 lines of code anywhere? I have not because it was so vehemently opposed. I thought, why bother? Well, and I'm not saying that we go that way one way or the other. But, you know, I think it's always, I find it helpful. You can see it in your mind's eye. Just go into the audio services service and you'll see where it makes the distinction between MPEG and WAVE. And you can see, else if, you know, video, then call play video. And then the play video would be the exact same thing you have for play wave and play VMP3. It would be a couple lines to pull the command from the config file. So in this case it would be QVLC if you're on the mark two or VLC if you're on a laptop. And then basically would then call command line VLC play and you're done. I mean, there's some parameters for the mark two. They get it to play on this display and get it to auto terminate and all that. But that's just command line. And that's how you play MP3s and WAVES now. But it's trivial. I mean, it's literally nothing. Literally nothing. Yeah. I mean, it's like nothing that everybody needs. On the one file, I had like, you know, 15, 20 lines of code. And now when a skill says play, if it ends with MPEG four or dot move, it magically plays like it's supposed to on your laptop or on the mark two. But you know, then there's the whole concept of do you want to rely on a touchscreen interface for driving the experience and input? And how do you want to sync that up with the voice controls, right? So there's that whole aspect of it. And then I was pointed to some code that Jarvis has over on open voice. And I looked at that. And it's actually two different things. And his is actually pretty cool, too, because it has his new style players that are more gooey oriented. And then it has a fallback to old styles, which is something I know well, because we just did something similar. And so yeah, I mean, the only difference and the only concern I have with that piece of code, obviously, I'll have to port it to our environment, because he's not overly US, but that's not even the issue. The issue is the way he chooses to handle old skills is strange to me. He converts them to new format skills. And I'm not sure why he goes through that instead of just falling through the old code. So I'd have to figure that out. So yeah, that holds some promise as well. So I'll spend tomorrow looking into that as well as understanding this a little better. Yeah, I'm curious. What were the objections? I think indeed the objection was that it wasn't QML oriented, right? The interface was, you know, kind of like what you have now. And he envisions, you know, the specific, he referenced the spec and the forward and back buttons and rewind and fast forwards and all of that. And I don't have a problem with that. I just think first, if the objective is to be able to play videos in all environments, then 20 lines of code solves that problem. And now that's been taken care of. Now, if you want to encapsulate- It's not something to get added later, though. I mean, this just handles it from a voice perspective, right? Yeah. But my point is, if you want to encapsulate it at a higher level, then at the common play level, you could make a branch determination that says, I'm going to go this route, or I'm going to go the QML route, because I believe they're going to be very different. So yeah, you could certainly do that. I just feel like it actually be done higher up. And even then, I don't understand why you still wouldn't just rely on the default way it's done now and, you know, the MIME type to figure out what to do. I don't know. I'm still investigating. It just seems like people don't like simple anymore. I mean, to a degree, I also think we need to focus on getting what's going to work for the Mk2 out there. Yeah. You know, like if it can also work for desktop and stuff, then that's great. But we don't have that. In other words, I don't understand why we would have to have an either or situation, right? You add this to the foundational code, now you have the first part. And like I said, if you now want to, and that's trivial, and now if you want to go through and say, well, let's do something more too specific and take a branch that is heavily, you know, oriented on syncing up QML input controls from a touch screen with those commands, then fine. But you don't even have to address any of those issues on the other old school path, if that makes sense. Yeah. So that's why I think it's better gone up at the common place service. Yeah. One of the things that I think has hurt us a little bit is, you know, people being able to play, just play their own audio and stuff without Minecraft more broadly knowing about it. So I would be hesitant if we were doing the same with video as well. But well, the question is, why would anybody not just send out a message on the message bus and say play URI and based upon the mime slash determination of what it was mp3 wave, movie file, mp4, let the lower layer handle that. Then if every skill does that, now all skills are compliant. Now the system has half a chance of being able to know what the state is. When somebody says stop, it can be pretty sure it stopped the video or audio or whatever was playing because the skills aren't directly calling mpg123 or whatever. Yeah. And it just seems to me like it'll be a lot easier adapted if the existing messages and those interfaces are maintained and magically now videos are supported. But I tend to simplify things. I mean, that is my thought as well. I don't have any problem with the other stuff and I won't mind bringing it in. But I just don't feel like I feel like it's more of a one off for the mark two environment than it is a longer term solution that skill people can grok and not have to do a lot of that kind of stuff. So yeah, so I'm just I'm looking at that saying, well, why don't we do both? Why don't we just go ahead and put the ability for skills to, you know, magically play videos by just the fact that the URL ends with dot m o v. And then we can worry about the more mark two fancy stuff, which then, like I said, requires synchronization between touch screen and voice commands and some sort of interface that kind of like we have with volume. When you change the volume on the screen, it also has to change the volume when you speak and when you speak and change the volume, the screen should update. So you're going to have the same issue with your player controls. So what I'm saying is I don't mind going down that path, but I'd like to do this one quick and dirty out of the way, because it establishes a simple way for all skills to continue to behave as they have, and now have video support. And then, oh, let's go over and do this additional thing. That's a good point about about the like, you know, seeking, you know, where's your track status and all that sort of stuff, you know. Because all I'm doing is adhering to the existing simple audio service API, which is basically start, stop, pause. And that's about it right now. And that's fine, because that's that solves 90% of the problems. And, you know, if videos are magically incorporated in that as well, and nothing has to change above it, then that's a win-win in my mind. And then you want to address, well, now we have a mark two with a touch screen, let's really take advantage of that. To me, that's a decision that's made up in the common play skill, based upon the enclosure type. The playback control skill? No, in the common play skill. Playback control skill just takes the utterances basically from an intent perspective and fires off message bus events that the common play skill picks up. Yeah, I think this is why I see there being a playback service in core, which actually, because I see skills being the interface for users to interact with things, but it feels like there needs to be something that is independent of the common play service that handles unified playback of media. Well, when we say unified playback of media, if we expound upon that, what we find is, down low, media falls into, I mean, if you take the UI considerations out of it, it falls into two categories, it's either local or it's remote, and then you play it. Now, there may be things wrapped around that that take advantage of additional abilities provided by some API associated with that external entity, like search, fast forward, whatever. But those are very end point specific. In other words, you can almost think of this like a media hal. So at the bottom is like mpg123, and that's how you play an mpg file, right, that's local. And then there's like, I don't know, you could say VLC and that's how you could play streaming video or streaming video, it doesn't matter. My point is, there's a very small piece at the bottom that handles that. Then there's a layer on top of that that basically takes in place, stops, fast forward, rewind, and translates that and calls down into them, right? And then above that, there could be layers that handle more complex things that are happening enveloped outside of that, which is synchronization of touch screen events and things like this. But that's kind of what you have. And right now what you have is a playback skill that simply converts intense into message bus actions for common play. And that's fine. Now, a playback service. Because at the moment, you've got to like, if you want to know if something is, if there's media playing at the moment, you need to like check in with like a bunch of different places to see, you know, is there something... No, you should be able to call through the HALV, get status, get media status of the last active channel. Yeah, so what is the HALV? What are you thinking the HALV is? The common play service? Again, it's just a little plug and think of it that handles the interface with this entity. Some entities are quite simplistic. MPG123 has start and stop, yeah, doesn't even have pause. Some are more complex, right? But the same token, nothing's changed. They're all equal. They're just little plug-in drivers that communicate with the entity and provide the abstracted functionality upwards. Yeah, play, stop, pause, rewind. I mean, I think that's what I'm thinking about in terms of a playback service. But you have that today with the audio service. The audio service has currently support for Chromecast, mPlayer, simple, right? Yep. Yeah, so my point is, you're just talking about in my worldview, adding additional directories in those services. One would be your Spotify service, one would be your Pandora service, whatever. But at the end of the day, that's what handles converting play requests into actionable items, converting pause into a call to something, right? Yeah. Or human API or whatever. Yeah, maybe a better way for me to describe it is converting the audio service into a playback service. Yeah, I think that's it. But I think it's already there. In other words, the audio service today in its manifestations could not take advantage of the audio service framework. It has all of the entry points. If I'm not mistaken, I can double-check this already for next fast-forward rewind. Nothing takes advantage of it. Hmm. Yeah, and so then we should be encouraging, like, skills should be, you know, interacting with that rather than, you know, is the audio service playing yes or no? Is the GUI playing a video yes or no? Which is what the... No, skills should be interacting with the common play service. Okay. Anything a skill needs to know should come through the common play service. The common play service should normalize it and send it down to the appropriate module for execution. So when the common play service gets a pause on something that's playing a WAV file, it should respond with unsupported functions, so to speak, right? It doesn't do anything. But if it could pause, it should pause, right? And it might do that a variety of ways. It might do it using VLC command line one way. It might do it going out to the web another way, right, using Pandora or whatever. But at the end of the day, all you have above this is the abstraction layer that says translate, you know, request, play, stop, pause, fast forward, whatever. Does that mean... Being to pause. Does that mean... And those calls are in this. Does that mean if a skill wants to play any media, it needs to inherit from the common play service, common play skill? If it wants to play any media, no. In fact, it doesn't have to. It could simply send message bus messages to the common play service. Common play service, not common play skill. The common play skill, sure. The common play skill will then translate the message bus request. Stop media. It will take it and it will then know that, okay, the last thing I played, common play. Yeah, so, oh yeah, so I don't know if your question is double edged. They need to use the common play service to play media. Do they need to inherit from the common play service? I don't know. Maybe, maybe not. Maybe I need to learn more about the common play... I certainly need to learn more about the common play service, but... Yeah, just feel there's something we need to document how it works, what we want it to do, and how we think we might get there, because it sounds like there's a few different ways you can do it. And, you know, one of those things that, I mean, sounds like we probably need a little more discussion from, like, a design standpoint. I don't think they're that big and scary. Common play and common query were both basically created with the same objectives in mind, which was to normalize the process and to give the service the opportunity to go ask its adherents to give, to basically collate their confidence levels and make the right termination, right? So that was the first thing, right? And then the other thing was that when you, when you responded, it should automatically be able to play it without you having to go and do anything specifically. You should be able to say, play this, and the common play service should be able to play it. You should say, ask this, and the common query service should be able to answer it. So they're both just a way of normalizing that over the message bus, allowing the services to produce a calculated value that will give it some sort of level of prioritization, and then to actually call into core to do the actual playing. So it's pretty simple stuff and it's good. It's goodness. I agree with it. It's the right way to go about your business. The point being that skills shouldn't be using anything other than common play or the common query service to do those functions. If you allow rogue skills to not inherit from those or not follow that protocol, then all sorts of hell can break loose downstream, right? The whole point of going through it is to have a central point of control. Common play service knows the last thing it started playing. It knows what it's typing. You know, it knows what the module to fall into is all of it. Yeah. Yeah, I think I might hold on. I think I see. The framework's already there. The work's there. That's the thing. If you go into the audio service and you look at its, if you look at audio service.py, all the entry points are already supported. And all the little sub modules are already there. So it's really to do everything we need. You're talking about everything I saw in that spec as far as all the skills we want or all the types of media we want. We're talking about adding an iHeart radio subdirectory. You're talking about adding a Pandora, a Spotify. And I didn't see anything else. Some substance, really. Maybe YouTube if we can get over the legal shit. And then it's done. And you don't have to rewrite anything. You already have a framework that supports it. That's what I was so confused about. It's the common play piece that it feels like there's two sides to it. There's the intent, intent disambiguation side. And there's the media management side. Intent disambiguation doesn't happen in common play the way you think. It happens by calling and getting the confidence level of the people that might have an interest in this utterance. Yeah. Right. So that's the disambiguation. It's simply the confidence level. That's your disambiguator. Yeah, yeah, yeah. But it feels like they're two different functions. It feels like what's two different functions? Intent disambiguation for play intents. That's done by the playback skill. No, that's done by the common play base class, right? I'm confused about that. I thought the... Oh, no, no, no. You're right. You're right. It would have to be... I thought the playback skill had the intense and he forwarded the conversion of intent to actionable items on the message bus. The common play skill picked them off of the message bus, decided what to do with them. And it already has an audio service that should probably be renamed media service because everything we're trying to accomplish with its existing architecture, there were good people that worked on this code in the past that didn't write the first time. I don't know how they did or maybe they had like me 10 times to rewrite it. But which it seems like I did with that stuff for the part too. But the audio service is fine just the way it is. It doesn't not do anything we're asking of it to do in that spec. Yeah, okay. Cool. Well, I'll let you keep going because it sounds like you got a good head around it, say... Well, I'll tell you what I'll do. I'll throw a... I'll try to get it done before I go on vacation tomorrow. I'll throw a branch together with the changes to the audio service I'm talking about, play video, and then I'll just throw up... Or you can throw up a simple skill that says play something and if it ends in that MOV and it's local, it'll magically play the video. And if it points it to something that returns a mind type of video, it'll magically play the video. And then you can check that out and run with it and see what you think. All right. Why are we spending time on this if the video playing is not one of our essential skills? Yeah, I don't know. I was asked to review a PR that brought video into the system and it just seemed like we would be remiss if we didn't support video on the Mark II initial release when we have a screen. So it just seemed like if it was a no-brainer and I could add that capability for like two hours worth of work, do it. You know, now... If it was no-brainer, we wouldn't be sitting here talking about it for 20 minutes. Exactly. Yeah. I mean, I thought that my perspective on the PR was that it was, you know, like it's a six-month-old PR that I thought was pretty good back then. I added tests and things to it. I was going to merge it, but then I wanted to add tests and stuff to it. And so I was the last one that touched it, so I pushed it to someone else to review. So... Well, I think and I'm not sure of what it does yet because I still haven't figured it out. But if it's taking us down a QT-specific path, then like I said, I'm all for having an alternative branch at some point above this all. Well, my original concern with it was that it was, you know, playback of video was being managed in the GUI, which I like... Videos are inherently GUI-based, of course, but like I still don't think that the GUI is the right module. You're absolutely right. And that's exactly what I mean. In other words, there's no difference between playing audio, playing video. The fact that you look at video and you can see on-screen controls is no different than you could with playing a song. So the point being that don't... You don't want to get hung up on that and start having the cart, you know, put the cart before the horse. The GUI is not the place to control this from. Now, it may be... Because it's a voice interface that you should be controlling it from. Forward, backward, reverse, you know, skip. Those are voice commands, right? The fact that I can do it on a screen shouldn't be the primary architectural design point. It should be an aside. And that's why I said, if anything, it should be handled up at the common play skill with a branch of some sort, if then. And even then, maybe it's the case. I don't know that you could expand it down low at the playback service, the formerly... The playback formerly known as audio service. So the point is, you know, if you want to expand that to somehow incorporate the synchronization of a visual with it, albeit whether it's a media player or not, then that's fine too. But that's not the driving goal, right? The driving goal is getting video playing. Yeah. I said it before and I'll say it again. We're a voice assistant. We happen to have a device that has a touch screen, and that's great. But we're a voice assistant. If this stuff doesn't work for your voice, and it doesn't work. Right. Right. In other words, the voice doesn't drive it or the voice design necessity doesn't drive it. It runs without the UI being touched. Could it also sync up with somebody touching the UI? And could that also drive it? Sure. Those are just message bus messages. And screens aren't necessarily a touch screen. So yeah, that was my original concern with it. On my laptop, it would be my arrow keys. Yeah, yeah. Totally. So that was my original concern with it. But I was also like, look, I'm not going to touch the video stuff for another who knows how many months. So I was like, let's just merge it. If I think if we're going to get in there and do stuff with it, then I obviously don't think that we should merge something. If we're just going to change it straight away, if it's just going to sit for another six or 12 months and we don't touch it and people continue not being able to play video, then it just seems better than not being able to play video. Right. And so my point is I can have people being able to play video in two hours. And on top of that, I think Jarvis commented that it seemed like we were going a different route. His PR might have been basically rendered useless or moot at this point. I'm not sure. I think I saw his comment in there at one point. Okay. Well, if you guys don't want that way, this ain't the right way to go. So I don't know. All I know is let me get you a branch so you can see what I'm talking about and touch and feel it. Yeah, yeah. We can adjust the rest of them. Okay. Sounds good. All right. I'll try and be quick. I reviewed Ken's stuff. I am not sold on removing all the functionality and making it only... Ah, well, they bring up a really good point. Oh, now you asked for it. I said I was going to try and be quick. So now what you're saying is, gee, Ken, can you add this ambiguation and more to the common query skill framework so that skills that have that capability can take advantage of it? Because that's why they were stripped out of the Wiki skill. Nothing supports it. No, no, no. So my question is, is there really a need to remove it from the skill? You know, does something really need to be only common query or non-common query? Can it be both? Right. So valid question. So the question becomes, if I have inherited a skill that has additional functionality that can't be realized through common query, is it worth it to make it work outside of common query? So the additional functionality for just that one skill is available. And my response to that is that this is basically being encapsulated under the umbrella of a query or fallback skill. The user doesn't know he's accessing Wiki versus Duck Duck Go versus Wolfram Alpha. And if only Wiki supports more or disambiguation, he's going to get confused. That is true. But I think the other part of it is that if I say search Wikipedia for X, should I hit an intent in the Wikipedia skill that uses the Wikipedia skill intentionally, as opposed to going through to the common query skill and letting anything registered with that answer the question? I contend that you should be doing both. That if you say, ask Wikipedia question, common play should be smart enough to know what you just asked for. It doesn't have that many to keep track of. It has Duck Duck Go, Wikipedia, and Wolfram Alpha. If you wanted to specifically call them out by name, you could, right? But is there a reason not to just do that through the intent system? So the whole purpose of the common query framework, much like the common query framework, is to have intentless skills. Well, and to be a fallback. Well, I'm saying that the skills don't need intents. The intent parsing is handled by the playback controls and the common play framework, or by the common query skill and the fallback stuff. So the point is that they shouldn't be doing that anyway. I mean, now, if you want to make a case for, should I be able to have query skills that, remember, common query is a fallback, right? So you could have, you know, other skills that can return higher confidence levels and always get the intents before the common query framework. But the point is the common query framework is your fallback framework, and right now it has three options. It sounds like you wanted to leave the wiki skill the way it was, so that it's a skill outside of the common query framework, because it can do additional functionality. I question whether you want to do that, or you want to pull that additional functionality into the common query framework. My thinking was that it would be common query enabled, so that, and that we would remove things like tell me about, tell me, you know, whatever those tell me intents were. Well, no, but what you're saying is you would remove the word, the special keyword that would indicate use wiki instead of duck duck go. Let's just make it simple. So by saying tell me, it'd be the same thing like saying ask wiki. So you're trying to accomplish the same goal. You're trying to direct it to a particular query skill, right? I think if, if you, well, I mean, most people don't know what those utterances are to pick a specific skill, or are they going to care which skill returns it, you know? Yeah, yeah, yeah, that's what I'm saying. In other words, either you want the ability to call out the skill, the target skill by name, or you don't. Yeah, if you don't, then you want an amalgamated, normalized interface where the same utterances always cause the same behavior, regardless of whether it was responded to by wiki or duck duck go, or Joe blows query skill, right? So the point is you want the same behavior out of the common query skills, which are fallback skills. Now, is it, does it make sense to have another query skill that uses the encyclopedia Britannica online or the Bible, and it doesn't behave like a common query skill? I think that's more confusing. In other words, if you want this ambiguous, if you want more, I'm not disagreeing. I'm saying they should be in the common query skill. And they should be considered pause and forward and rewind. They're going to have to support interfaces that don't necessarily support those functionality. Yeah, well, I agree where they're generic. And so it comes into that, like, intent versus intentless process. Like, if I say give me a random Wikipedia page, I don't know that we need the common query skill to be able to comprehend that and direct that. Well, I mean, I guess the- I would certainly hope if I said Wikipedia and common query picked it up, it didn't go to duck duck go. Well, but I feel like we can, like, that is, there is an intent there. Like, there is a clear intent there that we can pick up through the intent passing process. Yeah, so this is, this is a really interesting architectural issue with the original design, which is intense, and then message plus actions. Because then you start overloading the intent handler. And so now you'd actually, the right way to do it would be to go up there to make those distinctions because the common query skill doesn't have intense. So, you know, then you could start having these high bridge, you know, well, because it just doesn't see architecturally clean. And there does seem a clear path. But like I said, it seems like you need to move the functionality out of the skill when, you know, if it merits it and move it up to the abstraction layer. So, you know, more and disambiguation always behave the same regardless of who's fulfilling the request, right? Now, that architecturally becomes difficult. And yeah, I don't know how you would move that up into the common, into the playback skill who was really the intent handler. Well, I'm getting things confused. The playback skill has nothing to do with the common query. Yeah, yeah, the common query. Yeah, yeah. The common query does indeed have intent parsing. Yeah, yeah. So, the common query should be able to, if I said, play a random wiki article just on normal waiting alone should be able to say, hey, this shouldn't go to duck.go. It should go to wiki. Because that's where the intents are handled. Anyway, it's food for thought. I'm not saying I figured everything out in five minutes here in this meeting. I'm just telling you what I've discovered, much like Chris, when he was getting into ADAPT. And I think Chris and I are getting a much better appreciation for some of the stuff in core, foundationally speaking, that we probably should have known anyway. So, this is all good. Yeah. I mean, I can tell you right now, I can fix bugs and skills and intents and all that stuff. I hell of a lot better now than I could two months ago. Yeah, that's awesome. Maybe I'll take the same approach and I'll put together a quick branch and just send it through and so everyone can have a look. Because it's essentially all I'm thinking about is an amalgamation of your changes plus the original skill, like keeping some of those things. Okay, I'll do that. Because I'm not married to the wiki branch. I've just minimized it to match what the existing framework supports. Yeah. Yeah. And behave like everybody else so that you wouldn't know if that answer was coming from duck.go or wiki or Wolfram Alpha. And that's how it works now. You wouldn't know who delivered the answer. But there's certainly more we can look at and more we can do there. So yeah, certainly putting together a branch that gets your thoughts across so I can check it out and try it would be good. And like I said, I'll try to get the same for you by tomorrow regarding what I did here today. Yeah, cool. The other thing of note that I did yesterday was I was testing out the PyCroft release for 2102 and couldn't get audio out of the 3.5 mil jack by default which was a pretty basic function. So it has been reported in the community before but I've kind of haven't spent the time to get into it. And basically it's an update of the kernel that the Raspberry Pi's use and changes the way that they order the default sound cards. Anyway, so the simplest way really was to switch things to pulse audio which is the way that Raspberry Pi's gone anyway. So I've done PRs for that. It removes all of the update, setting the volume via also mixer junk and like moves everything to pulse audio. So we define the, any device selection is now setting the default pulse audio input or output based on the device name, not a card number which jumps around depending on what you do. And the benefit of that is also that I added a new menu if you're using a non-standard, you know, something that we don't know about. It basically just presents you with the list of devices that pulse audio can see. You can pick from one of those and then it'll grab the name and use that as the default pulse audio device. So like in my limited testing it seems good. I thought I'd do an image of it and push it out to the community and get people to try it out in the wild and we'll go from there. That sounds like it was the right way to attack that. I think it's kind of been something that we've wanted to do for a while but it's like, you know, Linux audio is scary at the best of times. So like if you can, if it's working just don't touch it. Whereas now it's not working. So yeah, I mean definitely using the device names is much better. Yeah. And getting, you know, don't don't intermix also and when you start it's kind of like we have right now with the screen, right? Kind of like they don't communicate very well also and pulse audio anymore. They used to and so, you know, they get out of sync with each other. So yeah, just use pulse audio and be done with it. Yeah. Well, and there's some other areas in Microsoft where we need to be pulling this manual audio management out, you know, there's skills that are calling the ulcer mixer to do things and all that sort of junk. So we will have to do some scrubbing at some point but for now the pulse audio PR you have has been probably be very well done. Yeah, I think so. I hope so. Anyway, I will shut up now because we've gone on long enough. Yeah, there's a flight chance. I won't make the meeting tomorrow. My wife might want to leave a day early because we're on vacation. So yeah, if you don't hear from me, just keep that in mind. But I should be here tomorrow. Where are you going? We're not going very far. We're going over to the west coast of Florida. We're going to Naples. Yeah, it's just directly west of us on the other coast. They have different beaches. It's white sugar sand over here is more like a regular Atlantic Ocean beach. That's the Gulf of Mexico. This is Florida wanting to be Italy. Is that what it is? You're like, we're both little knobs on the bottom of a landmassage. So we actually have an interesting history. We have a city up north by a Tampa called Odessa because that whole area was founded by Russians and the Naples area was founded by Italians. Yeah, that's kind of what happens. Cool. Oh, we'll have fun. One of the things I wanted to bring up before we stop and this can just be something to snoot along. I was looking in my research and adapt I was looking and there's a context manager within ADAPT that tries to do conversational stuff. And I'm wondering if that even belongs in there. Be careful, tread lightly. Okay, it was overloading it I believe for something else. And that was one of the bugs that I had found when the stack was blowing out. And he had to refactor that. And I'm pretty sure that's in the latest releases. Yeah, I'm just kind of musing. I just it feels like the context is more a device function than an intent parsing function. No, so perfectly honest and I'm not going to spend too much time on this. Your context is usually think of it this way. John is a fat slob. He lives on 27th Street. You know who he refers to. But if you didn't have the prior information saved in this way, in a context somewhere, you wouldn't have a chance of deriving that. Now you do. So it's one way of work. It's not normally done this way. I understand what they're using it for and it's probably not being relied on much. And like I said, I think it's been overloaded a bit. But initially that was the intent. But that's a very flat single level approach to that problem, similar to our intent parsing. So yeah, but my point is context management also happens in core. Yeah, again, it's like an overloaded term. And I don't know what it means in half of the places I see it. But I'm just saying that usually what it means is think about it like a frame in. Well, you don't do see, but in the C language, when you want to capture things to do closures, what you do is you start pushing frames onto the stack rather than just values. It's like a context. It's like a snapshot of all the values of the variables within scope at that point. And it's the same kind of thing. You're basically pushing the previous information and phrases that you've parsed onto a stack. So that as you back out, you can know what you were talking about prior to this, talking about prior to prior to this, etc. So that's usually how it's handled in systems. But here, it was very flat, single level, much like our intents. And it never really met that. So like I say, it was used, I believe by Ake, for something a little bit different, double check with him. There's a pull request recently put out on that. He was sticking the entire returned information from the common query skills into the context variable. And it was blowing things out. And so be careful with that. I think it's being used for something. Well, I'm not going to touch it. I'm right now. I was just musing about, as I was looking at it, one of the questions in the document I'm putting together is why do we handle context in both places? If it's assuming that context means the same thing. I don't think it means the same thing. I think it's two different things. Yeah, I think an adapt context is different than what we're passing around on the message bus. But I don't know. I mean, maybe that was originally how it was intended and they varied. I don't know. Like I said, there's a lot of really intelligent people who worked on this code base over the years. And then some people didn't come in and didn't understand things. And you can see how it kind of deviated from its design. But yeah, so interesting. Anyway, I wouldn't mess with that stuff right now. All right. I'm going to leave a comment because we're at 50 minutes. Yeah, yeah, because you know I can go for another out. Anyway, all right, guys. We'll see each other tomorrow. And if not, I'll see you in a week. Yeah. Have a great night. See ya. Bye.