notes mizzy.org

ここから読む

1予測可能性はどこから来るのか

「実行前に結果が読める」がなぜ根本価値なのか。そこから記述自由度の話へ降りていく。

  1. 実行前に結果が読めることがIaCの根本価値である
  2. 予測可能性はgraph形状と属性値の二側面を持つ
  3. 結果予測性に効く記述自由度は三つに絞れる
  4. 記述自由度は「言語が決める」か「規約に委ねる」かの二層に分かれる
  5. 「DSLだから読みやすい」のではない
  6. IaCでは賢い抽象より退屈で逐語的な記述の方が価値が高い
  7. 抽象化境界の透明性は記述自由度とは独立した軸である
  8. AIのコンテキスト窓は人の局所読解と同質の制約である
  9. AI時代に予測可能性の根拠は組み替わるが重要性は落ちない

2planをコンパイラとして読む

planは中間表現で、applyはリンカである。この読み替えが実バグを予言するところまで。

  1. IaC言語は二段階の言語である
  2. planはコンパイルである
  3. planはSSA的で直列化可能なIRである
  4. applyはリンカ兼ローダである
  5. 再配置後に検証がないのは型検査済みIRの不変条件の破壊である
  6. 良い類比は実バグを予言する
  7. 類比が切れるのはターゲットが生きている場所である

3型はどこまで守れるのか

値ベースの全数検査という強い性質から出発して、その検査が届かない場所を特定する。

  1. 型は値の分類器である(意味論的型付け)
  2. 値ベースの全数検査は停止性の配当である
  3. 静的段階の全域性は構文制限だけでは得られない
  4. IaC言語は二段階の言語である
  5. Unknownは二段階の間に開いた窓である
  6. 未知値の周りは無検査ではない
  7. 「全数検査」は検証ステップの時点で確定している値に限られる

4何を言語に入れないか

意味的本体はグラフだけ、という立場から、高階関数を入れないという判断まで。

  1. IaC言語の意味的本体はリソース定義と依存グラフだけである
  2. 言語機能はグラフへ消える糖衣である限りで許される
  3. IaCが必要とする再利用は検証済みパターンのパラメータ付き合成であって任意計算ではない
  4. IaCで高階関数は「あれば嬉しいが必須ではない」かもしれない
  5. 高階関数の境界条件は「関数値がgraph形状決定位置に到達しない」ことである
  6. 5つのDSLが独立に「抽象化追加だけ規約寄り」へ収束した
  7. ツール=1象限という前提は粗い — 象限は自由度ごとに落ちる

すべてのノート 105本 更新が新しい順

確認済み 36 解釈 43 規範 8 AI由来 2

予測可能性には二つの源がある

コードを読めば分かることと、moduleを使い慣れているから分かっていること。体感は同じでも、成果物に宿るか個人に宿るかで性質がまるで違う。

#予測可能性 #抽象化 #設計判断

TOCTOUドリフト検出は窓を閉じずに、窓が動いたことだけを告げる

planはロックを取らず、serialとlineageの2つだけで「誰かが書いた」ことを事後に報告する。名前が付いている段と、実際に陳腐化を食い止めている段は別である。

#plan #apply #occ #toctou

黙って捨てるのは、落とすことより悪い

失敗の悪さは損失の大きさではなく、気付けるかどうかで決まる。溢れた内容を無言で捨てる設計が最悪なのはそのため。

#設計原則 #型安全 #peitho

契約を別ファイルに切り出すと必ずずれる

テンプレートがスキーマを兼ねる設計。同居できない言語境界では、片方を正として生成する。狙いはどちらも同じ。

#設計原則 #契約 #peitho

内容から導いた識別子は、内容を直した瞬間に静かに外れる

タイトルのslugをキーにすると、誤字を直しただけで上書きが的を失う。IaCの論理IDと同じ問題の別領域での再演。

#identity #リファクタリング #peitho

出力先に重ねる層があるなら、状態を溜めずに済む

純粋性は意志の問題ではない。stateは本質的な必要物ではなく、出力先が非合成的であることへの補償である。

#state #設計原則 #peitho

競合は観測では閉じない。順序づけでしか閉じない

痕跡の不在が「やっていない」と同値でない時点で、観測は判定器になりえない。二度捕まえ損ねた実測記録。

#並行性 #設計原則 #peitho

まとめられる通り道にトグルを流してはいけない

差分は失うと戻らない。絶対状態を、一度ではなく毎回送ることで初めて収束する。宣言的であることの実務上の利得。

#並行性 #宣言的 #peitho

遷移を実行する場所を一箇所に閉じ込める

本体がシェルを知らないのは行儀ではなく、配布物にシェルが入っていないための必要条件である。

#設計原則 #アーキテクチャ #peitho

変性は選ぶものではなく、位置が決めるものである

共変・反変・不変の三択は好みではない。型引数が出てくる位置にあるか、入っていく位置にあるかで決まってしまう。

#型システム #部分型 #型理論

変性は書かれていないだけで、既に決まっている

List/Mapは全て共変で、Mapはキーも共変。だがそれを確定させたのは変性を決めるための検討ではなく、別目的の修正の副産物だった。

#型システム #部分型 #設計負債

探索から出たissue索引

これらの探索から起票された、あるいは探索中に参照されたissueの一覧。各項目に「何のissueか」と「どの概念ノートに属するか」を付す。

#参照 #issue #carina

同値関係を方向付き判定に流用すると抽象から具体への代入が漏れる

公称識別の軸ごとの包摂は、設計としては方向付きである。受け側が特定している軸は送り側も一致していなければならず、受け側が特定していない軸は問わない。ところがその判定に使われている関数は対称な同値関係として書かれている。

#型システム #バグクラス #部分型

「未確定」を表す表現が四つあるのは漸進的型付けの境界が引けていない徴候である

目指す形は設計文書で決まっている。だが3か月弱を経て、コードは1つも動いていない。四つは四つのままである。

#型システム #漸進的型付け #設計負債

Unknownの理由は「誰がいつ埋めるか」の分類である

10変種を解決経路で並べると三群+誤りに割れる。二段階の間の窓に当たるのは上流参照系の3つだけで、1つは時間の向きが逆である。

#unknown #型システム #段階分離 #carina

previewはapplyのコールバックを近似しない、実行しない

入力が未知のとき、previewはコールバックに一歩も入らない。評価されるのは精度の落ちたプログラムではなく、長さの違うプログラムである。

#unknown #plan #iac

未知値の規律と段階分離は三すくみである

段階を跨ぐ値(applyまで決まらない値)の扱いに、IaCツールの設計差が最も鮮明に現れる。

#unknown #比較 #iac

モナドは箱ではなく合成戦略である

箱の比喩はIOや関数モナドで壊れる。実態は「次に何をするか」の繋ぎ方の共通形で、文脈固有のロジックはbindの定義1箇所に入る。

#モナド #構造 #型システム

import / removed / moved は現実を動かさずに帳簿だけを書き換える

コードの整理が本番の作り直しになると、誰も整理しなくなる。stateだけを書き換える3つのブロックが、その結びつきを切っている。

#state #リファクタリング #plan #iac

モノイドとモナドを分けるのは継続を持てるかどうかである

繋ぐものが値か関数か。この一点が、planを表示してレビューできるかどうかを決めている。モナドは劣った構造ではなく、強すぎる。

#モナド #構造 #plan

構成データ出力DSLから貰えるのは評価段階だけである

「グラフだから使えない」は言い過ぎ。貰えるのは評価段階だけで、identity・差分・state・Unknownは残り、エッジの検査は言語境界で失われる。

#dsl #設計判断 #段階分離

既存言語を採用してもフル機能は使わせられない

既存言語をfront endに採ると、蒸発しない機能を禁止して回ることになる。「別言語を作るのと同じ」では済まず、作った上でホスト言語の面積も抱え続ける。

#dsl #設計判断 #言語設計

類比が切れるのはターゲットが生きている場所である

「planはコンパイルである」という類比が切れる場所は散らばっていない。すべて一つの原因に帰着する — ターゲットが受動的なメモリではなく、生きた外部世界であること。切れ目は三つある。

#iac #コンパイラ #限界

Unknownは二段階の間に開いた窓である

静的段階では値が決まらないものがある。上流スタックのapply結果への参照、まだ作られていないリソースの属性、for展開の変数などで、Terraformの「(known after apply)」に相当する。

#unknown #型システム #段階分離

IaC言語は二段階の言語である

Carinaのようなインフラ記述言語は「実行時に型を検査する動的型付き言語」ではないし、古典的な静的型付き言語でもない。静的段階と動的段階という二つの段階を持つ言語として読むのが正確である。

#iac #型システム #段階分離

全域性の価値は「何をゲートするか」で決まる

全域性は、それ自体が普遍的に望ましい性質なのではない。静的段階が何の門番をしているかによって、その価値が変わる。

#全域性 #pkl #設計判断

全域性は後付けできない

静的段階の全域性は、実装を頑張れば手に入る種類の性質ではない。言語設計の選択そのものに由来するため、汎用言語に埋め込む方式を選んだ時点で原理的に取れなくなる。

#全域性 #言語設計 #iac

planはコンパイルである

carina planは、ソース言語(.crn)のプログラムを、検査を通しながら中間言語(Effectのリスト + 依存DAG)へ翻訳するコンパイラである。applyはその中間言語の実行系である。

#iac #コンパイラ #plan

planはSSA的で直列化可能なIRである

中間表現としてのplanは、コンパイラのIRが持つ古典的な性質をいくつも備えている。単一定義性、直列化可能性、そして「検査済みであること」の三つである。

#plan #ir #コンパイラ

typestateで壊れた状態を書けなくする

Carinaの処理系は「処理が進むと値の型が変わる」typestateパターンを系統的に使っている。狙いは一貫していて、静的段階の内部不変条件を、実装言語の型でコンパイル時に固定することである。

#typestate #型安全 #設計原則

汎用言語埋め込みとの取引は構造的に対称、価値づけは非対称

汎用言語埋め込みと専用全域言語の取引は、構造としてはきれいに相補的である。

#トレードオフ #設計判断 #比較

言語機能はグラフへ消える糖衣である限りで許される

IaC言語に機能を足してよいかどうかには、はっきりした判定条件がある。言語機能は、静的段階の終わりまでにグラフへ正規化されて消える糖衣である限りで許容される。以後これを蒸発条件と呼ぶ。

#設計原則 #蒸発条件 #dsl

効果の具体化 — planは効果の自由モノイドである

静的段階の出力であるplanは、Read / Create / Update / Delete / Import / Remove / Move / Wait / DeferredCreate / DeferredReplaceの10種のEffect値の列である。

#効果 #代数 #plan

差分計算は命令選択である

IaCの差分エンジンがやっていることは、コンパイラの命令選択(instruction selection)の変種として読める。命令セットは Effect の10種で、Replaceはその中に無い — 置換はCreate/Deleteの対へ展開される複合命令である。

#plan #コンパイラ #差分

IaCが必要とする再利用は検証済みパターンのパラメータ付き合成であって任意計算ではない

IaCが本当に必要とする再利用は、検証済みパターンのパラメータ付き合成であって、任意計算ではない。それはモジュール・for・exportsという有界な合成手段 — すべて蒸発条件を満たす — で足りる。

#設計原則 #再利用 #dsl

型名の文字列比較で代入可能性を決めるのは構造を捨てている

代入可能性判定の最終アームは、二つの型の表示用の名前を文字列として比較するものになっている。

#型システム #設計負債 #部分型

ソース調査ポインタ集

このノートは腐る。 行番号は当時のリポジトリのスナップショットであり、対象リポジトリが更新されれば合わなくなる。

#参照 #ポインタ

未解決の問い

これらの探索で答えが出なかった問いの一覧。概念ノートではなく、次に調べるべきことのリストである。既に解決したものは各概念ノートに事実として書かれているのでここには含まない。

#未解決 #todo

identityは「何を同一資源と見なすか」の規則であり、stateとは独立軸である

identityとは「何を同一資源と見なすか」の規則である。stateをどこに置き誰が運用責任を負うかという問い(章4の主題)とは別の独立軸であり、同じツールでも別々に設計できる。

#identity #iac #リファクタリング

構成データ出力DSLとgraph出力DSLはレイヤが違う

構成記述系DSLを「何を出力するか」で分けると、3自由度では捉えきれない別レイヤの差が浮上する。

#dsl #分類 #設計空間

逃げ道の有無が表現力の上限と組織コストを交換する

記述自由度の二層は、逃げ道の有無という一点でトレードオフを作る。

#トレードオフ #組織 #dsl

「外部DSL × 規約に委ねる」が空席なのは淘汰圧の結果である

記述言語と記述自由度の所在の2×2で、「外部DSL × 規約に委ねる」— 動的なsourceと任意関数を持つ専用DSL — に該当するツールがない。これは偶然の空白ではなく淘汰圧の結果である。

#設計空間 #dsl #淘汰圧

「汎用言語 × 言語が決める」の空席は偶然ではない

「汎用言語 × 言語が決める」象限に該当するIaCツールは、確認できる範囲で存在しない。これは偶然ではなく、ホスト言語をサブセット化しない限り埋まらないという構造から来る。

#設計空間 #dsl #全域性

「信頼できるworld = 全リソースの同期GET」という等式をほどく

IaCのコンパイルは二引数plan(source, world)である。このうちworldの取得が遅い。

#plan #性能 #設計

planは予測であり、真実はapplyが確立する

planはロックを取らず、applyがロック下で差分を再計算する。この契約を意識的に推すと、plan時のworldの鮮度は正しさの問題ではなくUXの問題だと正当化できる。

#plan #apply #occ

純粋性はplanを常駐クエリに変える前提条件である

worldを変更イベントで維持される実体化ビューにするという構図は、データベースの増分ビュー維持(incremental view maintenance)そのものである。

#増分計算 #純粋性 #plan

排他所有が証明できれば読まなくてよい

worldを速くする三つの攻め口のうち、最も踏み込んだものは「読まなくてよい条件を作る」である。自分しか書かないリソースについては、自分の記録が真であり、クラウドAPIを叩く必要がない。

#所有権 #型システム #分散システム

クラウドのdirty bitはAPI呼び出しログではなくリソース指向の変更フィードである

CPUはメモリの全走査をしない。ページテーブルのdirty bitが「変わったページ」だけを教え、キャッシュ一貫性プロトコル(MESI系)は無効化通知を受けたキャッシュ行だけを再取得する。

#増分計算 #aws #確認済み経験

買えるのは「有界の古さ+変更量比例のコスト+applyでの最終検証」である

world取得を速くする三つの攻め口を一つの設計に落とすと、三層になる。

#限界 #plan #分散システム

信頼境界を越えるデータは境界で再検証する

「一度検査したのだから、あとは信用してよい」は、データが同じ信頼領域に留まっている間だけ成り立つ。

#型システム #信頼境界 #設計原則

値ベースの全数検査は停止性の配当である

Carinaの型検査は、項(構文)にラベルを付ける体系ではなく、評価済みの値がその型に属するかを判定する様式を取る。これができるのは静的段階が全域的だからで、値ベースの検査様式は停止性の配当として読める。

#型システム #全域性 #契約検査

タグなし合併の判別はヒューリスティックに頼るしかない

CarinaのUnion(Vec<AttributeType>)はタグなし合併(untagged union)である。「いずれかのメンバが受理すれば妥当」という集合論的合併の意味論を持つ。これには理論的な代償がある。

#型システム #合併型 #設計負債

プラグイン境界の型消去は事故クラスを予測する

WASMプラグイン境界(WITプロトコル)では、型情報の一部が不可逆に消える。

#型消去 #プラグイン #バグクラス

等価判定は正規形へ簡約してから型ごとに行う

差分計算の中核にあるのは、等価性が型ごとに定義される(type-directed equality)という原則である。同じ値の組でも、期待される型によって判定が変わる。

#差分 #等価性 #型システム

検査対象はノード上の値とエッジ両端の型の二種に還元できる

IaC言語の型検査が項ベースの型体系をほぼ必要としないのは、実装上の手抜きではなく、意味的本体がグラフだけであることの帰結である。型を付けるべき「プログラム」が実質存在しないので、検査対象はグラフそのものになる。

#型システム #設計原則 #グラフ

型注釈の言語とスキーマ型は別の言語である

Carinaには型を表す言語が二つある。ユーザーが書く型注釈の言語(TypeExpr)と、プロバイダのスキーマが表すスキーマ型(AttributeType)である。

#型システム #設計負債 #非対称

「専用言語か」と「全域か」は独立した二軸である

設定記述言語の系譜は「汎用言語に埋め込むか、専用言語を作るか」の一本の線ではない。「専用言語かどうか」と「全域的かどうか」は独立した選択であり、その二軸が張る空間として見た方が正確である。

#dsl #系譜 #設計空間

未知値の周りは無検査ではない

Unknownの素通しは「未解決の値の周りは無検査」という意味ではない。値が無くても宣言型どうしを照合する別経路の検査が走るため、静的近似が本当に確定できない窓は見かけより狭い。

#unknown #型システム #検査

静的段階の全域性は構文制限だけでは得られない

「静的段階の評価が必ず停止する」という性質は、一般再帰を禁じてループを有限に限るだけでは出てこない。構文制限と参照グラフの非循環性強制という二本の柱で初めて成り立つ。

#全域性 #dsl #型システム

検査器が二系統あるのは設計負債である

静的検査器が二系統ある — plan/validate経路とLSP経路 — というのは、機能の重複ではなく理論的な負債である。同じ検査の二重実装であり、意味論の一致(パリティ)を規約と試験で維持している。

#設計負債 #lsp #コンパイラ

型は値の分類器である(意味論的型付け)

Carinaの型付けの様式は、型を「項に付く構文的な札」ではなく「値の集合(値の分類器)」とみなし、型付けを所属判定として与える意味論的型付け(semantic typing)の系譜である。

#型システム #型理論 #cue

再配置後に検証がないのは型検査済みIRの不変条件の破壊である

「well-typedなIRだけがバックエンドに渡る」というのがコンパイラの標準的な契約である。しかしapplyの再配置はIRに新しい値を書き込む。

#バグクラス #型システム #apply

カスタム型は独立の構成子ではなく篩型である

Carinaに「カスタム型」という独立した型構成子はない。代わりにString / Int / Floatの各変種が制約を持ち運ぶ。

#型システム #篩型 #型理論

属性の出所は型に昇格させるべきモダリティである

「この属性は誰が書くのか」— ユーザー指定か、プロバイダ算出か、サーバ既定か — という区別が、Carinaでは型に乗っていない。フラグと投影で表現されている。これが理論的な負債になっている。

#型システム #差分 #設計方向

検査は素通し、等価性は不成立 — Unknownの一貫した保守性

Unknownの扱いは、検査では楽観的に、等価性では悲観的に振る舞う。方向が逆に見えるが、どちらも「インフラを壊さない側」に倒すという一つの原則の現れである。

#unknown #健全性 #差分

公称軸ごとの幅部分型付けが再利用と混同防止を両立する

列挙やカスタム文字列型にはTypeIdentity { provider, segments, kind }という公称的な識別が付く(providerは省略可能)。

#型システム #部分型 #公称型

循環スキーマは名前付きμ型で明示展開する

CloudFormationのWAFv2 Statement → AndStatement → List<Statement> のような循環スキーマを表すため、スキーマは

#型システム #再帰型 #型理論

デプロイ計画がモノイドかモナドかで見通しが決まる

未知値をめぐる三すくみは、構造の言葉で言い直せる。鍵になる区別は、デプロイ計画が「平らな宣言の集まり」か「継続のつながり」かである。

#モナド #構造 #plan

IaCではIRダンプが一級の製品機能である

planを中間表現として読んだときの最も特徴的な性質はこれである。このIRはユーザーインターフェースである。

#plan #ux #ir

IaC言語の意味的本体はリソース定義と依存グラフだけである

IaC言語の意味的本体は、リソースの定義と、その依存関係グラフである。それ以外のすべての言語機能は、あれば便利という程度のものにすぎない。

#設計原則 #iac #グラフ

動的段階の効果の閉包性はP1完全性とP2帰属性に分解できる

「動的段階では、コードに書いたこと以外の副作用が発生しない」という性質を動的段階の効果の閉包性と呼ぶと、これは二つの独立した命題に分解できる。

#効果 #比較 #安全性

資格情報の傍で任意パッケージが動くこと自体が攻撃面である

汎用言語埋め込み型のIaCツールが得るパッケージエコシステムには、他のドメインでは生じない種類のコストがある。

#セキュリティ #供給網 #設計判断

IaCのコンパイルは二引数である

通常のコンパイラはソースだけの関数である: compile(source) = binary。IaCのコンパイルは二引数である: plan(source, state) = patch。

#iac #コンパイラ #増分計算

「全数検査」は検証ステップの時点で確定している値に限られる

値ベース検査の売りは「プログラムを完全評価してから、出てきた値を全数検査する」ことである。しかしこの「全数」性には時刻の指標が付く。検査されるのは、検証ステップの時点で値が確定しているものだけである。

#型システム #検査 #バグクラス

IaCでは賢い抽象より退屈で逐語的な記述の方が価値が高い

インフラ記述の主要な読者はレビューアと将来の運用者である。彼らが問うのは「このコードは何を計算するか」ではなく「この記述から実際に何が作られるか」の判読性である。

#設計原則 #可読性 #iac

applyはリンカ兼ローダである

applyの仕事をコンパイラの言葉で言うと、リンクとロードである。plan中の穴を実値で埋めながら、依存順に実行していく操作だからである。

#apply #コンパイラ #リンカ

良い類比は実バグを予言する

類比の価値は、記述が整うことにあるのではない。対応から実装上の予言が導け、その予言が実際のバグや改善方向を当てることにある。当たらない類比は装飾であり、当たる類比は分析の道具である。

#方法論 #類比 #設計

部分型関係が公理化されていないと性質の破れを検出できない

代入可能性の判定は、手書きの分岐の集合として書かれている。個々のアームは妥当だが、それらが全体として部分型関係の性質を満たすかはコードでも試験でも保証されていない。反射性・推移性・反対称性のいずれもである。

#型システム #部分型 #設計負債

構造体を封印すると打ち間違いは捕まるがスキーマ進化に弱くなる

構造体の値検証は、必須フィールドの存在を確かめ、未知のフィールドを拒否する(似た名前があれば候補として提示する)。つまり幅部分型付け(width subtyping)を負の方向にしか許さない。

#型システム #部分型 #トレードオフ

ツール=1象限という前提は粗い — 象限は自由度ごとに落ちる

「記述言語(外部DSL / 汎用言語)× 記述自由度の所在(言語が決める / 規約に委ねる)」の2×2は、暗黙に「ツール = 1象限」を前提していた。

#設計空間 #比較軸 #方法論

結果予測性に効く記述自由度は三つに絞れる

記述自由度は無数に立てられるが、「実行前にコードを読んだ時点で、resource graphの形と各ノードの属性値がどう決まるかを読み取れるか」に直接効く軸に絞ると、三つになる。

#比較軸 #dsl #設計判断

stateの「所有」と「運用責任」は分離できる二軸である

stateをめぐる設計判断は一つの軸ではなく二つある。

#state #運用 #設計判断

SDKが型を提供することは言語が制約を課すことではない

PulumiのOutput<T>やCDKのToken / BucketPropsのように、SDK側が型を提供して依存追跡や未知値伝播を表現するパターンがある。これを「言語が決める」象限の実例と数えるのは過大評価である。

#型システム #dsl #評価

リファクタ耐性はidentityを歴史的に繋ぐ機構が要る

コード構造を変えたとき(rename / move / refactor)に既存リソースが破壊されないかどうかは、identityの生成規則そのものではなく、旧identityと新identityを歴史的に繋ぐ機構がある…

#identity #リファクタリング #state

3自由度サマリ表

IaC 4ツールと構成記述系DSL 11本を、3自由度 — 抽象化の追加 / 複数量の制御 / 実装の切替 — で横断評価した一覧表。

#参照 #比較表 #dsl

Terraform / CDK / Pulumi / Carina比較マトリクス

4ツール(Terraform / CDK / Pulumi / Carina)を軸ごとに横断比較した概観表を集約したもの。(要確認)と書かれたセルは埋まっていないまま残してある — 何が確認できていないかも情報である。

#参照 #比較表 #iac

構成記述系DSL 11本の調査

構成記述系DSL 11本(Pkl / Bicep / KCL / CUE / Dhall / Jsonnet / Nickel / cdktf / cdk8s / Crossplane / Helm)を、同じ枠組み —…

#参照 #dsl #調査

Carina機能点検(2026-04-27時点)

2026-04-27時点のスナップショット。 carina-rs/carina(https://github.com/carina-rs/carina) repoをIaCツールとして必要な20項目で点検した結果である。

#参照 #carina #スナップショット

「DSLだから読みやすい」のではない

「DSLだから読みやすい」のではなく、「『言語が決める』範囲が広いから(= 規約に委ねる範囲が狭いから)読みやすい」。読みやすさの原因は記述言語の選択ではなく、記述自由度の所在にある。

#dsl #可読性 #設計判断

AI時代に予測可能性の根拠は組み替わるが重要性は落ちない

予測可能性の基準を「実行前にコードを読んだ時点でresource graphの形と各ノードの属性値を読み取れるか」と置くとき、暗黙に読む主体は人間が前提されていた。

#ai #予測可能性 #設計判断

実行前に結果が読めることがIaCの根本価値である

IaCの根本価値は「apply前に結果を見せる」ことにある。だから予測可能性 — 実行前にコードを読んだ時点でresource graphの形と各ノードの属性値を読み取れること — は、他の設計軸と並ぶ一つの軸ではなく、…

#予測可能性 #iac #設計原則

論理IDと物理リソース名は別物だが漏れる

論理ID / URN / binding名はstate/IR内部の識別子であり、AWS上の物理リソース名(S3 bucket名、IAM Role名等)とは別物である。

#identity #命名 #運用

記述自由度は「言語が決める」か「規約に委ねる」かの二層に分かれる

ユーザーの記述自由度をどこまで許すかという設計判断は、誰が制限するかで二層に分かれる。

#設計判断 #dsl #組織

拡張ポイントを言語境界で開けるのは第三の選択肢である

「言語が決める」か「規約に委ねる」かという二択の外側に、拡張ポイントを言語境界で開けるという第三の選択肢がある。

#設計空間 #拡張性 #crossplane

5つのDSLが独立に「抽象化追加だけ規約寄り」へ収束した

構成記述系DSL 11個を3自由度で点検すると、当初の4象限には現れていなかった第5象限が浮上する。Pkl / KCL / Dhall / Jsonnet / Nickelの5つが、独立に同じパターンへ収束している。

#設計空間 #dsl #収束

IaCで高階関数は「あれば嬉しいが必須ではない」かもしれない

ハイブリッド象限への合流は構造的整合性の議論であって、ユーザの実需要とは別の問題である。実需要の観点から見ると、IaCで高階関数は「あれば嬉しいが必須ではない」機能かもしれない。

#高階関数 #dsl #懐疑

予測可能性はgraph形状と属性値の二側面を持つ

コードから読み取りたいものは二つある。graph形状(どんなリソースがいくつ、どう繋がって作られるか)と、各ノードの属性値(そのリソースが具体的にどう設定されるか)である。三つの記述自由度はどちらの側にも適用される。

#予測可能性 #比較軸 #差分

高階関数の境界条件は「関数値がgraph形状決定位置に到達しない」ことである

graph出力DSLに高階関数を入れる核心は属性値計算の自由度を上げることにあるが、その自由度がgraph形状側(resource生成位置 / module選択位置 / identity決定位置)に染み出すと、「実装の切…

#型システム #境界設計 #高階関数

属性値が動的計算だと静的監査が破綻する

予測可能性はgraph形状と属性値の両方に効く。運用の現場では「このリソースは具体的にどう設定されているか」をコードから知りたい場面 — インシデント対応、コンプライアンス監査、セキュリティレビュー、IAMポリシー検査、…

#監査 #セキュリティ #予測可能性

AIは抽象化の実需要をむしろ下げる

「IaCで高階関数は本当に必要か」という問いは、AI時代の観点から見直すと必要性が上がるのではなく下がる方向に傾く。IaCで実際に必要とされる三つの抽象化のいずれも、AIが肩代わりできるからである。

#ai #高階関数 #dsl

AIのコンテキスト窓は人の局所読解と同質の制約である

巨大なIaCリポジトリでは、AIが全コードを一度にコンテキストへ入れられない。このとき効くのは「局所読みでgraph形状と属性値が分かる」という性質であり、これは人の局所読解性と同質の制約である。

#ai #透明性 #局所性

抽象化境界の透明性は記述自由度とは独立した軸である

記述自由度から導かれる予測可能性の議論は、すべて「抽象化を経由していない範囲」に限定される。

#抽象化 #透明性 #仮説

これらのノートの精度について

これらのノートは確定した結論ではない。 すべて生成AI(Claude / Codex)との対話による設計探索の記録を分解したもので、結論の確定ではなく論点の整理と根拠確認を目的として書かれた作業ノートが元になっている。

#メタ #精度

プロトコルで型が潰れるのは共通で、差はschemaの型語彙にある

「プロバイダのプロトコルで型が潰れるから型を強くできない」というのは、差の所在を取り違えた説明である。TerraformとCarinaを並べると、値を運ぶ層はどちらも型タグなしで送っている。

#schema #型システム #プロバイダ

ツールの限界は出自を四層に分けないと解消手段を取り違える

「Terraformの限界はHCLに起因する」という仮説は部分的に正しいが不十分である。限界は単一原因ではなく、出自の違う四つの層が重なっている。層を分けないと、解消手段の見積もりを丸ごと間違える。

#比較軸 #iac #設計判断