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