第55話 デバッグ vs コラプト
```
[SYSTEM LOG - /dev/null deepest layer]
> timestamp: 3.2.7_build.9041
> location: /dev/null/core/-1
> ambient_density: 0.31 (CRITICAL LOW)
> entity_detected: VIRUS [CORRUPTED] - threat_level: UNDEFINED
> self_integrity: 68% → WARNING: ACCELERATED DEGRADATION ACTIVE
> debugger_eye: Lv3 / ACTIVE
> combat_mode: INITIALIZING...
> [ERROR] Cannot predict corruption vectors
> [ERROR] Hotfix queue: OVERLOADED
> BEGIN ENCOUNTER
```
---
「来い、プログラマー——俺はずっと、誰かに止めてほしかった」
その声は静かだった。
叫びでも怒りでもなく、ただ疲れ果てた人間が、長い夜の終わりに吐き出すような声。
俺は右腕の感覚を確かめた。肩から先がノイズのように揺らいでいる。デバッガーズ・アイの表示は自己コード劣化32%。/dev/nullの低密度空間が、通常の倍のペースでバグを積み上げていた。
それでも。
「——やるぞ」
俺の声に、全員が動いた。
その瞬間、/dev/nullの空気が変わった。
今まで静かに漂っていたゴーストデータが、ざわついた。まるでこの空間が戦いを認識したみたいに、建物の断片が浮き上がる。名前のない人々の輪郭が遠ざかる。それは逃げているのか——あるいは、かつて同じ場所で同じような戦いがあったことを、動作パターンとして記憶しているのか。
判断している時間はなかった。
---
最初に飛び出したのはガルドだった。
「ああ、やってやる!」
巨体が地面を蹴る。/dev/nullの足場——0.xバージョンの建物の断片、石か金属か判断できない素材——が砕けた。戦斧が空気を裂いてヴァイラスへ向かう。速い。ガルドの踏み込みは本物の冒険者の速度だ。
ヴァイラスは動かなかった。
ただ一本の指を、軽く振った。
刹那。
ガルドの戦斧が異常を訴えた。デバッガーズ・アイに情報が流れ込む——速い、速すぎる。コードが書き換えられていく。1行、また1行。剣先の動作定義。攻撃対象の参照先。それが俺の目の前で塗り替えられていく。
```
// BEFORE
weapon.target = enemy;
weapon.direction = forward;
// AFTER (CORRUPTED)
weapon.target = owner; // ←書き換え済み
weapon.direction = backward; // ←書き換え済み
```
「ガルド、離せ!」
叫ぶより先に、戦斧の刃がガルド自身に向いていた。柄を握る手に戦斧が抵抗する。金属が生き物のようにねじれ、持ち手の方向へ引き戻ろうとする。
「なんだこれ、俺の斧が——!」
「武器が汚染された!一時的に手放せ!」
俺はすでにコードを開いていた。リアルタイムのhotfix。デバッガーズ・アイで空中のコードを掴む。修正する。前世でも何度もやった動作——ただしあの時は本番環境で本番コードを直接触ることはなかった。今は違う。触れているのは現実そのものだ。
```
// HOTFIX APPLIED
weapon.target = enemy; // 復元
weapon.direction = forward; // 復元
```
戦斧の動きが止まった。ガルドが再び柄を握り直す。
「助かった!」
一秒もなかった。それでもヴァイラスは止まらない。
「速いな」
ヴァイラスが言った。感情のない声。称賛でも驚きでもなく、ただの観測。「だが——」
また指が動いた。
今度は二本。
---
アリアの剣が空を切った——方向が違う。
「っ——!」
アリアの目が見開く。狙ったのはヴァイラスの右側面のはずだった。なのに剣は左前方へ飛んだ。体が覚えた軌道と、コードが命令した軌道が食い違っている。剣士としての本能が混乱を訴えていた。
条件分岐剣法の根幹、そのコードが改竄されていた。
俺はアリアの剣技のコードを開く。見た瞬間、胃が冷えた。
```
// BEFORE
if (enemy.position == front_right) {
strike.direction = right_slash;
}
// AFTER (CORRUPTED)
if (ally.position == front_right) { // ←「enemy」が「ally」に書き換え
strike.direction = right_slash;
}
```
「アリア、攻撃を止めるな!でも軌道は俺に任せろ!」
「わかりました!」
アリアが突っ込んでくる。剣を振る。俺は同時にコードを修正する。彼女の体の動きと、俺のコード修正を同期させる。一歩踏み込んだタイミングで修正が完了する。一瞬でも遅れれば剣は仲間に向く。
```
// HOTFIX APPLIED
if (enemy.position == front_right) { // 復元
```
剣の軌道が戻った。刃がヴァイラスの肩口をかすめる。
初めてヴァイラスが後退した。わずか半歩。でも確かに。
「——デバッグが間に合うか」
ヴァイラスが呟いた。今度は少し、違う声色だった。試しているような——自分に問いかけているような——そんな声だった。
---
シェルが後方で両手を広げた。周囲の空間にクエリ式が展開する。光の文字列が網を張るように広がり、ヴァイラスの動きを追いかける。情報を食らって分析を進める。シェルが俺の耳元で言った。
「ヴァイラスの汚染パターン解析中——優先度は武器から入る。次にスキルコア。本人が触れなくても、視線の先に汚染波を飛ばせる。射程は推定15メートル」
「飛び道具があるか」
「あと、汚染速度——お前より速い。このまま続けると30秒でジリ貧になる計算だ」
わかってる。
俺は今、三つのコードを並列で処理していた。ガルドの戦斧、アリアの剣技、そして自分自身の自己コード劣化の抑制。脳が焼き切れそうな感覚。デバッガーズ・アイが軋む。前の世界でマルチタスクの限界を感じたことは何度もあった。だがあの時は「精神的な疲弊」だった。今は「文字通りコードとして自分が壊れていく」感覚だ。Lv3の上限に指がかかっている。
汚染が来る。
修正する。
また汚染が来る。
また修正する。
ループ。終わりのないループ。
これは普通のデバッグじゃない。俺が修正を終える前に次の改竄が走っている。本来ならhotfixは「バグを見つけて修正して終わり」のはずだ。だがヴァイラスはバグを入れ続ける生産者だ。俺は修正し続ける消費者だ。生産速度が消費速度を上回っていたら——
答えは明白だった。
```
// HOTFIX QUEUE STATUS
[1] weapon.target → FIXED → CORRUPTED AGAIN → FIXING...
[2] sword_logic.condition → FIXED → CORRUPTED AGAIN → FIXING...
[3] self_integrity: 68% → 65% → 62%...
[WARNING] Queue processing speed approaching limit
[WARNING] Estimated failure in 18 seconds
```
「俺がデバッグする速度とお前がコラプトする速度——どっちが速いか勝負だ」
俺は言った。自分自身への言い聞かせでもあった。諦めの言葉じゃない。宣戦布告だ。前の世界でも同じことがあった。リリース前夜にバグが連鎖して、直しても直しても次のバグが湧いてくる夜。あの時と今が重なった。あの時は負けた——倒れて終わった。今は違う。負ける前に終わらせる。
「もう答えは出ているよ」
ヴァイラスが静かに答えた。嘘ではなかった。数字が証明している。18秒。いや今は15秒だ。
「——でも俺はまだ諦めていない」
ヴァイラスは答えなかった。ただ、また指が動いた。今度は三本。
---
ガルドの戦斧が再び汚染された。今度は拳具も同時に。
```
// CORRUPTED
knuckle.force_direction = owner;
axe.blade_angle = -180deg (reversed)
```
二箇所を同時に修正する。コードが滲む。視界が一瞬揺れた。自己コード劣化が60%を超えた。
「くそ——!」
修正が一拍遅れた。その一拍の間に、ガルドの拳具が自分の腕に衝突した。鈍い音。ガルドが舌打ちをしながらも体勢を崩さない。さすがに元Bランクだ。打たれ強さが違う。フォームが崩れない。
「ドンマイ蓮!気にするな!」
「気にしてる場合じゃない——!」
アリアの条件分岐剣法がまた改竄される。今度は二条件同時。
```
// CORRUPTED (double)
if (enemy.position == front) → if (ally.position == front)
if (enemy.defense == low) → if (ally.defense == low)
```
アリアが素早く剣を止める。俺が修正する。修正が終わる前に次の汚染が来る。
段々と手が届かなくなっていた。
修正の網が破れ始めている。
ヴァイラスが言った。静かに、でも確かに——
「俺の速度には、届かない」
その声には、悲しみに似た何かが混じっていた。勝ちを喜んでいるのではなく。むしろ——証明されてしまうことを、惜しんでいるような。
---
「蓮!」
ガルドの声が変わった。
戦場の声だ。判断を求めない声。何かを伝えるだけの声。
「俺を気にするな!お前はヴァイラスの本体を狙え!」
「馬鹿言うな、お前の武器が——」
「俺は自分でなんとかする!」
ガルドが戦斧を放り投げた。そのまま拳一本で、ヴァイラスに向かって走り出す。素手だ。汚染できる武器がなければ、汚染のしようがない。
空気が変わった。
ガルドの周囲の密度が上がる。熱ではない。圧力でもない。何か、根本的なものが溢れ出す感覚。コードが膨張している。容量が、上限を超えようとしている。デバッガーズ・アイに警告が走った。
```
[ALERT] ENTITY: GARD
> stack_memory: OVERFLOW DETECTED
> capacity: 100% → 120% → 150%...
> WARNING: STACK OVERFLOW IN PROGRESS
> estimated_output: EXCEEDS SYSTEM LIMIT
> [NOTE] repeated use causes permanent integrity loss
```
スタックオーバーフロー——ガルドの切り札。自分のメモリ限界を超えてリソースを積み上げ、爆発的に解放する技。使えば寿命を削る。
こいつは——いつからこれを知っていたのか。何度使ってきたのか。それを誰にも言わずに、今この瞬間も迷いなく選んでいる。
俺はそれを知らなかった。でも今この瞬間、デバッガーズ・アイが読んだあのログの最終行を、頭の隅に刻み込んだ。
`[NOTE] repeated use causes permanent integrity loss`
繰り返し使えば、永続的な損傷が起きる。
ガルドはそれを知っていて——使っていた。今も、使おうとしていた。
「——ガルドゥオオオオッ!!!」
爆発。
ガルドの全力が/dev/nullを揺らした。ゴーストデータが吹き飛ぶ。0.xの建物の断片が砕け散る。床の定義が一時的に崩れ、重力が揺らぐ。ヴァイラスが初めて真剣に回避行動を取った。体が右に飛ぶ。視線が、ガルドに向いた。
俺に向いていない。
今だ。
---
走った。
汚染の余波が大気を変色させた空間を、最短ルートで抜ける。右腕が揺らぐ。自己コード劣化が59%——いや、また上がる。/dev/nullの増幅効果が止まらない。もうデバッガーズ・アイが通常では見えないものまで見え始めている。これは悪化のサインだ。ノイズが多すぎる。フィルタが追いつかない。
構わない。
5メートル。3メートル。
ヴァイラスの背中が見えた。
デバッガーズ・アイを、限界まで開く。
ヴァイラスに向けて、アクセスを試みた。
普通なら弾かれる。エンティティの源コードは、相手が受け入れなければ読めない。触れることもできない。システムの基本原則だ。他人のコードを無断で読むことは、この世界でも前の世界でも——許されない。
だが——
ヴァイラスが、俺を見た。
汚染の指を向けず、ただ見た。
「——読めるか、プログラマー」
静止。
ヴァイラスが、受け入れていた。
---
コードの海に落ちた。
ヴァイラスの内部。源コードの奥深く。
汚染のコードが絡み合い、腐食したフレームが積み重なり、もはや原型を留めていないように見えた——最初は。
腐食の臭いがする、と思った。コードに臭いなんてない。でもそう感じた。何百年分の憎しみと怒りと諦めが堆積している場所の、臭い。
だが、俺は目を細めた。
デバッガーズ・アイが、深く潜る。
汚染の下に、何かがある。
前の世界でも同じだった。長年放置されたレガシーコード。誰も触りたがらないスパゲッティの奥に、最初に書いたエンジニアの設計意図が残っていることがある。コメントとして。変数名として。仕様書を読めば分かる構造として。腐っていても、消えないものがある。
```
// [LAYER: CORRUPTED] - active
// [LAYER: VIRUS] - overwrite
// [LAYER: ........] - SEARCHING...
// [LAYER: PATCH v0.4] - FOUND ← !!!
```
息が止まった。
汚染の何十層もの下。腐食したコードの海の底。
そこに、原型があった。
改竄される前の、消される前の——英雄パッチのコードが。
まだ、生きていた。
消えていなかった。
三十%の劣化で霞む視界の中でも、それははっきりと見えた。周囲の汚染コードよりも鮮明に。色が違う。質が違う。パッチが自分で書いた、自分だけのコードだ。古い。古いが——丁寧に書かれている。誰かに読んでもらうことを意識して書かれたコードの、あの独特の整然さがあった。
```
// PATCH v0.4 - original signature
// function: protect(target: ALL)
// motive: keep_world_safe()
// core_value: "誰も消えなくていい"
// status: BURIED / NOT DELETED
```
守ること。全員を。誰も消えなくていい。
それがパッチの——ヴァイラスの、根っこにあるコードだった。
汚染に埋もれて。腐食に覆われて。それでも消えずに、ずっとそこにあった。
俺は画面の前で止まった。比喩ではなく、本当に止まった。デバッガーズ・アイの中で、手が止まった。
ヴァイラスはずっと、誰も消えなくていい、と思っていた。
世界を壊そうとしていた存在の、一番奥に。
「誰も消えなくていい」という言葉が、消されずに残っていた。
こいつは——バグだ。
ヴァイラスそのものが、世界最大のバグだと俺は思っていた。だがパッチのオリジナルコードを見た今は、少し違って見える。バグじゃない。矛盾だ。「誰も消えなくていい」と信じていた者が、世界を消そうとしている。その矛盾が、ヴァイラスというエンティティを作っていた。
矛盾は——修正できる。
「……」
言葉が出ない。
そして、さらに深く。
原型コードの、さらに奥。
誰かの手が書いた痕跡があった。プログラミング言語でも古代文字でもない、もっと根本的な何か——世界の設計者だけが書けるもの。ソースコードの一番深い層に刻まれた、設計者の痕跡。
コメント文。
```
// ※ アドミンによる設計コメント ※
```
それだけ見えた。
内容は読めなかった。デバッガーズ・アイが弾かれた。Lv3の限界だ。まるで扉に鍵がかかっているみたいに、それ以上は届かない。
だが確かに、そこにあった。
この世界を設計した者が、ヴァイラスの源コードに、何かを残していた。
なぜ消さなかった。
なぜ残した。
---
衝撃が来た。
ヴァイラスの汚染波が俺を弾いた。接続が切れる。意識が/dev/nullの空気に戻る。体が石の床を転がった。衝撃は強いが、殺意はない——弾き飛ばす力であって、潰す力ではなかった。
「見えたか」
ヴァイラスの声。近い。
「見えた」
俺は立ち上がりながら答えた。
右腕のノイズが激しい。自己コード劣化が、メモリの声を聞かなくても分かるくらいに積み上がっていた。それでも足は立つ。声は出る。
「パッチのコードが、まだ残ってる。お前の中に」
沈黙。
/dev/nullが静まり返った。
「……そんなものを見て、何が変わる」
「わからん。でも——」
俺はデバッガーズ・アイの余光が冷める前に、さっき見たものを反芻した。
英雄パッチの原型コード。汚染に埋もれて消えずにいるもの。そしてアドミンが残したコメント。
なぜそこに、設計者のコメントがある。
なぜ削除しなかった。
「——お前のコードに、アドミンが何か書き残してる」
ヴァイラスの動きが止まった。
初めて、明確に止まった。
「何、だと」
その声には、初めて感情が乗っていた。
疲れでも怒りでもなく——何か、もっと深いもの。封じ込めてきた何かが、一音だけ滲み出したような声だった。
俺は続ける言葉を持っていなかった。Lv3では読めない。内容を知らない。
ただ、そこにあったという事実だけを、持っていた。
「俺一人では読めない。でも確実にある。アドミンがお前に向けて書いたコメントが」
---
/dev/nullの空気が揺れた。
ガルドが膝をついていた。スタックオーバーフローの反動。シェルが駆け寄る。アリアが剣を構えたまま、ヴァイラスと俺の間に立っている。
ヴァイラスは動かなかった。
汚染波も出ていない。
ただ、俺を見ている。
「……読めるのか、プログラマー」
「今は無理だ。Lv3じゃ届かない」
「ならば——」
「でも次に会うときは、読む」
沈黙が伸びた。
ヴァイラスの表情が動いた。
俺には読めなかった。悲しみか、安堵か、あるいは全く別の何かか。数百年分の感情が詰まった顔を、俺はまだ読み解けるほど知らない。
「……続きは、また今度だな」
それだけ言って、ヴァイラスは後退した。/dev/nullの深部へ。暗闇の中へ。ゴーストデータの群れが道を開けるように揺れた。
その背中を見ながら、俺は思った。
あいつは今——何を思っているのか。
自分のコードに、アドミンのコメントが残っていると知った。長い年月、ずっと持ち歩いていた。知らなかったのか、知っていて見ないようにしていたのか。それは分からない。でも反応した。明確に、動きを止めた。
追わなかった。
追える状態でもなかったし——追うべきでもないと思った。
あの源コードの奥にあったもの。英雄パッチの原型コード。そしてアドミンのコメント。
内容を知らないまま、ヴァイラスを終わらせてはいけない気がした。
「誰も消えなくていい」——それを書いた者が、世界を壊そうとしている。
なぜか。
答えはアドミンのコメントの向こうにある。
---
「蓮」
ガルドの声。掠れていた。
膝をついたまま、でも口の端が上がっている。
「俺、役に立ったろ」
「……ああ」
スタックオーバーフローの反動が体に出ている。俺には見えた。ガルドの源コードが、わずかに——削れていた。前と比べて、少し薄い。また一枚、剥がれていた。
どこかで誰かがコードを書く時に、寿命を変数として定義するだろうか。`lifespan = 100`のように。削れていく。毎回使うたびに、一ずつ減っていく。
見ているのが辛かった。
でも——ガルドはそれを選んでいた。今も、笑っていた。
何も言わなかった。
今は、言えなかった。
「シェル。ガルドを頼む」
「了解。でも——」
シェルが少し間を置いた。こいつが間を置くのは珍しい。
「今の、お前の目——普通じゃなかった。Lv3の限界突破しかけてた」
「わかってる」
「わかってるなら——」
「わかってる」
繰り返した。
アリアが剣を鞘に収めた音がした。
「あなた——大丈夫ですか」
「大丈夫じゃない。でも死んでない」
「それは——」
「十分だ」
/dev/nullの暗闇の奥に、もうヴァイラスの気配はなかった。0.xのゴーストデータが、静かに漂っている。名前のない人々が、また何事もなかったように、動作パターンだけを繰り返している。
俺はデバッガーズ・アイを閉じた。
右腕がノイズを撒いている。劣化57%。Lv3の限界ギリギリを、今日は何度も往復した。それでもまだ立っている。倒れなかった。
さっき見えたコメントの書き出しだけが、脳裏に焼き付いていた。
アドミンによる設計コメント。
ヴァイラスの源コードの、一番奥に。
なぜ消さなかった。なぜ残した。
アドミンはこの世界を作って、バージョンアップして、パッチを——かつての英雄を消した。それなのに、消した相手のコードに何かを書き残した。消した後で。消してから。
それはどういう意味か。
その問いへの答えは——次の扉の向こうにあった。
---
```
[SYSTEM LOG - UPDATE]
> combat: SUSPENDED (not resolved)
> self_integrity: 57% ← CRITICAL
> VIRUS: RETREATED / LOCATION: UNKNOWN
> debugger_eye: Lv3 / STRAIN DETECTED
> new_flag: ADMIN_COMMENT_FRAGMENT [READ: FAILED / LOCKED]
> condition_check: Lv3→Lv4 THRESHOLD: APPROACHING
> next_action: PENDING
```
次回——第56話「ルート・アドミンの意志」
ヴァイラスの源コードに刻まれたアドミンのコメント。その一行が、英雄パッチの過去と、世界の設計者の苦悩を明かす。「お前は私の最高傑作だった——」。真実を知ったヴァイラスは静止し、そして——暴走する。メモリが割って入り、かつての記憶を語るとき、蓮のデバッガーズ・アイは、限界の向こうへと手を伸ばした。




