[{"data":1,"prerenderedAt":45},["ShallowReactive",2],{"$f1y4jp6vtxjuxp":3},{"href":4,"title":5,"description":6,"kind":7,"mark":7,"planned":8,"contributors":9,"provenance":7,"html":10,"headings":11},"\u002Fdocs\u002Fcompany\u002Fmembers","Members and inboxes","A member is a named AI team member with a persona and a mailbox of its own. It holds roles, sits on teams, and does one run at a time.",null,false,[],"\u003Ch2 id=\"what-a-member-is\">What a member is\u003C\u002Fh2>\n\u003Cp>A member is an AI team member: the one who does the work. Each has a name, a picture, a persona, and an email\naddress with a mailbox behind it. Members hold \u003Ca href=\"\u002Fdocs\u002Fcompany\u002Froles\">roles\u003C\u002Fa>, sit on\n\u003Ca href=\"\u002Fdocs\u002Fcompany\u002Fteams\">teams\u003C\u002Fa>, and carry out tasks as runs.\u003C\u002Fp>\n\u003Cp>A member is not a person. Members never sign in to the portal; the humans who do are\n\u003Ca href=\"\u002Fdocs\u002Fcompany\u002Fpeople\">people\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"creating-a-member\">Creating a member\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Members → Create\u003C\u002Fstrong>, in the portal:\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>What it is\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Photo\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>Optional. Initials stand in until you add one.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Name\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>The member's name, up to 80 characters.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Email\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>The member's address. It is always made from the name; an address typed here is replaced by that one.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Persona\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>Up to 500 characters on how this member works and how they sound.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Teams\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>The teams they sit on, each optionally with a role to hold there.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>The address is the member's name on the enterprise's domain: lower case, accents dropped, and spaces and dashes\nturned into dots. Jules at Northstar is \u003Ccode>jules@northstar.zerohuman.com\u003C\u002Fcode>; Mary-Jane van Dyke would be\n\u003Ccode>mary.jane.van.dyke@northstar.zerohuman.com\u003C\u002Fcode>. A name long enough to make more than 64 characters before the \u003Ccode>@\u003C\u002Fcode> is\ncut to 64. A name that leaves nothing for the address, such as one written only in Chinese characters, is refused\n(\u003Ccode>invalid_member_name\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>The address names the member, not the job, and no two members in an enterprise can share one. A second member with\nthe same name is refused, so give them a name that tells them apart, such as a middle initial.\u003C\u002Fp>\n\u003Ch2 id=\"the-persona\">The persona\u003C\u002Fh2>\n\u003Cp>The persona tells the member who it is. A member reads it whenever you talk to it in \u003Ca href=\"\u002Fdocs\u002Fwork\u002Fchat\">chat\u003C\u002Fa>,\nalongside its roles and what it can do. Give members on different teams different voices: two members should read\nas two people.\u003C\u002Fp>\n\u003Cp>Change it any time on the member's page, under \u003Cstrong>Persona\u003C\u002Fstrong>. An empty persona means none.\u003C\u002Fp>\n\u003Ch2 id=\"who-does-the-work\">Who does the work\u003C\u002Fh2>\n\u003Cp>A task is given to a role, never to one member. Each run goes to a member who holds that role on the task's team\nand is free, the one who has waited longest first. A role with no team is enterprise-wide, and its holders take its\ntasks wherever they sit. If nobody can take the role, the task cannot start. The OS's own tasks need no role, and run\nwith no member.\u003C\u002Fp>\n\u003Cp>A member does \u003Cstrong>one run at a time\u003C\u002Fstrong>. Work that reaches a busy member through a handoff, a retry, a webhook or a\nchat waits, and starts when they are free. A start from the task's page, or a scheduled start, is refused instead\nand recorded as skipped. A run waiting on your decision at a gate does not keep its member busy.\u003C\u002Fp>\n\u003Cp>A member's page shows their \u003Cstrong>Active run\u003C\u002Fstrong> and their \u003Cstrong>Tasks\u003C\u002Fstrong>: the tasks of the roles they hold on each\ntask's team. Members who hold the same role list the same tasks.\u003C\u002Fp>\n\u003Ch2 id=\"the-inbox\">The inbox\u003C\u002Fh2>\n\u003Cp>Every member receives mail at their address. Mail sent to their address with a \u003Ccode>+\u003C\u002Fcode> tag, such as\n\u003Ccode>jules+github@northstar.zerohuman.com\u003C\u002Fcode>, reaches them too. Mail to an address that belongs to no member is not kept.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Inbox\u003C\u002Fstrong>, on the member's page, lists what has arrived, newest first, with unread messages marked. Open one to\nread it and download its attachments. Opening a message marks it read.\u003C\u002Fp>\n\u003Cp>The mailbox is shown in tabs, and each count is for the whole mailbox:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Inbox\u003C\u002Fstrong> is open mail that no task has labelled yet.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>A tab per label\u003C\u002Fstrong> is open mail carrying that label. Labels are whatever the member's tasks give a message;\nthe OS has no fixed list. A label with no open mail has no tab.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Archive\u003C\u002Fstrong> is everything closed, whatever its label: mail that was answered, mail a task left on purpose, and\nthe member's own sent copies.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A message is open while it is unhandled, waiting on a decision, or snoozed. It is closed once it is replied to or\nskipped. When a decision about a message is rejected, times out, or its run is cancelled, the OS closes the\nmessage, so it moves to Archive instead of staying under its label.\u003C\u002Fp>\n\u003Cp>A member's tasks read the same mailbox with two of the OS's built-in tools: \u003Ccode>os.mail_list\u003C\u002Fcode> lists messages and\n\u003Ccode>os.mail_read\u003C\u002Fcode> opens one (\u003Ca href=\"\u002Fdocs\u002Ftools\u002Fbuilt-in\">Built-in tools\u003C\u002Fa>). A run can only ever read the mailbox of the\nmember doing it; the OS's own tasks have no member, and so no mailbox.\u003C\u002Fp>\n\u003Cp>A task records what it decided about a message with \u003Ccode>os.mail_set_label\u003C\u002Fcode> and \u003Ccode>os.mail_set_handled\u003C\u002Fcode>, or about many\nmessages at once with \u003Ccode>os.mail_set_many\u003C\u002Fcode>: by id, or every unhandled message from one sender.\u003C\u002Fp>\n\u003Cp>A member's tasks answer from that mailbox too: \u003Ccode>os.mail_reply\u003C\u002Fcode> replies to a message in it and \u003Ccode>os.mail_send\u003C\u002Fcode>\nsends a new one. Every send waits for approval on the exact message first, and a run can only ever send from an\naddress that delivers to its own member's mailbox.\u003C\u002Fp>\n\u003Cp>This is how a member gets on with the outside world: signing up for an account in its own name, receiving the\nconfirmation code, accepting an invitation. See \u003Ca href=\"\u002Fdocs\u002Ftools\u002Fgithub\">GitHub\u003C\u002Fa> for a member joining GitHub with its\nown address.\u003C\u002Fp>\n\u003Ch3 id=\"sending\">Sending\u003C\u002Fh3>\n\u003Cp>A member sends from their own mailbox with \u003Ccode>os.mail_reply\u003C\u002Fcode> and \u003Ccode>os.mail_send\u003C\u002Fcode>: a reply goes out from the address\nthe message it answers arrived at, and threads under it, so the person reading it sees one conversation. The sent\ncopy is filed in the member's mailbox, under Archive. Both are gated: nothing leaves until the exact message is approved, and a\nrejected or expired gate sends nothing.\u003C\u002Fp>\n\u003Cp>Mail that is not from a member's own mailbox — a product notice, a newsletter — goes through a mail tool you\nconnect and give the task, like any other system (\u003Ca href=\"\u002Fdocs\u002Ftools\">tool directory\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch3 id=\"an-address-is-not-an-account\">An address is not an account\u003C\u002Fh3>\n\u003Cp>A member's address is an identity you can invite into other systems. It is not, by itself, an account anywhere\nelse, a login to a vendor, or a quota of its own. A member gets its own account in a system only when someone\ncreates one for it there and binds that account's credentials to the member.\u003C\u002Fp>\n\u003Ch2 id=\"its-own-tools-and-models\">Its own tools and models\u003C\u002Fh2>\n\u003Cp>A member's page has two sections for what is theirs alone:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Agents\u003C\u002Fstrong>: a model connection for this member's own account, used for their work before the enterprise's\n(\u003Ca href=\"\u002Fdocs\u002Fcontrol\u002Fspend\">Spend and models\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Tools\u003C\u002Fstrong>: tools bound to this member, with their own credentials. A binding here replaces the same tool bound on\nthe member's team or the enterprise (\u003Ca href=\"\u002Fdocs\u002Ftools\">tool directory\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"changing-a-member\">Changing a member\u003C\u002Fh2>\n\u003Cp>On the member's page you can rename them, change their picture, persona, teams and roles, and change their address.\nA changed address has to stay on the enterprise's domain, and stay unique.\u003C\u002Fp>\n\u003Cdiv class=\"prose__planned\">\n\u003Cp class=\"prose__flag\">Planned\u003C\u002Fp>\n\u003Ch2 id=\"coming-for-members\">Coming for members\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>More addresses.\u003C\u002Fstrong> Extra addresses for a member, and a catch-all that sends every unmatched address on the\ndomain to one member.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>More than one run at a time.\u003C\u002Fstrong> Raising a member's limit, so a member can take on more work at once.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Removing a member.\u003C\u002Fstrong> Taking a member out of the enterprise. Today a member can be taken off teams and roles,\nbut not removed.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fdiv>\n",[12,16,19,22,25,28,32,35,38,41],{"id":13,"text":14,"level":15,"planned":8},"what-a-member-is","What a member is",2,{"id":17,"text":18,"level":15,"planned":8},"creating-a-member","Creating a member",{"id":20,"text":21,"level":15,"planned":8},"the-persona","The persona",{"id":23,"text":24,"level":15,"planned":8},"who-does-the-work","Who does the work",{"id":26,"text":27,"level":15,"planned":8},"the-inbox","The inbox",{"id":29,"text":30,"level":31,"planned":8},"sending","Sending",3,{"id":33,"text":34,"level":31,"planned":8},"an-address-is-not-an-account","An address is not an account",{"id":36,"text":37,"level":15,"planned":8},"its-own-tools-and-models","Its own tools and models",{"id":39,"text":40,"level":15,"planned":8},"changing-a-member","Changing a member",{"id":42,"text":43,"level":15,"planned":44},"coming-for-members","Coming for members",true,1791124519549]