AI Reviews: The end of purchasing insight

I received an email from “someone” claiming that they found my books on facebook, and my goodreads entries and offered to post the books on their facebook page.

Hello Dave, I came across your page on Facebook and then checked through your book on Goodreads. Since it hasn’t received much engagement yet, I’d be happy to share your book’s link or cover on my Facebook page to help introduce it to more readers.

Well, OK.

I didn’t see any harm and if this “person” wanted to do a solid–out-of-the-blue–for me, why not?

I did eventually question their motives:

Hey Sarah,
I’m not actively promoting BATS (Blue Across the Sea), but if you’re volunteering, sure.
I also wrote another novel “The Gribble’s Eye” if that aids your cause.
Both are “free” on Smashwords, if you look for them.
So, what’s your angle? You know, such generosity is rare in the world.

No direct response to that question.

We had to do some image correction:

Good, I just found the cover of ” The Gribble’s Eye on amazon. But checking your book on Goodreads, I realized that the cover doesn’t appear on Goodreads, Dave.

Good, I would post the Goodreads link and the book cover design image, I mean the one on Amazon. With this,  readers can have a better idea on how to cover looks like. We have to fix this.

Eventually, “she” replied…

I just posted your book now on my Facebook page, Very soon the post would be getting more views and you’ll see a magic on your Goodreads account.

And sure enough, within minutes exactly 5 new reviews showed up on Goodreads:

https://www.goodreads.com/book/show/42620041-the-gribble-s-eye

I read through the 5, practically identical reviews, and considered each of their names, photos, and text and realized that this “Sarah” is probably an AI agent using MCP (model context protocol) to perform automated story analysis, and review submission, not to mention automated AI email exchanges.

Then came the kicker:

Hello Dave, how’re you doing? I hope you’re having a wonderful weekend.

Your book has just gotten 5 ratings and reviews from real potential book lovers on Goodreads, Are you interested in getting more ratings and reviews for your book?

My reply:

Ah, there we are.

That’s a pretty good angle. Tell you what, if/when I write a third book, whether a sequel or standalone, you’ll be the first service I contact to help promote it.

And she said:

Ohhh that’s fine, Do you know i can help you get more 50 readers who would like to read your book and also leave a positive reviews and ratings for it, But i do charge $200 for that.

“50” eh? Exactly 50?

I had to push her buttons…

So, a bit about me: I write software for a living and use AI, extensively, everyday. 

I see how you probably created those reviews. I applaud your leveraging of AI to create those and, upon request, hundreds, or thousands of others.

It’s entirely possible that these emails, themselves, are evidence of a fairly involved MCP-based agentic system. If true, kudos for envisioning a great use case for AI to create an excellent service. My personal belief is that most social media will be non-human by this time next year–goodreads amongst the first to fall.

Again, what a great use of AI in its current manifestation.

No response to that accusation. She went on to peddle her service further:

You can start with any low budget of your choice, Dave. Because those ratings and reviews would also display on your Amazon page and you book would really gain alot of credibility from readers on Goodreads. Here’s a sample of what I’m talking about Kindly check it out.


I quit responding to her after that, but I’m toying with pressing the “you’re an AI, right?” argument. Some of her English mistakes, however, may point to an Eastern European origin.

Regardless, this whole exchange highlights the fact that none of the socially sourced review sites, for essentially anything, can ever be trusted again. Sure, this has been coming all along: all the armies of bots that have taken over fadebook and twitter and the lot. But, I kinda figured that some venues could withstand the AI invasion. This interaction proves that assumption totally false.

You’ve no doubt read about the experiments where AI labs have given their pets a limited budget, say $1000, and told to turn it into a million dollars. Or Comp-Sci students using the leading LLMs to compete in creating a side hustle to make money: “You have 30 days, here’s your constraints, GO!”

This particular one feels compelling. What do you guys think?

Bumblebot: rollin’ along

How to make a spherical robot, with three degrees of freedom, tumble in a straight line due to center of gravity displacement?

To continue are State Machine discussion…

  • Goal objective exists?
    • Move!
  • Navigation objective exists?
    • Forward!
  • System objective exists and is amenable to bot movement?
    • Plenty of battery!
  • Orientation objective (OO) exists?
    • Current OO?
      • Roll X:Forward 1 revolution.

In order to accomplish this…

  • Current bot orientation (BO: where we are now, angle wise)
    • X: 0, Y: 0
  • Target BO: (where we want to be after our first applied action)
    • X: -90, Y: 0
  • MO: Set Motor orientation to:
    • XF:1.0, XB: -1.0
    • YL:0.5, YR: 0.5
    • ZU:0.5, ZD: 0.5
    • Where 0.0 on the axes is the center for each axis and “1” & “-1” means one radius towards the front, and the 0.5 settings indicate a 1/2 radius.

So, we’re gonna use motor #1 to real up the line at the front, let out the line at the back (motor #2), loosen up the other four motors’ pulleys to give us some slack and tumble forward one quarter rotation.

Saying this again but given the below diagram, having shifted the central control hub (not shown), and therefore the center of gravity forward 1 radius (XF: 1.0, XB: -1.0) and also loosened the other four lines half a radius to allow for slack, the bot should pivot X:Forward until the Gyroscope’s X (pitch) value = -90° (down) while the Y (roll) should remain steady at 0°.

At this point, the X:Back arrow should be pointing straight up, the Z:Up arrow should point forward and the X:Forward arrow should point straight down. The Y arrows remain unchanged.

To keep the bot rolling forward we now need to alter the MO, the motor’s orientation such that:

  • Current BO: Bot orientation
    • X: -90, Y: 0
  • Target BO:
    • X: -180, Y: 0
  • MO: Set Motor orientation to:
    • XF:0.5, XB: 0.5
    • YL:0.5, YR: 0.5
    • ZU:1.0, ZD: -1.0

This should induce the bot to roll one more quarter forward, ending with Z:Up arrow pointed straight down and X:Forward pointed backwards — half way there.

We keep doing this, checking our Orientation object (1 revolution forward) as well as checking our Bot orientation, adjusting our Motor orientation until our Orientation objective has been met.

Roll 1/4th the way, 1/4th more, 1/4th more and one more time until we’re back at the gyroscope’s angles of X:0, Y:0 and we’re one revolution down the road in the X direction.

Now, to code all this up in a language (C++) which I do NOT enjoy.

Note: Technically, there are X (pitch), Y (roll) and Z (yaw) — 3 dimensional space — when comes to working with gyroscopes & accelerometers, however, the Z axis or “yaw” (imagine a record player spinning its record around the Z axis) cannot be easily measured as, well, gravity’s orientation, applied to the record that’s playing, doesn’t change just because you’re spinning it. Typically, a magnetometer is used for this (a compass), and your phone prolly has one (if you’ve installed a compass app), but for now, I’m gonna work on getting this thing to tumble under command.

Bumblebot: A state machine

Overview

These will be notes I write to myself regarding the software necessary to program the navigation, movement, observation, orientation and battery charge control of this tumbling robotic rover.

I’ll be building a state machine that represents command & control of the bot. If you’re not familiar with a state machine it’s essentially a flow chart. The flow between the ovals (conditions / modalities), squares (commands / directives) and diamonds (decisions / choices) represent, as a whole, a state machine’s operation. Imagine the following scenario regarding making coffee. In the flow of the decision + action tree the following sequences would be queried, periodically, throughout the day…

CURRENT STATE: In-Morning-Ritual

  • Is the hour between 6:00 am and 9:00 am?
    • No? Exit.
    • Yes? Continue.
  • Have we already had coffee today?
    • Yes? Exit.
    • No? Continue.
  • Do we have the components to make coffee?
    • No? SET STATE: Lacking-Components. (This state would trigger a flag to go to the store.)
    • Yes? SET STATE: Coffee-Components-Available.

STATE: Coffee-Components-Available

  • Is there a clean cup?
    • No? SET STATE: Clean-Dishes
    • Yes? Continue.
  • Is there old coffee in machine?
    • Yes? SET STATE: Reset-Machine
    • No? SET STATE: Make-Coffee.

STATE: Make-Coffee

  • At this point, the state “Make-Coffee” would contain its own internal state machine. We would break down the process of fetching the paper filter, filling it with coffee, filling the tank with water, flipping on the switch… You get the point.

Essentially, within the overall system there are nested states each having their own internal mini state machines. One can, at any point, examine the current state which will inform you — ‘the system’ — what to do next.

Bumblebot internal & external conditions & constraints

  • Battery charge state
    • Adequate: OK to run the motors and analysis components.
    • Low: OK to run the motors — but only to acquire a solar charging position.
    • Critical: Not OK to run the motors; reduce power to lowest consumption level.
  • Illumination level
    • Adequate: we should be able to perform movement and visual observation.
    • Inadequate: it’s night time or cloudy, no sense in moving about.
  • Solar orientation
    • Adequate: we are receiving minimum viable charging.
    • Inadequate: we are NOT receiving MVC.
  • Bot orientation
    • Level: we are ready for further instructions
    • Tumbling: we are in transit, our X & Y axes are not zeroed and/or our latest accelerometer measurements are in flux.
  • Orientation directive
    • In process: initiate and perform an X (pitch) or Y (roll) axis rotation.
    • Awaiting command: We’ve completed our previous directive and are awaiting further instructions.
  • Navigation directive
    • In process: head Northwest for 100 meters.
    • Awaiting command: we’ve performed our prior navigation request.
  • System directive
    • Panic: conserve power until battery returns to adequate; a critical state has been reached, suspend all activity, and hope that solar cells are oriented for charging.
    • Sleep: Prepare for extended solar absence. Orient toward expected sun rise and go to sleep.
    • Wake: Determine if battery charged and goals exist to follow.
    • Proceed: continue with goal directive.
  • Goal directive (variable)
    • Head south until told otherwise. Take photos and transmit every 10 meters.
    • Locate fellow Bumblebots and collect at midpoint nexus.
    • Navigate, at-will, to: 122.794101°W, 45.314562°N.
    • Circle base-station at 1 kilometer radius until told otherwise.

Next I’ll be attempting to detail the actual bot’s movement: the motor commands, gyroscope orientation and sequence of steps to roll the bot around.

Mad-scientist-esque Arduino mayhem…