Hey, everyone. In today's session, I'm going to cover how we built a consistent hash ring for GRPC while we were implementing SpiceDB.  So it makes better sense kind of the context in which we went about to solve this problem and build this library. So my name is Jimi Asolinski, co-founder and one of the creators of SpiceDB, which is built by a company called OpZed. I'm going to get into SpiceDB a little bit later because it's going to be a core part of the story of kind of why we built this library and how it fits into our application and how it might fit into your applications as well. But prior to all of this, I worked at a company called Red Hat by way of the CoreOS acquisition. At Red Hat, I was a product manager and also an SRE. And then I built basically the largest service that was running at Red Hat. While I was at CoreOS, you might know that Neko system is called QuedaIO. And effectively, I've worked as a supper engineer and a product manager, always carrying a pager, always kind of working on distributed systems. In Neko system, the greater open source community, I'm an OCI maintainer. So that is the standards body for containers if you're unfamiliar. And then I've also created a couple of kind of CNCF landscape projects, notably operator framework is one of the ones that we started at CoreOS and got inherited by Red Hat and eventually incubated by CNCF. But I've worked on a whole bunch of other things in the space too and I've kind of been around since before the CNCF was founded, I started working at CoreOS in 2014 and CNCF and Kubernetes goes around in 2015. So been around familiar with containers, familiar with kind of cloud-native ecosystems and building things on the cloud with or without Kubernetes in a cloud-native fashion. We'll up some contact info here. Feel free to like come back to the slide whenever. I prefer folks reach out to me by email. Doesn't matter what the question is, I'm willing to spend time with anyone answering any questions, guide you to the right place. Email is the best way. If you wanna reach me for that, I'm saying synchronous, but you can also find me on GitHub or Twitter. But then also if you want to actually like ping me synchronously and have a real-time conversation, you can also find me in the SpiceDB Discord under the username Jayzolinsky. Speaking of SpiceDB, what exactly is SpiceDB? It's gonna be critical to kind of understand the rest of this talk. SpiceDB is actually a framework for kind of building secure modern authorization systems. So fundamentally folks, they get product requirements in their application usually when they get their first big enterprise customer and that functionality usually is dictating some kind of hierarchy around permissions and access to data stored within the system. So they might require that for example, there's a higher level concept called like an organization. And organizations can have teams and then within a team there might be roles and then users are assigned roles. This is kind of like a typical kind of hierarchy that you'd see. A lot of people will call the system I just described RBAC, but there's a lot of subtle details as to how different applications implement RBAC in different ways and what those requirements are. And because all those things can vary greatly, the recommendation from security professionals is that you actually build on top of a pre-existent authorization tool chain to actually build out these systems because if you build them yourselves, you're very likely to introduce security flaws or make changes that fundamentally limit the capabilities of your product and make it so you can't implement features that your customers are gonna require in the future. Ask me how I know I should experience all these pain problems, which is why we love to start our company outside to build SpiceDB. So why is SpiceDB different from your home-grown system? So it is actually inspired by the technology built at Google called Zanzibar and this is SpiceDB is the most mature and source implementation of that. It's being used in production for a couple of years now by companies large and small. So we kind of tested it in the full gamut, but the real core power to it is kind of all around its design with regards to relationship-based access control. So REBAC, which is not to be confused with RBAC, there's actually a kind of lower level of design where the chain of relationships defines whether or not a person has access. So this actually first got started by Facebook. They started protecting their social network using basically graphs. Because Facebook's database fundamentally is a graph, it was a very natural fit, but ultimately what Google found was that even applications where the core data is not a graph, it benefited from modeling at least the authorization system as a graph to make that a separate and more understandable system. And what's even cooler about all this is that actually because you're modeling a subset of your data as a graph, the graph system actually runs as a separate system entirely. So that would be space DB in this case and your applications would call then into space DB and ask questions such as, can this user access this document? That's really powerful because now you don't actually have any of that logic living within your applications and any application can make those queries at any point in time in the lifecycle of handling requests or user interactions. That means you don't have to know explicitly ahead of time what permissions need to be checked to handle a request. Instead, you can let any application check the permissions as needed to handle a request at any point in time while the system is being processed in something like a microservice architecture. So I said earlier that space DB is a permissions database so that means that you write a schema and the schema kind of models the objects in the system and the relationships across them and then you're going to write data into the database that has that schema applied and then you can query that data in an efficient way to answer these permission questions. So on the left, I've got an example schema. This is basically modeling a very simple system that kind of looks like Google Docs. So there's going to be documents and then there's going to be kind of roles that you can assign to each individual document. It can be a reader of a document. It can be a writer of a document and there are permissions on that document. So just like can you edit or can you view this document? If you look at the very bottom where we have the view permission, you'll see that the view permission is actually defined as being both the reader and the writer. And you can actually then see from the right-hand side if someone does a permissions check, this is using Zed, which is the official command line tool for space DB. This lets you query space DB from your command line and you just check on data and truly understand kind of the flows through the system and as well as timing information and debugging metadata. So in this example, we've done that check and you'll see that first evaluates to true. So Fred does have access and we'll even explain why it will show that first it checked the writer set of users and it did not find Fred, but then it checked the reader set of users and it did find Fred. So Fred was granted access by means of being a reader to the system. Cool. Now we have kind of a basic understanding of space DB, but what's really important is kind of this nested behavior. There's a reason why this debug information is kind of being displayed as a tree. That's because you can actually break down the request, that check request, checking if Fred has access to a first doc and you can actually do a bunch of this in parallel. So fundamentally how space DB works is it breaks down the request onto some requests, evaluates them in parallel and it wants to try to cache those values as much as possible because authorization and checking permissions is in the critical path.  So for example, request comes in from your API. The first thing it's gonna do is check to see if the user has access to be able to perform that action that they're trying to perform. Before your application does any other work. So that means that we're targeting in the few milliseconds for response times from space DB. Fundamentally that means that almost everything needs to already have been pre-computed and in cache. So we wanna serve everything from memory as much as possible. So fundamentally the solution to us getting all the stuff served to that quickly is to have a sophisticated distributed caching system. So not only is space DB kind of this recursive parallel graph engine, it also has a sophisticated distributed caching mechanism built throughout the whole system. If you're familiar kind of with caching and a regular application architecture what normally happens is you have requests flowing into the system. They get randomly assigned to a server. An instance in this case are the circles. Each of those servers have their own independent cache in memory and then if the value that the application is looking for is not in that cache it then reaches back up to storage which is probably a database system to actually compute that result. And then it returns that probably inserts it into its cache. This is pretty standard in web applications from a caching often in storage is credits. So distributed caching adds these additional arrows to that whole system which is kind of this bidirectionality between the caches in the set of applications themselves. So that means that they actually are aware of each other and know what values are actually in each other's cache so that they don't have to reach out to storage. They can reach out to their neighbor's cache and get that value straight from memory. You might be thinking, hey, like, what's the difference between the hop to storage versus a hop to my neighbor to reaching the cache? While you are paying the same network latency querying database is likely going to be more overhead. It's probably gonna be doing way more computation. And it's almost certainly not gonna just read directly from memory from already pre-concuted result. The more expensive the computation you need to do on the data store in the storage system to get that result, the more the cache is going to be saving you from that work. So it is usually worth making an extra hop to your neighbor, even if you are making that network latency. All right, so now that we kind of understand it's supposed to be use case, it's time to dive into what a consistent hashing is. But before we answer that question, we have to answer the question, what is consistent hashing? So consistent hashing is a concept that was kind of mostly research in the 90s. At the time, it didn't really have a name. Nowadays, a lot of folks are familiar with this because it's so you could just be used in distributed systems. The idea is that you're going to map a key to a finite set of nodes. You're gonna do that using a hashing algorithm. So if you take something like three values, foobar and baz, and you run them through a hash algorithm, they're going to evaluate to a number. And that number is then going to map itself to a set of nodes. The most simple hash algorithm you can use is modulus. So you can say like mod three in this case is the example being used here.  Every single time you run foob through that hash algorithm, it needs to evaluate to that same value. This is gonna be the core between picking which nodes we're going to route to and which nodes should hold the value in memory in their cache. This is kind of like the first stab at the research. You'll see that foobar and baz are both getting mapped to node number one, and then bar is getting mapped to number three. But where this really falls over is in a problem called rebalancing. And so rebalancing is meant to deal with is basically what happens when one of these nodes go missing. So in this example, I made it so that node one goes missing, but also there are other events such as adding more nodes to the system that would incur a rebalancing to try to fix all these things. The problem here is that if we remove node one and we only have node two and three, we're still going to get values if we do modulus three as our hash function that mapped to node one. foob and baz finally have to go to node one but node one is gone. So now we've effectively lost this data for using this to store data. We won't get an answer to this problem until basically a algorithm called rendezvous. And that was written in a paper in 1996, but I'm actually not so interested in rendezvous so much as a paper published the following year in 97, which is where we get this hash rings introduced. And while not the first solution to this problem, it has become the lasting solution to this problem. The idea behind a consistent hash ring is actually that you have basically this array and the array wraps around at the end. So if you iterate past the last value in the array, you arrive back in the first. The way that folks like to kind of visualize arrays that work this way, typically call them something like a ring buffer, they put them as a circle, kind of similar to a wall clock like I've drawn here. And then what happens is we have nodes one, two, and three mapped as effectively times on the clock. But you'll notice there's a whole bunch of these other lines here. And those are all the possible values that can get hashed to. So when we run a hash on foo, r, and buzz, they get mapped to one of these individual lines and not actually specifically to node number one, node number two, or node number three. The idea now is that we kind of around those values to the nearest node. So we kind of move clockwise and kind of arrive at the node that is real basically in the ring. So now you can see that foo and buzz, they both get mapped to node one just like in the previous example and then bar gets mapped to node number three just like the previous example. But we've got this additional metadata now, this data of kind of the location on the clock. So now when we get a rebalancing event such as node number four being introduced in between foo and buzz, you can see if foo now points to node number four, buzz still points to node number one. So that means we only have to update foo from pointing to node number one from node number one to node number four. So we kind of like minimize the damage.  And so we now have this guarantee of kind of how much work has to be done when a node is added or removed. Now, you may be thinking, looking at this example, wow, that's like a really bad distribution. Look where node number four, node number one are really close together. How can you make guarantees about the closeness of these things to kind of minimize the disruption? And so what you do in practice is you create what are called virtual nodes. So you would actually say we had kind of these four nodes here, what you would actually do in practice is probably have something like a thousand of those nodes and then virtually exist. And those virtual nodes would then map to real physical nodes that exist in the system. And that kind of keeps the balancing to a minimum amount when you need to add or remove nodes and there is disruption. It also lets you do a really interesting thing which is configure replication. So say we didn't want to lose data when one of these nodes ceased to exist. What we can do is actually modify kind of how we store things in this ring. We could say that once something is mapped, for example, foo is mapped to node four, we could then run another hash, well foo combined with node four, for example, and that would map to yet another location on the ring and we could store the data there as well. And that would be a replication factor of two. And then we could also maybe if the replication factor was three, you could hash that again and then find yet another location on the ring and save that data there. And then that is a kind of configurable metric that you can have for resiliency for nodes coming and going out of a system such that you're not going to lose data when one particular node leaves. So this is actually why the hash ring kind of algorithm has stuck around for a really long time. It has a lot of these properties that are kind of beneficial for configuring and dynamically adapting to the different requirements that folks have in applications. So we have an implementation of this, everything that was just described with the hash ring in Go that is completely agnostic to the use case. So you can install this in your Go application and start using the following API. What makes it generic is actually you can plug in your own hash function. So you could literally use modulus like I just used in the example where you could use basically very, very fast hashing algorithms that are not cryptographically secure or you can use cryptographically secure hash algorithms that are expensive to compute without hardware acceleration, for example. All that's completely configurable but we kind of have this basic API that always stays consistent across hash rings which is one of adding and removing members, listing the members themselves and then also finding kind of the set of members from that list. So this is totally agnostic and can be adopted by anyone in any use case as long as they're writing in Go. But the whole topic of this conversation was actually GRPC and how this all fits into GRPC. So now we've got this kind of agnostic and a neutral implementation of the hash ring concepts and we map that back into GRPC world. So we can actually kind of bounce GRPC requests using this hash ring logic. So if we dig into Google GoLang.org slash GRPC slash balancer and this is a Go package that's used as bread as the set of kind of official GoLang, GRPC packages. Got this interface balancer and if we look at the documentation we can look at all the kind of methods. The only method we really care about is this update client state con method that I'm gonna be showing in depth later. But if we go through the actual that the doc comment, which is at the very bottom you'll see that says balancer takes input from GRPC manager sub cons and collects and aggregates connectivity states. But it also generates and updates the picker used by GRPC to pick sub cons for RPCs.  That's that kind of first sentence. And then in the second sentence it says actually this is gonna be your hook for providing a picker implementation. We're just going to pick how we're going to map the request to a particular connection. Great, so let's look at what a picker is. A picker has this one method pick and that's the thing that's actually going to do the mapping like you said. So fundamentally what we need to do is implement a picker that is going to pull nodes out of our member list and select the right one from the hashering and then send the request to that particular member. Fantastic, so let's start implementing the update client constate method. We've got a ring balancer implementation here and I kind of cut out a lot of stuff. I'm just gonna focus on basically implementing this one method and also cut out a lot of boilerplate things like locking and things that are not necessarily tied to the hashering logic in this. You still have to implement a lot of the invariance that GRPC assumes when you hook into GRPC and implement balancer. So I don't really want to focus on much of that, although I will cover some of it just by happenstance. I really want to focus just on where we're kind of doing updates to our hashering within this implementation because that's the novel and interesting part about this library. So we get into this method. This method is going to be called whenever there's a change to the client state.  The first of all, the first one we're ever gonna check is that the service config has changed. From the way the config has changed, then we probably need to start from scratch. So in that scenario, we have us allocating a new hashering because we're assuming that hashering cannot fail in this scenario. We use the most new constructor there, allocating new hashering, and we set the config on our ring balancer. And then the next conditional below that is another state that we have to handle, which is basically we've gotten this call but we actually haven't set anything up yet. We haven't gotten the service config with any of the settings, in which case this is kind of like the default state. Like we haven't been allocated yet. And in that scenario, we're just going to set a picker that basically just throws an error. This is kind of the recommended behavior from kind of the different GRPC implementations. And they actually provide this nice library for us base. That's gonna provide a utility function for us. This error picker is gonna return this failure for us until we get to a state where we can be valid and we can actually start picking good views. So now we're gonna get into the meat and potatoes. We're actually going to be able to start tracking changes to the member set. In this case, we're going to look for folks that are not yet added into our member list. So new connections. So what we're actually gonna do is we're gonna iterate over the list of addresses that we're gonna get out of the resolver state. That came in when we got our update. And basically we're going to check to see if this connection exists in a set of connections that we're maintaining ourselves. And if it's not there, then we're gonna do kind of some bookkeeping, but fundamentally at the very end, you'll look at the bottom, it has hashering.add. So we're gonna make sure that we added this new connection that we weren't tracking before into our hashering so we can start mapping requests to it. And then the next code block below that is gonna be doing the opposite, which is removing anything that shouldn't be in our hashering anymore. So what we're gonna do is iterate now over our set of connections that we know exist in our hashering and we're gonna look them up in that same set that we just saw. And if it's not in that set, then we need to remove it from our hashering. So you'll see again at the very bottom, we're calling that hashering remove. There's also a bunch of internal bookkeeping just around normal logic that we have to maintain just being a normal gRPC balancer. But then we get to the end of this function where we get to call this update state function that's gonna do basically both the heavy lifting for us and that's where we get to actually provide the state that we just computed, but also the picker. So the picker is really, really important. As I said earlier, the picker is what is going to actually map a particular request to one of the members of our hashering. I'm glad that it's so elegant that it fits very cleanly in this page, the very small function. Fundamentally, we're kind of smuggling this context key in that is the key for the hashering that gets provided with the request context. But then we use that to find the members in our hashering. You'll see that we have this value or this variable called spread. And we're using spread not only in the call to find end, but also a little bit lower. We have this index, how we're gonna basically ultimately index into the member list to pick the ultimate connection that we're gonna map over, that we're gonna send the request over. The idea here is that if you have a replication factor that is greater than one, that means that we can actually load balance basically requests across those replications. So this fundamentally means that we're gonna pick a random node of the set of replications for that have been mapped to.   So now you'll minimize the more disruption if you're kind of spreading across a replication factor. And so then that ultimately is our picker. So that is the core logic behind allset.com, or sorry, github.com slash allset slash consistent, our library for implementing all this into your PC. There is a lot more boilerplate, but this is the meeting potatoes fundamentally. That's it. Honestly, to add this to your code base, it takes about an import of our library. It takes a registering of the balancer and it takes setting that initial service KDA. And that's about it. I'd like to thank everyone involved at Allset who helped build this library, but also the folks over at GRPC that write all the go tooling, I think that's also the go line team and just the GRPC team. In addition, I'd like to thank the folks that developed the library called kubresolver. kubresolver is how we actually detect and find that embryo list. So that space to be can self cluster on Kubernetes. It doesn't need to have any configuration from our user. It will actually just auto detect nodes and start kind of clustering itself and all the dispatching and caching that comes for free. If you're interested in implementing anything like that, feel free to jump into our discord, the space to be discord. This is not just for folks that are trying to solve authorization problems, but folks interested in distributed systems are kind of building orthogonal tooling in the cloud native ecosystem. Also, if you're interested in kind of other distributed systems topics, I've also given a previous webinar talking about database consistency and consistency in general that you can find with this YouTube link here. Thanks for listening.


Captured by giant yellow men, Tarzan and his friends are taken to the distant jungle city of Taur, where they are brought before the exotically beautiful queen Artaea.  Artaea informs Tarzan that the laws of Taur permit a chief to claim the right of avenging the death of his men on the person who has slain them. She adds that Tongo has come to claim that right on Tarzan. The ape man accepts the challenge and in single combat kills the giant Tongo. Deeply impressed by Tarzan's magnificent strength and utter fearlessness, Artaea gives him and his friends the freedom of the city. Before quartering them in the palace, she conducts them to the hall of Pantu, the chamber of sacrifice, where she forces them against their will to witness the sacrifice of a Rhetorian prisoner to the fires of Taur. At the conclusion of the ceremony, Artaea gives Tarzan her ultimatum. He shall remain in Taur as her mate. The alternative, death to them all by sacrifice. Hey, then will you listen to the brazen, Hussie? She's actually making Tarzan an offer of marriage, if he can call it that. You have heard the will of Artaea, Tarzan of the apes. Upon your answer, rest the future safety of Jeanette Burton and those others. Oh, speak!  Oh, why did we have to come to this awful place? I have seen Tarzan under a similar situation very ably. Well, Tarzan, your answer? I can't answer now, Artaea. Tomorrow perhaps. Then you shall rest and come to me later with your answer. Mungo will conduct you to your quarters. Well, Mungo, look to a rope, Tarzan, Mungo, on the loop. Well, look, Artaea. Come, Tarzan, white people, go along, Mungo. Out of the great circular hall of Pantu, through numerous well-lighted corridors, the giant Mungo and his guard of yellow men conduct the whites to their abode. A suite of two rooms and a distant part of the palace. One large room accommodates the men, a smaller one, Jeanette. There are stone couches, a low massive table of wood, many leopard and lion skins. Into a small basin set on the floor of the larger room, fresh cold water flows. There are several long narrow windows screened with heavy metal grills. On the threshold, Mungo and his guard halt. The yellow giant motions his charges to enter. White people, stay here. Very soon bring food. Artaea, Tarzan. Well, you've found your city of tour, haven't you? Yes, by Georgian with the vengeance. And know that she phoned his major. What the devil are you going to do with it? Get out. Escape at the first opportunity. Which, my friend, will not be so simple. Artaea would not be so ingenuous as to leave as unguarded. If you open that door, you will find that we are well supplied with yellow soldiers. Well, just for the satisfaction of knowing, I'm going to see. You're right, Juan. They're six of the Hayden devils. It is quite evident that Artaea does not trust her guests. A charming young lady. Charming? Well, she's an out and out fiend. A savage who hates every one of us. Oh, hate, and there's one of us she don't hate. Apropos, that, Tarzan, mon ami. What are you going to do about Artaea's ultimatum? Well, he'll not agree to her offer, Lieutenant. None of us would permit it, not even to save our lives. Bien dit, ma poiselle. We are agreed upon that. At least she doesn't intend to starve us. If I'm not mistaken, these fellows are bringing food. Sure, and they don't mind admitting that I'm hungry. Wait a minute, you two. Why are those guards... Aprian Tarzan, you might just as well have addressed the Stonewall. You would have received the same answer. They did not understand you, mon ami, or were ordered to keep their mouths shut. I guess you're right, Dono. They didn't even seem to hear me. Deathmute, maybe. Oh, we got it. How this smells good, whatever it is. What do you say to eating first and talking afterwards? Yes, we'll eat. How can you men eat when tomorrow we may... die, your cushioner? Didn't I hear Wang tell you a while back that a fellow dies like a gentleman on a full stomach? Sit down here, Jeanette, and get some of this porridge. You'll feel better. And, my dear, we are far from being dead. We'll find a way out somehow, Jeanette. I have a feeling that even if you did agree to her offer Tarzan, the rest of us wouldn't get far before her yellow guards would murder us. That golden idol back there in the chamber of sacrifice, and those very beautiful gems around its neck. Where do you suppose they came from, Tarzan? Dr. Wang, you certainly aren't contemplating it. I contemplate nothing, Jeanette. However, it might prove profitable to cultivate... but never mind. Let us see what tomorrow brings us, eh? Well, I suppose these stone benches are the only beds we can expect. Which one's mine? I believe the other room was meant for you, Jeanette. No, thanks. We're all in this place together, Uncle Jim. I don't intend being alone at any time, if I can help it. There are plenty of benches in here. I'll take this one in the corner. Good night. Good night, Jeanette. It's in me, my gentlemen, that there's no love in that she-devil's heart for Jeanette. She still believes Jeanette and Tarzan are sweetheart. Right, Terry. Her pale skin may be white, but her heart's black. She wants you, Tarzan, frankly, and she intends having her way. She may let us go if you stay, but I very much doubt it. Vraiment, Major Ashley. I agree with you. Her demonstration on the sacrificial chamber upon that, what did she call him, rat-rat-toryan, was merely a threat to impress us with her power. Rat-tore. Rat-tore. By Joe, didn't she say that he'd been sent to spy on her and her people? She did that, from which one might infer the nearby presence of another tribe of yellow people. It's inimical to these thorians, right? And if so, oh, my jor, what good would that do us? They would as likely sacrifice us to some heathen god or feed us to their own pet crocodiles as they would these thorians. If they had us. The Lieutenant's right, Major. We'd probably only be stepping from one bad fix into another.  Tarzan will have to string along with a tear and cape his eyes open for a chance to escape while he's doing it. Artea, the woman has the left ear of typing and the right of a Mandarin, but on which side her hearing is the better it might be hazardous to guess. However, for her own sake, Jeanette must be kept inside of one of us all the time. Voila. Voila, our friend Mungo returns. Oh, look, Tarzan. You come along, Mungo, now. Artea won't talk to you and one man from China. Artea wants to talk to Wong and me.  She's trying to break up our throat. Get her separated. Tell her to go to the devil, Tarzan. And the country, Tarzan. Let us follow Mungo. The fact that Artea has not sent for you alone Oh, good. Where for us? Doosman, doosman, monami, be careful. I sense a trap of some kind. Why should Artea send for me to see the doctor Wong instead of one of us others? I'll find out soon enough. I'm not afraid of Artea's trap. Keep your eyes open here while we're gone. Come on, doctor. All right, Mungo. We are ready. Hey, Lieutenant, that woman don't mean them to any good. What does she mean sending for them at this time of night when all decent people ought to be in bed? I should like to know myself, old old. However, so long as Tarzan and the doctor are together with her, I do not think either of them are in any danger. Unless she's a lot smarter than we think she is. I wonder why she sent particularly for Wong instead of one of us others. Tarzan, well, that's self-evident. She's frankly infatuated with him, but she certainly can't have designs on Wong, too. By the way, Major, can Monsieur le Docteur Wong is a good friend of yours? You have known him a long time? Only since Nairobi, some three months, eh, Terry? Just about that, Major. When I began the organization of my safari for this expedition in Nairobi, Wong came to me with an attractive partnership offer. His credentials were excellent from the old Imperial Museum in Payping. I accepted his offer and, well, that's that. Eh, puis Monsieur Ruec? Terry, oh, he came down on the same boat with us from Port Said. I discussed my plans freely with him. Through his advice and suggestions, I saw that he knew his jungle. I, or rather, Jeanette, prevailed upon him to accompany us. She's the attraction, Darneau, as far as Terry... Ah, leave me, Major. You know well why I joined you. It was for the fun of it alone. What are you driving at, Lieutenant Darneau? Rien du mon ami, not ten at all. I was merely curious to know why... I don't like your questions, Darneau, nor the tone of vice you're using in them. Come clean. What's your craw? Hey, what's in your craw? Meme is your... So far as you are concerned, there is nothing in my craw. I am thinking about Mr. Dr. Wong Tai. The cold in him, I should turn to, and the diamonds around its neck seemed to fascinate him. Meanwhile, Tarzan and Wong Tai, surrounded by a dozen or more gigantic yellow guards, have traversed several corridors, descended along flight of worn stone steps, to enter at last a dimly-lipped narrow passageway. At the entrance to this tunnel, Mungno halts his men, with a sign he motions Tarzan and Wong to follow him. What do you make of this Tarzan? We are certainly not going to a Terry's audience chamber, or the Hall of Fan too. No. We must be far below either of those rooms, in the central rock tower somewhere. Mungo, where are we going? We go out there, door, end of tunnel. She wait. If she demands your answer to her ultimatum tonight, Tarzan, what are you going to say, eh? I don't know yet. I'll give her an answer. Quiet now. You're at the door. Quiet people, go in. Tarzan, wait. Come on, Wong. Tarzan, hey, hey, hey. Get back, Wong. Open the door. I, I come up. It is Tarzan from the outside. Look out. He is coming.


Okay, let's get started because I stopped in the middle of things last time Let me just give a quick quick review of where we got to so we had a mirror pair u and v of log Calabi our varieties and We discussed the stromenge our Zaslo conjecture that says when you have a mirror pair The way to think about it geometrically is there should be a pair of dual Taurus vibrations a Lagrangian Taurus vibrations like this so over the same base U maps to be Via F V maps to be via G the fibers are The smooth fibers are a real n-tor I s1 to the n and they're dual in in the sort of obvious sense, so If I write a Taurus without choosing coordinates, I can write as H1 LZ Censor s1 and the dual Taurus just obtained by dualizing this will be in group H1 of L Okay, so that's the stromenge. I was as low conjecture Related to that is the homological mirror symmetry conjecture of can save it which says in this context if you just look at the Symplectic geometry of you there's a category you can associate to it called the Foucaille category and This category should be equivalent To the derived category of coherent sheaves on V So we're regarding now you just as a symplectic manifold and V is a complex manifold so what I explained last time is that This is compatible of the syz conjecture in the following way It's expected if you just take a point in V and you take the skyscraper sheet that corresponds to a fiber of the syz Fibration on the mirror the fiber Corresponding to the point P. So let's take so P lies in some fiber of V take the corresponding fiber of you and together with a local system so The objects of the Foucaille category a Lagrangian submanifolds together with the data of a of a local system on on the Lagrangian So that's just the same as a representation of the fundamental group of L into Into the group and the group of this local system is just the unitary group you want or the circle so this this element is nothing other than an element of the dual torus so it's just the same group as we had over here thinly disguised and Those should correspond under this identification. So that's actually corresponds the choice of the point P But the moral of all this is that somehow You know how does one construct V if you just given you and you want to construct the mirror and you try to do it Using the homological mirror symmetry conjecture what you say is there's some objects in the Foucaille category of you namely these Lagrangian Tori with with an arbitrary you on local system just take the modulite space of those objects That would correspond on the mirror symmetry just just the modulite space of skyscraper sheaves on V Which of course is V itself so that gives you a construction of the mirror at a conceptual level And so somehow this is point of view of motivate now how we try to describe this mirror variety V explicitly Okay, so first of all what I want to do is discuss the complex structure on V So at the moment I've said okay as a set told you what it is But you know it's basically a complex manifold So how do we construct the complex structure and this is going to be two versions? So there's the first version is the naive version And the second one will incorporate what are called instant on corrections So I'll say more about what that what that means And the first step But maybe I'll just say immediately that somehow this is where all the deep properties of mirror symmetry are sort of hidden So for instance if you are familiar with the fact that Gromov-Witton invariance on one side correspond to some periods on the others On the other side. This is really coming out of this second step, but how you modify the complex structure of V according to certain counts of Holomorphic curves, okay, but let's let's do the naive version first Okay, so let's draw the following picture. So this is a picture of the Boris vibration on you I want to describe local coordinates on this This set V the modular space of these Fibers of you together with you on local system. So let's pick a reference fiber over B zero and take another Point close by So let's draw the corresponding Fibers L zero and B. I'm going to describe some complex coordinates B Which I'm thinking of as this set of these various Fibers together with local systems. Okay, so what do I do? So just for any One cycle in the reference fiber. I'm going to lift it to a relative element. So I'm gonna choose a path from B zero To be here's my gamma in the fiber. I'm just going to extend it to a Two cycle like this So I'm working in some small neighborhood of B zero so I can do this In a way that sort of you know doesn't doesn't depend on Any choices at the level of of topology? And then I'm going to define The z z z to the exponent gamma that'll be my notation notation for the associated local coordinate If I evaluate it at a pair L row, I guess it's an L here What should it be? So it's a complex number in fact a non-zero complex number So it's the exponential the normalizing factor 2 pi I and then the integral of The Complexified Kayla form so this is what I discussed last time so omega is a symplectic form and B is the so-called B field on On our variety you so if you want to ignore the B field feel free could set B equals zero and we're just going to integrate that over this cycle gamma and Multiply so the final term is how does the local system contribute so it's row times the boundary of gamma This is an element of C star and so so that's a definition associated to one element of h1 and if I choose a basis, so if Gamma one up to gamma n is a basis of h1 then we get local coordinates Z1 up to Zn on V as a complex manifold and The local model in these coordinates is just you take the torus with n and coordinate Z1 up to Zn and the map to be It's just given by um the So let's see so have I done this I'm going to Take the following coordinates on the base, so I'm just going to take the absolute value and then do the following Normalization so these are my coordinates on the base and so just unpacking what I've done there in other words. This is Sorry, I'm just inverting the transformation there. This is the integral over gamma i of omega so these are the coordinates on the base, so we have Distinguished coordinates on the base given just by the areas of these cylinders with respect to The symplectic form omega Okay, and so why did I choose this particular Normalization of the coordinates on the base the point is that these are what are so-called integral affine coordinates remark Is that the yj? What's called integral affine coordinates on on the base bit? Or what does that mean? So it just means if I have a No, I cover my manifold by patches of this sort if I Change from one chart to another the transition map lies in the integral affine group glnz semi-direct product with Rn, but what I mean is you know, what was the Ambiguity in choosing these coordinates. Well, first of all, I had to pick a basis of H1 of the torus, so that's just an element of glnz and I also have to pick my base point So if I translated the base point that would change these areas by a constant That's the translation here Okay, so these are special distinguished coordinates on the base associated to Symplectic form on the selected manifold and the structure of this Lagrangian torus vibration And so in the theory of interval systems. These are called action angle coordinates. Okay, so that's the naive complex structure And as I said that doesn't quite work it needs to be corrected So what's the problem? So this does not extend So let me go back to the same notation. I had yesterday. So what I really have is You know a Lagrangian torus vibration over an open subset of the Fibers and there'll be some subset of singular fibers where this construction Does not apply. So what I'm really good at doing is getting Like structure on this open set So the problem is that this complex structure Does not extend to a complex structure on Maybe I should be more precise about it.  So because Why is that because of the monotron around the singular fibers? So the point being if I go around a singular fiber these sort of coordinates I've written down will undergo some Non-trivial transformation and it means that, you know, you won't be able to extend that to a local function near near the singularity Okay, so what's the solution and again, this was in the original paper of Strominger-Johannes Aslo And it was motivated by considerations in string theory So what you should do is modify the gluing of these local charts in the following way. So using counts Ending on the fibers of the SYZ fibrations. So the picture is, you know, my SYZ fiver.  So somehow It's a good picture. If you have a singular fiber like this a pinched torus Such that this cycle is the vanishing cycle for this degeneration Then at least topologically you can see there is a disc like this and in certain situations That disc can be made to be can be come holomorphic for appropriate choice of particular disc So let's see an example So I want to go back to the example we discussed yesterday So if you remember yesterday, I had a construction of the following type. So I started with Basically started with C2 and I just blew up a single point On the boundary, let's say 1-0 for instance, and I'm thinking about my log club. Yeah, I was being the complement of the boundary So, you know, so my U, this is my Xd U is X-2 So D being the the strict transform of the boundary And so what I said last time is that if you think about this from the point of view of the SYZ fibrations You get a picture like this for the torus vibration So, SYZ fibrations It's a bit difficult to draw, but let me try So first of all the base Like this, so like a quadrant and there's a A singularity So the monodromy of the cycles in H1L around this point given by this matrix And so, you know, so the picture, so this is the base and here's U So over this point, there's a singular fiber and if I sort of look at this path here That's Roughly speaking, so over some path of this sort, I see the exceptional divisor This this line here corresponds to my boundary, one of my boundary divisor, then you have a boundary divisor I guess I don't care about This is um the x-axis That's that's the rough picture, but he's my exceptional curve. Okay, and so now one can see There are two disks in this picture Which end on the fibers of the SYZ vibration so maybe Oh, sorry. So this is what I did last time So if you remember we had just the moment map image of C2 just the positive quadrant in R2 We removed A small triangle And then we glued via this map to form this space B. Does this sound familiar? So I want to emphasize that, you know, this is a um this this should not be thought of as embedded in the blackboard. It's some kind of You know, so this this is a planar picture and now I've done some funny gluing So it's really, you know, think of it more as an abstract space as opposed to Okay, so what I want to sort of explain is there are two disks in this picture. So let's sort of see so where are they You take this line. So this is the line. I guess x equals 1 And you take it strict transform So now let's sort of um fatten this up to to a more reasonable picture the sort that a complex geometry might draw So here's here's so this is um Right. What does this look like? It looks like a Uh a disc So cp1 of one point removed. So here's a disc Coming out of the singularity of the singular fiber here and similarly Um, you know, here's my cp1 And you know, this is the other disc. So coming out that way So there are two disks um emanating from the singular point one going this way one going the other way And so when I say two discs, uh, what I mean is Um two families of discs. So depending on which fiber I want it to end on, you know, I stop at a different point So this is the singular fiber. This is a general fiber Over this um Over a wall in the base So what we have is this kind of picture there's a wall um Real co-dimension one over which there are do exist holomorphic discs Ending on the fiber So there exist Discs exactly exactly one Ending on the fiber again, this is a picture of b again So there's a singularity here and the discs are emanating in the two directions from the singularity Okay, so now I want to try to show how do we correct this problem with the local coordinates So now I'm going to introduce a branch cut So that on the complement of this cut Uh in in the in the variety you I can define these functions Uh z one and z two globally away from the cut So define coordinates Z one z two Um away over the complement of the cut and so um First of all, let me just say what's the monodromy? So remember these are associated to um The homology of um the torus These correspond to a basis gamma one gamma two of l So what's the monodromy as I go around? This point so you have to be a little bit careful to go back to um So what we did last time so this has monodromy this gives you the monodromy on the integral tangent vectors So this is the dual space these correspond to coordinates. So this is cotangent vectors So that's dual To the tangent space Um at a point So I'll write tz for an integral tangent space. So this was the monodromy On the tangent space. So the monodromy here. So in the opposite Direction will just be given by the transpose So if we take our z one z two to correspond to the two basis vectors or the dual basis of the basis there This is the monodromy. So it's saying z one Goes to z one And z two goes to z one inverse c two. Oh, I'm sorry. I forgot to do the transpose I should have written it out. So this is the transpose Okay, now we're good. So z one goes to z one z two inverse And z two goes to z two. Sorry. I I I should say so this is of course, um the monodromy written Additively and here we're writing it multiplicatively. So the map gamma goes to z gamma is a homomorphism. So this is just writing H one of l multiplicatively. Okay, so that's that's the transformation across here And so what do we attach to the wall? So so as I said on this wall, we're going to associate an automorphism to crossing this wall So what is it? It's just the standard cluster transformation that we've seen already So on this side, it's given by the following formula. So z one is fixed And z two goes to z two times one plus z one inverse And above the wall Above the singular point. So on the other connected component of the wall I'm running out of space. Maybe I'll erase this matrix if you don't mind So z one z two similar formula, but now it's one plus z one Let me try to explain. So where did these functions here? So we think of those two functions as attached to the wall one plus z one and one plus z one inverse Where did those functions come from? They're basically just recording The class of this disc Um, you know, so this is some holomorphic disc You can look at the boundary of the disc that has a class in h one And under our normalizations that corresponds to the coordinate z one Similarly here, you know this disc has the opposite Boundary as an oriented You know disc and that corresponds to z one inverse Okay, and so you can now check just see That now the gluing is consistent Meaning if I go around a loop this Composition is the identity So that's the um simplest example of this fixing the problem with monodromy using holomorphic discs And in general, you know, this is kind of an amazing Thing that sort of came out of string theory Um, I should say I'll give you know later in a moment I'll give a sort of more mathematical reason. Why should this work? So why does this work if you just correct using holomorphic discs? But let me just say now in general What happens? So holomorphic discs In you ending on the fibers So these lie over Real co-dimension one walls in the base Possibly thickened So it's not In some limit they they become real co-dimension one But uh, they might be sort of slightly thicker that might be some kind of amoeba like structure transverse to the wall And what's the we attached to function so here alpha is the class of the disc Um, so let me just say so now I'm sort of writing a slightly more general notation So let's write it down. So what's z z to the alpha? It's really the same definition as before But now I have a global homology class to integrate over Times the holonomic. I'm sorry. What did I call it row row of delta? So in terms of what I did before this is just a constant Times z to the delta alpha The boundary of alpha So, you know the original coordinates were in terms of h1l now I've got an actual class in a relative class Is that max to h1l just by taking the boundary? But uh, here I'm getting a A function which takes account of the the the area of this of this disc And now this function is some kind of generating function Counting multiple covers of the disc Discs associated with the wall multiple covers Okay, and um What's the gluing automorphism? So it can be written in these coordinates z gamma The following way They just take the product with this generating function raised to a power So you take the boundary of gamma And then there's a class Let me call it c So this um, maybe c c sub c sub c So what's c? So this is a a class in h n minus 1 of the fiber And it's just the um swept out by the boundary of the discs And so if we're in dimension two, this would just be Delta r for itself the boundary Okay, so this looks like a crazy thing to do So let me try to explain why this is going to work Why? Why does this work? reasonable question So the point is that with the corrected gluing we can write down global functions global holomorphic functions on v In the following way Of course now i'm really in the non-compact case that we're most interested in Otherwise there won't be any global holomorphic functions at all But yeah, so we're really thinking about the log log collabial case now So what do I do? So let's take some compactification Let's let c be some A component of the boundary in some uh log collabial compactification What usually v is inside um So Yeah, I think it's y ye right Oh, I'm sorry. I'm sorry. I'm sorry. I'm on the wrong side Is x set minus d So Just the usual picture. I've got my u and I compactify it to some projective variety x with a normal crossing boundary That's infinity And just take some component of the boundary And I'll take a positive integer as well Then what's my function? So incidentally we call these a theta functions because um You know the analogous construction for an abelian variety produces the usual Theta functions from classical geometry So again, it's the same a similar formula to before So if I have A point in v so it's given by a Lagrangian and a local system I take a sum of the following sort So it will be a sum over classes in the relative The relative homology group h2xl of a count of disks n beta times this um Local function z to the beta defined in the same way as over here. So this is just the The definition of z to the beta And what's n beta so where? n beta Is the number of holomorphic disks I'll use this blackboard bold d for the the usual complex disk of radius one Close disk in the plane So mapping to the pair xl So a holomorphic disk in x now the compact guy with boundary on the Lagrangian With the following properties so it's in class beta It has a relative homology class That's this beta here Such that so several things So first of all it meets c in a single point Multiple st so contact order m The local intersection number Is this positive integer m Secondly It's disjoint from the rest of the boundary It doesn't intersect the boundary anywhere else and finally One more condition which fixes the expected dimension to zero Is that it passes for a general point of l So remember the boundary lies on l I wanted to pass through a particular Point of that Lagrangian so then that's expected dimension zero And so the point is that if you try to do these counts Um, you know use the naive gluing of v so you don't make any of these corrections This function will jump Um as you cross a wall and the gluing correction is um defined in such a way that that that it corrects for that jump So that these become global holomorphic functions on v Um, so let's give an example So back to our our running example So again, I'll sort of draw the base And here's our wall remember There are these two discs emanating from the wall Um, and so if I try to let's let's make this our boundary divisor c I try to do this computation on one side of the wall over here I'll just get a single disc So I'll sort of draw it like this sort of It's just um Think about it, you know, it's just one of the lines y equals constant That's your disc If you're on the other side of the wall, you have that you have that disc again, you know the same thing Another disc y equals constant, but there's another one as well looks like this So I'll sort of draw it like an amoeba. That's what it looked like under this projection Some kind of amoeba like this There's another disc of this sort And again, let me try to sort of say intuitively what you should think take the original disc we had There's a disc coming out along the wall Sort of glue those discs together Together with a cylinder So here there'll be some kind of balancing condition Is that the sum of the boundaries zero h1l And so you could imagine you you glue together some topological surface like that But then the assertion is okay near to that topological surface. There's an actual holomorphic disc And since we're in such a simple example, you can actually write down this disc explicitly So let's go back to the toric variety. So remember that this was uh, you know originally we had the Toric variety we're just blowing up a point I guess I'm sort of slightly abusing notation here I was originally talking about the base, but there's also of course the the variety living over it So we blow we blew up a point Let's construct what would this disc look like down here So it would just be a disc like this There's a disc intersecting the boundary in two points and it's ending. So this is our fiber here ending on a Lagrangian torus fiber l And the way that we constructed this Lagrangian vibration I didn't give you all the details last time But away from this wall the Lagrangian vibration is just the same away from some Compact neighborhood of the of the wall So in fact, this will just be the usual usual torus fiber um for a toric variety just you know the absolute value of the the Coordination is constant And so then uh, you know my disc Be the following disc. So remember this is the point. What did I call it one zero? um So what's the disc one way to write it down like this? Yeah, so that's a a disc Which goes through this point one zero And if you look at the boundary of the disc, this is D mapping to C2 Um, you'll check that the way I've cooked things up. So the boundary of the disc maps exactly to this some Lagrangian torus fiber And so really the only thing that's going into this which probably most people know Is this a thing from complex analysis 101? In the so-called blashka factor So that's what we're saying is this map gives a map from the unit disc to itself Um, which sends alpha to zero In fact, you only if you only know this one fact you can basically completely classify holomorphic discs in toric varieties ending on a on a on a Lagrangian torus fiber So that was done in a paper Of cho and oh Let me just give the reference So, you know, I'm just giving this reference if in case you want to see more but I guarantee you if you don't see it immediately you can do this example on your own and see that this is this is the this is a Such a disc Okay So I want to switch gears now and so before I do are there any questions at this point So maybe I just quickly review what we said so the point is that You know a mathematician can understand why this gluing is the right thing because what it does It makes sure that the complex manifold you're constructing has lots of global functions Right, so somehow if I want to extend a complex manifold, you know, I have have some say structure on a On a complement of some small co-dimension sets in a complex manifold And I want to know if it extends to a complex variety over that puncture Then you know one way to do that is just ensure that you have enough functions to define the thing You know so you can take sort of spec of the ring of global functions essentially just to extend it And so this construction sort of explains from a mathematical point of view why this instanton correction will solve this problem That the complex structure doesn't extend over over the discriminant locus Okay, but now I want to Explain so, you know our work is basically taking this picture and trying to make it a rigorous mathematical Proof of this conjecture for cluster algebras. So construction of global functions on cluster algebras So the next step is to translate this picture into algebraic geometry or really more accurately tropical geometry And use it to prove To construct canonical basis of cluster algebras. Remember, what is a cluster algebra? Well, we've got some log Calabi our variety with some additional special properties. We just take its global functions That's the cluster algebra. And so, you know this canonical basis will be exactly this This base is described here. So in fact if you do this for all possible components and all possible positive integers M and you throw in The identity elements that would be called feet of zero these guys together form a basis of the ring of global functions Okay, but that's going to require quite a bit of work. So let me switch gears and start doing that So let's quickly review the notation that we Used earlier. So we have a cluster variety And we've got some toric model. So in the cluster language, that's what's called a seed. We've got the torus T that's the interior Of this toric pair That's a copy of c star to the n We've got the lattices. So n is the lattice of one parameter subgroup. So the first tomology of the torus Um, let's copy of z to the n n is the dual of n We have a holomorphic symplectic form on x Or strictly speaking on u with log poles along the boundary And what we sort of explained last time is um On the first day is that actually that becomes completely combinatorial thing if you just restrict it to the torus Um, let's call that sigma bar So that's a log two form on holomorphic two form on the torus And that's a very simple thing. It's just a constant coefficients given by some skew matrix And without choosing coordinates That's an element of wedge two of m tensancy So what was the story? So this toric, uh, I probably shouldn't write any lower. Should I go over here? So this is a blow-up Was a blow-up of a certain amount of data so It's defined by the following data So we had some centers z i they were given by a boundary divisor Let's let me write d sub vi so vi will be the Generator of the ray corresponding to the boundary divisor Intercepted with Zero locus of a character So let me write my character in multiplicative notation z to the mi equals lambda i So here the vi Is a primitive element of n Mi is a primitive element of n Lambda i of course is just a scalar And there was the condition which was for if you do this blow-up When does the the holomorphic form actually lift? And the condition Was so in these in this combinatorial fashion You take sigma bar you evaluate it At vi in the first argument that should be a multiple of mi That's just the condition for the holomorphic form sigma bar to lift to a holomorphic form sigma on the blow-up Okay So that's the notation that we had last time. I agree. It's a bit of a mouthful. So my apologies So now what I want to define is what's called a scattering diagram associated to this data so Let me first explain what's basically going on here. So we we understood that in the base of this Taurus vibration There were certain walls in the base that we had to attach some automorphism to Now one can certainly ask what happens when one when two of those walls collide Well, uh, if you were to go around a loop here, so there'll be some automorphism attached to each wall You know this This um composition of automorphisms will be some kind of commutator So it wouldn't be the identity unless these two guys commute and there's no reason to expect that in general So what one can think of is that the scattering diagram Is there's a canonical way to fix this So if you have these two walls, I'll draw some arrows to indicate the direction in which the sort of disks propagate So somehow this is the the direction in which the disks area increases So then what happens is it's going to be some kind of picture like this where you add a whole new bunch of rays coming out of this point Um, which fix this property that fetus should be the identity when you get around a loop And again topologically it's the same picture we saw before that if I have two incoming disks I can sort of glue them on To a cylinder like this at least topologically take, you know n times this m times this Glue them together and get some nearby holomorphic disk That's the meaning of these rays So basically, uh, yeah, what the statement will be is that somehow If you take the initial disks coming from the blow-ups and you apply this scattering procedure That will somehow tell you all the holomorphic disks On your on your manifold and and thus you'll be able to build the mirror Um using this scattering diagram, but the first step The technology of the scattering diagram is to just start with this data which tells you these initial Disks corresponding to the blow-ups. How does that data determine all the other disks? That's what's encoded in this scattering diagram. I should say Um, you know, this was discovered by consavich and soiblman In 2004 and it's still a kind of a miraculous object. We don't quite know why it works, but it does and it's very beautiful Okay, so let's try to say what it is So first of all, uh, I'll have a base ring. I'm just going to write down a polynomial ring These are just formal parameters which are going to control convergence issues Let's write n for the maximal ideal of the origin And we'll use hats for matic completion There'll be a certain amount of Care required to to to get convergence. So what's the scattering diagram? Well, it's a collection of walls So I'll use the notation b and f so d will be the support of the wall so this will be um rational polyhedral cone The vector space associated to the lattice n that's the lattice of one prime and subgroups of the torus where the Where the fan for a toric variety lives And it's got co-dimension one Okay, so given that so let m in the dual lattice be a primitive vector with um delta contained in m perp So that's just determined up to a sign just the hyperplane that this rational polyhedral cone lies in Um, so then we also have another part of the data. So what's this function f? First of all, I have a vector v In the in the lattice n this is going to be called This is related to what's called the direction of the wall Again primitive We have our usual condition on the Relation between these two guys. So if I take sigma bar of v And that should be a multiple of m The same condition we had over here and our f is now a function So we've got this coordinate. We've got this coefficient ring a So just take the polynomial ring in this variable z to the v and that lives inside um This ring here, maybe I should just say so what's this? This is just the coordinate ring Of the torus the dual torus actually so it t dual uh cross um a They are we've Or that's t1 to tr So these are just global functions on the dual torus um But we've introduced these formal parameters t1 up to tr and um I'm going to have to complete here. So this won't actually be an element of this ring It'll be an element of the completion. So let's put hats So what's sorry? I should have said so t dual. It's the obvious thing, of course My t is n tensor c star. So t dual will be n dual tensor c star n tensor c star So it's always confusing. I've been doing this for a long time today. It's still get confused So n is the one parameter subgroups of t, but it's the Characters on t dual. So this z to the v is a character on on the dual torus. That's our patch of the mirror variety Okay, and so this guy should satisfy some property. So it should be congruent to one Modulo the maximal ideal and also its constant term should be one. So it'll be So it's in this polynomial ring. It's congruent to one mod the maximal ideal and the constant term is also equal to one We have a finiteness condition. I just can't hear you n times this actually So every term will have a non-trivial You know exactly what I said, this is correct So the finiteness condition so for every Positive integer l there are only finitely many f congruent or not congruent to one mod m to the l And so so okay, this is a whole load of junk. What's the point here? So I've got a wall crossing automorphism associated to a wall So here's my wall or two-dimensional picture is m greater than zero m less than zero if I cross this wall In that direction so from m greater than zero term less than zero I get an automorphism of the ring Roughly speaking an automorphism of the torus the dual torus What does it send? So it sends z to u z to the exponent u goes to z to the u times some power of f and the power is given in this way slightly Pairing between u and m So this is again should look familiar. It's something like what we were just doing in the symplectic discussion translated into this framework No, so um Sorry, finally many walls Such that So what it means is that I mean, sorry, let's say in terms of this So attached to each wall is an automorphism But at any finite order, I only want to have finitely many non-trivial automorphisms, right? That's the that's what it means So now what you get But now for any path in the scattering diagram So the ambient space is n r um So I don't want it to go through the singularities of d the the places where it's not a manifold with endpoints Again, I don't want endpoints on a wall Maybe I should write vertical lines for the support of these things We'll get an automorphism in the obvious way you just compose all the automorphisms You get by crossing the various walls And you know if you sort of this is why this sort of completion is kind of Crucial remember all that means of completion, you know our hat. I'm just taking the inverse limit Like this So what I can do at any finite level this makes sense because there's only finitely many walls And then I pass to the inverse limit. I get this This automorphism, which in general could be kind of gnarly Okay, let me let me go in for one minute because I want to state the theorem Of consavich-soyverman and gross seabit gross seabit The consavich-soyverman did this in dimension two In a slightly different context and gross and seabit Translated it into algebraic geometry and did it in arbitrary dimension So if I take Let's call it d in this is an initial scattering diagram Consisting only of hyperplanes So each wall the support is a hyperplane then unique scattering diagram d containing this Initial scattering diagram with two properties so such that so first of all The new walls are all outgoing and secondly we have this consistency property that theta D gamma is the identity for every loop gamma and it occurs to me. I forgot to tell you what an Outgoing wall is so let me do that now very quickly So in this data, luckily I haven't No, I have erased it Oh, sorry. Here it is. Uh, that's right. So This vector v. So what's an outgoing wall? The direction of a wall df The same notation as before is minus this vector v And again informally, this is the the direction that the disk Propagates The direction in which the area of the disk increases And we say it's incoming if this vector v is in the wall and outgoing otherwise, okay, so so the um again the heuristic here is sort of we're constructing this varieties a blow-up They will have some disks Coming from the exceptional divisors, which are they're going to be the incoming walls Then we'll have a whole bunch of other disks Which are sort of generated by this process, which will be the outgoing walls. And so this theorem Tells you that somehow there's this sort of magical construction Um, I mean it was basically just amounts to a computation in some uh, lee algebra associated to this A group of scattering automorphisms Which tells you that you know given any initial data you can construct Uh, a unique scattering diagram with this consistency property So unfortunately, I'd had wanted to talk about some examples, but uh, I better stop so actually, um Lofa, am I supposed to talk this afternoon as well? There's some sort of exercise session or I just thought well Yeah, well what I wanted to do is to discuss discuss some examples of this And so which might that might be appropriate to do it this afternoon. I don't know anyway. Thank you very much


Studying Macbeth, let's look at the exchange between Ross and Lady Macduff when he's trying to get her to escape. In Act 142, Ross defends Macduff's decision to run away. He tells Lady Macduff that Macduff is noble, wise, judicious and best-knows. Now here, these adjectives belong to the rule of three. In other words, he's basically saying that Macduff probably can see through Macbeth's evil deeds. Ross says, from what we fear, yet know not what we fear. Now, the repetition of the words, fair, essentially show that there's a hidden enemy that's causing Scotland to degrade. They don't know what it is, but he's hinting that it might be Macbeth. But Lady Macduff is still really angry at her husband, and what she sees is a betrayal that he left Scotland. She says, fathered he is, and yet he's fatherless.


phone and it didn't quite work. That's right. Pursuant to Chapter 20 of the Acts of 2021 and extend again by Chapter 2 of the Acts of 2023, this meeting will be conducted by a remote means. Members of the public who wish to access the meeting may do so in the following manner by emailing steve mccarthy at mccarthy s at mrstma.gov. That's m-c-c-a-r-t-h-y-s at mrstma.gov. No in-person attendance of members of the public will be permitted, but every effort will be made to ensure the public will adequately access the proceedings in real-time by a technological means. In the event we are unable to do so for reasons of economic hardship and despite best efforts, we will post on the m-rst website an audio or video recording transcript or other comprehensive record of proceedings as soon as possible after the meeting. That done, we'll call the meeting to order at 5.03 p.m. and take a roll call. Dylan? Dylan? I'm here. Guest on? Guest on? Immuted. Oh, is he, did he say here? He may be going through a dead zone or something. He's on, okay. He's on here. He's on, he's on you? He's camera froze. Okay. Hallie? Here. So what do I do if I've got a frozen camera? Did he say here? I'm going to say here. So he's on, we have to wait, do we have to wait, Steve? Well, we have a quorum without him, so. Okay. So he just says here whenever he joins. Okay. Yeah. All right. So just to say for the minutes, we could note that he was in attendance with a bad connection, but we have the quorum. So we do have a quorum with three present and three present and two currently absent and possibly joining shortly. Okay. So the next up is public comment. And this is general public comment unrelated to anything on the agenda. So if you have general public comment and you'd like to comment, please raise the press the raise hand button at the bottom of your screen. Any public comment? Okay. Moving on to licenses. Okay. Special short-term liquor licenses. Up first SST-23-53, Gabrielle Gould, Amherst Bid, all alcohol, December 14, 2023, 5 to 9, 45 South Pleasant Street. And Gabrielle. Hi, Gabrielle. Hey, guys. How are you? Good, how are you? Good, thanks. So this is the sip and stroll? Yep. So this is the old B. R. Exactly. So last year, sip and shop stroll. The sip and shop stroll part is throughout Amherst, but the makers market is what this is specifically for. Last year we did it at the Drake. We outgrew the Drake. We have more makers and creatives in Western Mass and we can fit into that space. And we have a perfect window where AJ Hastings is going to be completed for Amherst College, but not yet belonging to Amherst College, there will be starts on in January. So we were able to work with the owners to allow us to use that space for this year's makers market. Okay, great. And you submitted all the documents and the map or the diagram of where everything is going to be. Did everybody have a chance to take a look at those before the meeting? You want to just look at them again quickly. Any questions or comments about it? As per usual, we will have certified bartenders. We will this is this is a very grown up and the grown up tend to have like little humans. It's not exactly a teenager and college age mix in the pottery and woodworking and glass blowing and things like that. So we're not too concerned about bracelets or anything like that. But it's a very festive evening and one that I think is very beneficial to downtown and local businesses. Okay, fantastic. Is there food served along with the alcohol or is it just there will not be. And we didn't do that at the Drake last year either. Okay, have several restaurants participating in a three for 45. So three courses for 45. And then of course, the goal is to really drive. There wasn't a seat empty at a restaurant last year. That's kind of the goal is to get people out and about. We of course, strong carriage is bringing people from location to location, whether permitting of course, this all could fall apart if there's a huge snowstorm. Right. Okay. All right. Any other questions for Gabrielle? No. No. If not, is there a motion to approve SST dash 23 dash 53? Almost. Thank you. Dylan, is there a second? I second. Thank you, Hallie. Any further discussion? If not, we'll take a vote. Dylan. Hi. Hallie. Hi. Gaston, are you able to answer? Yes, I sorry. The train was delayed, but now I'm where I should be. Thank you. Okay, fantastic. Great. And I vote I, that is four to zero with one absent. The license has been approved. Okay. Thank you all so much. Hope to see you there. Yeah. Thank yous. Thanks for coming in. Okay. Bye. Okay. Up next, SST dash 23 dash 54. Benson Hyde, Wine and Malt. October 14th, 2023, 1 to 5. Lawn outside 113 Coles Road. Is Benson Hyde. Oh, hi. Thank you for coming. How are you? Thank you for having me. And this is, did you do this last year? No. So what we did, and I apologize, I'm getting over a cold and I'm just getting my voice back. So if it cuts out, I apologize for that. But we did a fundraiser for the International Language Institute in April. Okay. And so this is basically a replica of that, but for the Amherst Survival Center. Okay. Okay. And with a different, you know, that was all Italian wine people. And this is going to be more of a mix of, it's we're working with one specific importer. Okay. All right. Great. Does anyone have any questions about this license application? Nope. Everything look good? I actually had a question. Oh yeah, sure. And I was a little confused when submitting the application because I do have a couple of, I guess they're, I call them local, but they're like upstate New York spirits makers who are interested in attending. I'm able to have them just do like a regular in-store tasting that day that is separate from the event. But I was wondering, because I know that it's for nonprofits, or I was trying to understand the language, but it's, you know, we're doing this in raising money for a nonprofit. Right. And I was wondering if that made it, you know, I was wondering where the line was for the all spirits or the all alcohol license. So thank you for not raising the issue. Yeah, definitely. So do you want to tackle that Dylan? Did you have? Yeah, I was just going to ask it. So for you're doing this event, but then simultaneously, well, this event's happening. There's going to be tastings that would typically just be part of the normal license. Am I correct? That's the idea. Exactly. And it's no part of our normal Saturdays. We generally try to do tastings on Fridays and Saturdays when we can get people. Yeah. I mean, Steve, correct me if I'm wrong, but I think that there's no issue with that. I think it would be if you wanted that to be part of the event. So you want it to be part of the event? I was wondering if I would be able to move them and include them as part of the event, but it would be the all alcohol license as opposed to the beer and wine. I just wanted to, just because I was having a hard time understanding how that breakdown happened. God, I mean, I think that can definitely be part of this license. Steve, does it just need to be on the application that those folks are part of it as well? Or is that okay to just go with it? I think the question would be, and I spoke to Benson with this earlier and I thought I would just leave it for you all, is there's this weird thing with the short-term licenses where an individual has to apply for them, but the all alcohol can only be obtained if you're doing it for a non-profit organization? I think the principle is that if you're going to make the liquor level of sales, then it should be going to a non-profit or something like that. Yeah, that very well, I don't know. The statute doesn't really talk on that. That makes sense as a justification. I don't really know what it is, but that makes sense certainly. So I guess the question of the board would be, if this is all going to the Survival Center, would that qualify? Which it is. Yeah, I think. Yeah, I would think so, right? So you don't need a license for a tasting though, right? I mean, does a spirit tasting, is that different from a wine tasting? So the tasting is part of the overall license. I know that Light of the Night has had it. But my guess, my question was, I'm doing this for the, raising money for the Survival Center, but I personally am not like an officer of the organization. Oh, that's okay. Okay, okay. That's where I like, I just didn't want to, I didn't want to do anything wrong. Okay. So does that change, does this turn into a different license then or Steve? I could just amend it. Can we amend it? Just a couple of clicks of the button. I guess if Mr. Hyde makes that request formally and that'd be awesome. Leave it to the board. Okay. Do you need me to say it out loud? Steve, can I make a formal request to amend the license so that it is an all-alcohol license? Yes. Short term. And then do we have to, when the motion is made, first of all, does anybody have any questions about the application aside from the amendment to turn it into a, if not, okay. So then does the amendment have to say approving the amendment, adjusting it to a non-alcohol short term? I guess you could just make a motion to approve the application, you know, modifying it to be an all-alcohol. Okay. Does someone want to make that motion? Yeah. I'll just say I moved to approve the license with the proposed amendments. Okay. Thank you. Is there a second? I'll second. Thanks, Hallie. Any further discussion about this one? If not, we'll take a vote. Dillon? Aye. Hallie? Aye. Gaston? Aye. And I vote aye. That is four to zero with one absent. The short term, what is this? SST 23-54 is proved. Thank you so much for coming in. Good luck with that. Thank you, guys. All right. Okay. Next up is SST 23-55. Oh, these are both UMass, but these are two different things. Can we make that motion second? Just... Oh, Hallie did the second. Dillon and Hallie, okay. Dillon was the motion. Dillon was the motion. Hallie was the second. Okay. So now we have SST 23-55 and 23-56, which are both top of the campus and all alcohol. UMass student lawn. So are these part of the series of short term, Steve? So one of them is the Fine Arts Center lobby, I believe, is just another event that popped up. Mr. Trisbitt should be here. Oh, yes, here he is. Hello, Mr. Trisbitt. Hi, Bill. How are you? I'm good. I'm good. Yeah, I just wanted to jump in and let you know that it was a pop-up type of event. Okay. So if you had any questions, but it follows the similar path as the others for the Fine Arts Center lobby, so it really isn't anything different, but I figured I'd jump here and say hello. Okay. All right, great. Super, thank you. And then the other one is? The other is the Student Union lawn. Homecoming. Oh, right, the homecoming. Megan is here. Okay. Hi, Megan. Great. But the homecoming has been done before, correct? Correct. Yeah, okay. It basically follows the same pattern as last year, but my understanding is more or less over a couple of years, like two years prior, we were having everybody go into the whole area. Following them down there, my understanding is that this year they're going to go into the Student Union ballroom for tours, if they want, as my understanding, but Megan can jump in and let you guys know if that's in fact the case. Okay. Sure. Thank you, Bill. So, yes, the block party has been done since 2019. This year we're reimagining it and calling it Homecoming Fest. As we did last year, the Beer Garden would be taking place on the North Lawn, which is the grass area located in between the Campus Center and the Student Union. The difference this year, as opposed to when we did it in 2021, as opposed to allowing individuals to enter the Blue Wall, which is the dining location in the Campus Center, we are having them go through the Student Union and they are allowed to bring their drinks from the Beer Garden on the North Lawn into the Student Union. Okay, and that's the older looking building that's attached underneath to the Blue Wall, correct? It's the newer of the two buildings. Oh, the newer, the brand new one. Okay. Yeah. Our intention is to help showcase the building to our alumni who are coming back for the first time in however many years to celebrate Homecoming. Okay. Okay. So it's the one, but okay, got it. Thank you. Great. Does anyone have any questions about this? Everyone get a chance to look at the documents. No questions. I guess we can approve these together. If there are no objections, is there a- I guess one question I had, Megan, is that the parts of the Campus Center are part of a license premises. I know there's an underground passage between the Campus Center and Student Union. I don't know if there'll be any signs up or anything to say. I believe the license premises of the Campus Center is the hotel upstairs, the UPUB, and, you know, it's like a storage room, but that's kind of the more important parts. So it's fine to have it in other parts of the Campus Center, but I don't know if there'll be signs at the boundary or what you'll be doing for that. Yes, that's correct. So we will have signage throughout the Student Union, and we have actually hired five security guards and one supervisor to patrol five of the main access points, including that underground tunnel of sorts that links them to the Campus Center to instruct them that they are to stay within the Student Union or the North Lawn with their beverage. All right, thank you. Thank you. And is there food available? Yes, we will have food in the beer garden tent, little snacks, for instance, that they don't have to purchase, and then the blue wall will be open as well. So after they've finished their beverage, they will have access to the blue wall, and we are working to have the food truck also accessible on the opposite side of the Student Union. Okay, fantastic. Thank you. Any other questions? If not, is there a motion to approve SST 23-55 and 56? Go moved. Thanks, Dylan. Is there a second? Second. Thank you, Hallie. Any further questions? If not, we'll take a vote. Dylan? Aye. Hallie? Aye. Gaston? Aye. And I vote aye. That is 4-0 with one absent, and those two licenses are approved. Thank you so much for coming in. Thank you very much. Bye. Thank you. Okay, so that's the licenses, marijuana discussion topics, marijuana regulation. Yeah, I'll take the lead on this. I haven't done anything with it since the last time I talked to you guys. It's a poor excuse. I've gotten very busy with things, and I don't expect it to take long once I sit down and do it. I am to sit down and do it. I'm going to try to get that together this weekend, and then hopefully get something in for our next meeting in two weeks when I can actually have that together. I've only got the outline done. It doesn't need a whole lot more than that, but it needs a little bit more than that. So I'll get that folks to you by our next meeting. Okay, super. Great. Thanks. And you said last time you'd talked to Alyssa Brewer and thought about streamlining the whole thing following that conversation, correct? Yep. Yeah. So Steven ended up sending me, he sent over all the stuff we had from alcohol licensing, and basically what the work I've actually done is basically dragged out the stuff out of our alcohol rigs and kind of put them together in an order that makes sense, but right now it just says it's just copy and paste of everything from alcohol, and I just have to put in the time to, one, make sure that everything makes sense that it's referring to marijuana, but again, it's still taking that general approach of basically saying, there's the state regulations, like follow the state regulations, these are fee structures, and then that will be, I think the thing that we're really going to talk about with it, and then what we're doing for violations, and that's just kind of, as it stands right now, I've just done what we're doing for alcohol, and if we want to make any changes to that as well, we can, but that's kind of the structure that I have for it. Okay, super, sounds great. Any current questions for Dylan? If not, okay. Super. So next, we'll look forward to that next time, and then lunch carts and food trucks on Prey Street, plus their regulation. Steve, how's that going? I do have an update on that. Okay. The town manager had discussions with some town council members about the plan, and he's willing to go forward with this as a trial run, so I'm going to begin reaching out to different food truck operators, and we will see if we can get three of them, and maybe potentially next week would be the first one. I've left the regulations up there, if any changes were needed for this. I don't think we will at this point. I think the building commissioner's ability to issue short-term permits on the municipal parking district will suffice, but we'll keep that there if anything does need to be changed, and yeah, I will let you guys know, but hopefully if I am able to get three together, we could do it next weekend, next Friday. That'd be great. That'd be great. Thanks so much. That's exciting. Thanks for your work on that, Steve. Thank you. So was there anything else? So we don't need to amend anything on food cart, food truck regulation currently? I don't think so right now. Okay. All right. Great. Okay. Any other questions on this, Dylan? I just wanted to put it out there right now. I'm still a ways away from it, but I've had this conversation with Steve that for any regulations related to food trucks, I will be just recusing myself for those for any sort of votes or discussion on it. I'm looking into pretty seriously right now the idea of doing like a hot dog stand, a much more reduced idea of a food truck. I've been talking with Susan Malone for the health department over at a town hall about kind of the requirements of all that. So whether or not I actually go through with it is yet to be seen, but I think I'm considering it seriously enough that I think it might be a conflict of interest if I were to weigh in on those discussions at this time. Okay. All right. Well, thanks for letting us know. Thank you. Any questions? Any other questions? No. Okay. Great. So we'll look forward to that, Steve. And let's see, discussion topic D, upcoming meetings and agendas. So our next meeting, we could do the 19th or we could just skip ahead to the 26th to give ourselves a break. It takes us off our first and third schedule, but then we could just resume that in November. I think it's a big deal. Does everyone want to, oh wait, the 26th, is that okay for everybody? Or are you burning to meet next week? Works for me. Okay. Great. Six works for me. So anything on the November 2nd then. Yeah, is that all right? If we just do October 26th and November 2nd, or does everybody want to do it next week and then have the last week in October? I mean, what makes sense, Steve, with what's coming? Yeah, I mean, we do have probably that new application for Gabe's underground in the former Hazel space. So I have to check up on, if that'll be ready for the 26th, or if we might push that to the second, but I would assume it'll be ready for one of those two. But probably not the 19th, probably not the 19th, right? No, we would be past the notice deadline anyway for that. So if everyone's okay with doing the 26th and then the second, that might make a difference. Yeah. And maybe if we don't have a lot on the 26th, we can delve more into the marijuana regulations. Dylan, I'm happy to help with anything if you. Perfect. I will make sure to be on my desk. On the 26th? Okay. Awesome. All right. So are there any other discussion topics? I guess on the 26th, we'll do the marijuana regulations. Maybe we'll have an update on the lunch cards. Is there anything else that we needed to discuss? I don't think so. What's the timing on the chair and vice chair votes and all that, Steve? Do you know? The vice chair for the license commission? Yeah. How frequently are we supposed to be having an election-like process? That is a great question. I will look into that. Yeah. Steve, because if you could see if Doug, what his situation is. Yeah. If I can. Yes, Dylan. I mean, I know on ZVA, it was really up to us whenever we wanted to hold the election schedule. I don't think there's any bylaw constricting us on when we want to do it. It's just we elect a chair and the vice chair. So we can do it whenever we wanted to. Obviously, if we should get Doug here for it, we could even do something like mirroring the town council schedule where in January, although it would probably make much more sense for us to do a regular schedule in June when appointments happen or July. But I think we should probably get Doug in here because I think it's a good point. We haven't done it in two years now. So I think we are overdue. Oh, more than that. I think it was 2020, right? Yes. Three years. That's right, because I tried to do vice chair and we got Doug and that was the last time we had one. I'll tell this. I don't think I'm doing vice chair this time. But yeah, I think we can do one whenever. I think we can all get together. I think we should formalize positions again. Yeah, that would be great. Yes. Okay. So we can put, what do we call that, Steve, officer elections or something like that? Vice chair and vice chair elections. That sounds good to me. Who are we going to put on the next agenda? Put it on the next agenda. Yeah, put it down. Great. Thank you, Gaston. Okay. Topics not reasonably anticipated. 48 hours prior to the meeting. Any topics? I'm getting nothing. No. Okay. All right. If there's nothing, is there a motion to adjourn? Thank you, Dylan. Is there a second? Second. Thanks, Hallie. We'll take a vote. Dylan? Hi. Hallie. Hi. Gaston. Hi. And I vote aye. Four to zero with one absent and we are adjourned at 5 29 p.m. Thank you, everybody. See you on the 26th. Hi. Thank you. See you then. Oh, sorry. It was, Dylan did the motion and Hallie did the second. Is that correct? I'll be in pace then. I'm running a little slow today. Thank you guys. We try to make it easy for you. Thanks, Steve. Bye, everyone. Thanks. Bye. Thank you guys.