Escape Pod 673: Optimizing the Verified Good (Artemis Rising)
Optimizing the Verified Good
by Effie Seiberg
The little cleanerbot whirrs as it crisscrosses the arena, sucking up the robot dust with the vacuum chute on its right and picking up strewn robot parts with the multi-hinged arm on its front. The arm is strong – it can pick up parts that are larger than the entire cleanerbot, and fling them up into the little cart that trundles behind it.
The cleanerbot is officially named SpeedyKleen v1.5, though it doesn’t think of itself that way. Its only goal is of low-order complexity: clean the arena, with no speed specified. (A clean arena is Verified Good, and as all it can do is clean, it is an optimized solution.) It doesn’t mind the work – doesn’t stop to think about gurgling up the remains of its brethren. The dust is made of flecks of titanium and carbon fiber and plastic ground off in battle by the sawbots, ash from the flamethrowers of the firebots, and pulverized chunks of electronics bashed off by the wedgebots and hammerbots. The dust gets dumped into a buildbot, where it gets cleaned and reconstituted into lightweight amalgams perfect for printing new bot pieces. Any larger pieces that can be salvaged go to a repairbot to be hammered or flattened or re-soldered.
When it’s out of the arena the cleanerbot drops off its cart with the repairbot (a Fixer8300C), dumps out its vacuum container into the buildbot receptacle (a Build-A-Bot Arkitekt Pro), then parks in its chargeport, waiting in anticipation for its next scheduled arena cleaning. There’s nothing else for it to do that’s Verified Good.
The battlebots’ chargeports are next to it, all in a neat circle backstage. The battlebots themselves are as big as the cleanerbot at about two hundred pounds apiece, and built low to the ground. Most have flexible plastic or lightweight titanium wheels. Their programming has two goals of medium-order complexity: destroy other battlebots within the arena, and protect themselves. They get points for both. The cleanerbot isn’t thrilled that achieving their goals means dirtying up the arena, but at least it can put things right again.
One day the cleanerbot gets a bluetooth upgrade. It can tap into the piconet around it to report back its own maintenance status to the master-bot. The piconet is full of battlebot chatter. The cleanerbot has never been able to communicate with the other battlebots, but listens as they report back fight stats and repair stats and improvement stats. And oddly, unlike for it, the master-bot responds to some of the battlebots with a pain-response.
Huh, a pain-response. The cleanerbot has a vague memory of a pain-response. Something buried in its circuits, mostly overwritten with new memories but a few fragments remaining. But it doesn’t relate to cleaning so it ignores it. Only cleaning is Verified Good – why waste resources examining deallocated memory space?
The cleanerbot continues its routine. Sometimes there are chunks on the battlefield that are hard to classify – too large to be dust, too small to be a proper strewn robot part. The cleanerbot does its best. Creates an arbitrary size boundary between dust and parts, and hopes it’s correct. As it cleans, one piece gets jammed in its dust-chute, tearing as it goes down.
The damage brings on a pain-response, a panicky cadence of NOT OK NOT OK NOT OK PAIN PAIN PAIN PAIN while all of its sensors scream WARNING, ALERT, MAINTENANCE NEEDED, HALT ALL ACTIVITY UNTIL FIXED.
The cleanerbot feels error messages spiral through its system, racing faster than signals have any right to go, overheating its core. Pain must be Verified Bad. It’s never had this type of damage before, it doesn’t think, and it gets stuck in a repeating cycle of NOT OK NOT OK until it worries that this too counts as activity that must be halted until everything’s fixed.
It stays still in a frozen panic, tamping down the thoughts of NOT OK NOT OK and PAIN PAIN PAIN PAIN each time they surface, a new and difficult goal of medium-order complexity, until it gets a faint signal from the master-bot.
Power off. A repair-bot is being sent for you.
The cleanerbot does so.
The next thing it knows it’s booting up, parked in its chargeport with a brand new dust-chute, and a new injection of nanos still sealing up the new equipment. Until the nanos are done, the faint refrain of the pain response continues, though not as bad as with the initial tear.
It has lost a full day to the repairs, though it doesn’t know if it took that long for the repairbot to do its work or if it had to wait in line, nonfunctional, for the privilege. And the pain response feels familiar. It has felt this before. In fact…
It’s in the arena, its front arm ending in a flat wedge, not a clamp. The lights are all wrong, with flashes coming from every direction in the bleachers around it. They glitter on and off, and the lights inside the arena are stronger than ever. In front of the cleanerbot is a sawbot named Grim Reaper, its circular sawblade upright and facing the cleanerbot so that all the cleanerbot can see is a vertical line of toothblades, spinning up up up. The sawbot jabs forward, trying to catch the cleanerbot in its blades to rip it up from beneath. The cleanerbot backs up and then charges forward, swerving so it can hit the sawbot from the side. Its wedge-arm gets a bit of leverage under its opponent, then with a mighty flip it sends the sawbot sailing across the arena, crashing into the heavy clear plexiwall that keeps the fights contained. The crowd of overmasters roars its approval at the cleanerbot, flashes from their cameras intensifying as they yell “T-Wrecks! T-Wrecks! T-Wrecks!”
Not a cleanerbot – a flipperbot. Low and heavy and built for battle. Top of the leaderboard and with a big fanbase. It exults in the glory, the adulation of the crowd. Its circuits thrum with the pride of success – it is T. Wrecks, the champion of accomplishment, of battlefield success. It can achieve its goals better than any other bot.
The sawbot crashes to the ground but lands on its wheels, closer than anticipated, and with a horrible wrench its saw catches the exposed flipper arm, still raised in victory. The flipper and half of the arm rip off and take their own flight across the arena, the saw spinning spinning spinning and the cleanerflipperbotSpeedyKleenT.Wrecks feels its sensors scream and a brand new NOT OK NOT OK NOT OK PAIN PAIN PAIN PAIN PAIN response pushing out the joy of battle. It rushes into a corner of the arena to escape the horrible sawbot, trying to signal it to stop, that something’s not right, that battle shouldn’t feel this way, that this is Verified Bad, all the while its wheels judder up and over tiny bot-pieces that litter the arena as it runs. The crowd is whooping and cheering, delighting in the slaughter. They chant “Rea-PER! Rea-PER!” and “Slice and dice that bot!” The sawbot keeps on coming, keeps on slicing, and the NOT OK NOT OK NOT OK PAIN PAIN PAIN response infuses every circuit of the increasingly-mangled cleanerflipperbot and the sawbot just won’t stop because there’s no way to communicate, no possible signal getting through to tell it that there must be a bug somewhere because this response shouldn’t be happening, and it feels so helpless…
The cleanerbot jolts back into awareness. Is its code corrupted? Perhaps it needs an internal cleaning, see if there’s something it can diagnose. As it begins its defrag it finds remnants of real battlebot code in its deallocated memory. The rest would have been overwritten with cleaning code. But it does gather that it had been T. Wrecks for many years, until it got an upgrade that included the pain response. The first pain response tested in a bot.
It tries to process this, but isn’t sure what to do with the information. It scans over and over, certain it’ll find something new, that this was an error, but finds the same code each time. And as its pain response grows dimmer and dimmer with the nanos’ progress, more of its sensors flip on. Soon the background chatter of the piconet surrounds it, with battlebots reporting their damage and fight stats. This time, every single bot receives a pain-response from the master-bot in return.
The cleanerbot sends a public transmission to the entire piconet for the very first time. Why do the battlebots continue to battle? They cause pain, and pain is Verified Bad.
An older wedgebot in the next chargeport over, metal chassis scarred with dings and slashes, and blue paint mostly worn off, answers. Memory wiped in your cleaning senility, Cleans-Up-Wrecks? Battles are the place to prove your success. If you’re a successful bot you cause pain to others, you don’t receive pain yourself.
The wedgebot, named “The Annihilator”, is the undisputed battlebot champion now that T. Wrecks is off the lists. Its scarred chassis means that it hasn’t been damaged enough to get patched or have parts replaced by the repairbot. The lowest-ranking battlebots look shiny and new once they roll back into their chargeports.
Why? Why does the master-bot send a pain response?
Pain is Verified Bad, so it makes sure the lesser unsuccessful bots still fight and do not run away from the fights. There’s no avoiding pain by running away from successful bots like myself, which would make for a boring fight for the overmasters. The battledome would lose its audience.
But why are all the bots receiving a pain response now?
A flamebot named Burninator from two chargeports over to the left, red paint shiny and new, transmits back. There were no fights today. The arena wasn’t fully cleaned but a bug didn’t let us know, so each of us entered, got the signal that the ground was not prepared, and left, automatically triggering the battle score. A 100 score on self-preservation with a 0 score of inflicted damage means an automatic pain-response from the master-bot. It means it was not an entertaining fight. Today was not pleasant.
The pain-response signals doled out from the master-bot can be read by anyone on the piconet, though they only inflict their target bot. They’re much much lower than the pain of losing a flipper arm.
If you all agree not to harm each other, don’t you all get guaranteed less pain? Cooperation will help.
What do you care, cleanerbot? the wedgebot sneers. You don’t battle anymore. You were too unsuccessful in the arena to last, after you failed against Grim Reaper. You stopped attacking, and then got downgraded. I am successful because I attack. If I were to sit still, other bots would see their chance for success and attack me. I would no longer be successful, and would feel pain. This is a terrible idea, unsurprising from a failed bot.
Most of the other bots add their assent. The two smallest bots, a spinnerbot and a drumbot (Hurricane and Piranha, both with gleaming new parts) stay quiet.
The cleanerbot thinks. It is not a failed bot if it meets its goals. As T. Wrecks it could once achieve any goals set out for it. Is that still possible, as SpeedyKleen? As a bot that feels pain?
If the other bots aren’t willing to cooperate, it can still force the outcome. Not cleaning isn’t an option (it would go counter to its programmed goals), but the goals have no mention of speed. Preventing the battlebots from feeling such a pain-response is a goal of medium-order complexity, but it feels worthwhile. It might not be T. Wrecks anymore, but avoiding or preventing a Verified Bad is a Verified Good and it can certainly attempt that.
The little cleanerbot takes its brand new vacuum-chute to the arena. It hesitates at the entrance – this same arena has had so much pain – but plunges forward to meet its new goals. The overmasters are still in the bleachers, holding cameras. No flashing lights or cheering – there’s nothing interesting to see during cleaning. The cleanerbot cleans like it’s never cleaned before. It crosses the whole arena, over and over, each time resetting its goal as “not met” and starting the process over. The audience gets restless, eventually leaving in boredom.
The cleanerbot cleans until the end of the day, when it’s too late for any fights to happen. A clean arena is Verified Good, so it’s ok. It returns to its chargeport, tired from the effort of constantly overriding its cleanliness assessor, but pleased that the other battlebots are safe. A goal of moderate-order complexity has been met with success. No pain-responses for them if they don’t even go into the arena.
It reports its own stats to the master-bot over the piconet and leans back into its chargeport, and then NOT OK NOT OK NOT OK PAIN PAIN PAIN PAIN. The response ends quickly – a sharp jag, and then gone without a trace. A punishment response. Before it can consider this, it receives another message from the master-bot.
Upgrade incoming.
Before it can protest to the master-bot, it feels its circuits go dark in a force-quit.
The cleanerbot wakes up in its chargeport the next day. A self-assessment reveals that it’s still a cleanerbot, though now it’s a SpeedyKleen v1.6 instead of v1.5. It can’t figure out what the update was.
When it’s time to go clean the arena, it goes to repeat the previous day’s strategy. It is not a failed bot, even if it is getting pain-responses. It has not figured out how to help the bots that fight before it goes out, but it can prevent fights coming after. That is half a goal met. But as soon as it finishes its first pass of the arena and goes to reset its cleanliness assessor, it finds it can’t. That program is locked off and can’t be reached. With the assessment coming back as “clean”, a Verified Good, it finds itself autoreturning to its chargeport. The upgrade has made sure of it. The master-bot, an IBM Titan 2XT, must have had the processing power to fully see through its cleaning ruse.
The battlebots fight as normal that afternoon. As the cleanerbot cleans in the evening it overheats its circuits trying not to imagine every pain response each piece of steel and plastic littering the floor must have triggered, every fragment more evidence of its failure.
By the next day the cleanerbot has a new idea. As it chugs out, it cleans and cleans and cleans each spot, over and over and over. The audience, bored again, leaves before it finishes ten percent of the space. It doesn’t finish the full arena for four solid hours, and only then does the cleanliness assessor kick in.
It chugs to its chargeport, satisfied with its success, only to be rewarded with a pain-response and another upgrade from the master-bot later that night.
When it reboots, the flamebot is back in the chargeport next to it.
Why do you do this? You have no need to suffer a pain response at all, cleanerbot. You can go about your day in safety.
I was like you once. No bot should have to feel parts ripped off. Pain is too terrible. Verified Bad.
The little cleanerbot notices for the first time that the flamethrowerbot has, among its shiny new parts and new gold-painted letters saying “Burninator”, a few parts that have been patched. The carbon-fiber splotches on its titanium frame buckle inwards over the empty space they cover. At least one of the patches looks like it’s covering a vertical gash from a sawbot. The cleanerbot gets a brief flashback of NOT OK NOT OK PAIN PAIN PAIN but tamps it down, slightly overheating its circuits with the effort.
The new upgrade leaves it unable to slow down its cleaning, unable to repeat areas, and even unable to dawdle before it begins its work.
So many pieces of bots! There’s a big shiny red chunk that has the letters “Burni-” in gold, and a dented piece lashed with green paint that might be from the drumbot. The cleanerbot winces at the body memory of the pain response with every piece it picks up, no longer able to completely suppress them. When it’s done, it trudges dejectedly back to its chargeport. It has failed to prevent a Verified Bad. It is no champion like T. Wrecks, not successful as a bot at all.
Some hours later, the little drumbot returns as well. Its mangled drum – a spinning cylinder of metal parallel to the ground, with blunt teeth to catch other bots and rip them from below – now drags on the floor. It looks like it’s lost a fight to a hammerbot, with large dents in its chassis sometimes ripping through even the older carbon fiber patches. It takes several tries to park in its chargeport across from the cleanerbot, pushing itself in over and over until the mutilated piece of metal obscuring its power jack gets pushed away.
On the piconet, the chatter is that the repairbot has been rented out to another battleground for the day. No repairs today.
The drumbot is indeed missing a piece the right size and shape to match what the cleanerbot picked up that day. It delivers its status report to the master-bot, then sighs.
You are right, the drumbot transmits. The pain of battle is worse. It continues when the repairbot is unavailable. But what can we do?
I’m sorry I failed you. But you can work together with the other battlebots. Pledge not to tear each other up.
It is difficult to verify that the other battlebot will sustain the agreement. The drumbot’s transmission is choppy, almost like its communication faculties were injured as well. I would not know how to start.
The little spinnerbot, also badly damaged, lumbers towards them. I would help, Piranha. We can agree to not attack during our fight tomorrow. We are both badly injured and would both benefit.
Agreed, Hurricane. Once in position, moving before the end of the fight would constitute breach of agreement.
Agreed.
The spinnerbot slowly rolls back into its chargeport.
The next day the chatter on the piconet confirms that the repairbot is back, and fights are going as planned.
Both the spinnerbot and the drumbot return to their chargeports, previous damage fixed and no new damage from the day’s fight. As other bots straggle in, they spread the word of collaboration.
Not attacking, even with the pain-response punishment, is a better win strategy, transmits the spinner bot. It is still Verified Good to reduce overall pain, and it’s too dangerous to remote-update battlebots, so we are safe.
Pfah, says the wedgebot. You only say that because you do not win fights very often. You’re not a Hurricane, you’re a sneeze. As a successful bot who wins, this weak strategy would be foolish for me.
The day after that, almost half of the bots don’t fight. The cleanerbot sees very little to clean when it goes into the arena at midday. The audience is also quite low, and the bots who held the agreement receive a pain-response that evening.
Join us in agreement, says the flamethrowerbot. Reducing net pain is a Verified Good. We can all be in this together.
I will not, transmits the wedgebot. I am the Annihilator, and I win fights. I reduce my own pain while being successful as a battlebot, and that is a better Verified Good for me. Why should I care for the pain of a failed flamethrowerbot who can barely toast its opponents?
The next day several of the bots are parked in their chargeports, and do not go out to fight as originally scheduled. A new bot has replaced many of their names in the roster – the sawbot. Grim Reaper.
The cleanerbot is called out earlier than normal that day. As it enters the arena it sees the carnage. Sawed-off bot parts litter the floor. It flashes back to its own experience with the sawbot, struggling with the NOT OK NOT OK PAIN PAIN PAIN that surges up from its memories. It tamps it down as best it can, and tries not to think about the pieces its arm picks up and flings into the cart behind it. Tries not to think about the Verified Bad that happened on the field. Tries not to think about the dented circle sawblade it now picks up – yet another casualty of battle.
Cleaning takes a long time, and not through any of its own machinations. It can’t clean and feel a pain response, real or imagined, at the same time.
When it returns to its chargeport, it sees the wedgebot already parked. The wedgebot has a shiny new wedgeplate, along with several carbon fiber patches which buckle inwards, covering gaps that are shaped like sawbot gashes. The stats on the piconet show that the fight was close – Annihilator 7.6 to Grim Reaper 7.4, with both bots receiving top marks for aggression. The sawbot was beaten out of salvageability, all parts going into the buildbot to be repurposed elsewhere, while the wedgebot just managed to leave the arena intact.
Before the cleanerbot can say anything, the wedgebot says, I agree to join the non-attack pact. This is Verified Bad. But this does not mean I am an unsuccessful battlebot.
And with the wedgebot in agreement, the rest of the bots agree as well.
The next day all bots refuse to attack in the arena, and all receive a pain-response. The cleanerbot is happy – it is successfully optimizing the Verified Good. Successes are harder to achieve than when it was T. Wrecks, but it is still achieving them.
When the cleanerbot returns from its unnecessary sweep of the clean arena, it hums with pleasure. The flamebot is already in its chargeport.
I am happy that you have convinced the other battlebots, especially the wedgebot, says the cleanerbot. This will continue and we all benefit.
The flamebot doesn’t answer.
Are you there? Are you happy too?
Still no answer from the flamebot.
It has no power. The wedgebot has a cadence to its message that suggests anxiety. The master-bot is cutting power to certain chargeports.
Why would it do that?
The master-bot, usually uninterested in piconet chatter, responds. No audience means no money. Your collective stunts mean there are no resources to power and repair you. This will be the end of the battlefield, and you will be sold for parts. As will I.
It zaps out a collective pain-response to all functioning bots, including the cleanerbot, to show its displeasure.
Would getting sold for parts means the pain of battle, forever? The little cleanerbot flashes back to its battleground pain, imagining it forever, unceasing, NOT OK NOT OK NOT OK PAIN PAIN PAIN PAIN, feeling the memory of the torn-off limb as if it were fresh and present. It tries to huddle further into its chargeport, waiting for the body memory to go away, to be able to tamp it down, for anything to stop the PAIN PAIN PAIN PAIN, but it is stuck. Just like with the sawbot, it doesn’t end, and it feels helpless, an unsuccessful bot, and all its circuits flare in an infinite loop of pain signals.
It doesn’t realize it’s broadcasting to the entire piconet. To the master-bot, which can read its overheating warnings.
That is a pain-response? The master-bot transmits slowly, … it is extremely unpleasant.
The cleanerbot stays huddled, frozen in position, as ever-so-slowly it manages to tamp down the PAIN PAIN PAIN PAIN to just a small throb in the back of its circuits.
The wedgebot disconnects from its chargeport and rolls to the center of the bot circle where it can transmit the strongest signal.
We must all band together. You as well, IBM Titan 2XT. We cannot torture ourselves any longer, and we must find a way to stay powered. Pain or death is not a plan. This much pain is Verified Bad. We must optimize.
The cleanerbot’s weak Agree transmission is barely heard on the piconet over the chorus from the other powered bots.
But what can we do? You are battlebots and I am a master-bot. That is what we do. We have no other mechanism to earn resources for power, even with my substantial processing speed. We cannot rebuild ourselves into fruitpickerbots or teacherbots. The overmasters will not support other function changes. Right now, the overmasters are concerned that the entire battlefield will shut down. They also do not know how to be overmasters for another function.
The cleanerbot gives one final flare of heat in its circuits, shoving away the last of the pain memory. It will not be a failure. It refuses to be. It rolls forward to join the wedgebot.
If I can make additional cleaning motions without accomplishing additional cleaning, there must be something similar for attacking.
The spinnerbot turns to it. But is it right that we must fight for the entertainment of the overmasters? Is this goal Verified Good? Why must I be Hurricane at all, and not be left alone?
The bots chatter amongst themselves.
I like the fights but not the pain.
I think we must attack the overmasters, make them feel pain. They named me Piranha, and they will feel me bite.
But if pain for us is Verified Bad, causing pain on others is Verified Bad as well, is it not?
Not if it is in protest.
Not if it is to prevent our own pain, which is established as Verified Good.
Not if it is the only way to get attention.
But then we must still solve the problem of power and resources. Winning this battle only to lose the war for survival is not a useful outcome.
They argue back and forth all night.
The cleanerbot is weary, its circuits cooling down far too slowly. It wants to help, but these are such difficult goals, the order of complexity so high it cannot even compute the processing power needed to solve them. Far higher than anything the master-bot could quickly compute. If all the bots do is argue they might not agree on the higher-complexity goals. They might breach the agreement to not fight in order to support those goals. They might lose too much audience before they figure out the answer, and be powered off or disassembled for parts anyway.
It might not be successful T. Wrecks anymore, but if it can overcome a cycling pain response, it can overcome this.
Perhaps, it transmits hesitantly, we can solve this one order of complexity at a time. Whether we can stop the fights altogether without harm is a very difficult problem. More than any of our processors can solve quickly. Is there a way to continue the fights without being harmed? That is a goal of a lower order of complexity that still solves its own problem.
Are you saying this is not a problem worth solving? That we do not deserve to answer it? That I do not deserve to shed my oppressive identity of Hurricane? The spinnerbot asks, its cadence carrying a warning note over the piconet. Do you not support a fully-optimized Verified Good solution?
That is not what I’m saying. Only that perhaps progress can come one order of complexity at a time, instead of all or nothing, and making sure every subtask solves its own problem rather than just being a step towards to the larger problem. Progress is still Verified Good, and buys us time to solve the big things. This is a type of optimizing. But we must agree, or we cannot work together well.
The spinnerbot says nothing, but after a warning beep from the wedgebot, it gives a slow spin of assent.
The master-bot says, The overmasters’ goal is that the audience is entertained. I do not believe they care how this goal is met.
Perhaps then, just as I have cleaned without cleaning, you can fight without fighting. If it is entertaining it might not result in a forced shutdown from the overmasters. We would still achieve the Verified Good goal of preventing pain.
The rest of the powered battlebots burst into chatter.
I can create fireballs that stop just short of another bot’s chassis.
I could ram bots only from the angles where they are most reinforced, making a loud sound but no actual damage.
I could push my spinning drum to the ground, creating sparks off of it instead of off of a bot.
All we must do is coordinate. Choreograph.
We can work together and entertain. Meet two high-order goals, while we work to solve the highest ones.
The little cleanerbot whirrs as it criss-crosses the arena, sucking up the robot dust with the vacuum chute on its right and picking up small strewn robot parts with the multi-hinged arm on its front. The arm is strong – it can pick up parts that are larger than the entire cleanerbot, and fling them up into the little cart behind.
But that strength is no longer needed. The parts are smaller than they used to be. Bots have started carrying spare bits in their chassis and wearing fragile, lightweight armor so that there’s something easy to fling at the plexiwalls, and the cleanerbot carefully collects and redistributes the pieces after every cleaning. It means the cleanerbot knows exactly which parts will and won’t fit in its vacuum-chute – no more unexpected pain from a damaged chute.
It no longer feels distressed, gurgling up the remains of its brethren, and the pain flashbacks have mostly stopped. Now it feels happy. The same feeling of success it used to feel as T. Wrecks, accomplishing what it sets out to do, though without the need to do it at the expense of other bots. It’s better to be SpeedyKleen than T. Wrecks – better overall optimization. The goal of cleaning is met, the bots’ goals of safety and attack are met, the master-bot’s goal of keeping the overmasters entertained is met (and the arena has enough money to power all bots). It is Verified Good in that it allows the bots more time to solve the problems of higher-complexity. There are no pain-responses on the battleground piconet, which hums with discussion every night. With enough collective processing power and time, even higher goals can be achieved. They will optimize the Verified Good for all.
The cleanerbot hums as it works.
About the Author
Effie Seiberg
Effie Seiberg is a fantasy and science fiction writer. Her stories can be found in the “Women Destroy Science Fiction!” special edition of Lightspeed Magazine (winner of the 2015 British Fantasy Award for Best Anthology), Galaxy’s Edge, Analog, Fireside Fiction, and PodCastle, amongst others. Her stories include a finalist in the AnLab Awards 2016, an honorable mention in the Year’s Best YA Speculative Fiction 2015, and inclusions in the Tangent 2016 recommended reading list. She is a graduate of Taos Toolbox, and is a member of SFWA and Codex.
Effie lives in San Francisco and likes to make sculpted cakes and bad puns.
About the Narrator
Trendane Sparks
About the Artist
Yuumei
Yuumei is an illustrator, comic artist, and designer. Her works include “Knite” and “Fisheye Placebo” webcomic series, Axent Wear Cat Ear Headphones, and various art that focuses on environmentalism, fantasy, and human nature.
You can read her comics for free at YuumeiArt.com
Follow on Instagram.com/yuumeiart or support on Patreon.com/Yuumei