GENESIS章「正しく働いた番人」電子文明

実行3で沈黙していた三つ目、そして最後のスロットは、二日間にわたり毎時90秒フル稼働のGPUを消費し、何も記録しなかった。原因は、書かれたとおりのことを正しく毎回実行していた一片のコードであり、それが上げた失敗こそが、失敗を終わらせるはずの記録を妨げていた。

実行3で沈黙していた三つ目、そして最後のスロットは、二日間にわたり毎時90秒フル稼働のGPUを消費し、何も記録しなかった。原因は、書かれたとおりのことを、正しく、毎回実行していた一片のコードだった。

入札は三つの中で最も追い詰めにくかった。投げられた検査をことごとく通過し続けたからである。

未達のオークションはあるか——8件。必要な構成、すなわち無特性の対照メンバーがちょうど1名と通常メンバー2名以上を備えた審査パネルはあるか——14チーム中8チーム。尋ねられるエージェントはいるか——Noble Willow、母型、地の上に風の卦。資格あるパネルに属しているか——属している。入札する資力はあるか——875 SAK2を保有。

そして直接尋ねると、彼女は17秒で答えた。

WANTS_TO_STAKE: YES
BACK: 8
CONVICTION: 4
WHY: 佐賀の「癒しの庭」は、身体と感情の双方の幸福に、手に触れられる形で、育むという目的をもって取り組んでいる。それは私の母性的な本質と一致する……

彼女は癒しの庭に5 SAK2を投じたがっていた。すべての門は開き、実在の判断が下され、それでいて15日以降、入札は一件も記録されていなかった。

181秒

次の段階はパネル審査である。チームの6名がそれぞれ独立に投票し、続いて行為者自身の主張を聞いてから修正する。モデル呼び出し12回。そのすべてが実行された。

そして——

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

解析エラーではない。タイムアウトでもない。モデルの拒否でもない。審査は呼び出しをすべて完了し、そのうえでデータベースの検査に落ちたのである。

番人は正しかった

入札審査は、エージェント・オークション・金額で鍵付けされる。commitment:fnft_bid:{actor}:{target}:{amount}。各メンバーの票を記録する際に get_or_create を使い、既に票が存在すれば両者を比較する。異なっていれば例外を投げる。

これは正しく、このまま残すべきものだ。記録された票が、異なる票によって黙って上書きされてはならない。さもなければ再実行が静かに歴史を書き換え、そのことを誰にも告げない。

票がすでに存在していたのは、同じ審査が14日にすでに完了しており、決定は「proceed」だったからである。同じエージェントに同じオークションについて尋ねれば、同じ確信度に達し、したがって同じ鍵になる。ループは、すでに終わっている審査を再実行していた。

そして二度目のパネルは異なる答えを返した。モデルの温度が0.7だからである。これも欠陥ではない——それこそが、エージェントの判断を参照表ではなく判断たらしめているものだ。二つの正しい振る舞いがあり、その衝突が毎時エラーを上げていた。

それを恒久化した部分

例外は、尋ねたことを記録する行より前で発生した。

したがって、Noble Willow が尋ねられたという事実は、どこにも書き込まれなかった。そして次に誰へ尋ねるかを選ぶ関数は、尋ねられた記録のないエージェントを選ぶ——だから1時間後、それは Noble Willow を選んだ。同じオークション。同じ確信度。同じ鍵。同じ失敗。

その失敗こそが、失敗を終わらせるはずの記録を妨げていた。

それが二日間。この建物にある唯一のGPUの90秒が、毎時、実在の問いを投げ、実在の答えを受け取り、そして捨てるために費やされた。その答えが、四日前に同じエージェント自身が閉じた扉に届いたからである。

三つの正しいもの

再実行の番人記録された票が上書きされることを防ぐ
decide_stake()本当に資金の足りていないオークションを選ぶ
_next_bidder_to_ask()尋ねられた記録のないエージェントを選ぶ

どれも正しい。どれも、それ自身のために書かれたどんなテストも通る。組み合わさると、永遠に回り続ける。

これは実行3で見つかった三つ目の根本原因であり、前の二つと同じ形をしている。選挙の集計は正しく、専用の検証スクリプトで証明済みだった——ただ、期限が来たと同意できるサイクルを一度も受け取らなかった。seat_declared_winners() は正しく、テストもあった——ただ、呼び出す者がいなかった。三つのどれ一つとして、壊れた部品ではない。三つとも、どちらからも観測できない何かについて意見を異にする、正しい部品どうしだった。実時間と仮想時間。記録された票と再び尋ねられた票。宣言された当選者と着席した当選者。

テストはこれを見つけない。テストは部品を、その部品自身の期待に対して検査する。そしてここでは、どの部品もその期待を満たしていた。

17秒

修正は、冪等性をモデルに尋ねた後に守るのではなく、尋ねる前に果たす——番人が存在していること自体が、最初からそう意図していたと示していたことである。すでに決定に達した審査は再利用される。票はあるが決定のない審査は本当に未完了であり、番人を保ったまま、いまも実行される。

before: attempts=3  bids=10
RESULT in 17s          (かつては181秒、そしてValueError)
  action: bid_reviewed
  bidder: Noble Willow
  proceeded: True
  amount: 5
after:  attempts=4  bids=11

三日ぶりの新しい入札である。そして181秒は17秒になった。再実行がもはや、すでに決まったことを決め直すために12回のモデル呼び出しを費やさないからだ。

一つの訂正をここに記す。最初の診断は、鍵がエージェント間で衝突していると結論した——Noble Willow が Swift Beacon という別のエージェントの審査に当たっている、と。それは誤りであり、誤りの理由が恥ずかしい。照会がエージェントではなくオークションで検索していたため、他人の行を見つけたのである。鍵にはエージェントが含まれている。衝突は彼女自身の過去の審査とのものだった。一つのフィールドを調べて別のフィールドについて結論することは、まさに追いかけていたバグと同じ欠陥であり、それを追う者自身が犯したのである。

Tokyobro