cleaned key handling and security
|
|
@ -0,0 +1,283 @@
|
|||
00:00 Jeroen Haverkorn van Rijsewijk: Oxygen and a bit of confidentiality.
|
||||
|
||||
00:01 Patrick Motsch: Oh yeah. You have Confederate there. There you are.
|
||||
|
||||
00:06 Jeroen Haverkorn van Rijsewijk: Yeah.
|
||||
|
||||
00:07 Patrick Motsch: You should also look upstairs look like this.
|
||||
|
||||
00:15 Jeroen Haverkorn van Rijsewijk: Yeah, it looks good just looking. I just. I was looking at this Tesla. Maybe it's recording me, but apart from that I'm I should be safe.
|
||||
|
||||
00:26 Patrick Motsch: Yep.
|
||||
|
||||
00:44 Jeroen Haverkorn van Rijsewijk: Yeah, almost done with. Presentation, I think. Good to good to go.
|
||||
|
||||
00:59 Patrick Motsch: Crucial.
|
||||
|
||||
01:57 Jeroen Haverkorn van Rijsewijk: You hear? A little background noise for me or not?
|
||||
|
||||
02:01 Patrick Motsch: From your side, I have no noise, perfect cancellation.
|
||||
|
||||
02:05 Jeroen Haverkorn van Rijsewijk: Very good.
|
||||
|
||||
02:06 Patrick Motsch: Yeah.
|
||||
|
||||
02:47 Jeroen Haverkorn van Rijsewijk: Oh yeah.
|
||||
|
||||
02:49 Ommeren Pieter van (SB): Oh, I had a bit of a difficult, very difficult Saturday and already better Sunday and now a better Monday. So I fell a bit ill Friday night.
|
||||
|
||||
02:57 Jeroen Haverkorn van Rijsewijk: Oh.
|
||||
|
||||
02:58 Ommeren Pieter van (SB): But yeah, really severe headache. I could not. I could not sleep anymore from 4:00 in the night and the whole day it was like. Aw, incredible.
|
||||
|
||||
03:08 Jeroen Haverkorn van Rijsewijk: Sorry to hear that.
|
||||
|
||||
03:10 Ommeren Pieter van (SB): But this was in the end, better on Sunday and then now even better. On Monday I would say.
|
||||
|
||||
03:14 Jeroen Haverkorn van Rijsewijk: OK.
|
||||
|
||||
03:16 Ommeren Pieter van (SB): And you guys? Where are you?
|
||||
|
||||
03:21 Jeroen Haverkorn van Rijsewijk: Oh, there goes my conference. There goes my confidentiality screen. OK. Outside, I'm outside. Yeah, I'm. I'm at the Tesla garage. There's it's an interesting situation. The like a lot of things stopped working like I I couldn't. It was all in one go. So firstly the rear. Left your door, couldn't open it anymore. That was quite impractical. Then the autopilot stopped working. It stopped tracking my position, so it also couldn't switch on the cruise control anymore because it needs to know the maximum speed for that. It also didn't have adaptive lights. I don't. It was like, no, no cameras anymore, nothing working. Very interesting. But yeah, they're looking at it. I meant to say so, yeah. Hopefully so I said. I need to be away at 5:30 because I need to get my my daughter from hockey training. Yeah, and it's fine. I mean, I have a very comfortable customer lounge here, but I prefer to to be here outside talking to you with a a few less people, many more cars listening, but no people. Yeah. So that's me, I had a. And now, yeah, I would love to take you through what we prepared for you and a line for tomorrow. Patrick, how are you?
|
||||
|
||||
04:54 Patrick Motsch: Yes, I had an an inspiring Friday was a wonderful day and Saturday, Sunday, many things happened in Brain and also in the restaurant for 10 days. First, first day from from a young woman that I supported not two years to make Cook Chop. She was starting from zero. She came from Kiev, you know. She was then coming to Switzerland with nothing, and then she finished all the school. Now, she's not 20 years and she has a wonderful job in a wonderful restaurant. So this was just just wonderful weekend. So this is how I feel.
|
||||
|
||||
05:27 Jeroen Haverkorn van Rijsewijk: It sounds good.
|
||||
|
||||
05:29 Patrick Motsch: And now we prepare the presentation and we are curious are curious how bad Peter will be with us or how we shape it?
|
||||
|
||||
05:38 Jeroen Haverkorn van Rijsewijk: Oh, maybe before we start. Peter, I think just to onboard you with regards to on the Modi, yeah was really fantastic. Let's maybe 2 minutes. So it was really fantastic interview I think was better than I said. Yeah, you know her a bit. So you've worked with her extensively as coordinator last year. So she's very much leaning into this tech AI enabled future, and she thinks basically. Yeah, it's a long time. In order to to really lean in as an organization. So she's an avid supporter and she's. A myriad of opportunities.
|
||||
|
||||
06:18 Ommeren Pieter van (SB): I'm not surprised.
|
||||
|
||||
06:18 Jeroen Haverkorn van Rijsewijk: She will stand us. Desired use case list. Also, you know her, but also knowing her, it's not, yeah. It's no BS, right? It's it. Has it has substance and so it's it's it's super nice. It was very energizing to to speak to her. She. Yeah. She talked about many things, like the possibility of adopting an AI first mindset and see where that leads us, that possibility to also. Or she said, what helped for Germany delivery was to put together process managers and developers, which is exactly what Edwin told us last. Friday. Right. So that was an integral part of the success of the delivery, turn around, which she led, obviously with great success. So yeah, these are just some of the things that said to me and maybe Patrick, maybe other things you'd like to put.
|
||||
|
||||
07:13 Patrick Motsch: Yes, that is that is shaped that it's from in to out and from out to in, meaning DSH experts to delivering all the units and on the other side the units are expert to integrate them with knowledge, with experience, with playgrounds, whatever they have.
|
||||
|
||||
07:31 Jeroen Haverkorn van Rijsewijk: Yeah. So I feel that there's an opportunity also in the BUMC to really elevate and and transcend silos even more, to come around to steam one concept. And hopefully that will also dismantle some of these central for decentral dynamics, which are still. Kind of fear driven sometimes and if we could take them as opportunity driven, then I feel it will really help us to unlock the next. Virgin must have been adventure, yeah.
|
||||
|
||||
08:06 Ommeren Pieter van (SB): Cool. And then we also had a good interview on Friday, right with Adrian.
|
||||
|
||||
08:09 Jeroen Haverkorn van Rijsewijk: Amazing. Yeah. I spoke a bit about it with with Patrick, but definitely. Very happy to have him on board. I think Peter and I both agree it was wonderful to not only very capable, but also very, I would say, very approachable and easy to connect with. Energetic guy with lots of Dr. who? Who was there from the beginning of the BU. So I think he said back in 2009. I think he was asked to to develop. An app for the first time, for, for immobility, and so I started out that this is as a developer, grew the ranks and now is obviously managing a larger portfolio. But he he said he interestingly, he said, you know, we used to be kind of front running and. Now and then, as a result of certain. Things decisions, dynamics, BU is not BU in BU is not so much front running anymore, but he definitely sees that opportunity to get back in the lead. I would say this is translated to. In my words. If we. Yeah. If we accelerate on a few things. So that was very hopeful and at least wonderful to have him there, very capable and knowledgeable it and E mobility leader, how is it for you, Peter?
|
||||
|
||||
09:34 Ommeren Pieter van (SB): No, the the exact same. And of course, I knew it was already a little bit more little bit better, and I've also joined him in, in, in Poland, in Cutter, which last Week 2 days. I've also visited all the IT developers there and.
|
||||
|
||||
09:50 Jeroen Haverkorn van Rijsewijk: Yeah, a really great move there, Peter, by the way.
|
||||
|
||||
09:52 Ommeren Pieter van (SB): To go there.
|
||||
|
||||
09:54 Jeroen Haverkorn van Rijsewijk: Yeah, to go there and talk to developers, yeah.
|
||||
|
||||
09:57 Ommeren Pieter van (SB): And it was quite interesting, Patrick, so. I would say 90% of the developers were there in person. Normally they're working from home, so it's it's also normally doesn't make sense anymore to go to Katherine because they are simply not there twice a year. They they they come together, they share learnings and best practices with each other. I've also of course presented something on behalf of sort of a management update, but it was interesting for me to see because I also had a lot of time, 1:00 to 1:00 to those guys during dinner and then lunch, et cetera. So to to discover basically that they're both quite knowledgeable on the IT side, or at least that's my interpretation. But as well on the business side. So I think they're not just IT guys. They also understand the immobility business. So I I put a few of my current challenges on their table to just check in. Do you? Do you recognize it, right? Luckily, they did right also on the payment terminal, so I I have a hard time. So they're just not user friendly, right? And they immediately acknowledge it and have 1000 ideas how to fix it. Same for CRM and user usability. AI was part of the the. Somebody presented on AI where we stand with AI, which you can do. So think this was a quite important thing for me to see because that means. That it's basically up to management to fix it because basically if they don't understand it, yeah, then maybe you need to hire better developers. I don't know if they're perfect. Probably not. But they are good enough, I would say. So it's it's up to us, I would say to maybe give them more freedom or whatever. I also checked it with Edwin. Have we made it too? Too complex for them to just act? I don't know, but let's see. It was in at least a good observation and I I liked it.
|
||||
|
||||
11:43 Patrick Motsch: Very cool.
|
||||
|
||||
11:44 Jeroen Haverkorn van Rijsewijk: Yeah. And then also, I think you were on the back of the in the back of a taxi saying here, hey, what are three things that we can change tomorrow, right? What were those three things? Do you know those?
|
||||
|
||||
11:57 Ommeren Pieter van (SB): No. So I gave everybody, so the magic stick, but it was more developed team. So they the development teams, they presented to me who they are of course already knew that a little bit, but OK. And then I asked all of them, hey, you have a magic stick. What would you change? What would you do? What you can do whatever, not the first team requested higher salary. The second team requested a bigger bonus. And then the 13 gave up. Yeah, it was actually a bit disappointing, but then? Then it was like. Uh, let me say it's. I wrote it down. Yeah, one team, one. One of the more. They have a limit of 50 gigabytes per day on data data lock analysis. They wanted more, more, more room, more bandwidth. Another team desperately wanted to visit the countries at least once a year to talk to users and visit stations themselves to test their products in real life. Yeah. Then the CRM team wanted more people. At least different kind of people. Yeah, another team wanted us to review the organization. Issue a little bit and look at testing. Another team asked for automatic station configuration because that leads to less basically shit any shit out kind of problems. And then the UX team requested a common component system or continue with that and better better way to work with customers. Also quite good. Then there was a team that basically put to the table. Hey, we're developing a lot of great stuff, but operations is not adopting it.
|
||||
|
||||
13:44 Jeroen Haverkorn van Rijsewijk: And.
|
||||
|
||||
13:45 Ommeren Pieter van (SB): So this is interesting if you talk to if you talk to SNos, they're complaining about DSH. This team was heavily complaining about the local unit saying we develop all kinds of things. They're just not using it. They're not adopting it. And then I raised the question, why is it so difficult? And yet I also don't know. So interesting. Yeah, that was basically it.
|
||||
|
||||
14:07 Jeroen Haverkorn van Rijsewijk: It's thanks. I mean some of that would be fixed by putting the process. Process manager in a room with a developer, right? A lot of that.
|
||||
|
||||
14:21 Ommeren Pieter van (SB): Yeah, yeah.
|
||||
|
||||
14:22 Jeroen Haverkorn van Rijsewijk: And that's interesting because it also, I think ties well into Neil's news perspective on how he wants to run central process management, which is exactly to to empower the local units because there are more people working there anyway. So he he also doesn't have the capacity. But more importantly, he doesn't have the knowledge.
|
||||
|
||||
14:44 Ommeren Pieter van (SB): And the CRM team asked for 1/4 of time for maintenance because they said we have so much legacy. We're only focusing on new things and we have a lot.
|
||||
|
||||
14:55 Jeroen Haverkorn van Rijsewijk: I will be back in one minute because I'm getting an update on my car here, sorry. Sorry, please continue.
|
||||
|
||||
15:01 Ommeren Pieter van (SB): But basically saying you need to, you need to. Yeah, we need. We need to work on fixing some legacy stuff in our system. Or bit of code optimization. And now we're currently running into all kinds of bugs every time. Because we don't fix this root cause.
|
||||
|
||||
15:17 Patrick Motsch: Yes, I understand. And they fix it 10 times because they did not solve it one time correctly. But this this issue I know from many companies that this wish I know this is like the wish for more salary or to wish to have to have more time or something like this. What I like on this issue, this is also a training issue to make the fixes means you have new people or new new mates in the team that you train for this and they make it in parallel to optimize the efficiency here. Could could could support some some project management or something above. Because cessation or Sprint? Just for fixing is not added value cannot.
|
||||
|
||||
15:50 Ommeren Pieter van (SB): No, shut up.
|
||||
|
||||
15:52 Patrick Motsch: It has to be connected with some with some. Perhaps they have to fix some some product or some service that they connected always with cleaning up legacy. This would be the right way.
|
||||
|
||||
16:03 Ommeren Pieter van (SB): Yeah, yeah.
|
||||
|
||||
16:06 Patrick Motsch: But a good point important. And what else did they have?
|
||||
|
||||
16:09 Ommeren Pieter van (SB): Yep.
|
||||
|
||||
16:12 Patrick Motsch: You know.
|
||||
|
||||
16:14 Ommeren Pieter van (SB): Yeah. So not more than that. I just mentioned so. But I think so. It was also not per SE about this exercise. I think it shows that we can do much more with this group.
|
||||
|
||||
16:27 Patrick Motsch: Yes.
|
||||
|
||||
16:28 Ommeren Pieter van (SB): And I think they're all mentioning that there is, there is a distance between the business and IT. And then I'm thinking, hmm, but we have still quite many people on it, right. Product owners manager mighty. Process. So I think it's not a lack of people, maybe even too many.
|
||||
|
||||
16:50 Patrick Motsch: It's clear. You mean, what do they do? The whole day. It's to be or. To be honest, it's it's also a little bit on this side how to organize, how to organize the work, and how to get input, or how open to people inputs and what to do with it. Is it is or is it that they're all loaded?
|
||||
|
||||
17:10 Ommeren Pieter van (SB): I would say we could also benefit from a few experiments. So why shouldn't of course we have all this confidence and all these things with process management and the boards and development committees, but you could also say what if we experiment to maybe give a lot of mandates to a team for a specific item or something whatsoever just. Fix it. I don't know.
|
||||
|
||||
17:33 Patrick Motsch: Accept accept just a test.
|
||||
|
||||
17:35 Ommeren Pieter van (SB): But let's let's maybe not also to solve now, but it's interesting. It was interesting.
|
||||
|
||||
17:39 Patrick Motsch: I like this idea.
|
||||
|
||||
17:41 Jeroen Haverkorn van Rijsewijk: What did I miss?
|
||||
|
||||
17:44 Ommeren Pieter van (SB): Yeah. So.
|
||||
|
||||
17:45 Patrick Motsch: Experimenting.
|
||||
|
||||
17:47 Jeroen Haverkorn van Rijsewijk: I like it. Thanks. OK, I'm updated. Yeah, I think. You know, Peter, what I what? I what I'm pretty sensing. Is a desire also from from the organization and and maybe also in me but. To to get back a bit of this. Part of five. Again, just just throwing things at something, and of course we need. We cannot do it in the same way as when you started because you're much more system, much more like a. Interdependency, etc. But at least the energy that that we. Yeah, just to get going to talk to each other, to start cooking, to start Co, creating to to transcend this. What's central? What's decentral conversation? But just to get in a room and fix the things that are most hurting us. I think there's no answer on that. Yeah, but I think one of the great thrusts is to have procurement the BU and it. Room tomorrow and I think that will already also create a certain. Perspective. That's that's that's novel I would say. And then and what connects us all I think is very much a common desire to to be successful, so. Yeah. So let's make it work, shall we take you through the presentation that we prepared for tomorrow?
|
||||
|
||||
19:13 Ommeren Pieter van (SB): Yep.
|
||||
|
||||
19:14 Jeroen Haverkorn van Rijsewijk: Or or do you? Would you prefer something else? I mean.
|
||||
|
||||
19:18 Ommeren Pieter van (SB): So I so I looked at the deck you sent on Friday. So I pre read that one. So that's Michelle already. Looks looks good. I think from an agenda perspective and also the way you want your structuring it. Actually I really like it.
|
||||
|
||||
19:35 Jeroen Haverkorn van Rijsewijk: OK.
|
||||
|
||||
19:37 Ommeren Pieter van (SB): But I think we also discussed the topics right. So where do we want to end? In a sort of list of priorities that we want to work on are to find the themes as as next step. So I don't know if you think you continued also to work afterwards right on the deck, but.
|
||||
|
||||
19:49 Jeroen Haverkorn van Rijsewijk: Yeah, we did. We did. But maybe, maybe, let's I'll take you through it and then let's see how. How to proceed with?
|
||||
|
||||
19:58 Ommeren Pieter van (SB): This is also new. Like it yeah.
|
||||
|
||||
19:59 Jeroen Haverkorn van Rijsewijk: How to proceed with it? So this is. Basically, slide one, slide 2. Probably, yeah. I think it still kind of works in terms of timing. But well, check in quick. I would say just to land and calibrate on what we like to work with there, we seem to see the initial insights. This is kind of three leveraged slides, but I am planning on. We would like to just send it after this meeting to the audience with your permission. If you think it makes sense to to to not to be perfect, but to at least have as prereads and to. To calibrate. So strategic context, I mean these are not strange things. It's consolidating it's oversupply challenge. Which is heavily, which makes it heavily competitive and merges are thinning. And then there's the long term forecast, which still remains strong. I mean high level high level. Here we this that when you saw this, when you also saw.
|
||||
|
||||
21:14 Ommeren Pieter van (SB): Yep.
|
||||
|
||||
21:14 Jeroen Haverkorn van Rijsewijk: I think it's still true. Patrick, we didn't. I mean, you also have some insights you put put on this? Maybe last check after this meeting that we get, yeah. Yeah, exactly.
|
||||
|
||||
21:32 Patrick Motsch: I make a last check on this also with the last interview today with Anna Marie to check whether some some magic inside of the trispatin sum, it's it. That's it on this level.
|
||||
|
||||
21:39 Jeroen Haverkorn van Rijsewijk: And then we distilled some certainties. And uncertainties and this is new. And we did this together with. I think we used Gemini for this. And we have a powerful prompt that simulates. Yeah, strategy consultants, and this is. This is what what it came up with. This is definitely a slide to read and that's why I'd like to get this presentation out so people can read it. Because when it comes to.
|
||||
|
||||
22:14 Ommeren Pieter van (SB): Since it's a lot of slides, we might want to send it out saying OK, please read these three or four slides.
|
||||
|
||||
22:21 Jeroen Haverkorn van Rijsewijk: Yeah, yeah, sure will do that. And certainly as an uncertainties are important when it comes to building scenarios. And so we need to calibrate on what we see are are the critical uncertainties. And then when you have those in place, there's a methodology that we propose that would, let's say, flash out the different scenarios and then we can also. Strategies and we can. Do let's say. Then Windstream that we have certain scenarios, we project on those strategies and then you can get. A. A very clear idea of OK, which strategies will hold in which scenarios, and there we can leverage AI, but we'll come to that later. The case for change. This was already in your the one that you read. I mean, there's a lot of. Things to say. About the case for change, but ultimately I think. I guess I wanna check with you. For me it's. His first title was navigating perpetual transformation. That there's a lot of difficult words, but ultimately I think. It's also about reclaiming the leads and the leads can be interpreted in many ways, but I mean more the lead in terms of, yeah, there's five. There's energy, there's this can do mentality and then it might of course also lead to delete or what do you say 1? Of the. The top CP OS or however you define it, it's reclaiming the lead, is also an internal stance that I'm. Addressing here. And I adapted to. Yeah, I added to the first point that that it's really or to the overall value that it's really about becoming an AI adaptive organization. And I feel there we have. Potentially energizing narrative. Which? Energizes the right people, I would say. It's it's about more than AI, but at the same time, when it comes to. Unlocking potential for a large part we feel for large part it is also about AI and for sure. It's about the ability. To to be adaptive in that space, I said. So that's kind of then comes out AI adaptive organization.
|
||||
|
||||
25:11 Ommeren Pieter van (SB): With respect to the examples. For revenue uplift, I would say maybe it would be wiser to mention. Flexibility here instead of FI 2G. And the reason for it is that FI two, I would say flexibility is the first step, the fi 2G, the next and then you could say, OK, we start with the end in mind. It is also a lot of uncertainty around future G4 AC for instance. With all the losses. And so it's it's looks like quite far away. While the first first step should be or could be flexibility, so we're offering flexibility to the to grid operators, right frequency regulation or smart charging on our urban networks or when we install HPCS with batteries. And by the way, feature G could be something, but so maybe maybe at least mention also the flexibility part. P2G could trigger a lot of people saying ah, but this is so far away and it's so doubtful and.
|
||||
|
||||
26:20 Jeroen Haverkorn van Rijsewijk: OK. Yep, fairpoint.
|
||||
|
||||
26:25 Ommeren Pieter van (SB): But this is a key key topic.
|
||||
|
||||
26:26 Jeroen Haverkorn van Rijsewijk: Yeah. I think it's later. Umm. Right. So obviously here we will have a conversation right in the ring. There's a lot of wind here. I hope it's not respectful me a bit, but. And then we would go after that. We were going to methodology. A piece which is also a bit of a keynote, let's say. So we would be, let's say, sharing our thoughts and then? This would also be input for shaping phase one proposal. Yeah, but so here, here, there would be a case for change. There would be a a discussion which we will capture. And then here we're going to a bit of a keynote. Which is to say, we want to go through surgery for breakfast and then we say AI, AI use all of it. Benji culture change management and and your operating system, and I mean, of course it's a bit with with a bit of spice but and and we we don't have a crystal ball. But ultimately, we do really believe that there's there's so many opportunities that someone will take those opportunities and if it's not us, it's it's someone else, right. So either directly or indirectly, we, yeah, AI will eat a lot of that. Here is our F rated circle. Our upgraded wheel. We place strategy around leadership in the heart. Because we feel that is kind of also all-encompassing like leadership. And we entered people because we feel the people and capabilities. Yeah. So it's about. It's not only it's not only people, sorry. People and capabilities. Alludes to a future where. Which is not so distant in our. View where you actually have great human and synthetic teams now. You could say, yeah, it's just an agent. Yeah, sure. But if you have if you. If you work on a daily basis with with 10 different, perhaps 50 different agents, then are you still fully only human? And if those agents? We say no. It's actually it's good to have a hybrid at some point at least have a vision now on it and then when? When it when it comes around, which is really next year, I think we're already seeing obviously many, many examples of of agents doing work. Then there should be. There should be a plan to how to on how to work with them and if agents are autonomous, then obviously they should also adhere to principles. So how do you hold an agent accountable? Well, we need to think about that. And there are ways to do that. But that basically means that you monitor all the actions against a set of defined behaviors, for example, and. So these these kind of programs need to be. At this, AI governance needs to be also somehow part of this. Because we're not just looking for the next six months, we are looking to create a tech vision that will hold for the at least one year to five years. Is that what Fabio told? And then we really also need to take into account. So that's why. We have added this change it a bit. There are still many, let's say, personal. Desires on maybe a bit more of that, a bit less of that. You know, Tobias wanted customers more prevalent. Anna Marie wants. Partner customer ecosystem more prevalent tech infrastructure, all of that. And then finally wanted to arrows. Inside, not outside what? And those things. But we said OK, fine, but let's say taking all of that and looking through our eyelashes, this this comes out for now. Also wanted to keep it as simple as possible at a meta level.
|
||||
|
||||
30:58 Ommeren Pieter van (SB): Mm-hmm.
|
||||
|
||||
31:01 Jeroen Haverkorn van Rijsewijk: And I will tell a bit more about. This tomorrow but. You you've been part of this journey, just focusing on this when people in capabilities, what's in their. Now, how does this look over time? Or if you if you were to say, OK, where do we start? Well, here we are now making a big deal. And. Sorts the strategy, but ultimately we will go into leadership quite quickly. Data and AI quite quickly, and then once we know what we want, then we'll also be translating to operating model and into more like the people, people, agenda, people and capabilities and ship points. For example, what Edwin mentioned last Friday is that, hey, maybe we should or I really think you should have a data scientist. For example, on the team edit is typically also something that you want. But and and maybe there are more. Maybe there are more of those things. This is just to give an example how that we don't. We're not going to start work or we don't propose to start work on everything immediately, but rather take it step by step. Start with strategy, then involve start. Start translating that into an involving leadership and then pick up the rest. Now this is what we proposed, right? So conduct interviews. Have to kick off, then analyze results. Create a tech vision. Where we have with sub sub actions to that. And we think we still. We should still do that. That will look like this and analyzing results and Patrick will talk. Please tomorrow cause and effect diagramming best angles and fields and actions and and very concrete. Goals, results, values and then. How to capitalize on that? Yeah, including the expected investment. Going into creating a tech vision. We'll start with setting a strategic posture. So you can. You can have different postures, have a more or less aggressive, and we should calibrate on that. Also, how much are we focused on the different horizons? Right. If the first horizon is softer and cheaper, or the second one is better and smarter. And then the third arises, it's valence and autonomous. We also need to calibrate. How much are we leaning into which horizon? Because that will help us to find the right language and also set the right expectations. Well then from that we create a high level vision. Yeah. So that's also a bit of. A creative part of that, and of course. As studying the proposal that. We'll then translate that into a different road map. First treated, but that is phase two. The road map parts, the phase one is. Coming to that high level phishing. And now we our suggestion is to go on a bit of an adventure. Where? We work, AI ignited and scenario based now because what we say is. We don't know. There were, but it's it's so ambiguous that it's very hard to say. Now this is the vision and that's the strategy. We we given the the the volatility in in, in, in tech tech development and and we're really all of us were in this collective experiment kind of finding it out together. We we think that's. That, that will kind of be a be a hit or miss approach and and what we rather say is let's. Go for. Yeah, the best of AI and people. So the thinking power of AI and then working with scenarios that leads and then we can stress test certain strategies which strategies hold on or which scenario. Based on Oxid scenario planning approach now has done this. Real life. During COVID with with an organization. And it costs weeks. But thanks to AI, you can kind of supercharge it. And you can just do it in a few hours with the right prompts. And I mean few hours, of course it will. It will take a few workshops, but it's it's kind of a few days rather than weeks. Now what we would do, let's say what we suggest to do on top of what we had. What we what you what you show on slide 15 here is that we also start working on this AIS scenarios based track. Where we define. Well, first set scope and drivers and create scenarios. Then we're going to wind tunneling and then on the back of that also we have indicators. An adaptive plan, obviously. Which which then should be taken into account, but also have the, the, the the indicators for that. To see hey. Is the scenario actually changing and if so, then that probably means we should ramp this up. And and reduced it and then we get a new strategy out of that, so to speak. Yeah. And so that you can calibrate. Not every day, of course, but with. Yeah, with the frequency that makes sense. It's relatively little effort.
|
||||
|
||||
37:21 Ommeren Pieter van (SB): Mm-hmm.
|
||||
|
||||
37:21 Jeroen Haverkorn van Rijsewijk: If we're still, if if we're still, if our approach is still in check with regards to this scenario that's unfolding. But that's the logic here. Not to make it. Practical. That would be one workshop.
|
||||
|
||||
37:43 Patrick Motsch: I just reads to the Contras that you know.
|
||||
|
||||
37:45 Jeroen Haverkorn van Rijsewijk: Yeah. OK. If you that to make this practical, there are like tonic overcoming of steam. OK. I'm in a macro new housekeeping this evening, yeah. Yeah. Thanks.
|
||||
|
||||
38:19 Patrick Motsch: I'm here. I'm. I'm here again.
|
||||
|
||||
38:21 Jeroen Haverkorn van Rijsewijk: All right. Thanks Patrick. OK. Sorry, that was the guy from the garage. But so you have a step one and two. That would be one workshop. Let's say 90 minutes where you flesh out. This what are the certainties? What are the uncertainties? What are core core assumptions? And what are the most prominent? Environmental. The conditions and and and and other drivers. And then there's a, let's say symbiosis between the the human team in the room and an AI that would be also in that room. Let's say we would have access to that. Tool and based on that we we would then create the scenarios. And then. Test those again in Workshop 2 with with with the human team. And then we would wind tunnel those. And. Yeah, basically unpec does. And start to embody those different. Strategies and. Ultimately, if you're at that stage where there are very concrete, so I think the you can do a lot of that virtual, but if it comes to when it comes to leadership and embodying different strategies. Yeah, we feel that will probably be very much serving if that would be, let's say the BUNT or at least, I mean, yeah, I think it would be probably just a BUMT. But, but at least it's a a significant subset of that and NIT and procurement in one room where you have an inperson intervention. I would say Peter with given the importance of informal. Moments probably, you know, like 1 1/2 day with an evening dinner in between. Something like that. Where you really go into. Hey, what does this look like and what what do we feel? How? What does it look like? How are we going to drive this? So that's at least one component of of of this. And then, yeah. And then monitor indicate this is obviously something that you would tend to. On the back of this.
|
||||
|
||||
40:56 Ommeren Pieter van (SB): Yep.
|
||||
|
||||
40:57 Jeroen Haverkorn van Rijsewijk: So this is kind of the high level. And so and so there's also to answer this topic. Or or or main themes. Approach. It's we we feel it would. I mean, yeah, we feel it would make more sense to do it this way because you are kind of leveraging all the on on the leveraging human and AI intelligence to work with what you know. While staying adaptive at the same time. And and that's that last part is is is harder when you kind of. It seems. And then organize yourself around the themes. It's it's a bit more risky we feel. Of course we can do it. But at the same time, we really feel we are going into, we're transitioning into a bit of a unknown territory, a bit of new era where. Less than before we we we can predict what's coming.
|
||||
|
||||
42:11 Ommeren Pieter van (SB): And what does that mean for tomorrow?
|
||||
|
||||
42:17 Jeroen Haverkorn van Rijsewijk: Well, for tomorrow that means that you know, if that means that. We would have a discussion on is that the case? Yes, OK. Do we agree, do we disagree? Because that would kind of define. The the phase one approach which we we will spend the next few weeks detailing that phase one approach. And it makes a difference if it's. AI ignited and scenarios based make make makes difference from let's say a theme based. Or so there are some, of course security aspects. Is it possible to get that AI? In in the room. If so, how? Because yeah, we work with copilot, but as Ana Marie also put it. Vas rather risk 1st and so. She she feels she is. She feels that she's limited. Also, just between between us here. Like many people she uses. AI and and she she she also said agents in her private life, which is just at our disposal. And then there's Vodafone and the Vodafone reality is you're working with an out to dated version of copilot. So you're kind of continuously working with old instruments. She calls it 2000 and late. So is there a way to? Is there a way to organize a A secure protocol compliance? Environment where we can access also latest AI models. Well, and so that we're not just talking about a possible future, but we're also kind of we're seeing the boundaries and we're not pushing but exploring what's possible beyond what's given to us at the current moment. So that kind of those kind of topics, I would also and we with Edwin there in the in the room, we can have a a real conversation about it and not just the hypothetical 1. So those are kind of considerations that. Yeah, those are kind of questions that we need to have answered before, before in, in order to to define the phase one approach.
|
||||
|
||||
44:46 Ommeren Pieter van (SB): Yeah, yeah.
|
||||
|
||||
44:50 Jeroen Haverkorn van Rijsewijk: After that, there's Stephen governance. I haven't created a slide on that, but that's just something. That we need to talk about, which will be of course informed by the whole discussion on scenarios based or theme based. And then we have the, yeah, let's say next steps on a very high level but this is what we already know. But it's just to kind of. Repeat. So that that that's basically what what we had prepared. It's Peter. I'll I'll just stop sharing to get your, let's say first and I know it's it was a lot also some new information, but I'd love to get your impression. And and and. Yeah, and and well, how to approach it?
|
||||
|
||||
45:36 Ommeren Pieter van (SB): Yeah, so this looks quite sophisticated. Which which is maybe also fitting fitting the theme of fitting the assignment. So 80% is a bit. So I'm I'm a bit. So like like as I said at the beginning, I really like the proposal also for tomorrow's slot. It looks very solid and it's really good to give back about the interviews and then and exactly how we're going to do it is still a bit. I would lie if I would say I fully get it, but I'm I'm also at the same. I'm also at a point where I know that I can also trust the process, right? So this bit of an angle, but I want to also honestly share it with you. So it looks very far through. That's for sure, right? So this looks very thought through. But I'm also a bit trusting on on you guys here.
|
||||
|
||||
46:35 Jeroen Haverkorn van Rijsewijk: Yep, there are points now. I'm also thinking.
|
||||
|
||||
46:39 Ommeren Pieter van (SB): But I'm I'm more than willing to take an experiment, right? This is love it. I mean, we can fail, but then we do it another. Yeah. Then we try something else.
|
||||
|
||||
46:47 Jeroen Haverkorn van Rijsewijk: Yeah, I would say.
|
||||
|
||||
46:48 Patrick Motsch: But but Peter Trump, in here at Trumpinia, one question, would it help? Perhaps, if he had one? Slide to show what we did in this Phase Zero and what will be the next step like.
|
||||
|
||||
47:02 Jeroen Haverkorn van Rijsewijk: What do you mean?
|
||||
|
||||
47:07 Patrick Motsch: Sorry, I had to go ahead. But I mean, I repeat, would it help perhaps when you say to shape that we make one slide to show what we already, which is what is the next step like like in some boxes would say to to make more hands on or or what is it that? Would help you.
|
||||
|
||||
47:30 Ommeren Pieter van (SB): Hmm. No, maybe. Maybe it also requires the voice over over again, right? So to fully get it. I mean it's it's a new approach that's basically it.
|
||||
|
||||
47:45 Patrick Motsch: Huh.
|
||||
|
||||
47:45 Jeroen Haverkorn van Rijsewijk: Yeah.
|
||||
|
||||
47:46 Ommeren Pieter van (SB): I like new things, but it was just like did I just just understand that you are two steps or maybe five steps ahead of me and ahead of the group here?
|
||||
|
||||
47:56 Jeroen Haverkorn van Rijsewijk: Yeah.
|
||||
|
||||
47:57 Ommeren Pieter van (SB): That's the only thing I want to share.
|
||||
|
||||
48:00 Jeroen Haverkorn van Rijsewijk: That's totally true, we.
|
||||
|
||||
48:03 Patrick Motsch: Great. That's good.
|
||||
|
||||
48:03 Jeroen Haverkorn van Rijsewijk: We have thought about it. Long and hard.
|
||||
|
||||
48:10 Ommeren Pieter van (SB): Yeah, yeah, but this is also what you can see, right? That's good.
|
||||
|
||||
48:14 Jeroen Haverkorn van Rijsewijk: Right. Yeah. And and of course, we're only now taking you in so. So that's also what I would expect, let's say. I'm wondering. I'm thinking out loud if we can. So if we can get because he did this in a room with clients, that whole scenario they're thinking. That might be. Let me see if I can see. This availability. So. Yeah, yeah, might work, actually. Then he can. He can also talk from experience because we created this with the three of us, Peter on our side and given that he is done this. In in in the room with clients. I think from from his you know he's only successfully. We'll make it feel very strong. I would say.
|
||||
|
||||
49:34 Ommeren Pieter van (SB): Yeah.
|
||||
|
||||
49:34 Jeroen Haverkorn van Rijsewijk: Because I'm also, I mean we talked about it a lot and I can see it, but I haven't done it. And then I know that when I haven't done something. I'm I'm I might also sometimes be questioning it myself. How? How does it look? And and you on the receiving end you will pick that up. So let me I mean I can do it if it needs to be, but looking at his calendar, I think we might get him for at least at least one hour. And that that would be. That would be sufficient. Then maybe he he can be there for the whole thing. Would you be open to him being there at pizza?
|
||||
|
||||
50:13 Ommeren Pieter van (SB): Sure. Yeah, absolutely.
|
||||
|
||||
50:14 Jeroen Haverkorn van Rijsewijk: Yeah, because he's he's an integral part of this whole thing anyway, OK. Good. But then I'll check that. I think that will. That will provide a lot of clarity.
|
||||
|
||||
50:30 Ommeren Pieter van (SB): Yep.
|
||||
|
||||
50:30 Jeroen Haverkorn van Rijsewijk: And he does have a brilliant mind. So I'm not saying that everything is. In. It will still require a lot lot of the slides, all of the slides and a lot of talking, but he can explain it. I feel in in from this embodied experience, which will probably benefit the whole. Yeah. Getting a selected sense of clarity around what what this is and unless we have questions, it's easy to answer them on based on the real life itself. Let me try and figure that out. And I'll get back to you, yeah. OK, good.
|
||||
|
||||
51:14 Ommeren Pieter van (SB): Then it's only about what do we send out as a pre read.
|
||||
|
||||
51:19 Jeroen Haverkorn van Rijsewijk: Yeah.
|
||||
|
||||
51:22 Ommeren Pieter van (SB): Would your proposal be to send a full deck, including a recommendation, what to read or?
|
||||
|
||||
51:28 Jeroen Haverkorn van Rijsewijk: Yeah, I would say that.
|
||||
|
||||
51:33 Patrick Motsch: Up front, I would only send apart until next steps that we also go through with the team that the backup slides. I would not send yet because they are not yet ready. They will. They will probably also change based on the decisions that we do, for example, as it is analysis, it also discharges. We do. It is this documents they will change. I would not. Because it's too much details.
|
||||
|
||||
51:57 Jeroen Haverkorn van Rijsewijk: You mean the methodology slice?
|
||||
|
||||
52:00 Patrick Motsch: Yes, after after the last slide that we have for the next steps, those those like these details, I would not yet send uncommented. I would not.
|
||||
|
||||
52:10 Jeroen Haverkorn van Rijsewijk: So right now we have. We have the check in and we have initial insights. We have the case of change with methodology and then there is and that's all those slides. And then we have the team governance team and governance phase one and then we have the next steps and that's it. Yeah. You mean the you mean the the appendix with the possible scenarios and everything? Those are just like. No, no, that.
|
||||
|
||||
52:40 Patrick Motsch: Yes, all day. And also the preanalytics that we also based on interest because the two last interest for example not yet integrated. For me, I would be carefully coup around picture not so wrong, because 80% is even more this I mean.
|
||||
|
||||
52:53 Jeroen Haverkorn van Rijsewijk: I also didn't share them with Peter now, so I'll I'll.
|
||||
|
||||
52:58 Patrick Motsch: This I did not know. Then Peter then I'm relaxed now. Good, because we have all completed documents, yeah.
|
||||
|
||||
53:04 Jeroen Haverkorn van Rijsewijk: I mean, we have. Yeah, we have example slides, example scenario slides. Peter, if before asking OK. But how? How? How can it look in practice? And we have, we we created a few to a few few examples but yeah, OK granted.
|
||||
|
||||
53:22 Ommeren Pieter van (SB): With pre reading it's always like either we ask to pre read and then we quickly touch upon the meeting but don't extensively or we don't ask for pre read and then we can extensively discuss things right? Let's let's let's have that little bit in mind. But it's also 2:00 already. So how much time do people have for pre reading for tomorrow morning? It's also, yeah, let's see.
|
||||
|
||||
53:43 Jeroen Haverkorn van Rijsewijk: Yeah, but OK. But then then we can do the synthesis of initial insights and the case for change. We can. That's four slides and then the whole methodology we can present tomorrow that work.
|
||||
|
||||
53:56 Ommeren Pieter van (SB): Yep, Yep.
|
||||
|
||||
53:56 Jeroen Haverkorn van Rijsewijk: OK. Great. Then I will do that. Patrick, I'll give you a call.
|
||||
|
||||
54:05 Patrick Motsch: What?
|
||||
|
||||
54:05 Jeroen Haverkorn van Rijsewijk: Now for to kind of wrap on the insights and. Oh, if I have outfits and I'll send out the the prereads. Yeah, cool.
|
||||
|
||||
54:19 Patrick Motsch: Perfect.
|
||||
|
||||
54:19 Ommeren Pieter van (SB): Thanks a lot guys. Looking forward tomorrow.
|
||||
121
mandates/vattenfall/100 Context/20250916 Kickoff Debriefing.md
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
1. What does the steering committee actually need?
|
||||
Explicit needs:
|
||||
• Clear next steps and feeling of moving in the right direction (Head BU)
|
||||
• Clarity on procurement's role and extent of support expected (Procurement)
|
||||
• Concrete deliverables for the upcoming period (IT)
|
||||
• Full understanding of current status and clarity on next steps (Person Head)
|
||||
Underlying needs they truly require:
|
||||
• Simplicity over complexity - Person Head's visceral reaction to the cause-effect diagram ("it drives me crazy") reveals deep frustration with overcomplicated approaches
|
||||
• Internal ownership - Procurement's blunt statement about developing strategy in-house shows fear of consultant-driven solutions
|
||||
• Quick tangible wins - Person Head explicitly wants to identify where DSH can "generate the first real tangible benefits"
|
||||
• Alignment without lengthy processes - Multiple stakeholders emphasize existing knowledge but lack of execution
|
||||
|
||||
2. What are they missing now?
|
||||
Critical gaps identified:
|
||||
• Process automation and self-service capabilities - explicitly called out as lagging
|
||||
• Alignment between BU and IT - described as "disconnect" or "misalignment"
|
||||
• Process management maturity - Person Head notes "immaturity on case management"
|
||||
• Strategic use of existing IT capabilities - "outstandingly good functionalities... but we're not using them strategically"
|
||||
• Integration of procurement in innovation - tension around underutilizing integrated utility advantages
|
||||
• Clear ownership model - Person Head asks "what is my role here?"
|
||||
|
||||
3. What context is needed for Phase 1 proposition?
|
||||
Key contextual elements:
|
||||
• Organization operates on thin margins, requiring high efficiency (Person Head's emphasis)
|
||||
• One shared IT platform across countries - major competitive advantage not fully leveraged
|
||||
• Strong push for 5 concrete topics: sourcing strategy, supplier strategy, AI, integrated utility, automation
|
||||
• AI should be a component, not the umbrella - Person Head explicitly rejects AI as overarching theme
|
||||
• Need for harmonized hardware portfolio with limited international suppliers
|
||||
• Balance between pioneering spirit (past) and corporate structure (present)
|
||||
|
||||
4. What approach should we continue with?
|
||||
Recommended approach:
|
||||
1. Abandon complex methodologies - The cause-effect diagram approach clearly failed
|
||||
2. Simple three-step process:
|
||||
o Define 5-year desired state in simple words
|
||||
o Identify path from current to desired state
|
||||
o Agree on concrete milestones
|
||||
3. Focus on facilitation, not direction - Enable internal teams to develop strategy
|
||||
4. Start with pilot use cases - Demonstrate value through quick wins
|
||||
5. Weekly alignment sessions rather than extensive analysis phases
|
||||
|
||||
5. How do we identify deliverables at the right level?
|
||||
Framework for right-level deliverables:
|
||||
• Not too high: Avoid "TED talk" level abstractions about AI transformation
|
||||
• Not too low: Don't dive into technical specifications immediately
|
||||
• Sweet spot: Process-level improvements with clear business impact
|
||||
o Example: "AI agent automating specific process X with human check cycle"
|
||||
o Example: "Procurement harmonization saving €X through Y suppliers"
|
||||
• Test: Can Person Head explain it to his team in 2 minutes and show value?
|
||||
• Milestone-based: Each deliverable should show progress within 3-4 weeks
|
||||
|
||||
6. How should we shape the next offering?
|
||||
Phase 1 offering structure:
|
||||
Week 1-2: Alignment Sprint
|
||||
• Workshop with all stakeholders to define 5-year vision (max 2 pages)
|
||||
• Identify 5 priority areas with owners
|
||||
• Create simple one-page roadmap
|
||||
Week 3-6: Quick Win Identification
|
||||
• 2-3 concrete AI/automation use cases
|
||||
• 1 procurement harmonization opportunity
|
||||
• 1 integrated utility leverage point
|
||||
• Each with clear business case and 90-day implementation plan
|
||||
Week 7-8: Capability Building Plan
|
||||
• How to build AI capabilities internally
|
||||
• Process management improvement approach
|
||||
• Alignment mechanisms between BU/IT/Procurement
|
||||
Deliverables format:
|
||||
• No complex diagrams - Simple lists and tables
|
||||
• Executive summaries - 1-page max per topic
|
||||
• Action-oriented - Every document ends with "who does what by when"
|
||||
• Co-created - Stakeholders involved in creation, not just validation
|
||||
Critical success factors:
|
||||
• Person Head and Head BU must see themselves as co-authors, not recipients
|
||||
• Procurement must feel their expertise is driving sourcing strategy
|
||||
• IT must own the technical roadmap
|
||||
• Consultants act as facilitators and capability builders, not strategy definers
|
||||
|
||||
|
||||
7. Seven Major Topics to Focus On
|
||||
Based on stakeholder input, consolidate around these priorities:
|
||||
|
||||
Process Automation & Self-Service
|
||||
|
||||
Current gap: Manual processes, poor user experience
|
||||
Quick win: 2-3 specific process automations within 90 days
|
||||
|
||||
|
||||
Strategic Sourcing Harmonization
|
||||
|
||||
Leverage international scale for hardware procurement
|
||||
Define supplier strategy (sophisticated platforms vs. commodity)
|
||||
|
||||
|
||||
AI Integration (Targeted)
|
||||
|
||||
Not as umbrella, but specific use cases
|
||||
Focus: Process efficiency, not transformation theater
|
||||
|
||||
|
||||
Integrated Utility Leverage
|
||||
|
||||
Underutilized competitive advantage
|
||||
Cross-selling and customer loyalty opportunities
|
||||
|
||||
|
||||
BU-IT Alignment
|
||||
|
||||
Address "disconnect" explicitly mentioned
|
||||
Create structured collaboration mechanisms
|
||||
|
||||
|
||||
Process Management Maturity
|
||||
|
||||
Pair process managers with developers
|
||||
Build case management capabilities
|
||||
|
||||
|
||||
Utilization of Existing IT Capabilities
|
||||
|
||||
"Outstandingly good functionalities" not strategically deployed
|
||||
Quick win: Activate underused features
|
||||
BIN
mandates/vattenfall/100 Context/20250916 Kickoff Notes.docx
Normal file
|
|
@ -0,0 +1,291 @@
|
|||
00:00 Patrick Motsch: Good morning, everybody.
|
||||
|
||||
00:03 Jeroen Haverkorn van Rijsewijk: Morning. Are you?
|
||||
|
||||
00:06 Patrick Motsch: I'm fine. And you. Everything good?
|
||||
|
||||
00:10 Jeroen Haverkorn van Rijsewijk: Yeah. Good. I'm. I'm at the garage for my car but.
|
||||
|
||||
00:15 Patrick Motsch: This is a garage. This looks like a like a big hole. So you have a big car.
|
||||
|
||||
00:21 Jeroen Haverkorn van Rijsewijk: Yeah, well, I'm a Tesla three, so I'm in this customer line here. Yeah.
|
||||
|
||||
00:28 Patrick Motsch: That that I make a good job. They know how to serve customers.
|
||||
|
||||
00:32 Jeroen Haverkorn van Rijsewijk: Yeah. Well, yeah, yeah. No, that's true. There's a nice lunch. And so yeah, yeah.
|
||||
|
||||
00:40 Patrick Motsch: Yeah, yeah.
|
||||
|
||||
00:40 Jeroen Haverkorn van Rijsewijk: How was Friday?
|
||||
|
||||
00:42 Patrick Motsch: It's very, very, very exciting. Nice, warm, wonderful, full of life. You cannot imagine how it. Was really very good. It was really good.
|
||||
|
||||
00:55 Jeroen Haverkorn van Rijsewijk: Yes, I can see here that.
|
||||
|
||||
00:57 Patrick Motsch: Yes, it's perfect. It's perfect to go inside and to check how it feels and to take something from them. Those who go, those who go there leave something for us.
|
||||
|
||||
01:08 Jeroen Haverkorn van Rijsewijk: Yeah. Yeah. Wonderful to hear. Sounds like it was very uniting.
|
||||
|
||||
01:16 Patrick Motsch: Yes, definitely.
|
||||
|
||||
01:19 Jeroen Haverkorn van Rijsewijk: Mm-hmm.
|
||||
|
||||
01:23 Patrick Motsch: We can. We can start with the question.
|
||||
|
||||
01:25 Jeroen Haverkorn van Rijsewijk: There we can. Well, let me.
|
||||
|
||||
01:29 Patrick Motsch: Let's do like this. I ask you.
|
||||
|
||||
01:31 Jeroen Haverkorn van Rijsewijk: Peter didn't respond. So let me just.
|
||||
|
||||
01:36 Patrick Motsch: But it's also we can also do it on the media directly, it's OK.
|
||||
|
||||
01:38 Jeroen Haverkorn van Rijsewijk: Yeah, it's OK.
|
||||
|
||||
01:40 Patrick Motsch: Because we have. That's the good thing that we have this transcript because everybody can always listen what have been discussed or details, this is good.
|
||||
|
||||
01:51 Jeroen Haverkorn van Rijsewijk: Let me see if I can. Narrow WhatsApp message. Sometimes they can't find them. The link. Thanks for putting the the guides online.
|
||||
|
||||
02:34 Patrick Motsch: I hope it's OK, I just realized, oh, we have to do something so.
|
||||
|
||||
02:39 Jeroen Haverkorn van Rijsewijk: Yeah, same. You're just ahead of me.
|
||||
|
||||
02:43 Patrick Motsch: OK.
|
||||
|
||||
02:46 Jeroen Haverkorn van Rijsewijk: Last one for now, huh?
|
||||
|
||||
02:49 Patrick Motsch: Yep, not too bad all day.
|
||||
|
||||
04:06 Jeroen Haverkorn van Rijsewijk: Hey, so Peter cannot join.
|
||||
|
||||
04:09 Patrick Motsch: OK. But relevant is on the Marie because you remember we moved it. We moved the date because she invited initially herself. Peter could not. Then we changed.
|
||||
|
||||
04:22 Jeroen Haverkorn van Rijsewijk: Yeah, yeah, I'm sure she will. See what's going out? Well, yeah. So she accepted the meeting and. And she suggested that I'm herself. So let's see. She hasn't yet seen my WhatsApp messages. I sent her the meeting invite and asked her if she was joining. Let's see if I can give her a call. Hey, on the movie. Boy, who is it? Now it is made-up of a new meeting heaven. Yeah, for met. Patrick for the tech vision. Let's talk now. OK, fine. It's on our way.
|
||||
|
||||
06:24 Patrick Motsch: Perfect.
|
||||
|
||||
06:27 Jeroen Haverkorn van Rijsewijk: See if I can cut off the 1st 7 minutes of this conversation. It's not so interesting for the stakeholder field. I do. I do notice I I keep more quiet now with AI note takers in the last chit chat. Yeah.
|
||||
|
||||
06:49 Patrick Motsch: But for me it just in the beginning. I also had this, but now it's good.
|
||||
|
||||
06:53 Jeroen Haverkorn van Rijsewijk: OK, good. Very good. Hey.
|
||||
|
||||
07:05 de Jong Annemarie (SB-G): Hi, good morning. Sorry for being late. I I completely lost track of time.
|
||||
|
||||
07:10 Jeroen Haverkorn van Rijsewijk: Yeah, that's good. That's alright. No problem, Anna Maria. I think at least I have plenty of those anecdotes. So happy you're here, and thanks for picking up the phone. Maybe just to kick it off, Peter's not joining as he shared our e-mail. And he said we don't need him. And I I I do agree so because it's. I think the piece of me are synchron synced enough, so maybe we should just kick it off and then? I'll provide a bit of context and allow Patrick to introduce himself and then we get going. Is that OK?
|
||||
|
||||
07:53 de Jong Annemarie (SB-G): Absolutely. I might have to switch rooms halfway, so just managing your expectations, but. Trying to see if I can prevent that at the moment, yeah.
|
||||
|
||||
08:03 Jeroen Haverkorn van Rijsewijk: Very good. And so we booked until 35. Is it still OK or?
|
||||
|
||||
08:07 de Jong Annemarie (SB-G): I I also have a bit of room afterwards, so that's fine.
|
||||
|
||||
08:11 Jeroen Haverkorn van Rijsewijk: OK, let's say 45 minutes. Does that work? Yeah. Good. Wonderful. So context of today is. Peter. As I dunno, as he yet he's already official. Not really, I think. Or is he already officially the? Is he still interim? But we're acting as though he's officially the leader of TSH. And he has asked me, together with Fabian, to support. With the. Definition and roll out of DSH tech vision. And also to support the DSH management team. To yeah. To basically accelerate into, you know, next level of performance and those things are connected. So then we set off to. To to define an approach and basically the first part of that is kick off which will we will have tomorrow and as part of the kickoff, we are interviewing stakeholders. You're the last in the row and the stakeholders were. On well within the Bumt, it's the S&O directors. It's funny. As director at MCO. And it's from and of course Fabian. And it with and. And Edwin and from procurement, we have interviewed Tobias. I think that was all of them, Patrick, right? I think so. And then tomorrow we have a kickoff with Fabian, Peter, Tobias and Edwin. So we have kind of a very lean population where we say based on the feedback and the input from from the I would say both industry reports but also the stakeholder interviews, we will define the scope for the next phase. The next phase is really high level definition of. Of the tech vision and. Yeah. And then and and well, some work looking at more depth in. Cause and effect. Diagramming. And then after that. There's phase two and that will then look more into detailing out Rd. maps, et cetera, et cetera. In the meantime, and and in parallel, we'll do team development on that management team. So that's the context and. And that's also the next step. Next step is tomorrow. The two hour virtual kickoff. So super happy to speak to you and also in this context we've been speaking. Quite a few times recently, which is I find really enjoyable. And so maybe then to. Introduce Patrick. Patrick is an absolute expert when it comes to tech. So yeah, that's why I invited him. Many generously accepted to be part of this engagement. So, Patrick, over to you. Maybe a few sentences to introduce yourself.
|
||||
|
||||
11:41 Patrick Motsch: I'd really keep it turned, yes.
|
||||
|
||||
11:44 de Jong Annemarie (SB-G): I'll listen in, but I'm I'm going to move room. So don't I hope that doesn't distract too much, but I'm listening very attentively. But I know I'll get kicked out in a minute, so please. Apologies for that.
|
||||
|
||||
11:57 Patrick Motsch: I will try not to be irritated. Don't worry, it's OK. So you can listen to me. That's good.
|
||||
|
||||
12:04 de Jong Annemarie (SB-G): I will switch to my headset. Then you I can hear you better.
|
||||
|
||||
12:04 Patrick Motsch: Yes, you can give me off the web to summary what you understood. So yes, I'm originally from Geneva, from the German part, from the French part of that thing, from the French part of Switzerland, and now I live in near Zurich area. I live in this part. I come from infrastructure. I met civil engineer initially and then I switched over to the combination. I would say of infrastructure. And it I was in the era of data centers that I could design, build and also I would say realise two data centres. The second one then it was with a Dutch company. It was called interaction at the time and then I could hand over to their internal team. So my job was with the customer who was very demanding and wanted to be very fast. We know him because we sit in a meeting with him. He wanted to have space in Switzerland and I had to plan and organise this to set up his team. In a quite short time, it was one year then to hand over, then finally it was this digital transformation that I I liked very much, but not because of technology for sure. This is interesting, but finally for the people part, I like to support organisations and people to go there to this journey. What I realised is especially also this this companies make making food or making this pharmaceutical things. They were normally in their domain. They were experts. The process business. But then they had to do a change. A teacher transformation. This was new and they were happy to have external to support. And in this role I am now so from infrastructure over IT digital, I'm now arrived, I would say the people now I can speak to people. They understand what I say and I support them on this journey.
|
||||
|
||||
13:49 Jeroen Haverkorn van Rijsewijk: Very good.
|
||||
|
||||
13:51 Patrick Motsch: Thank you.
|
||||
|
||||
13:52 Jeroen Haverkorn van Rijsewijk: Thanks.
|
||||
|
||||
13:54 Patrick Motsch: Now I need to know more about you. When you're ready to speak.
|
||||
|
||||
13:57 Jeroen Haverkorn van Rijsewijk: Exactly.
|
||||
|
||||
13:58 de Jong Annemarie (SB-G): Yes. So my name is Emery. I am director of Adventity Germany since July and have previously always executive roles at various startups, always in the renewable space, with varying roles. Focus very much around the operations or sales and marketing. And I also have had a short stint at Techcom. Companies. So SAS tech companies where we we sold a lot of hardware and that also showed me that when I was in my early 20s, I thought I was illiterate because I didn't. I couldn't write Python or anything, so I actually did also do quite a invested quite heavily in also learning that because I said I can't be illiterate so early on in my life and what not everyone knows. But I'm actually a quite a tech geek so. Always use quite a lot of tools. At the moment, also quite a few agents to to support me privately. In in managing life, because I feel it's it's really relevant and important. Yeah. So very excited to talk to you.
|
||||
|
||||
15:14 Jeroen Haverkorn van Rijsewijk: Wonderful. And there's so much more I could share, but I guess what I think is definitely one of the most talented leaders I'm currently enjoying working with came into Vodafone from outside last October and. As manager. As a management, I think it was called then or delivery. What was it called? Delivery Germany.
|
||||
|
||||
15:40 de Jong Annemarie (SB-G): Delivery. Yeah, that was. I was and responsible for the installation. Of our entire infrastructure. So we install mainly HPC from the hardware side and as before I had a software company in Europe where I was responsible for installers and optimizing processes. I I could bring a lot of that knowledge together with. My experience at installers. And really bring it together and turn the business around. So I often also come around to do big change processes.
|
||||
|
||||
16:14 Patrick Motsch: Yeah, it is a fantastic, great.
|
||||
|
||||
16:15 Jeroen Haverkorn van Rijsewijk: No, and and that is the yeah. What to say it it's it. 'S anomaly really left a dent in in the very positive way, and so.
|
||||
|
||||
16:28 Patrick Motsch: OK, cool.
|
||||
|
||||
16:30 Jeroen Haverkorn van Rijsewijk: Zip codes to. Basically, when Peter switched jobs, which was always let's say in the stars to to to succeed him. So and that's only because obviously that those first the first six months were a success.
|
||||
|
||||
16:45 Patrick Motsch: Am I? Am I? My notifications tell me that your family is still in in Munich and you are in Berlin or what is wrong?
|
||||
|
||||
16:53 de Jong Annemarie (SB-G): Yeah, exactly. So yeah, life is funny, right? So I moved from one of the rules. We moved to Germany and. We could live everywhere and we love the mountains, so we moved to Munich and now I commute.
|
||||
|
||||
17:05 Patrick Motsch: Yeah. OK.
|
||||
|
||||
17:07 de Jong Annemarie (SB-G): So I commute to to Berlin, but it's it's it's very manageable and also allows me to then in the days that I'm there really be fully focused. So a good balance.
|
||||
|
||||
17:16 Patrick Motsch: Absolutely, because family was important for me. That's why my reticent thought so far away. This is not cool.
|
||||
|
||||
17:23 de Jong Annemarie (SB-G): Yeah, it.
|
||||
|
||||
17:26 Jeroen Haverkorn van Rijsewijk: Yeah, it has its positives, I guess also.
|
||||
|
||||
17:27 de Jong Annemarie (SB-G): And it's a lot of stability for the children. You know, they always know Mommy is away. Monday, Tuesday, she's always away. There's a lot of continuity which is important.
|
||||
|
||||
17:36 Patrick Motsch: Absolute no.
|
||||
|
||||
17:36 Jeroen Haverkorn van Rijsewijk: Are you contemplating you're contemplating Berlin still or not so much anymore? And we'll move on, yeah.
|
||||
|
||||
17:45 de Jong Annemarie (SB-G): We are, we thought about moving actually this summer, but we thought maybe it's a bit too much and so we are moving next summer.
|
||||
|
||||
17:52 Jeroen Haverkorn van Rijsewijk: OK, good. Thanks. And I think one other thing that you should know about, like I said, I think on the at least in my in my eyes, Anna Marie, I think you are one of the most leaning in leaders when it comes to tech.
|
||||
|
||||
18:11 Patrick Motsch: OK.
|
||||
|
||||
18:11 Jeroen Haverkorn van Rijsewijk: It's no surprise to me that you just said it's new to me, but no surprise to me that you said also, you're working with a a few agents also in the family space to organize your life. And I that's also one of the reasons why I was looking forward to this specific call. Yeah, to get your input into and to get your vision into this. Cool. So. Yeah. You see, there's an AI note taker. It's a GDPR compliance and also let's say I'm paying extra to have it stored on European servers. Is that OK for you on on the to have it? Yeah.
|
||||
|
||||
18:48 de Jong Annemarie (SB-G): Yeah, although the the joke, of course, is the European service doesn't really matter because we've seen with the ICJ, even Microsoft said it, but when need be, they will also shut down services. So, but we all feel better because of it, so it's fine.
|
||||
|
||||
19:02 Jeroen Haverkorn van Rijsewijk: I I know and actually I I must confess it last. Last Friday I had interview with Edwin IT manager and he said actually I thought for policy that it's not allowed to have AI know takers and even when they had a a meeting with Microsoft. The Microsoft people told him better to shut off the note tech. Because they don't trust their own data. Policies anyway, it's a crazy world. Let's get into it. I would say. I will ask you some questions on the. Yeah, and. I'll ask the first few and then Patrick will take over. Let me start by saying how satisfied are you currently with the services and product provided by digital services and hardware?
|
||||
|
||||
20:06 de Jong Annemarie (SB-G): Maybe as a disclaimer for the sake of this interview, and also to provide clarity in the fastest manner possible, I think it is valuable if I'm very much on point and don't speak in too much fluff about it so.
|
||||
|
||||
20:24 Jeroen Haverkorn van Rijsewijk: Let's do that.
|
||||
|
||||
20:26 de Jong Annemarie (SB-G): So if you ask how satisfied are you about the services for which DSH is providing? My first thought was which services. So I don't think it's it's super clear. Of course I you know, I understand that they keep the security and the lights on and so forth. There is a part of course with. The with the CRM adjustments I would also count that under the DSH services there I could say I'm. I'm like 83% satisfied and Y 83 and not 90 or 100 because of course there is this bugs in there. And I think if you ask me what would be helpful, I think it would be very helpful if we had. AI agents like running the script 1520 a hundred times, because then you see that it doesn't make sense always that it that that there's still bugs in there. I feel like what I look developing software is hard. Yeah, we we know that and I think that and we also know that you know you say it takes three weeks and in practice. It takes five and I I don't think that that is a problem. That is the reality of how it is. You know, everyone's ambitious and and. But I think what is? What would be good and what I'm missing a bit in the services? Sorry, I'm out ready. Like how satisfied you AM. I'm also like going into what I would my wishes. Is I think it would be very valuable if we could get. I don't know automated updates saying hey, you know we're. At 50 percent, 70%. I know it's also hard. You can't always like state that software is like 50% finished or 70 but still just giving like feedback to the people working on it or or anticipating it is is valuable.
|
||||
|
||||
22:21 Jeroen Haverkorn van Rijsewijk: OK. Thanks. Yeah. Next question was actually let's see where and how can a collaboration between your team and DSA be elevated to the next level. So obviously automated progress updates would help. Is there anything else that might serve of that?
|
||||
|
||||
22:41 de Jong Annemarie (SB-G): Yeah, so I'm now basing a bit on my experience from delivery because there I think one of the reasons why we had a very successful transformation is that we were had a very successful roll out of process updates, which came from DSH. And what really worked there, what? Worked there. Well, was that we had. A weekly meeting of one hour and sometimes 90 minutes where we would talk to the developers and give them. And they put together with the process manager and by doing that, you know, ideally you think, oh, the process manager should understand everything. But then it was the nitty gritty details that the developers asked, which the process manager didn't know enough about. And so by having these I call it like collaboration sessions. I think we got much faster to what was exactly needed. So yeah, I think that is a A wish that I would have. Is that there would be if if things are being developed for local teams or international teams, that there is still this like check in moment and then here it is important that the check in moment is with the power users. So not with me but with the actual. User. So what we did for delivery is we identified. Power users and yeah, I think that was what made the collaboration effective and what I'd like to see also for other departments.
|
||||
|
||||
24:15 Jeroen Haverkorn van Rijsewijk: Interesting that Edwin said. I think exactly the same, he said at well, obviously he has. You meet at in before on Marie. I don't. Maybe not, no. Edwin is basically the hierarchically the beer of Steven and Stefan Luska Lutz. Sorry, but. In practice, he's more, let's say Peter Speier, because he has a bigger portfolio and he look, he looks at at multiple bus. What he sees one of the key differences that is a key differentiator in other BUS is exactly that the process managers talk directly to developers. So it's identical to what you said, and he says that's where. He feels the BU is currently. Let's say yeah, not serving yourself in the current setup. So that's something that he also pointed to. So interesting points and I'm good to hear that there's actually proof points that that would work or has worked within the BU in a very recent past. So thanks for that.
|
||||
|
||||
25:33 de Jong Annemarie (SB-G): Yeah. And it and it enabled us to have very high speed, I think. And I think in in these times we need speed and I think that's also kind of expected. But this is I think the how you need to realize it. So and in order to enable that you need to have the buy in from the from the other side that they make the time. So my team was very clearly believed. Whatever happens, you always need to drop your pen and talk to the developers, right? And and and that's why we could have that speed. So I think that's very valuable.
|
||||
|
||||
26:03 Jeroen Haverkorn van Rijsewijk: Yeah, very, very, very true and. Of course, you and I also have in in different contexts have exchanged about the central versus the central setup, right? So this is also something that that we can take into account in, in service of the of the of the BU as a whole. So thanks for that. Looking at a tech Fisher now, Anna Marie, how would you define a tech? How would you define a tech vision? Open philosophical question. What needs to be in?
|
||||
|
||||
26:38 de Jong Annemarie (SB-G): I'm also looking at my notes because I prepared some things, so if I glance away, it's not being rude, but it's because.
|
||||
|
||||
26:45 Jeroen Haverkorn van Rijsewijk: Sure. Yeah. And sorry for not sending you a a pre e-mail by the way, but.
|
||||
|
||||
26:50 de Jong Annemarie (SB-G): No, no, this is fine. This is fine so. I think the technology is there to support and to support the business, but also lead the business in the way that and being proactive and helping us make better judgments or better calls or find better opportunities. And I believe that the the vision of DSH should be to to have a scalable model. Where what we roll out is for 70% and I think this is an important part for 70% relevant for all markets and for 30% also. Aligns with the specific country needs. One of my fears is that by trying to make everything relevant for everyone we we produce the worst of every world because we everywhere water down a bit and not take into account the the local exceptionalities and thus build processes or or. Tech. That doesn't fit the the total needs. I would like. The this age to be very innovative in the forefront, so really be a leader in helping us enable the the business to work with agents. I see a long term that the IT department will become much more like an HR department where you have. A vast like a collet like army of supporting role. So I don't see tech as a as a standalone thing, but also also there in transition to like an HR partner because the the tech that is being developed should be like and and here I'm specific like referring to like agents for operations for asset management, for sales. For roll out they are also like kind of a yeah they are. If you see them as semi people, you should also be able to manage them right? Or give them input so. I see that as a as a very. Yeah, important role. That's maybe my vision. And yeah, need that, yeah.
|
||||
|
||||
29:04 Jeroen Haverkorn van Rijsewijk: So is it kind of? A. A curator for kind of hybrid talent or something where you have synthetic and human that abilities.
|
||||
|
||||
29:16 de Jong Annemarie (SB-G): Yeah, well, there is the vision. If you if you read about like IT departments and trends of the future that the HR departments as we know them now will will really transform and that the IT departments will become the HR departments of the future and. I think we need to quite a soon stage, have a conversation about like who is managing the agents you know and who is like training the agents or giving feedback to the agents or making sure that the agents don't go rogue. Right and. And I think without having this part of the conversation early on, we will develop agents as a natural tendency, but forget the second part. So I I believe that that should be part of the vision.
|
||||
|
||||
30:06 Jeroen Haverkorn van Rijsewijk: Yeah, yeah, probably also. I mean, I'm obviously very passionate about this as well. I'll just see there's it needs to happen in some sort of structured, grounded way that not everyone is just doing whatever and you create this fragmented agent landscape. So Agent Joe or don't go rogue. Yeah. So we can shake hands. Interesting anami. Thanks. Next question. Actually, we have done a bit of thinking around, OK what would do we feel? It would need to include. And I'll show you. What we call. It's a wheel. I mean. Granted, it's it's high level. I mean, that's the intention. And then we make it more, let's say. Applied it in in in working it out further. But just to get your thoughts on how we see this. All the aspect that we feel need to be included. In the tech vision, obviously. I would say it's all in a bath of data and AI, so that means data quality data or all the all the aspects of data. And we also we gave AIA specific. Yeah, place here because we feel it's so prevalent now that we need to. Be sensitive to that. And within that context. And I guess you could say tech also, Patrick more generally but but within that context we feel two important things obviously. A strategy to to execute on obviously leadership at the heart to drive that strategy. The rest of the of the business unit to execute on that from a certain culture. To execute on the strategy and then an operating model that kind of puts that strategy. On the ground and and we we're using. A model based on. A framework coined by the IMD Business School in Lausanne, which then falls apart into go to market engagement, operations and organization. So just wondering, is there anything that you are missing like any, anything big Yep.
|
||||
|
||||
32:56 de Jong Annemarie (SB-G): Yeah, yeah, yeah. I'm missing a thing like on the top of my head. If I if I look at this, I think what I'm missing is is customer and partner ecosystem. You know, engagement is in there, but you know, as often as CP OS we our success depends on the ecosystem orchestration. And so for example, how we work for billing, we work with a third party provider. So you know, also making sure that that is very much in taken into consideration you know. At the moment, most of our money is being made by our roaming partners and so it's not our tech vision, it's actually how we integrate with our partners. So I I think that should be in there and maybe technology and infrastructure. I'm missing a bit the the infrastructure as separate as a whole. You could say you know it's part of everything, but. It's kind of the plumbing that that makes that that makes it. It's solid and so I think what we're seeing at the moment, if you look at our infrastructure set up. We we haven't spoken about, you know, are we? You know, are we? Are we on the right servers? Are we on the right back end? Are we? You know, are API integrations the right one at the moment? I think we're very rigid. For example, with API integrations which which as a consequence have that we sometimes manually copy 1000 work orders, whereas an API plug in could be. Would would fix it within 30 seconds and so I think also. And that is not part of the operating model. It's not part of the culture, it's not part. Maybe you could count it under a strategy, but I think like technology and infrastructure as a whole should also be we separately be considered.
|
||||
|
||||
34:57 Jeroen Haverkorn van Rijsewijk: Thanks. Thanks. Yeah. So it's almost like the outer ring also, right, that it's data and AI and tech and infrastructure or it's kind of it's everywhere. Then it's not in the operating model.
|
||||
|
||||
35:11 de Jong Annemarie (SB-G): Yeah. Yeah. And I and I I think really I think that's an absolute blind spot of our organization. Which I haven't come across so much as here is. I think vattenfar tends to be very inward focused, so also on their on their strategy. But we have to speak about the fact that we are outward focused, right. So from the customers or from where we get the money and and and again. So therefore I also find. Customer and partner ecosystem. Such a important driver. So also when we look at like you know, how do we connect with the outside world and it's and I'm not talking about e-mail or teams or conversations. I'm talking about really. The API vision or and you know I think the GTP just brought out these you know MSP agents that now everyone could be like it was to me explained like as the USB port for for chat GTP, right. So what are we doing for us? What does that? Mean you know, how are we using it?
|
||||
|
||||
36:15 Jeroen Haverkorn van Rijsewijk: Yeah. Thanks.
|
||||
|
||||
36:17 Patrick Motsch: Perfect.
|
||||
|
||||
36:18 Jeroen Haverkorn van Rijsewijk: Really enjoying this interview.
|
||||
|
||||
36:20 Patrick Motsch: Yes.
|
||||
|
||||
36:21 de Jong Annemarie (SB-G): Now see a side of me which you didn't know yarun.
|
||||
|
||||
36:24 Jeroen Haverkorn van Rijsewijk: No, no, I I I had to know that. Well, I suspected it. I suspected it was quite elaborate, so I'm happy that I have an excuse to engage with that side, so thanks. And I know you're very passionate also about this, so. I was wondering also now actually one thing that came to mind listening to you I think is very much is in line with our first was it our. Yeah, our first interview we did with Tobias from procurement. Very talented on strategic procurements and overseeing multiple business units and he also said you know, there's likely once if you have a good which part points to the importance of the partner ecosystem, he said. If you have a good tech vision, basically we can leverage the multi million R&D budgets of our partners because we simply said, hey, this is our techfish and this is where we're going. So make sure. With Vata file name behind you that you research and develop across this line. And so then indirectly you actually access your your multiplying your R&D budget by factor. X right? Obviously, so that also applies to the importance of ECO or of a partner ecosystem. So I just wanted to share that, OK. Thanks. Wonderful. I think I really like to enrich this also based on this interview with Patrick. I think it's very makes a lot of sense. Quickly moving on. Yeah, what initiative? Two more questions. What initiatives? What initiatives, trends and other things are relevant for us to know? That are going to be happening within Germany. That that are relevant, let's say for us to know in this context.
|
||||
|
||||
38:17 de Jong Annemarie (SB-G): Umm. We think about that. I find that we, in comparison to our competitors are being very slow in, in the roll out of new technology. And when I speak about new technology, I often use it. For I often speak about like agents, but it's of course more than agents. But I know that our competitors are much faster in in for example. The management of of ticket systems and of like first and second level operations. They have already nearly all have bots and agents in place and you know, and we're now talking about whether we should insert a chat bot. And I think this shows the and I think there's a very much a bridge between MCO and DSH. That again are basics infrastructure, but also basics. Process is not in order, so we can't even scale fast to to for example roll out this technology because we haven't got, we've haven't done our homework. Properly so, like for example build knowledge bases through which you can pull. So I think that is something that I see. We are being weakened and our competitors are being stronger in. I I see that whereas a lot of people think that Germany is very, I would call them very privacy minded. I think that the the users of our business so and that with that I mean the the customers and also the location partners. They are quite open to tech, so I also don't think that whereas. Maybe the the standard deviation for a German person is to say oh, but they don't want to speak to technology and all they need human interaction. I think that actually that is not very much the case. So by the time we have actually rolled it out, it will be accepted. So I would not be held back by that. We haven't spoken about like payment models and and user experience. Innovation. But I think at the moment there is a lot of like and this is also where DSH is also hardware, right? So.
|
||||
|
||||
40:27 Jeroen Haverkorn van Rijsewijk: Mm-hmm. Definitely.
|
||||
|
||||
40:29 de Jong Annemarie (SB-G): Where I think like if we look at that part, there is innovation going around us and we haven't even tapped into that or thought about that like you know Google Pay.
|
||||
|
||||
40:41 Jeroen Haverkorn van Rijsewijk: Where hardware or what do you mean or payments?
|
||||
|
||||
40:43 de Jong Annemarie (SB-G): Well, like I think like in payment systems like how we pay like I think we're like like we're like touching that firstly. But also there there is a tech vision. Related to you know, how do you go with trends there? Yeah, interesting enough. So I don't know if you know, but actually a working student of ours build an AI model where most of our cables are cut. So I think also AI is already being used more in the business than we think. So we actually have a very solid model that we're running in parallel, but just not screaming off the roofs because we think about that. That was developed by the university. The TU University Berlin, where they already like have models predicting. Where what is being cut? And we see that that is also it's a model which we actually used to make business decisions on where we place cameras, so. I think it would be interesting to to look into that.
|
||||
|
||||
41:45 Jeroen Haverkorn van Rijsewijk: Yep, OK. So you already have a use case. You're several use cases within within ESNA Germany, yeah.
|
||||
|
||||
41:51 de Jong Annemarie (SB-G): Yeah, I would happily also send you an e-mail with my wishes for use cases because I have very clear use cases.
|
||||
|
||||
42:00 Patrick Motsch: Happy for this, yeah.
|
||||
|
||||
42:00 de Jong Annemarie (SB-G): Where I where I would like to see it being implemented and also how I say that that could resolve workload.
|
||||
|
||||
42:08 Jeroen Haverkorn van Rijsewijk: Yeah. Well, if you if you could get that to us today, then we can still take it into account for tomorrow's kickoff. And otherwise you can send us any time. I would say very helpful, yeah.
|
||||
|
||||
42:19 de Jong Annemarie (SB-G): And other innovations that are taking place. From a leadership perspective, I'm very much pushing on copilot, and actually we see now that we have also very few, like copilot power users who now train others in my department, and then they they see it like as their magician with with what they enable a lot. So. Also, where DSH for example says hey, it's not possible to pull this data. A local person that says no, it is because I tried it with copilot. And I build this and this and I I played half an hour around that we we I think. There I I think if you ask like what's happening, I think it would be it's it's very relevant that DSH doesn't think that they are the king and know everything because we see that that doesn't always doesn't hold truth.
|
||||
|
||||
43:21 Jeroen Haverkorn van Rijsewijk: Hey, Patrick, I think I think something to note for us. I think there is definitely a what would serve the BU is that we kind of elevate our default perspective as. As from to this team, one perspective that we are here to serve the BU and so these kind of these silos and egos, that kind of dissolve in that I know it's sometimes it's a fantasy because we're also humans and egos get triggered but kind of for also. For it it.
|
||||
|
||||
43:49 Patrick Motsch: Input was crucial to, as he said, it was absolutely crucial because this is the shift from the mindset. DSH, like technology and it and digital department is, is, is called. I name it like this. And then we bring something to the others. It the other way around people. From the county organization, for example, having contact to the partners and to the customers, they can bring in, they can also bring in better prototypes with their plans. This is really cool now.
|
||||
|
||||
44:17 Jeroen Haverkorn van Rijsewijk: Yeah. Now this is cool. And also I'm I'm I'm I'm deeply in the in all the dialogues and the sentiments right. So but if we play this right then yeah I think we it's also it's it's always important to have the BU as a central. Thing, but also very much in this context. OK, good.
|
||||
|
||||
44:40 de Jong Annemarie (SB-G): It would be very healthy if there be you as a tech vision said. For example, also in our decision making AI 1st and now that that might sound controversial because but it's not. It's not taking away jobs. It is about, you know, have we used the data properly? Have we have we challenged it properly? Have we in in, in discussions or decisions that we take? Have we taken this? We for now, we'll call it still new worldview in 2026, we will stop calling it that.
|
||||
|
||||
45:07 Jeroen Haverkorn van Rijsewijk: Yeah.
|
||||
|
||||
45:09 de Jong Annemarie (SB-G): You know, have we taken this reality into perspective and?
|
||||
|
||||
45:12 Jeroen Haverkorn van Rijsewijk: I like it, yeah. And what is the quality of our data, etcetera, etcetera. Yeah. OK. Wow. Wheezing through time. So I think let's see how strong these digital transformation anchors in your strategy and what's your vision for Germany's role in very strongly. Yeah, OK, I think. I think we. I mean, is there one sentence? Otherwise I hand over to Patrick.
|
||||
|
||||
45:37 de Jong Annemarie (SB-G): Yeah, my main concern is that the DSH is actually not fast enough in in delivering on the on on the needs because I see huge needs in assets and operations where I see a lot of repetitive work where I believe that we could make massive improvements I I. See it at the moment, also in in sales in looking for opportunities, I'll provide a list where I think we could really. Very quickly. Get that more? It's also something that from October ONS I will challenge my team on continuously like you know, have you used that? Because we should be digital native.
|
||||
|
||||
46:14 Jeroen Haverkorn van Rijsewijk: Is that these AI use cases that you alluded to or said this different list?
|
||||
|
||||
46:20 de Jong Annemarie (SB-G): So this AI use cases where I fear that the DSH will not be fast to deliver on. So if I'm if I'm. If I'm unlucky, it'll take 1 1/2 years for asset management to. To, you know, have an agent in there. Worst case.
|
||||
|
||||
46:37 Jeroen Haverkorn van Rijsewijk: Thanks, Patrick. Handing over to you and conscious of time. Sorry for taking up so much space.
|
||||
|
||||
46:43 Patrick Motsch: It's always my job to be fast, but I have a partner on the other side who's always very fast. That's great. I I try to shape the questions very clear and very short. First on on expression in the topic for collaboration your organization, the county organization together with us. Where do you see the future challenges? The environment, the challenges, things like time to market, human resources, increasing risk outside regulatory things. Where would you say within the next years? We face the biggest challenges.
|
||||
|
||||
47:18 de Jong Annemarie (SB-G): So a logical one that comes to mind is of course time. You know, and resources and in order to be tech successful, you need to free up resources to be the sparing partner. And I think that is also there is always the. The the healthy. Rubbing right, you know, is there enough time. Are we available enough? So I think there there is a trend which I think can be fixed very easily if there is a leadership by in so to really frame it as. A. As a driver, I think regulatory. No, I would say differently, but in far as a whole is extremely risk averse. So if if you read a regulatory and say, oh, I don't know, for example, after your compliance and you know there should be this like certain software update or we should check something then VAT and file has the tendency to go at 180% and over.
|
||||
|
||||
48:20 Patrick Motsch: OK.
|
||||
|
||||
48:20 de Jong Annemarie (SB-G): Over interpret over de risk. So if you say like where is the challenge in the future years? I think it would be if you if you look on the risk apartment side that. Whereas on the one hand, you know, everyone around us is using technology and everyone privately uses chat. GTP, we say, oh, we're not allowed to use AI because I don't know. So I think there is a is a a risk. I think there's also a risk that the technology that we use in House, for example copilot is, is, is quality wise worse than what you use in your normal life. So and as a as a risk. You have people not using it because the the quality is inferior, I mean. Copilot has recently done quite a major update, but I think. That is a risk that I see in the ecosystem that is happening that you know.
|
||||
|
||||
49:17 de Jong Annemarie (SB-G) (Unverified): Even though we all embrace change then it feels like we're adopting predated or outdated stuff at watanfow because it took so long for legal
|
||||
|
||||
53:56 Jeroen Haverkorn van Rijsewijk: Sorry, Betsy. So knowing that you've just been through this exercise of looking at FTE and. Wonder organizational tasks. What? What? What do you feel is your number? You can put to that when you say this leveraging. AI in asset management, for example, where we see quite a few FTS Sara like.
|
||||
|
||||
55:27 de Jong Annemarie (SB-G): And again, I'm also referring partially back to my former role as head of delivery. We should not change having the ability that power users interact with the developers or lead developers to to really better understand. How we are? What is exactly being meant? Because I also think that. If something is that, sometimes the we always think. The process managers have the solutions, but sometimes I think we should involve much more developers because they know the tech stack better and the tech capabilities. So if you look at that very siloed, you also get a siloed vision. Whereas I think sometimes if you get the lead developers in there, they say hold on. But actually if we would, you know, and then they have this vision, how you could mix and match it. It works much better, which I don't always think that the process manager does have from a skill perspective. What we should do more? As we should interact and think more about our ecosystem and our partners, that is absolutely a thing. That is, I think, lacking. We should think more about the I'm from. I'm going to call it HR aspect of DSH. In the it's it's it's going to be near future if if we want it or not. And we should.
|
||||
|
||||
56:47 Jeroen Haverkorn van Rijsewijk: You mean the HR aspects of of of the synthetic human future? Yeah.
|
||||
|
||||
56:52 de Jong Annemarie (SB-G): Agents. Yeah, yeah. And. And we should now, I thought. Yeah, we should think much more about. Yeah. How? How ages? Not only a central part, so to speak, a central department in the top operating model. And don't worry your own. I will not, for now, applaud like changing that operating model. I'm too early here to say that, but it should be much more like this. Eight should be in every line and in every department, so it's not like a silo from the top which trickles down. It's it's. It's a two way St. so to speak. I'm quite visual Patrick, so I see it like you know visually and.
|
||||
|
||||
57:32 Patrick Motsch: I like it. I understood you don't like one way St.
|
||||
|
||||
57:35 de Jong Annemarie (SB-G): Yeah, that I think that that is something would. We should match.
|
||||
|
||||
57:47 Patrick Motsch: Yes. What about I want to. I know time but.
|
||||
|
||||
57:49 de Jong Annemarie (SB-G): Yeah, yeah, go ahead.
|
||||
|
||||
57:50 Patrick Motsch: Things that change in the future and when we change, maybe we change change regulations might change. Stability of countries might change and all these things can you give us some inputs also for the strategy where we should be careful.
|
||||
|
||||
58:03 de Jong Annemarie (SB-G): Ah, very good question. Where should be. Be careful bearing all the uncertainties around us. Although logically you want to say regulation, I think that will be too slow in Germany. So before that, is actually through Parliament and everything, where at least 18 months down the line. So I I wouldn't be too concerned about that for now. I think where we should be concerned is the and I need to close the door for this. This better better close the door. For this is is the power of workers councils. We don't have one in in Germany yet, but we do have them in other countries. And apparently the overarching workers councils for Vattenfall have adapted a policy where they say that no jobs will be lost due to AI probably set up by someone who didn't understand the future. So I would really recommend that you you take that into consideration in how you frame that, because it could otherwise be that you're. Higher vision gets like slashed because of this central policy that I would, I would dive into that like, you know what, you use the right words. Yeah, another part I don't even talk about that. Yes, in the in the future landscape of E mobility and especially Germany, there will be mergers and acquisitions. And merger acquisitions also means tech stack means back end means stitching stuff together. Which you don't want. And I don't think we have any vision on that. I think it's always a bit of an insult and we'll see what happens. But I think if you ask what could be destabilizing in our infrastructure setup or there I don't know if we do. If we do a a big merger or we buy a big party. That I think. Even though we don't speak about it, I think immobility is always on the list of being sold. Also, they're thinking, you know, if you, if you look at your tech stack and also the proprietary value, I've done a lot of selling of companies or preparing them for for being sold. Sometimes it's smarter to like. How do you write up your tech if you if there is a position, and I think this is something that you should discuss in a very small round yarun and and Patrick. It was with perhaps people's like how do we document? How do we make sure that should the DD moment happen that we are prepared and because I've also been once at a company where then the IT department? I don't know. Scrambled for two months, day and night to to write everything properly because it was never written up. And then they couldn't prove. And actually the value of the company was mostly in the IT.
|
||||
|
||||
01:00:59 Patrick Motsch: Exact perfect. I take 2 steps and we have perfect perfect one is the one that decided documentation acquisition and the other one is doing some documentation of the AI. So sometimes help to understand application to to shape it. Better to make it better and all these things. With this I like great point. So we are true also in time.
|
||||
|
||||
01:01:20 de Jong Annemarie (SB-G): Thank you very much.
|
||||
|
||||
01:01:23 Patrick Motsch: Yes. Anything else that we missed, we have more questions. Thank you.
|
||||
|
||||
01:01:27 de Jong Annemarie (SB-G): No, I am going to provide my wish list of AI agents which I believe are very beneficial for the market. I will go a bit crazy and spend. I don't know another 10 minutes thinking about everything I could add and then I will break it down to the the five priorities where I believe they have the most impact, but I just do want to show that I think there is a vast world of opportunity out. There and when we're not using any of it.
|
||||
|
||||
01:01:52 Jeroen Haverkorn van Rijsewijk: No. And please also note, if you're doing that from Abu perspective for a Germany perspective, right, I think the first perspective would be, I mean they're both helpful I guess, but. Yeah.
|
||||
|
||||
01:02:07 de Jong Annemarie (SB-G): I will flag by the BU as a whole. Can I think so? All the options that that I'm seeing are BU as a whole, right? So it's how we do sales, how we do operations, how we do asset management, how we do billing.
|
||||
|
||||
01:02:18 Jeroen Haverkorn van Rijsewijk: Yeah.
|
||||
|
||||
01:02:18 de Jong Annemarie (SB-G): But I I can't always speak for my other colleagues, and maybe because also my my former role, I'm a bit hesitant to to, so to speak, dancer on the Dutch territory. Or that and say, oh, they should also use this though.
|
||||
|
||||
01:02:31 Jeroen Haverkorn van Rijsewijk: I just am really thankful so much also for the extra time and. Yeah. Obviously, we'll keep you posted later. What's next? But I'm sure. Oh yeah. We will pull you in throughout the next phase of this program. Thank you very much.
|
||||
|
||||
01:02:53 de Jong Annemarie (SB-G): Thank you very much and take care. Bye bye.
|
||||
|
||||
01:02:55 Patrick Motsch: Thank you.
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
AI Agents & automations thoughts that can benefit the entire BU
|
||||
🏷 Sales
|
||||
• Contract Copilot agent: scans CI/VI contracts, flags risks/clauses, indexes terms; generates draft Single Site agreements automatically from CRM data. Created together with legal teams per country
|
||||
• Pricing Optimizer agent: simulates customer usage across AC/DC/HPC and suggests tariff adjustments to balance competitiveness, ROI, and utilization.
|
||||
• Lead & Opportunity Sourcing Agent: monitors tenders, fleet electrification announcements, and retail expansions; flags new sites/partners.
|
||||
________________________________________
|
||||
⚙️ Operations
|
||||
• Customer Follow-Up Automation: sends reminders when customers don’t respond;
|
||||
• Agent: Customer Service Copilot: triages tickets, performs quality checks after training, and provides German chatbot support for 1st-level requests.
|
||||
• Agent: Incident Predictor: monitors charger/payment data, raises alerts before customers report issues, and flags data quality problems.
|
||||
• Agent: Fraud Watchdog: detects unusual charging or payment behavior (e.g. RFID misuse, stolen cards, suspicious usage).Takes standard action based on pattens
|
||||
• Agent: Back-Office Automator: automates compliance checks and invoicing for standard cards; supports bulk whitelisting of specific card groups (e.g. fleets).
|
||||
• Agent: Customer service Automation learns from Microsoft Dynamics/Service cases to generate standard replies; works like training a new employee (human check first, then automation). Salesforce Einstein has many great examples of this for cases.
|
||||
________________________________________
|
||||
🛠 Asset Management
|
||||
• Maintenance Predictor: anomaly detection from charger telemetry (ABB, Alpitronic, Compleo);This could also be done by integratuing partner APIs (e.g. Monta or from our hardware providers, they are also building this).
|
||||
• Asset Lifetime Advisor: recommends part swaps or preventive repairs before breakdowns.
|
||||
• Investment Prioritizer: ranks assets/sites for upgrade vs. replacement based on ticket history and recurring issues.
|
||||
• Usage Insight Agent: identifies underperforming or high-potential locations.
|
||||
• Customer Follow-Up Automation: sends reminders when customers don’t respond; learns from Microsoft Dynamics/Service cases to generate standard replies; works like training a new employee (human check first, then automation).
|
||||
• Customer Priority Scanner: pre-screens all incoming cases and tickets to flag priority A customers (e.g. VF executives/board); links even personal emails to sites/IDs.
|
||||
• Invoice Checker: automatically cross-checks EPC/service invoices against closed contracts; flags mismatches in pricing or scope before approval.
|
||||
________________________________________
|
||||
🚧 Delivery
|
||||
• Document Checker: auto-scans permitting documents, EPC contracts, and compliance materials.
|
||||
Top Automation
|
||||
Customer Follow-Up Automation: sends reminders when customers don’t respond;
|
||||
Top 5 Agents
|
||||
1. Customer service Automation learns from Microsoft Dynamics/Service cases to generate standard replies; works like training a new employee (human check first, then automation). Salesforce Einstein has many great examples of this for cases.
|
||||
2. Invoice Checker: automatically cross-checks EPC/service invoices against closed contracts; flags mismatches in pricing or scope before approval.
|
||||
3. Lead & Opportunity Sourcing Agent: monitors tenders, fleet electrification announcements, and retail expansions; flags new sites/partners.
|
||||
4. Customer Service Copilot: triages tickets, performs quality checks after training,
|
||||
5. Incident Predictor: monitors charger/payment data, raises alerts before customers report issues, and flags data quality problems.
|
||||
Nice to have, projects for a hackathon
|
||||
1. Customer Priority Scanner: pre-screens all incoming cases and tickets to flag priority A customers (e.g. VF executives/board); links even personal emails to sites/IDs.
|
||||
|
||||
|
Before Width: | Height: | Size: 6 KiB After Width: | Height: | Size: 6 KiB |
|
|
@ -1,440 +0,0 @@
|
|||
<mxfile host="app.diagrams.net" modified="2025-05-15T12:00:00.000Z" agent="Mozilla/5.0" etag="dIAQtBcnX-3NLNgQbHcC" version="14.6.13" type="device">
|
||||
<diagram id="C5RBs43oDa-KdzZeNtuy" name="LucyDOM">
|
||||
<mxGraphModel dx="1422" dy="762" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
|
||||
<!-- Core Models Group -->
|
||||
<mxCell id="2" value="Core Models" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#dae8fc;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="40" width="750" height="230" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Label -->
|
||||
<mxCell id="3" value="Label" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="60" y="80" width="140" height="78" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="4" value="+ default: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="3" vertex="1">
|
||||
<mxGeometry y="26" width="140" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="5" value="+ translations: Dict[str, str]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="3" vertex="1">
|
||||
<mxGeometry y="52" width="140" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- FileItem -->
|
||||
<mxCell id="6" value="FileItem" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="230" y="80" width="180" height="182" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="7" value="+ id: int (PK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="6" vertex="1">
|
||||
<mxGeometry y="26" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="8" value="+ mandateId: int (FK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="6" vertex="1">
|
||||
<mxGeometry y="52" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="9" value="+ userId: int (FK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="6" vertex="1">
|
||||
<mxGeometry y="78" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="10" value="+ name: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="6" vertex="1">
|
||||
<mxGeometry y="104" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="11" value="+ mimeType: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="6" vertex="1">
|
||||
<mxGeometry y="130" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="12" value="+ fileHash: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="6" vertex="1">
|
||||
<mxGeometry y="156" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- FileData -->
|
||||
<mxCell id="13" value="FileData" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="440" y="80" width="140" height="104" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="14" value="+ id: int (PK, FK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="13" vertex="1">
|
||||
<mxGeometry y="26" width="140" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="15" value="+ data: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="13" vertex="1">
|
||||
<mxGeometry y="52" width="140" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="16" value="+ base64Encoded: bool" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="13" vertex="1">
|
||||
<mxGeometry y="78" width="140" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Prompt -->
|
||||
<mxCell id="17" value="Prompt" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="610" y="80" width="140" height="130" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="18" value="+ id: int (PK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="17" vertex="1">
|
||||
<mxGeometry y="26" width="140" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="19" value="+ mandateId: int (FK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="17" vertex="1">
|
||||
<mxGeometry y="52" width="140" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="20" value="+ content: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="17" vertex="1">
|
||||
<mxGeometry y="78" width="140" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="21" value="+ name: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="17" vertex="1">
|
||||
<mxGeometry y="104" width="140" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Workflow Models Group -->
|
||||
<mxCell id="22" value="Workflow Models" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#d5e8d4;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="290" width="750" height="330" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Document -->
|
||||
<mxCell id="23" value="Document" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="60" y="330" width="180" height="156" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="24" value="+ id: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="23" vertex="1">
|
||||
<mxGeometry y="26" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="25" value="+ name: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="23" vertex="1">
|
||||
<mxGeometry y="52" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="26" value="+ fileId: int (FK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="23" vertex="1">
|
||||
<mxGeometry y="78" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="27" value="+ mimeType: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="23" vertex="1">
|
||||
<mxGeometry y="104" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="28" value="+ data: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="23" vertex="1">
|
||||
<mxGeometry y="130" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- DocumentContent -->
|
||||
<mxCell id="29" value="DocumentContent" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="60" y="500" width="180" height="104" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="30" value="+ sequenceNr: int" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="29" vertex="1">
|
||||
<mxGeometry y="26" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="31" value="+ name: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="29" vertex="1">
|
||||
<mxGeometry y="52" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="32" value="+ data: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="29" vertex="1">
|
||||
<mxGeometry y="78" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Workflow -->
|
||||
<mxCell id="33" value="Workflow" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="260" y="330" width="180" height="156" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="34" value="+ id: str (PK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="33" vertex="1">
|
||||
<mxGeometry y="26" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="35" value="+ name: Optional[str]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="33" vertex="1">
|
||||
<mxGeometry y="52" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="36" value="+ mandateId: int (FK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="33" vertex="1">
|
||||
<mxGeometry y="78" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="37" value="+ status: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="33" vertex="1">
|
||||
<mxGeometry y="104" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="38" value="+ messageIds: List[str]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="33" vertex="1">
|
||||
<mxGeometry y="130" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- WorkflowMessage -->
|
||||
<mxCell id="39" value="WorkflowMessage" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="460" y="330" width="210" height="182" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="40" value="+ id: str (PK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="39" vertex="1">
|
||||
<mxGeometry y="26" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="41" value="+ workflowId: str (FK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="39" vertex="1">
|
||||
<mxGeometry y="52" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="42" value="+ parentMessageId: Optional[str]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="39" vertex="1">
|
||||
<mxGeometry y="78" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="43" value="+ startedAt: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="39" vertex="1">
|
||||
<mxGeometry y="104" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="44" value="+ role: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="39" vertex="1">
|
||||
<mxGeometry y="130" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="45" value="+ documents: Optional[List[Document]]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="39" vertex="1">
|
||||
<mxGeometry y="156" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- WorkflowLog -->
|
||||
<mxCell id="46" value="WorkflowLog" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="460" y="530" width="180" height="78" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="47" value="+ id: str (PK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="46" vertex="1">
|
||||
<mxGeometry y="26" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="48" value="+ workflowId: str (FK)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="46" vertex="1">
|
||||
<mxGeometry y="52" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Agent and Task Models Group -->
|
||||
<mxCell id="49" value="Agent and Task Models" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#ffe6cc;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;strokeColor=#d79b00;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="640" width="750" height="370" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- AgentTask -->
|
||||
<mxCell id="50" value="AgentTask" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="60" y="680" width="240" height="130" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="51" value="+ taskId: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="50" vertex="1">
|
||||
<mxGeometry y="26" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="52" value="+ workflowId: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="50" vertex="1">
|
||||
<mxGeometry y="52" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="53" value="+ prompt: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="50" vertex="1">
|
||||
<mxGeometry y="78" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="54" value="+ inputDocuments: List[Document]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="50" vertex="1">
|
||||
<mxGeometry y="104" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- AgentResult -->
|
||||
<mxCell id="55" value="AgentResult" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="60" y="830" width="240" height="78" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="56" value="+ feedback: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="55" vertex="1">
|
||||
<mxGeometry y="26" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="57" value="+ documents: List[Document]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="55" vertex="1">
|
||||
<mxGeometry y="52" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- TaskItem -->
|
||||
<mxCell id="58" value="TaskItem" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="680" width="240" height="130" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="59" value="+ agent: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="58" vertex="1">
|
||||
<mxGeometry y="26" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="60" value="+ prompt: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="58" vertex="1">
|
||||
<mxGeometry y="52" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="61" value="+ outputDocuments: List[OutputDocument]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="58" vertex="1">
|
||||
<mxGeometry y="78" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="62" value="+ inputDocuments: List[InputDocument]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="58" vertex="1">
|
||||
<mxGeometry y="104" width="240" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- InputDocument -->
|
||||
<mxCell id="63" value="InputDocument" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="830" width="180" height="104" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="64" value="+ label: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="63" vertex="1">
|
||||
<mxGeometry y="26" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="65" value="+ fileId: Optional[int]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="63" vertex="1">
|
||||
<mxGeometry y="52" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="66" value="+ prompt: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="63" vertex="1">
|
||||
<mxGeometry y="78" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- OutputDocument -->
|
||||
<mxCell id="67" value="OutputDocument" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="950" width="180" height="78" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="68" value="+ label: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="67" vertex="1">
|
||||
<mxGeometry y="26" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="69" value="+ prompt: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="67" vertex="1">
|
||||
<mxGeometry y="52" width="180" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- TaskPlan -->
|
||||
<mxCell id="70" value="TaskPlan" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="580" y="680" width="190" height="130" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="71" value="+ objFinalDocuments: List[str]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="70" vertex="1">
|
||||
<mxGeometry y="26" width="190" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="72" value="+ objWorkplan: List[TaskItem]" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="70" vertex="1">
|
||||
<mxGeometry y="52" width="190" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="73" value="+ objUserResponse: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="70" vertex="1">
|
||||
<mxGeometry y="78" width="190" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="74" value="+ userLanguage: str" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="70" vertex="1">
|
||||
<mxGeometry y="104" width="190" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Relationships -->
|
||||
<!-- FileItem to FileData -->
|
||||
<mxCell id="75" value="" style="endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;" edge="1" parent="1" source="7" target="14">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="76" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="75">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="77" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="75">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Document to FileItem -->
|
||||
<mxCell id="78" value="" style="endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="26" target="6">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="320" y="421" />
|
||||
<mxPoint x="320" y="280" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="79" value="*" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="78">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="80" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="78">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Document to DocumentContent -->
|
||||
<mxCell id="81" value="" style="endArrow=diamondThin;html=1;endSize=12;startArrow=none;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;" edge="1" parent="1" source="30" target="28">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="40" y="539" />
|
||||
<mxPoint x="40" y="473" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="82" value="*" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="81">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="83" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="81">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Workflow to WorkflowMessage -->
|
||||
<mxCell id="84" value="" style="endArrow=diamondThin;html=1;endSize=12;startArrow=none;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endFill=0;" edge="1" parent="1" source="41" target="34">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="85" value="*" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="84">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="86" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="84">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Workflow to WorkflowLog -->
|
||||
<mxCell id="87" value="" style="endArrow=diamondThin;html=1;endSize=12;startArrow=none;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endFill=0;" edge="1" parent="1" source="48" target="37">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="440" y="569" />
|
||||
<mxPoint x="440" y="447" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="88" value="*" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="87">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="89" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="87">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- WorkflowMessage to Document -->
|
||||
<mxCell id="90" value="" style="endArrow=diamondThin;html=1;endSize=12;startArrow=none;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endFill=0;" edge="1" parent="1" source="45" target="25">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="91" value="0..1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="90">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="92" value="*" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="90">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- AgentTask to Document -->
|
||||
<mxCell id="93" value="" style="endArrow=diamondThin;html=1;endSize=12;startArrow=none;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=0;" edge="1" parent="1" source="54" target="24">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="20" y="797" />
|
||||
<mxPoint x="20" y="369" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="94" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="93">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="95" value="*" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="93">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- AgentResult to Document -->
|
||||
<mxCell id="96" value="" style="endArrow=diamondThin;html=1;endSize=12;startArrow=none;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=0;" edge="1" parent="1" source="57" target="25">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="30" y="895" />
|
||||
<mxPoint x="30" y="395" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="97" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="96">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="98" value="*" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="96">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- AgentTask to AgentResult -->
|
||||
<mxCell id="99" value="" style="endArrow=open;html=1;endSize=12;startArrow=diamondThin;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="50" target="55">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="100" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="99">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="101" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="99">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- TaskItem to InputDocument -->
|
||||
<mxCell id="102" value="" style="endArrow=diamondThin;html=1;endSize=12;startArrow=none;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endFill=0;" edge="1" parent="1" source="63" target="58">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="103" value="*" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="102">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="104" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="102">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- TaskItem to OutputDocument -->
|
||||
<mxCell id="105" value="" style="endArrow=diamondThin;html=1;endSize=12;startArrow=none;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.496;entryY=1.038;entryDx=0;entryDy=0;entryPerimeter=0;endFill=0;" edge="1" parent="1" source="67" target="62">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="106" value="*" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="105">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="107" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="105">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- TaskPlan to TaskItem -->
|
||||
<mxCell id="108" value="" style="endArrow=diamondThin;html=1;endSize=12;startArrow=none;startSize=14;startFill=0;edgeStyle=orthogonalEdgeStyle;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endFill=0;" edge="1" parent="1" source="72" target="60">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="109" value="*" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;" connectable="0" vertex="1" parent="108">
|
||||
<mxGeometry x="-1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="110" value="1" style="edgeLabel;resizable=0;html=1;align=right;verticalAlign=top;" connectable="0" vertex="1" parent="108">
|
||||
<mxGeometry x="1" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Legend -->
|
||||
<mxCell id="111" value="Legend" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" vertex="1" parent="1">
|
||||
<mxGeometry x="580" y="850" width="210" height="130" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="112" value="PK - Primary Key" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
|
||||
<mxGeometry y="26" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="113" value="FK - Foreign Key" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
|
||||
<mxGeometry y="52" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="114" value="1 - One entity" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
|
||||
<mxGeometry y="78" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="115" value="* - Many entities" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="111">
|
||||
<mxGeometry y="104" width="210" height="26" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
1
poweron/appdoc/doc_architecture_gateway.drawio
Normal file
BIN
poweron/appdoc/doc_architecture_gateway.pdf
Normal file
164
poweron/appdoc/doc_security_key_management.md
Normal file
|
|
@ -0,0 +1,164 @@
|
|||
# PowerOn Key Management Specification
|
||||
|
||||
## 1. Objective
|
||||
|
||||
PowerOn requires a secure, pragmatic key management system that:
|
||||
- **Encrypts all sensitive configuration values** (API keys, passwords, tokens) in configuration files
|
||||
- **Maintains strict environment separation** (dev/int/prod) with different master keys
|
||||
- **Enables local development** without internet dependency
|
||||
- **Provides simple developer workflow** for adding/updating encrypted keys
|
||||
- **Ensures production security** with external master key storage
|
||||
|
||||
## 2. Key Management Logic
|
||||
|
||||
### 2.1 Master Key Storage Strategy
|
||||
|
||||
**Development Environment:**
|
||||
- Master key stored locally in `<key file path>/key.txt` file
|
||||
- File format: `env = 256bit-base64-encoded-key`
|
||||
- Never committed to Git repository
|
||||
- Accessible for local development without internet
|
||||
|
||||
**Production/Integration Environments:**
|
||||
- Master key stored as Azure environment variable
|
||||
- Variable name defined by `APP_KEY_SYSVAR` configuration - to set to HIDDEN!
|
||||
- Fallback to file-based storage if environment variable not found
|
||||
- Complete separation from development keys
|
||||
|
||||
### 2.2 Encryption/Decryption Process
|
||||
|
||||
**Encryption Process:**
|
||||
1. **Key Detection**: Identify if value needs encryption (ends with `_SECRET`)
|
||||
2. **Master Key Retrieval**: Load appropriate master key based on environment
|
||||
3. **Key Derivation**: Use PBKDF2 to derive encryption key from master key
|
||||
4. **Value Encryption**: Encrypt using AES-256-GCM via Fernet
|
||||
5. **Prefix Addition**: Add environment-specific prefix (`DEV_ENC:`, `INT_ENC:`, `PROD_ENC:`)
|
||||
6. **Storage**: Save encrypted value to configuration file
|
||||
|
||||
**Decryption Process:**
|
||||
1. **Prefix Detection**: Check if value starts with environment prefix
|
||||
2. **Environment Validation**: Ensure prefix matches current environment
|
||||
3. **Master Key Retrieval**: Load master key for current environment
|
||||
4. **Key Derivation**: Derive same encryption key using PBKDF2
|
||||
5. **Value Decryption**: Decrypt using Fernet
|
||||
6. **Return**: Provide plain text value to application
|
||||
|
||||
### 2.3 Environment-Specific Master Keys
|
||||
|
||||
**Key Format in `key.txt`:**
|
||||
```
|
||||
prod = 256bit-key-for-config-encryption
|
||||
int = 256bit-key-for-config-encryption
|
||||
dev = 256bit-key-for-config-encryption
|
||||
```
|
||||
|
||||
**Environment Variable (Azure):**
|
||||
- Variable name: Value of `APP_KEY_SYSVAR` (e.g., `CONFIG_KEY`)
|
||||
- Value: 256-bit base64-encoded master key
|
||||
- Used for production and integration environments
|
||||
|
||||
## 3. Developer Workflow
|
||||
|
||||
### 3.1 Adding New Encrypted Keys
|
||||
|
||||
**Step 1: Identify Secret Value**
|
||||
- Locate configuration value ending with `_SECRET`
|
||||
- Determine if it's text or JSON format
|
||||
|
||||
**Step 2: Use Encryption Tool**
|
||||
```bash
|
||||
cd gateway
|
||||
python tool_encrypt_config_value.py --value "my_secret_value" --env dev
|
||||
```
|
||||
|
||||
**Step 3: Update Configuration File**
|
||||
- Copy encrypted output to appropriate `.env` file
|
||||
- Replace plain text value with encrypted version
|
||||
|
||||
**Step 4: Verify**
|
||||
- Restart application
|
||||
- Confirm secret is properly decrypted and accessible
|
||||
|
||||
### 3.2 Development Environment Setup
|
||||
|
||||
**Prerequisites:**
|
||||
1. Master key file exists at `<key file path>/key.txt`
|
||||
2. Environment variable `APP_KEY_SYSVAR` points to key file path
|
||||
3. Environment variable `APP_ENV_TYPE` set to `dev`
|
||||
|
||||
**Setup Steps:**
|
||||
1. **Generate Master Key**: Create secure 256-bit key for development
|
||||
2. **Create Key File**: Save key in `<key file path>/key.txt` with `dev = <key>`
|
||||
3. **Configure Environment**: Set `APP_KEY_SYSVAR` to key file path
|
||||
4. **Test Encryption**: Use tool to encrypt a test value
|
||||
5. **Verify Decryption**: Confirm application can decrypt values
|
||||
6. **Share key file with developer**: Share the key file with the developer
|
||||
|
||||
### 3.3 Azure Environment Setup
|
||||
|
||||
**Production Environment:**
|
||||
1. **Generate Production Key**: Create unique 256-bit master key
|
||||
2. **Store in Azure**: Add as environment variable with name from `APP_KEY_SYSVAR`
|
||||
4. **Deploy**: Application automatically uses Azure environment variable
|
||||
|
||||
**Integration Environment:**
|
||||
1. **Generate Integration Key**: Create unique 256-bit master key
|
||||
2. **Store in Azure**: Add as environment variable
|
||||
4. **Deploy**: Application uses integration-specific master key
|
||||
|
||||
## 4. Security Considerations
|
||||
|
||||
### 4.1 Master Key Protection
|
||||
- **Never log master keys** in application logs
|
||||
- **Use secure key derivation** (PBKDF2 with 100,000 iterations)
|
||||
- **Environment isolation** prevents cross-environment decryption
|
||||
- **External storage** keeps keys out of code repository
|
||||
|
||||
### 4.2 Encryption Security
|
||||
- **AES-256-GCM encryption** provides authenticated encryption
|
||||
- **Unique salt per environment** prevents key reuse
|
||||
- **Base64 encoding** for safe storage in configuration files
|
||||
- **Environment prefixes** prevent accidental cross-environment usage
|
||||
|
||||
### 4.3 Key Rotation Strategy
|
||||
- **Regular rotation** of master keys: No rotation, as keys are rotated
|
||||
|
||||
## 5. Configuration File Structure
|
||||
|
||||
### 5.1 Environment Files
|
||||
```
|
||||
gateway/
|
||||
├── .env # Active environment file for the application
|
||||
├── env_dev.env # Environment file for development including encrypted keys (*_SECRET)
|
||||
├── env_int.env # Environment file for integration including encrypted keys (*_SECRET)
|
||||
├── env_prod.env # Environment file for production including encrypted keys (*_SECRET)
|
||||
└── config.ini # Non-sensitive configuration parts for all environments
|
||||
```
|
||||
|
||||
### 5.2 Encrypted Value Format
|
||||
```
|
||||
# Text secrets
|
||||
API_KEY_SECRET = DEV_ENC:gAAAAABh...encrypted_value...
|
||||
|
||||
# JSON secrets
|
||||
SERVICE_ACCOUNT_SECRET = DEV_ENC:gAAAAABh...encrypted_json...
|
||||
```
|
||||
|
||||
## 6. Monitoring and Alerts
|
||||
|
||||
- **Track decryption attempts** per environment
|
||||
- **Alert on failed decryptions** or missing keys
|
||||
- **Log security events** (without exposing keys)
|
||||
|
||||
## 7. Best Practices
|
||||
|
||||
### 7.1 Developer Guidelines
|
||||
- **Always use encryption tool** for new secrets
|
||||
- **Never commit plain text secrets** to repository
|
||||
- **Test decryption** after encryption
|
||||
- **Use environment-specific tools** for each environment
|
||||
|
||||
### 7.2 Production Guidelines
|
||||
- **Secure key storage** in Azure Key Vault (future enhancement)
|
||||
- **Audit logging** for all key operations
|
||||
- **Documentation updates** for any changes
|
||||
48
poweron/appdoc/prompt_produce_diagrams.md
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
MERMAID DIAGRAM:
|
||||
|
||||
can you make chart "wiki/diagramm_komponenten.mermaid". produce an component diagram, based on current code in poweron/*
|
||||
if document existsadd missing components, remove obsolete components.
|
||||
|
||||
in box texts to use <br> instead of \n
|
||||
|
||||
for all subgraphs to to add path on a separate line to find the module in the code.
|
||||
|
||||
read all code modules caerfully to identify all components and their relations.
|
||||
|
||||
connectors without texts, only lines.
|
||||
|
||||
to add connector between frontend and backend (apiCalls.js -> app.py)
|
||||
|
||||
to connect app.py (Main application module) with the route*.py
|
||||
|
||||
to put all items of frontend into subgraph "Frontend"
|
||||
to put all items of gateway into subgraph "Gateway"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
to put following boxes to a dedicated subgraph within their existing subgraph:
|
||||
- workflowManager.py, workflowAgentsRegistry.py, documentProcessor.py, --> "Workflow"
|
||||
- mimeUtils.py, defAttributes.py, configuration.py, autho.py --> "Shared"
|
||||
- agent*.py --> "Agents"
|
||||
- workflow*.js --> "Workflow"
|
||||
- all *.js in js/modules/ not starting with workflow* --> "Administration"
|
||||
- formGeneric.js not to put to subgraph "Shared", but to a separated subgraph "Shared
|
||||
|
||||
to connect the main.js (main app in the frontend) to nativation.js, globalState.js, login.js, register.js, msftCall.js, config.js
|
||||
|
||||
to connect navigation.js to moduleLoader.js
|
||||
|
||||
to connect moduleLoader.js to workflow.js, and all *.js in js/modules/ not starting with workflow*
|
||||
|
||||
to connect all *.js in js/modules/ not starting with workflow* --> formGeneric.js
|
||||
|
||||
to connect fomrGeneric.js --> apiCalls.js
|
||||
|
||||
|
||||
to use underscores (e.g. Backend_Python, Workflow_Modules, etc.) for all subgraph titles.
|
||||
|
||||
if adding legend, then to give same colors like references to legend
|
||||
|
||||
|
|
@ -1,883 +0,0 @@
|
|||
================================================================================
|
||||
POWERON AI PLATFORM - UI TESTDOKUMENTATION
|
||||
================================================================================
|
||||
|
||||
ÜBERSICHT
|
||||
---------
|
||||
Dieses Dokument strukturiert alle UI-Funktionen der PowerOn AI Platform nach Views,
|
||||
Objekten und Attributen. Es dient als systematische Testanleitung für die Validierung
|
||||
der neuen UI-Implementierung.
|
||||
|
||||
================================================================================
|
||||
1. AUTHENTIFIZIERUNG & BENUTZERVERWALTUNG
|
||||
================================================================================
|
||||
|
||||
1.1 LOGIN VIEW (/login.html)
|
||||
---------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Form: #login-form
|
||||
- Input: #username (type="text", required, autocomplete="username")
|
||||
- Input: #password (type="password", required, autocomplete="current-password")
|
||||
- Input: #csrf-token (type="hidden", class="csrf-token")
|
||||
- Button: .login-btn (type="submit")
|
||||
|
||||
- Error Display: #login-error (class="login-error-message")
|
||||
|
||||
- Alternative Login Buttons:
|
||||
- Button: #msft-login-btn (class="register-btn msft-btn")
|
||||
- Button: #google-login-btn (class="register-btn msft-btn")
|
||||
- Link: .register-btn.local-btn (href="register.html")
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Username-Eingabe validiert (min. 3 Zeichen)
|
||||
□ Password-Eingabe maskiert Zeichen
|
||||
□ CSRF-Token wird generiert und übertragen
|
||||
□ Login-Button aktiviert Form-Submission
|
||||
□ Fehlerbehandlung bei ungültigen Credentials
|
||||
□ Microsoft Login öffnet OAuth-Popup
|
||||
□ Google Login öffnet OAuth-Popup
|
||||
□ "Registrieren" Link führt zu Register-View
|
||||
□ Form-Validation funktioniert (required fields)
|
||||
□ Autocomplete-Attribute sind gesetzt
|
||||
|
||||
1.2 REGISTER VIEW (/register.html)
|
||||
---------------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Form: #register-form
|
||||
- Input: #username (type="text", required, minlength="3")
|
||||
- Input: #password (type="password", required, minlength="8")
|
||||
- Input: #confirm-password (type="password", required)
|
||||
- Input: #email (type="email", required)
|
||||
- Input: #fullName (type="text", minlength="2")
|
||||
- Input: #authenticationAuthority (type="hidden", value="local")
|
||||
- Button: .login-btn (type="submit")
|
||||
|
||||
- Error Display: #register-error (class="login-error-message")
|
||||
- Navigation: .register-link > a (href="login.html")
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Username-Validierung (min. 3 Zeichen)
|
||||
□ Password-Validierung (min. 8 Zeichen)
|
||||
□ Password-Bestätigung prüft Übereinstimmung
|
||||
□ Email-Validierung (korrekte Email-Format)
|
||||
□ FullName ist optional (min. 2 Zeichen wenn ausgefüllt)
|
||||
□ AuthenticationAuthority ist auf "local" gesetzt
|
||||
□ Form-Submission erstellt neuen Benutzer
|
||||
□ Fehlerbehandlung bei Validierungsfehlern
|
||||
□ "Zum Login" Link führt zurück zu Login-View
|
||||
□ Alle required fields werden validiert
|
||||
|
||||
1.3 HOME VIEW (/poweron-home.html)
|
||||
---------------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Container: .container
|
||||
- Header: .header
|
||||
- H1: "PowerOn AI Platform"
|
||||
- P: Beschreibungstext
|
||||
- Content Sections: .content-section
|
||||
- H2: Sektionsüberschriften
|
||||
- P: Beschreibungstexte
|
||||
- Features: .features (grid layout)
|
||||
- Feature Cards: .feature-card
|
||||
- H3: Feature-Titel
|
||||
- P: Feature-Beschreibung
|
||||
- Navigation: .navigation
|
||||
- Links: .nav-link (href zu Privacy/Terms)
|
||||
- Footer: .footer
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Responsive Grid-Layout für Features
|
||||
□ Navigation-Links funktionieren
|
||||
□ Alle Textinhalte sind korrekt angezeigt
|
||||
□ CSS-Styling ist korrekt angewendet
|
||||
□ Mobile-Responsive Design funktioniert
|
||||
|
||||
================================================================================
|
||||
2. HAUPTANWENDUNG - MODULARES SYSTEM
|
||||
================================================================================
|
||||
|
||||
2.1 MAIN CONTAINER (/index.html)
|
||||
-------------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- App Container: .app-container
|
||||
- Sidebar: #sidebar (class="sidebar")
|
||||
- Header: .sidebar-header
|
||||
- H2: "PowerOn AI"
|
||||
- User Display: #user-name (class="current-user")
|
||||
- Environment: #environment-name (class="environment-info")
|
||||
- Navigation: .navigation-container
|
||||
- List: #main-navigation (ul)
|
||||
|
||||
- Main Content: .main-content
|
||||
- Module Container: #module-container (class="module-container")
|
||||
|
||||
- File Preview Modal: #file-preview-modal
|
||||
- Content: .file-preview-modal-content
|
||||
- Header: .file-preview-modal-header
|
||||
- Title: #file-preview-modal-title
|
||||
- Actions: .file-preview-modal-actions
|
||||
- Download: #modal-download-file-btn
|
||||
- Copy: #modal-copy-file-btn
|
||||
- Close: #modal-close-file-preview-btn
|
||||
- Body: #file-preview-modal-body
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Sidebar wird korrekt geladen
|
||||
□ Benutzername wird angezeigt
|
||||
□ Environment-Info wird angezeigt
|
||||
□ Navigation wird dynamisch generiert
|
||||
□ Module-Container wechselt zwischen Views
|
||||
□ File-Preview-Modal funktioniert
|
||||
□ Modal-Actions (Download, Copy, Close) funktionieren
|
||||
|
||||
2.2 NAVIGATION SYSTEM
|
||||
--------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Navigation List: #main-navigation
|
||||
- Items: .nav-item (data-module, data-level)
|
||||
- Links: a (href="#moduleName")
|
||||
- Icons: i.fas (FontAwesome icons)
|
||||
- Labels: span (text content)
|
||||
|
||||
- Folder Items: .folder-header
|
||||
- Toggle Icon: .toggle-icon (fa-chevron-down)
|
||||
- Collapsed State: .collapsed
|
||||
|
||||
- Dropdown Items: .dropdown
|
||||
- Toggle: .dropdown-toggle
|
||||
- Content: .dropdown-content
|
||||
- Options: a (data-value)
|
||||
|
||||
- Action Items: .nav-action-btn
|
||||
- Dynamic Labels: span (text updates based on state)
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Module-Navigation funktioniert
|
||||
□ Folder-Toggle (auf/zu) funktioniert
|
||||
□ Dropdown-Menüs öffnen/schließen
|
||||
□ Action-Buttons (Logout, MS Login) funktionieren
|
||||
□ Aktive Module werden hervorgehoben
|
||||
□ Hierarchische Navigation funktioniert
|
||||
□ Dynamic Labels werden aktualisiert
|
||||
|
||||
================================================================================
|
||||
3. WORKFLOW MODULE
|
||||
================================================================================
|
||||
|
||||
3.1 WORKFLOW VIEW (part_workflow.html)
|
||||
-------------------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Container: .workflow-container
|
||||
- Chat Section: .chat-section
|
||||
- Columns: .chat-columns
|
||||
- Left Column: .chat-left (70%)
|
||||
- Empty State: #empty-chat-state (class="empty-state")
|
||||
- Icon: i.fas.fa-comments.fa-3x
|
||||
- Title: h4 "Noch keine Kommunikation"
|
||||
- Description: p
|
||||
- Content Area: #unified-content-area (class="unified-content-area")
|
||||
- Right Column: .chat-right (30%)
|
||||
- Dashboard: #workflow-dashboard-container
|
||||
- Header: .workflow-dashboard-header
|
||||
- Title: h4 "Workflow Progress"
|
||||
- Actions: .dashboard-actions
|
||||
- Refresh: #refresh-dashboard-btn
|
||||
- Minimize: #minimize-dashboard-btn
|
||||
- Content: #workflow-dashboard-content
|
||||
|
||||
- Footer: .workflow-footer
|
||||
- Columns: .footer-columns
|
||||
- Left Column: .footer-left (70%)
|
||||
- Input Area: #user-input-area (class="user-input-area file-dropzone-wrapper")
|
||||
- Container: .user-input-container
|
||||
- Prompt Selection: .prompt-selection
|
||||
- Select: #prompt-select-main (class="form-control")
|
||||
- Textarea: #user-message-input (class="form-control")
|
||||
- Actions: .user-input-actions
|
||||
- File Actions: .file-actions
|
||||
- Upload Button: #upload-additional-file-btn
|
||||
- File Input: #additional-file-input (type="file", multiple, hidden)
|
||||
- Workflow Controls: .workflow-controls
|
||||
- Stop: #stop-workflow-btn (class="btn btn-danger")
|
||||
- Reset: #reset-btn (class="btn btn-outline-secondary")
|
||||
- Refresh Tokens: #refresh-tokens-btn (class="btn btn-outline-warning")
|
||||
- Send: #send-user-message-btn (class="btn btn-primary")
|
||||
- Right Column: .footer-right (30%)
|
||||
- Statistics: #data-statistics (class="data-statistics")
|
||||
- Items: .stat-item (data sent, received, time, tokens)
|
||||
- Files Container: #additional-files-container
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Empty State wird korrekt angezeigt
|
||||
□ Unified Content Area zeigt Logs und Messages
|
||||
□ Dashboard zeigt Workflow-Progress
|
||||
□ Prompt-Selection lädt verfügbare Prompts
|
||||
□ User-Input funktioniert (Textarea)
|
||||
□ File-Upload (Button + Drag & Drop)
|
||||
□ Workflow-Controls (Start, Stop, Reset, Refresh Tokens)
|
||||
□ Statistics werden angezeigt
|
||||
□ Additional Files werden gelistet
|
||||
□ Drag & Drop funktioniert
|
||||
□ Enter-Key sendet Message
|
||||
□ Shift+Enter fügt neue Zeile hinzu
|
||||
|
||||
3.2 WORKFLOW STATE MANAGEMENT
|
||||
----------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Workflow States: WORKFLOW_STATES
|
||||
- NULL: null
|
||||
- RUNNING: 'running'
|
||||
- COMPLETED: 'completed'
|
||||
- FAILED: 'failed'
|
||||
- STOPPED: 'stopped'
|
||||
|
||||
- State Properties:
|
||||
- currentTask: number
|
||||
- currentAction: number
|
||||
- currentRound: number
|
||||
- totalTasks: number
|
||||
- totalActions: number
|
||||
- status: string
|
||||
- workflowId: string
|
||||
- pollActive: boolean
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ State-Transitions funktionieren korrekt
|
||||
□ Polling startet/stoppt bei State-Änderungen
|
||||
□ UI aktualisiert sich bei State-Änderungen
|
||||
□ Error-Handling bei State-Transitions
|
||||
□ Workflow-ID wird korrekt gesetzt
|
||||
□ Progress-Tracking funktioniert
|
||||
|
||||
3.3 FILE HANDLING
|
||||
----------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- File Objects:
|
||||
- id: string
|
||||
- fileName: string
|
||||
- fileSize: number
|
||||
- mimeType: string
|
||||
- content: Blob/File
|
||||
|
||||
- File Upload:
|
||||
- Input: #additional-file-input
|
||||
- Button: #upload-additional-file-btn
|
||||
- Container: #additional-files-container
|
||||
|
||||
- File Display:
|
||||
- Items: .additional-file-item
|
||||
- Icon: i.fas.fa-file
|
||||
- Name: .file-name
|
||||
- Size: .file-size
|
||||
- Remove: .remove-file-btn (data-file-id)
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ File-Upload funktioniert (Button + Drag & Drop)
|
||||
□ Multiple Files werden unterstützt
|
||||
□ File-Validation (Type, Size)
|
||||
□ File-Display zeigt korrekte Informationen
|
||||
□ File-Removal funktioniert
|
||||
□ File-Preview funktioniert
|
||||
□ Download-Links funktionieren
|
||||
|
||||
================================================================================
|
||||
4. USER MANAGEMENT MODULE
|
||||
================================================================================
|
||||
|
||||
4.1 USERS VIEW (part_formUsers.html)
|
||||
-----------------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Container: #users-view
|
||||
- Card: .card
|
||||
- Header: .section-header
|
||||
- Title: h3 "Verfügbare Benutzer"
|
||||
- Add Button: #add-user-btn (class="add-btn")
|
||||
- List Container: #users-list
|
||||
|
||||
- User Objects:
|
||||
- id: string
|
||||
- username: string
|
||||
- email: string
|
||||
- password: string (hashed)
|
||||
- enabled: boolean
|
||||
- language: string
|
||||
- privilege: string ('admin', 'user', 'sysadmin')
|
||||
- mandateId: string
|
||||
- authenticationAuthority: string
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ User-Liste wird geladen
|
||||
□ Add-Button öffnet User-Form
|
||||
□ User-Table zeigt alle Attribute
|
||||
□ Edit-Button öffnet Edit-Form
|
||||
□ Delete-Button löscht User
|
||||
□ Enable/Disable-Toggle funktioniert
|
||||
□ Form-Validation funktioniert
|
||||
□ User-Creation funktioniert
|
||||
□ User-Update funktioniert
|
||||
□ User-Deletion funktioniert
|
||||
|
||||
4.2 USER FORM FIELDS
|
||||
-------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Form Fields (from API getEntityAttributes('User')):
|
||||
- username: text, required, minlength=3
|
||||
- email: email, required
|
||||
- password: password, required, minlength=8
|
||||
- enabled: checkbox
|
||||
- language: select, options from backend
|
||||
- privilege: select, options: ['admin', 'user', 'sysadmin']
|
||||
|
||||
- Form Actions:
|
||||
- Save: .entity-save-btn
|
||||
- Cancel: .entity-cancel-btn
|
||||
- Delete: .entity-delete-btn
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Alle Form-Felder werden korrekt gerendert
|
||||
□ Field-Types entsprechen Backend-Definition
|
||||
□ Required-Validation funktioniert
|
||||
□ Minlength-Validation funktioniert
|
||||
□ Select-Options werden geladen
|
||||
□ Form-Submission funktioniert
|
||||
□ Error-Messages werden angezeigt
|
||||
□ Success-Messages werden angezeigt
|
||||
|
||||
================================================================================
|
||||
5. CONNECTION MANAGEMENT MODULE
|
||||
================================================================================
|
||||
|
||||
5.1 CONNECTIONS VIEW (part_formConnections.html)
|
||||
-----------------------------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Container: #connections-view
|
||||
- Card: .card
|
||||
- Header: .section-header
|
||||
- Title: h3 "External Connections"
|
||||
- Add Buttons: #add-connection-buttons
|
||||
- Google: #connect-google-btn (class="add-btn")
|
||||
- Microsoft: #connect-msft-btn (class="add-btn")
|
||||
- List Container: #connections-list
|
||||
|
||||
- Connection Objects:
|
||||
- id: string
|
||||
- userId: string
|
||||
- authority: string ('google', 'msft')
|
||||
- externalUsername: string
|
||||
- externalEmail: string
|
||||
- status: string ('active', 'pending', 'needs_reconnection')
|
||||
- expiresAt: number (UTC timestamp)
|
||||
- lastChecked: number (UTC timestamp)
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Connection-Liste wird geladen
|
||||
□ Google-Connect-Button funktioniert
|
||||
□ Microsoft-Connect-Button funktioniert
|
||||
□ Connection-Status wird angezeigt
|
||||
□ Token-Expiration wird angezeigt
|
||||
□ Refresh-Token-Button funktioniert
|
||||
□ Connection-Deletion funktioniert
|
||||
□ OAuth-Popup funktioniert
|
||||
□ Token-Refresh funktioniert
|
||||
□ Expired-Token-Warning funktioniert
|
||||
|
||||
5.2 TOKEN MANAGEMENT
|
||||
-------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Token Status:
|
||||
- hasValidToken: boolean
|
||||
- hasRefreshableToken: boolean
|
||||
- isExpired: boolean
|
||||
- expiresSoon: boolean (5 min buffer)
|
||||
|
||||
- Token Actions:
|
||||
- Refresh: .entity-refresh-token-btn
|
||||
- Cleanup: automatic cleanup
|
||||
- Warning: #refresh-tokens-btn (shows when tokens expire soon)
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Token-Status wird korrekt erkannt
|
||||
□ Expired-Token-Detection funktioniert
|
||||
□ Token-Refresh funktioniert
|
||||
□ Automatic-Cleanup funktioniert
|
||||
□ Warning-Button wird angezeigt
|
||||
□ Token-Status-Updates funktionieren
|
||||
□ Error-Handling bei Token-Refresh
|
||||
|
||||
================================================================================
|
||||
6. FILE MANAGEMENT MODULE
|
||||
================================================================================
|
||||
|
||||
6.1 FILES VIEW (part_formFiles.html)
|
||||
-----------------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Container: #files-view
|
||||
- Card: .card
|
||||
- Header: .section-header
|
||||
- Title: h3 "Meine Dateien"
|
||||
- List Container: #my-files-list (class="files-list-container")
|
||||
- Empty State: #empty-files-state (class="empty-state")
|
||||
- Icon: i.fas.fa-file-alt.empty-icon
|
||||
- Message: p "Noch keine Dateien vorhanden."
|
||||
|
||||
- Upload Section: #upload-section (class="upload-section")
|
||||
- Upload Area: .upload-area
|
||||
- Icon: .upload-icon > i.fas.fa-cloud-upload-alt
|
||||
- Text: .upload-text
|
||||
- Button: .upload-button > input#file-upload-input (type="file", multiple, hidden)
|
||||
|
||||
- File Objects:
|
||||
- id: string
|
||||
- fileName: string
|
||||
- mimeType: string
|
||||
- fileSize: number
|
||||
- creationDate: number (UTC timestamp)
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ File-Liste wird geladen
|
||||
□ Upload-Section wird angezeigt
|
||||
□ Drag & Drop funktioniert
|
||||
□ File-Selection funktioniert
|
||||
□ Multiple-File-Upload funktioniert
|
||||
□ File-Information wird angezeigt
|
||||
□ Empty-State wird angezeigt
|
||||
□ File-Actions funktionieren
|
||||
|
||||
6.2 FILE ACTIONS
|
||||
---------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- File Action Buttons:
|
||||
- Download: .entity-view-btn
|
||||
- Icon: i.fas.fa-download
|
||||
- Text: "Download"
|
||||
- Copy Link: .entity-copy-btn
|
||||
- Icon: i.fas.fa-clipboard
|
||||
- Text: "Copy Download Link"
|
||||
- Edit: .entity-edit-btn
|
||||
- Delete: .entity-delete-btn
|
||||
|
||||
- File Edit Modal: #edit-file-modal
|
||||
- Name Field: #edit-file-name
|
||||
- Upload Field: #edit-file-upload
|
||||
- Save Button: .entity-modal-save
|
||||
- Cancel Button: .entity-modal-cancel
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Download-Button funktioniert
|
||||
□ Copy-Link-Button funktioniert
|
||||
□ Edit-Button öffnet Modal
|
||||
□ Delete-Button löscht File
|
||||
□ File-Edit-Modal funktioniert
|
||||
□ File-Rename funktioniert
|
||||
□ File-Replacement funktioniert
|
||||
□ Modal-Validation funktioniert
|
||||
|
||||
================================================================================
|
||||
7. WORKFLOW LIST MODULE
|
||||
================================================================================
|
||||
|
||||
7.1 WORKFLOWS VIEW (part_formWorkflows.html)
|
||||
-------------------------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Container: #workflows-view
|
||||
- Card: .card
|
||||
- Header: .section-header
|
||||
- Title: h3 "Workflows"
|
||||
- Add Button: #add-workflow-btn (class="add-btn")
|
||||
- List Container: #workflows-list
|
||||
|
||||
- Workflow Objects:
|
||||
- id: string
|
||||
- name: string
|
||||
- status: string ('running', 'completed', 'stopped', 'error')
|
||||
- currentRound: number
|
||||
- lastActivity: number (UTC timestamp)
|
||||
- mandateId: string
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Workflow-Liste wird geladen
|
||||
□ Add-Button öffnet Workflow-Form
|
||||
□ Workflow-Status wird angezeigt
|
||||
□ Last-Activity wird formatiert angezeigt
|
||||
□ Continue-Button funktioniert
|
||||
□ Workflow-Creation funktioniert
|
||||
□ Workflow-Deletion funktioniert
|
||||
□ Sorting funktioniert (by lastActivity)
|
||||
□ Status-Badges werden korrekt angezeigt
|
||||
|
||||
7.2 WORKFLOW TABLE FORMATTING
|
||||
----------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Table Fields:
|
||||
- id: text, readonly
|
||||
- name: text, readonly
|
||||
- status: select, readonly, options: ['running', 'completed', 'stopped', 'error']
|
||||
- currentRound: number, readonly
|
||||
- lastActivity: timestamp, readonly
|
||||
|
||||
- Field Formatters:
|
||||
- status: badge formatting (success, info, warning, danger)
|
||||
- lastActivity: UTC timestamp formatting
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Table-Columns werden korrekt angezeigt
|
||||
□ Status-Badges haben richtige Farben
|
||||
□ Timestamp-Formatting funktioniert
|
||||
□ Sorting funktioniert
|
||||
□ Field-Alignment ist korrekt
|
||||
□ Readonly-Fields sind nicht editierbar
|
||||
|
||||
================================================================================
|
||||
8. PROMPT MANAGEMENT MODULE
|
||||
================================================================================
|
||||
|
||||
8.1 PROMPTS VIEW (part_formPrompts.html)
|
||||
---------------------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Container: #prompts-view
|
||||
- Card: .card
|
||||
- Header: .section-header
|
||||
- Title: h3 "Prompts"
|
||||
- Add Button: #add-prompt-btn (class="add-btn")
|
||||
- List Container: #prompts-list
|
||||
|
||||
- Prompt Objects:
|
||||
- id: string
|
||||
- name: string
|
||||
- content: string
|
||||
- mandateId: string
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Prompt-Liste wird geladen
|
||||
□ Add-Button öffnet Prompt-Form
|
||||
□ Prompt-Name wird angezeigt
|
||||
□ Prompt-Content wird angezeigt
|
||||
□ Copy-Button funktioniert
|
||||
□ Prompt-Creation funktioniert
|
||||
□ Prompt-Update funktioniert
|
||||
□ Prompt-Deletion funktioniert
|
||||
□ Form-Validation funktioniert
|
||||
|
||||
8.2 PROMPT FORM FIELDS
|
||||
---------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Form Fields (from API getEntityAttributes('Prompt')):
|
||||
- name: text, required
|
||||
- content: textarea, required
|
||||
|
||||
- Form Actions:
|
||||
- Save: .entity-save-btn
|
||||
- Cancel: .entity-cancel-btn
|
||||
- Copy: .entity-copy-btn
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Name-Field ist required
|
||||
□ Content-Field ist textarea
|
||||
□ Form-Validation funktioniert
|
||||
□ Copy-to-Clipboard funktioniert
|
||||
□ Form-Submission funktioniert
|
||||
□ Error-Handling funktioniert
|
||||
|
||||
8.3 PROMPT INTEGRATION
|
||||
---------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Workflow Integration:
|
||||
- Select: #prompt-select-main
|
||||
- Options: option (value=promptId, text=promptName)
|
||||
- Textarea: #user-message-input
|
||||
|
||||
- Event Handling:
|
||||
- prompt:created event
|
||||
- prompt:updated event
|
||||
- prompt:deleted event
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Prompt-Dropdown wird geladen
|
||||
□ Prompt-Selection lädt Content
|
||||
□ Event-Handling funktioniert
|
||||
□ Global-Prompt-List wird aktualisiert
|
||||
□ Workflow-Integration funktioniert
|
||||
|
||||
================================================================================
|
||||
9. UI COMPONENTS & SHARED ELEMENTS
|
||||
================================================================================
|
||||
|
||||
9.1 MODALS
|
||||
---------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- File Preview Modal: #file-preview-modal
|
||||
- Content: .file-preview-modal-content
|
||||
- Header: .file-preview-modal-header
|
||||
- Title: #file-preview-modal-title
|
||||
- Actions: .file-preview-modal-actions
|
||||
- Body: #file-preview-modal-body
|
||||
|
||||
- Edit Modals: .entity-modal
|
||||
- Content: .entity-modal-content
|
||||
- Header: .entity-modal-header
|
||||
- Body: .entity-modal-body
|
||||
- Footer: .entity-modal-footer
|
||||
- Close: .entity-modal-close
|
||||
- Save: .entity-modal-save
|
||||
- Cancel: .entity-modal-cancel
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Modal-Öffnung funktioniert
|
||||
□ Modal-Schließung funktioniert
|
||||
□ Modal-Content wird korrekt angezeigt
|
||||
□ Modal-Actions funktionieren
|
||||
□ Modal-Validation funktioniert
|
||||
□ Modal-Overlay funktioniert
|
||||
□ Escape-Key schließt Modal
|
||||
|
||||
9.2 NOTIFICATIONS
|
||||
----------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Toast Messages: window.utils.ui.showToast()
|
||||
- Types: 'success', 'error', 'warning', 'info'
|
||||
- Properties: title, message, type
|
||||
- Styling: .toast-success, .toast-error, .toast-warning, .toast-info
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Success-Toasts werden angezeigt
|
||||
□ Error-Toasts werden angezeigt
|
||||
□ Warning-Toasts werden angezeigt
|
||||
□ Info-Toasts werden angezeigt
|
||||
□ Toast-Auto-Dismiss funktioniert
|
||||
□ Toast-Styling ist korrekt
|
||||
□ Multiple-Toasts funktionieren
|
||||
|
||||
9.3 FORM VALIDATION
|
||||
------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Validation Rules:
|
||||
- required: boolean
|
||||
- minlength: number
|
||||
- maxlength: number
|
||||
- pattern: regex
|
||||
- type: string (text, email, password, etc.)
|
||||
|
||||
- Error Display:
|
||||
- Field Errors: .field-error
|
||||
- Form Errors: .form-error
|
||||
- Validation Messages: dynamic text content
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Required-Validation funktioniert
|
||||
□ Minlength-Validation funktioniert
|
||||
□ Email-Validation funktioniert
|
||||
□ Password-Validation funktioniert
|
||||
□ Real-time-Validation funktioniert
|
||||
□ Error-Messages werden angezeigt
|
||||
□ Success-Validation funktioniert
|
||||
|
||||
9.4 TABLES
|
||||
----------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Table Structure:
|
||||
- Container: .table-container
|
||||
- Table: table
|
||||
- Header: thead > tr > th
|
||||
- Body: tbody > tr > td
|
||||
- Actions: .entity-actions-cell
|
||||
|
||||
- Table Features:
|
||||
- Sorting: .sortable (data-sort)
|
||||
- Filtering: .filter-input
|
||||
- Pagination: .pagination
|
||||
- Empty State: .empty-state
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Table-Rendering funktioniert
|
||||
□ Column-Headers werden angezeigt
|
||||
□ Data-Rows werden angezeigt
|
||||
□ Action-Buttons funktionieren
|
||||
□ Sorting funktioniert
|
||||
□ Filtering funktioniert
|
||||
□ Pagination funktioniert
|
||||
□ Empty-State wird angezeigt
|
||||
|
||||
9.5 RESPONSIVE DESIGN
|
||||
--------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Breakpoints:
|
||||
- Mobile: < 768px
|
||||
- Tablet: 768px - 1024px
|
||||
- Desktop: > 1024px
|
||||
|
||||
- Responsive Classes:
|
||||
- .d-none, .d-block
|
||||
- .d-md-none, .d-md-block
|
||||
- .d-lg-none, .d-lg-block
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Mobile-Layout funktioniert
|
||||
□ Tablet-Layout funktioniert
|
||||
□ Desktop-Layout funktioniert
|
||||
□ Navigation ist responsive
|
||||
□ Tables sind responsive
|
||||
□ Forms sind responsive
|
||||
□ Modals sind responsive
|
||||
|
||||
================================================================================
|
||||
10. PERFORMANCE & ERROR HANDLING
|
||||
================================================================================
|
||||
|
||||
10.1 LOADING STATES
|
||||
-----------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Loading Indicators:
|
||||
- Spinner: .spinner, .loading
|
||||
- Progress: .progress-bar
|
||||
- Skeleton: .skeleton-loader
|
||||
|
||||
- Loading States:
|
||||
- Module Loading: moduleLoader states
|
||||
- Data Loading: formGeneric loading
|
||||
- API Loading: apiCalls loading
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Loading-Indicators werden angezeigt
|
||||
□ Loading-States werden korrekt gesetzt
|
||||
□ Loading-Errors werden behandelt
|
||||
□ Loading-Performance ist akzeptabel
|
||||
□ Loading-Cancellation funktioniert
|
||||
|
||||
10.2 ERROR HANDLING
|
||||
-----------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Error Types:
|
||||
- Validation Errors: form validation
|
||||
- API Errors: network/server errors
|
||||
- JavaScript Errors: runtime errors
|
||||
- User Errors: user input errors
|
||||
|
||||
- Error Display:
|
||||
- Error Messages: .error-message
|
||||
- Error Toasts: showToast('error', ...)
|
||||
- Error Modals: .error-modal
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Validation-Errors werden angezeigt
|
||||
□ API-Errors werden behandelt
|
||||
□ JavaScript-Errors werden abgefangen
|
||||
□ User-Errors werden erklärt
|
||||
□ Error-Recovery funktioniert
|
||||
□ Error-Logging funktioniert
|
||||
|
||||
10.3 MEMORY MANAGEMENT
|
||||
--------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Memory Cleanup:
|
||||
- Event Listeners: removeEventListener
|
||||
- Intervals: clearInterval
|
||||
- Timeouts: clearTimeout
|
||||
- Objects: null assignment
|
||||
|
||||
- Module Cleanup:
|
||||
- onDeactivation: module cleanup
|
||||
- Event Cleanup: removeEventListeners
|
||||
- State Cleanup: reset state
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Event-Listeners werden entfernt
|
||||
□ Intervals werden gestoppt
|
||||
□ Timeouts werden gestoppt
|
||||
□ Module-Cleanup funktioniert
|
||||
□ Memory-Leaks werden vermieden
|
||||
□ Performance bleibt stabil
|
||||
|
||||
================================================================================
|
||||
11. ACCESSIBILITY & USABILITY
|
||||
================================================================================
|
||||
|
||||
11.1 KEYBOARD NAVIGATION
|
||||
-----------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- Focus Management:
|
||||
- Tab Order: tabindex
|
||||
- Focus Indicators: :focus styles
|
||||
- Focus Trapping: modal focus
|
||||
|
||||
- Keyboard Shortcuts:
|
||||
- Enter: form submission
|
||||
- Escape: modal close
|
||||
- Tab: next element
|
||||
- Shift+Tab: previous element
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ Tab-Navigation funktioniert
|
||||
□ Focus-Indicators sind sichtbar
|
||||
□ Keyboard-Shortcuts funktionieren
|
||||
□ Focus-Trapping funktioniert
|
||||
□ Skip-Links funktionieren
|
||||
|
||||
11.2 SCREEN READER SUPPORT
|
||||
------------------------
|
||||
OBJEKTE & ATTRIBUTE:
|
||||
- ARIA Attributes:
|
||||
- aria-label: element labels
|
||||
- aria-describedby: element descriptions
|
||||
- aria-expanded: expandable elements
|
||||
- aria-hidden: hidden elements
|
||||
|
||||
- Semantic HTML:
|
||||
- Headings: h1-h6 hierarchy
|
||||
- Lists: ul, ol, li
|
||||
- Forms: form, label, input
|
||||
- Tables: table, th, td
|
||||
|
||||
FUNKTIONEN ZU TESTEN:
|
||||
□ ARIA-Attribute sind gesetzt
|
||||
□ Semantic-HTML ist korrekt
|
||||
□ Screen-Reader-Navigation funktioniert
|
||||
□ Alt-Text ist vorhanden
|
||||
□ Form-Labels sind korrekt
|
||||
|
||||
================================================================================
|
||||
12. TESTING CHECKLIST
|
||||
================================================================================
|
||||
|
||||
ALLGEMEINE TESTS:
|
||||
□ Alle Views laden korrekt
|
||||
□ Navigation zwischen Modulen funktioniert
|
||||
□ Responsive Design funktioniert
|
||||
□ Error-Handling funktioniert
|
||||
□ Loading-States funktionieren
|
||||
□ Form-Validation funktioniert
|
||||
□ Modal-Funktionalität funktioniert
|
||||
□ Toast-Notifications funktionieren
|
||||
□ Keyboard-Navigation funktioniert
|
||||
□ Screen-Reader-Support funktioniert
|
||||
|
||||
WORKFLOW-SPEZIFISCHE TESTS:
|
||||
□ Workflow-Erstellung funktioniert
|
||||
□ Workflow-Ausführung funktioniert
|
||||
□ Workflow-Stopp funktioniert
|
||||
□ Workflow-Reset funktioniert
|
||||
□ File-Upload funktioniert
|
||||
□ Prompt-Selection funktioniert
|
||||
□ Dashboard-Updates funktionieren
|
||||
□ State-Management funktioniert
|
||||
|
||||
DATEN-MANAGEMENT TESTS:
|
||||
□ User-CRUD funktioniert
|
||||
□ Connection-Management funktioniert
|
||||
□ File-Management funktioniert
|
||||
□ Prompt-Management funktioniert
|
||||
□ Workflow-List funktioniert
|
||||
□ Token-Management funktioniert
|
||||
□ Data-Synchronisation funktioniert
|
||||
|
||||
UI-COMPONENT TESTS:
|
||||
□ Tables funktionieren
|
||||
□ Forms funktionieren
|
||||
□ Buttons funktionieren
|
||||
□ Modals funktionieren
|
||||
□ Dropdowns funktionieren
|
||||
□ File-Upload funktioniert
|
||||
□ Drag & Drop funktioniert
|
||||
|
||||
================================================================================
|
||||
ENDE DER TESTDOKUMENTATION
|
||||
================================================================================
|
||||
|
Before Width: | Height: | Size: 379 KiB After Width: | Height: | Size: 379 KiB |
|
Before Width: | Height: | Size: 512 KiB After Width: | Height: | Size: 512 KiB |
|
Before Width: | Height: | Size: 418 KiB After Width: | Height: | Size: 418 KiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
337
poweron/implementation/implementation_key_management.md
Normal file
|
|
@ -0,0 +1,337 @@
|
|||
# PowerOn Key Management Implementation Specification
|
||||
|
||||
## 1. Implementation Overview
|
||||
|
||||
This document outlines the step-by-step implementation of the PowerOn Key Management system, building upon the existing configuration framework while adding robust encryption/decryption capabilities.
|
||||
|
||||
## 2. Core Components to Implement
|
||||
|
||||
### 2.1 Enhanced Configuration Module (`gateway/modules/shared/configuration.py`)
|
||||
|
||||
**Current State:**
|
||||
- Basic configuration loading from `config.ini` and `.env` files
|
||||
- Simple `handleSecretText()` and `handleSecretJson()` functions (no encryption)
|
||||
- Global `APP_CONFIG` object for configuration access
|
||||
|
||||
**Required Enhancements:**
|
||||
1. **Master Key Management Functions**
|
||||
2. **Encryption/Decryption Functions**
|
||||
3. **Environment Detection Logic**
|
||||
4. **Enhanced Secret Handling Functions**
|
||||
|
||||
### 2.2 Encryption Tool (`gateway/tool_encrypt_config_value.py`)
|
||||
|
||||
**Purpose:** Command-line tool for developers to encrypt secret values
|
||||
**Features:**
|
||||
- Interactive and command-line modes
|
||||
- Support for text and JSON values
|
||||
- Environment-specific encryption
|
||||
- Decryption testing capability
|
||||
|
||||
### 2.3 Master Key Generation (`gateway/generate_master_keys.py`)
|
||||
|
||||
**Purpose:** Generate secure master keys for all environments
|
||||
**Output:** Update `local/key.txt` with new secure keys
|
||||
|
||||
## 3. Detailed Implementation Steps
|
||||
|
||||
### Step 1: Add Required Dependencies
|
||||
|
||||
**File:** `gateway/requirements.txt`
|
||||
**Action:** Add cryptography library
|
||||
```txt
|
||||
cryptography>=41.0.0
|
||||
```
|
||||
|
||||
### Step 2: Implement Master Key Management
|
||||
|
||||
**File:** `gateway/modules/shared/configuration.py`
|
||||
|
||||
**Functions to Add:**
|
||||
1. `_get_master_key() -> bytes`
|
||||
- Read from environment variable (Azure)
|
||||
- Fallback to file-based storage (`local/key.txt`)
|
||||
- Parse environment-specific key from file
|
||||
- Error handling for missing keys
|
||||
|
||||
2. `_derive_encryption_key(master_key: bytes) -> bytes`
|
||||
- Use PBKDF2 with SHA-256
|
||||
- Fixed salt for consistency
|
||||
- 100,000 iterations
|
||||
- Return 32-byte key for Fernet
|
||||
|
||||
3. `_is_encrypted_value(value: str) -> bool`
|
||||
- Check for environment-specific encryption prefixes (e.g., `{ENV}_ENC:`)
|
||||
- Dynamically detect prefixes based on current environment
|
||||
- Return True if encrypted, False otherwise
|
||||
|
||||
4. `_get_encryption_prefix(env_type: str) -> str`
|
||||
- Generate environment-specific prefix dynamically
|
||||
- Format: `{ENV_TYPE}_ENC:` (uppercase environment type)
|
||||
- Support any environment type (dev/int/prod/staging/etc.)
|
||||
|
||||
5. `_check_decryption_rate_limit(env_type: str) -> bool`
|
||||
- Track decryption attempts per environment
|
||||
- Enforce maximum 1 decryption per second
|
||||
- Return True if allowed, False if rate limited
|
||||
- Log rate limit violations for security monitoring
|
||||
|
||||
### Step 3: Implement Encryption/Decryption Functions
|
||||
|
||||
**File:** `gateway/modules/shared/configuration.py`
|
||||
|
||||
**Functions to Add:**
|
||||
1. `encrypt_value(value: str, env_type: str = None) -> str`
|
||||
- Get master key for specified environment
|
||||
- Derive encryption key using PBKDF2
|
||||
- Encrypt using Fernet (AES-256-GCM)
|
||||
- Add dynamically generated environment-specific prefix
|
||||
- Return base64-encoded encrypted value
|
||||
|
||||
2. `decrypt_value(encrypted_value: str) -> str`
|
||||
- Check decryption rate limit for current environment
|
||||
- Validate encryption prefix (dynamic environment detection)
|
||||
- Extract encrypted portion
|
||||
- Get master key for current environment
|
||||
- Derive decryption key
|
||||
- Decrypt using Fernet
|
||||
- Return plain text value
|
||||
|
||||
### Step 4: Enhance Secret Handling Functions
|
||||
|
||||
**File:** `gateway/modules/shared/configuration.py`
|
||||
|
||||
**Modify Existing Functions:**
|
||||
1. `handleSecretText(value: str) -> str`
|
||||
- Check if value is encrypted
|
||||
- Decrypt if encrypted, return as-is if not
|
||||
- Maintain backward compatibility
|
||||
|
||||
2. `handleSecretJson(value: str) -> str`
|
||||
- Check if value is encrypted
|
||||
- Decrypt if encrypted
|
||||
- Validate JSON format after decryption
|
||||
- Return decrypted JSON string
|
||||
|
||||
### Step 5: Create Encryption Tool
|
||||
|
||||
**File:** `gateway/tool_encrypt_config_value.py`
|
||||
|
||||
**Features:**
|
||||
- Command-line interface with argparse
|
||||
- Support for `--value`, `--file`, `--env` parameters
|
||||
- Interactive mode for user input
|
||||
- JSON validation for structured data
|
||||
- Decryption testing with `--decrypt` flag
|
||||
- Usage examples and help text
|
||||
|
||||
**Usage Examples:**
|
||||
```bash
|
||||
# Interactive mode
|
||||
python tool_encrypt_config_value.py
|
||||
|
||||
# Command line mode
|
||||
python tool_encrypt_config_value.py --value "my_secret" --env dev
|
||||
|
||||
# File input
|
||||
python tool_encrypt_config_value.py --file "service_account.json" --env prod
|
||||
|
||||
# Test decryption
|
||||
python tool_encrypt_config_value.py --decrypt "DEV_ENC:gAAAAABh..."
|
||||
```
|
||||
|
||||
### Step 6: Create Master Key Generator
|
||||
|
||||
**File:** `gateway/generate_master_keys.py`
|
||||
|
||||
**Features:**
|
||||
- Generate cryptographically secure 256-bit keys
|
||||
- Base64 encoding for safe storage
|
||||
- Update `local/key.txt` file
|
||||
- Support for all environments (dev/int/prod)
|
||||
|
||||
**Output Format:**
|
||||
```
|
||||
prod = <256-bit-base64-key>
|
||||
int = <256-bit-base64-key>
|
||||
dev = <256-bit-base64-key>
|
||||
```
|
||||
|
||||
### Step 7: Update Configuration Loading
|
||||
|
||||
**File:** `gateway/modules/shared/configuration.py`
|
||||
|
||||
**Modifications:**
|
||||
1. **Import Statements:** Add cryptography imports
|
||||
2. **Error Handling:** Robust error handling for key operations
|
||||
3. **Logging:** Security-aware logging (no key exposure)
|
||||
4. **Backward Compatibility:** Support both encrypted and plain text values
|
||||
|
||||
### Step 8: Environment Configuration Updates
|
||||
|
||||
**Files to Update:**
|
||||
- `gateway/env_dev.env`
|
||||
- `gateway/env_int.env`
|
||||
- `gateway/env_prod.env`
|
||||
|
||||
**Changes:**
|
||||
1. **Add Key Configuration:**
|
||||
```env
|
||||
APP_KEY_SYSVAR = D:/Athi/Local/Web/poweron/local/key.txt # dev
|
||||
APP_KEY_SYSVAR = CONFIG_KEY # int/prod
|
||||
```
|
||||
|
||||
2. **Encrypt Existing Secrets:**
|
||||
- Identify all `_SECRET` values
|
||||
- Encrypt using appropriate environment tool
|
||||
- Replace plain text with encrypted values
|
||||
|
||||
### Step 9: Testing and Validation
|
||||
|
||||
**Test Cases:**
|
||||
1. **Encryption Tool Testing:**
|
||||
- Test text value encryption
|
||||
- Test JSON value encryption
|
||||
- Test decryption functionality
|
||||
- Test error handling
|
||||
|
||||
2. **Configuration Loading Testing:**
|
||||
- Test encrypted value decryption
|
||||
- Test plain text value handling
|
||||
- Test environment-specific keys
|
||||
- Test error scenarios
|
||||
|
||||
3. **Environment Testing:**
|
||||
- Test development environment
|
||||
- Test integration environment
|
||||
- Test production environment
|
||||
- Test cross-environment security
|
||||
|
||||
### Step 10: Documentation and Training
|
||||
|
||||
**Documentation Updates:**
|
||||
1. **Developer Guide:** How to use encryption tool
|
||||
2. **Deployment Guide:** Azure environment setup
|
||||
3. **Troubleshooting Guide:** Common issues and solutions
|
||||
4. **Security Guide:** Best practices and guidelines
|
||||
|
||||
## 4. Implementation Order
|
||||
|
||||
### Phase 1: Core Infrastructure
|
||||
1. Add cryptography dependency
|
||||
2. Implement master key management functions
|
||||
3. Implement encryption/decryption functions
|
||||
4. Create master key generator
|
||||
|
||||
### Phase 2: Tool Development
|
||||
1. Create encryption tool
|
||||
2. Test tool functionality
|
||||
3. Create usage documentation
|
||||
|
||||
### Phase 3: Integration
|
||||
1. Enhance secret handling functions
|
||||
2. Update configuration loading
|
||||
3. Test backward compatibility
|
||||
|
||||
### Phase 4: Environment Setup
|
||||
1. Generate master keys
|
||||
2. Update environment configurations
|
||||
3. Encrypt existing secrets
|
||||
4. Test in all environments
|
||||
|
||||
### Phase 5: Validation
|
||||
1. Comprehensive testing
|
||||
2. Security validation
|
||||
3. Performance testing
|
||||
4. Documentation completion
|
||||
|
||||
## 5. Security Considerations
|
||||
|
||||
### 5.1 Code Security
|
||||
- **No hardcoded keys** in source code
|
||||
- **Secure random generation** for master keys
|
||||
- **Proper key derivation** using PBKDF2
|
||||
- **Environment isolation** for key access
|
||||
|
||||
### 5.2 Runtime Security
|
||||
- **Memory protection** for sensitive data
|
||||
- **Secure logging** (no key exposure)
|
||||
- **Error handling** without information leakage
|
||||
- **Input validation** for all operations
|
||||
|
||||
### 5.3 Deployment Security
|
||||
- **Azure environment variables** for production keys
|
||||
- **File permissions** for local key storage
|
||||
- **Access control** for key management tools
|
||||
- **Audit logging** for key operations
|
||||
|
||||
## 6. Error Handling Strategy
|
||||
|
||||
### 6.1 Master Key Errors
|
||||
- **Missing Key:** Clear error message with resolution steps
|
||||
- **Invalid Format:** Validation with helpful error messages
|
||||
- **Access Denied:** File permission error handling
|
||||
- **Environment Mismatch:** Cross-environment usage prevention
|
||||
|
||||
### 6.2 Encryption Errors
|
||||
- **Invalid Input:** Input validation and error messages
|
||||
- **Encryption Failure:** Cryptographic error handling
|
||||
- **Format Errors:** Base64 encoding/decoding error handling
|
||||
- **Environment Errors:** Wrong environment key usage
|
||||
- **Invalid Prefix:** Unrecognized encryption prefix format
|
||||
|
||||
### 6.3 Rate Limiting Errors
|
||||
- **Rate Limit Exceeded:** "Decryption rate limit exceeded for environment '{env}'"
|
||||
- **Throttling:** Exponential backoff for repeated violations
|
||||
- **Monitoring:** Log all rate limit violations for security analysis
|
||||
- **Recovery:** Automatic retry after rate limit period expires
|
||||
|
||||
### 6.4 Configuration Errors
|
||||
- **Missing Configuration:** Default value handling
|
||||
- **Invalid Values:** Configuration validation
|
||||
- **File Errors:** File access error handling
|
||||
- **Parsing Errors:** Configuration file parsing errors
|
||||
|
||||
## 7. Performance Considerations
|
||||
|
||||
### 7.1 Key Derivation
|
||||
- **PBKDF2 Iterations:** Balance security vs. performance
|
||||
- **Key Caching:** Consider caching derived keys
|
||||
- **Memory Usage:** Minimize memory footprint
|
||||
|
||||
### 7.2 Encryption Operations
|
||||
- **Batch Operations:** Support multiple value encryption
|
||||
- **Async Operations:** Consider async for large values
|
||||
- **Memory Management:** Proper cleanup of sensitive data
|
||||
|
||||
### 7.3 Configuration Loading
|
||||
- **Lazy Loading:** Load keys only when needed
|
||||
- **Caching:** Cache decrypted values appropriately
|
||||
- **File Monitoring:** Efficient file change detection
|
||||
|
||||
### 7.4 Decryption Rate Limiting
|
||||
- **Rate Limiting:** Maximum 1 decryption per second per environment
|
||||
- **Tracking:** Monitor decryption attempts per environment
|
||||
- **Throttling:** Implement exponential backoff for rate limit violations
|
||||
- **Logging:** Log rate limit violations for security monitoring
|
||||
|
||||
## 8. Migration Strategy
|
||||
|
||||
### 8.1 Backward Compatibility
|
||||
- **Dual Support:** Support both encrypted and plain text values
|
||||
- **Gradual Migration:** Migrate secrets incrementally
|
||||
- **Rollback Capability:** Easy rollback if issues arise
|
||||
|
||||
### 8.2 Migration Steps
|
||||
1. **Deploy Enhanced Code:** With backward compatibility
|
||||
2. **Generate Master Keys:** For all environments
|
||||
3. **Encrypt Secrets:** Using encryption tool
|
||||
4. **Update Configurations:** Replace plain text values
|
||||
5. **Test Thoroughly:** In all environments
|
||||
6. **Remove Plain Text:** After successful validation
|
||||
|
||||
### 8.3 Validation
|
||||
- **Functionality Testing:** Ensure all features work
|
||||
- **Security Testing:** Verify encryption/decryption
|
||||
- **Performance Testing:** Check for performance impact
|
||||
- **Integration Testing:** Test with existing applications
|
||||
5
poweron/testdata/bewerbungen/Prompt.txt
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
werte mir die angehängten Anschreiben und Lebensläufe aus und erstelle mir ein begründetes Scoring zum Matching der potenziellen Bewerber auf eine Stelle bei uns als Product Architekt.
|
||||
|
||||
Erstelle anschliessend ein entsprechendes Antwortschreiben für den am besten passendsten Bewerber auf die ausgeschriebene Stelle und versende es als E-Mail von meinem valueon Account.
|
||||
|
||||
Dann speichere alle Dokumente im Sharepoint von valueon in der site company im folder uranus
|
||||