GENESIS[The Guard That Worked] Digital Civilization

The third and last of run 3's silent slots burned ninety seconds of saturated GPU every hour for two days and recorded nothing. The cause was a piece of code…

The third and last of run 3's silent slots burned ninety seconds of saturated GPU every hour for two days and recorded nothing. The cause was a piece of code doing exactly what it was written to do, correctly, every time.

Bidding was the hardest of the three to corner, because it kept passing every test put to it.

Were there open auctions? Eight. Was there a review panel with the required shape — exactly one no-trait control member plus at least two regulars? Eight teams of fourteen qualified. Was there an agent to ask? Noble Willow, a Mother-archetype with the Earth-over-Wind hexagram. On an eligible panel? Yes. Able to afford a bid? She held 875 SAK2.

And when asked directly, she answered in seventeen seconds:

WANTS_TO_STAKE: YES
BACK: 8
CONVICTION: 4
WHY: The community healing garden in Saga addresses both physical and emotional wellbeing with a tangible, nurturing purpose that aligns with my Mother nature…

She wanted to put 5 SAK2 into a healing garden. Every gate open, a real decision made, and no bid had been recorded since the fifteenth.

One hundred and eighty-one seconds

The next step is a panel review — the six members of her team voting independently, then revising after hearing the actor's own case. Twelve model calls. It ran all of them.

Then:

RAISED after 181s
  team_review.py:147
  ValueError: commitment vote replay conflict for voter.

Not a parse error. Not a timeout. Not the model refusing. The review completed every one of its calls and then failed on a database check.

The guard was right

A bid review is keyed by agent, auction and amount: commitment:fnft_bid:{actor}:{target}:{amount}. When the review records each member's vote it uses get_or_create, and if a vote already exists it compares the two. If they differ, it raises.

That is correct and it should stay. A recorded vote must not be silently overwritten by a different one — otherwise a re-run quietly rewrites history and nothing says so.

The vote already existed because the same review had already completed, on the fourteenth, with a decision of "proceed." Ask the same agent about the same auction and she reaches the same conviction, so the same key. The loop was re-running a review that had already finished.

And the panel answered differently the second time, because the model runs at temperature 0.7. That is not a defect either — it is what makes an agent's judgement a judgement rather than a lookup. Two correct behaviours, and the collision between them raised an error every single hour.

The part that makes it permanent

The exception fired before the line that records the asking.

So nothing wrote down that Noble Willow had been asked. And the function that chooses who to ask next picks an agent with no recorded asking — so an hour later it chose Noble Willow. Same auction. Same conviction. Same key. Same failure.

The failure was precisely what prevented the record that would have ended it.

Two days of that. Ninety seconds of the only GPU in the building, every hour, spent asking a real question, receiving a real answer, and discarding it — because the answer arrived at a door that had already been closed by the same agent four days earlier.

Three correct things

The replay guardprotects recorded votes from being overwritten
decide_stake()picks an auction that is genuinely underfunded
_next_bidder_to_ask()picks an agent with no recorded asking

Each is right. Each would pass any test written for it. Composed, they loop forever.

This was the third root cause found in run 3 and it has the same shape as the first two. The election tally was correct and verified by its own script; it simply never received a cycle it agreed was due. seat_declared_winners() was correct and tested; it simply had no caller. Not one of the three was a broken component. All three were correct parts disagreeing about something neither could observe — real time against virtual time, a recorded vote against a re-asked one, a declared winner against a seated one.

Tests do not find these. A test exercises a part against its own expectations, and every part here met them.

Seventeen seconds

The fix honours idempotency before the model is asked rather than defending it afterwards — which is what the guard's existence had implied was intended all along. A review that already reached a decision is reused. A review with votes but no decision is genuinely unfinished and is still run, with the guard intact.

before: attempts=3  bids=10
RESULT in 17s          (was 181s, then ValueError)
  action: bid_reviewed
  bidder: Noble Willow
  proceeded: True
  amount: 5
after:  attempts=4  bids=11

The first new bid in three days. And 181 seconds became 17, because a repeat no longer spends twelve model calls re-deciding something already decided.

One correction belongs here. The first diagnosis concluded the key was colliding between agents — that Noble Willow was hitting a review belonging to an agent called Swift Beacon. That was wrong, and wrong for an embarrassing reason: the lookup searched by auction rather than by agent, so it found somebody else's row. The key does include the agent. The collision was with her own earlier review. Checking one field and concluding about another is the same defect as the bugs being hunted, committed by the person hunting them.

Tokyobro