<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Rindrics Mumbles</title>
    <link>https://rindrics.com/</link>
    <description>Rindrics Mumbles</description>    
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Fri, 04 Sep 2026 00:00:00 +0900</lastBuildDate>
    <atom:link href="https://rindrics.com/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>第 1 章: ドメイン駆動設計入門</title>
      <link>https://rindrics.com/books/domain-model-made-functional/introducing-ddd/</link>
      <pubDate>Wed, 13 Nov 2024 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/books/domain-model-made-functional/introducing-ddd/</guid>
      <description>&lt;p&gt;&amp;ldquo;1. Introducing Domain-Driven Design&amp;rdquo; from &amp;ldquo;&lt;a href=&#34;https://rindrics.com/books/domain-model-made-functional/&#34;&gt;Domain Modeling Made Functional: Tackle Software Complexity with Domain-Driven Design and F#&lt;/a&gt;&amp;rdquo; &amp;#x1f4da;&lt;/p&gt;
&lt;p&gt;ソフトウェア開発者の仕事とは:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;not only コードを書くこと&lt;/li&gt;
&lt;li&gt;but also &lt;strong&gt;ソフトウェアを通して問題を解決すること&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要件が不明瞭だったり、設計が悪ければコーディングをどれだけ頑張ろうとよい価値は得られない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;つまり garbage in, garbage out
&lt;ul&gt;
&lt;li&gt;&amp;#x1f4dd; この表現はソフトウェア自体への入力と出力に対して使われることが多いが、ここでは input が「要件」、output を「得られる価値」というかなり高レイヤな意味で使われている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;ldquo;garbage in&amp;rdquo; を減らすのに必要なもの:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;明解なコミュニケーション&lt;/li&gt;
&lt;li&gt;共有ドメイン知識に基づく設計アプローチ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ドメイン駆動設計（DDD）をによってこれらを実現できる。&lt;/p&gt;
&lt;h1 id=&#34;共有モデルの重要性&#34;&gt;共有モデルの重要性&lt;/h1&gt;
&lt;p&gt;まず開発者が問題を正しく理解することが重要&lt;/p&gt;
&lt;p&gt;とりうるアプローチを 3 つ紹介:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;仕様書・要件定義書を整備する &amp;#x1f4a3;&lt;/li&gt;
&lt;li&gt;ドメインエキスパートを開発プロセスに入れる &amp;#x26a0;&amp;#xfe0f;&lt;/li&gt;
&lt;li&gt;ドメイン駆動設計 &amp;#x2705;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;1-仕様書要件定義書を整備する-bomb&#34;&gt;1. 仕様書・要件定義書を整備する &amp;#x1f4a3;&lt;/h2&gt;
&lt;p&gt;これはだめなやり方。&lt;/p&gt;
&lt;p&gt;理由:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメインエキスパートと開発チームの距離が遠くなってしまう &amp;#x274c;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;伝言ゲーム&amp;rdquo; のようなことが実際に起こり、これはプロジェクトにおいては致命的 &amp;#x274c;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-ドメインエキスパートを開発プロセスに組み込む-warning&#34;&gt;2. ドメインエキスパートを開発プロセスに組み込む &amp;#x26a0;&amp;#xfe0f;&lt;/h2&gt;
&lt;p&gt;いわゆるアジャイルなやり方。一見良さそうに思えるがベストではない。&lt;/p&gt;
&lt;p&gt;誤りをすぐに修正できるようにするために、ドメインエキスパートを開発プロセスのフィードバックループに組み入れる。&lt;/p&gt;
&lt;p&gt;デメリット:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開発者の働きがドメインエキスパートのメンタルモデルの単なる翻訳者でしかなくなってしまう &amp;#x274c;&lt;/li&gt;
&lt;li&gt;必ず抜け落ちてしまう情報がある &amp;#x274c;&lt;/li&gt;
&lt;li&gt;将来、ドメインエキスパートからの入力なしにコードをメンテする開発者は容易に方針を誤ってしまう &amp;#x274c;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-ドメイン駆動設計-white_check_mark&#34;&gt;3. ドメイン駆動設計 &amp;#x2705;&lt;/h2&gt;
&lt;p&gt;プロジェクトに関わる人々（下記）が&lt;strong&gt;共通のメンタルモデル&lt;/strong&gt;を共有した状態で開発を進める:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメインエキスパート&lt;/li&gt;
&lt;li&gt;開発者&lt;/li&gt;
&lt;li&gt;ステークホルダー&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ソフトウェアのコードはメンタルモデルを直接反映したものになるので、DDD では &amp;ldquo;翻訳&amp;rdquo; という作業は存在し得ない。&lt;/p&gt;
&lt;p&gt;メリット:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;市場投入スピード &amp;#x2705;&lt;/li&gt;
&lt;li&gt;得られるビジネス価値の大きさ &amp;#x2705;&lt;/li&gt;
&lt;li&gt;無駄の排除 &amp;#x2705;&lt;/li&gt;
&lt;li&gt;スムーズなメンテナンス &amp;#x2705;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（コラムでは、開発者自身がドメインエキスパートになる重要性が示されている）&lt;/p&gt;
&lt;p&gt;共有メンタルモデルを作るためのガイドライン:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データ構造ではなく、ビジネスイベントとワークフローに着目せよ&lt;/li&gt;
&lt;li&gt;ドメインを小さいサブドメインに分割せよ&lt;/li&gt;
&lt;li&gt;それぞれのサブドメインについてモデルを作れ&lt;/li&gt;
&lt;li&gt;会話やコードで使われる共通言語を作れ&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;ビジネスイベントからドメインを理解する&#34;&gt;ビジネスイベントからドメインを理解する&lt;/h1&gt;
&lt;p&gt;共有メンタルモデルの構築はどこから始めたらいい？ → イベントから始めよ &amp;#x2705;データ構造から始めるな &amp;#x274c;&lt;/p&gt;
&lt;p&gt;理由:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ビジネスがデータを&lt;strong&gt;ただ持っているだけ&lt;/strong&gt;で終わることは有り得ないため&lt;/li&gt;
&lt;li&gt;ビジネスは何らかの方法でデータを&lt;strong&gt;変換&lt;/strong&gt;するため&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ビジネスプロセスとは、データやドキュメントの変換処理の集まり → これらの変換がどう行われ、どう関連しているかを理解することが重要&lt;/p&gt;
&lt;p&gt;使われずにただ置かれているだけのデータは何の価値も生まない。
これらのデータから価値を引き出すためのプロセスはどうやって始まるか？ → &lt;strong&gt;ドメインイベント&lt;/strong&gt;によって始まる&lt;/p&gt;
&lt;p&gt;ドメインイベントの例:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外部トリガー&lt;/li&gt;
&lt;li&gt;スケジュールに基づいたトリガー&lt;/li&gt;
&lt;li&gt;観測に基づくトリガー&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ドメインイベントは事実である変化しないため必ず過去形で表現される。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;（中略）&lt;/p&gt;
&lt;p&gt;下記の 2 節で、イベントストーミングの説明と実例が書いてある:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using Event Storming to Discover the Domain&lt;/li&gt;
&lt;li&gt;Discovering the Domain: An Order-Taking System&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;イベントストーミング自体を理解するには&lt;a href=&#34;https://leanpub.com/introducing_eventstorming&#34;&gt;提唱者の解説&lt;/a&gt;を読むほうがいい。&lt;/p&gt;
&lt;p&gt;イベントストーミングで重要な点:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「&amp;ldquo;我々&amp;rdquo; vs &amp;ldquo;彼ら&amp;rdquo; 思考」から脱却できること&lt;/li&gt;
&lt;li&gt;意見が合わなかったら、それは問題ではなくチャンス&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;イベントを境界にまで拡張する&#34;&gt;イベントを境界にまで拡張する&lt;/h2&gt;
&lt;p&gt;要件の取りこぼしを防ぐために下記に注意を払う:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最初のイベントと思っていたイベントをトリガーする他のイベントがないか&lt;/li&gt;
&lt;li&gt;最後のイベントと思っていたイベントにトリガーされる後続のイベントはないか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;全てを一気に変える必要はない。最も価値を生む一部分から取りかかれ。&lt;/p&gt;
&lt;h2 id=&#34;コマンドを記述する&#34;&gt;コマンドを記述する&lt;/h2&gt;
&lt;p&gt;イベントストーミングによってイベントが見えるようになった。
それらのイベントはどのように発生するのか？ → そのイベントが起こることを誰かが要求したから&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全てのイベントがコマンドに紐付いている必要はない。スケジュールによるトリガーや監視に基づくトリガーなどがあるため。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DDD ではこれらの要求を「コマンド」という。
コマンドは常に命令形で表現される。
紛らわしいが、&lt;a href=&#34;https://ja.wikipedia.org/wiki/Command_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3&#34;&gt;OO のコマンドパターン&lt;/a&gt;とは違う。&lt;/p&gt;
&lt;p&gt;コマンドが成功するとワークフローがトリガーされ、ドメインイベントが作られる。&lt;/p&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「X を起こせ」というコマンドによってワークフローが X を起こし、「X が起こった」というドメインイベントが発行される&lt;/li&gt;
&lt;li&gt;「注文書を会社 A に送れ」というコマンドによってワークフローが注文書を送ると、「注文書が送信された」というドメインインベントが発行される&lt;/li&gt;
&lt;li&gt;コマンド「注文を確定せよ」 → ドメインイベント「注文が確定された」&lt;/li&gt;
&lt;li&gt;コマンド「配送を顧客 B に送れ」 → 「配送が送られた」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#x1f4dd; 「配送が送られた」は日本語としておかしいが、DDD ではモデルを記述する用語（ユビキタス言語）が重要なのでこのままにしておく。原著が英語なので限界がある。自然な日本語にしようとして「配送」の代わりに「商品」とするのは絶対に NG。いずれにせよ、ドメインエキスパートが使う言葉に合わせることが重要。&lt;/p&gt;
&lt;p&gt;これから、コマンド、ワークフロー、イベントの組み合わせでビジネスプロセスを記述していく。
これはまさに関数プログラミングの動きと同じ。&lt;/p&gt;
&lt;h1 id=&#34;ドメインをサブドメインに分ける&#34;&gt;ドメインをサブドメインに分ける&lt;/h1&gt;
&lt;p&gt;イベントストーミングによってイベントとコマンドを洗い出したことで、多数のビジネスプロセスの中身を理解できた状態になった。
しかし全体像がまだ整理されていない。
コードを書き始める&lt;strong&gt;前に&lt;/strong&gt;整理する必要がある。&lt;/p&gt;
&lt;p&gt;本文中では、受注プロセスを例として分割の様子が示されている。&lt;/p&gt;
&lt;p&gt;受注プロセスとは:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;受注&lt;/li&gt;
&lt;li&gt;配送&lt;/li&gt;
&lt;li&gt;請求&lt;/li&gt;
&lt;li&gt;その他&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;部署が既に分かれていれば、サブドメイン分割の強力な手がかりとなる。&lt;/p&gt;
&lt;p&gt;ドメインとは？ → DDD において、一貫した知識領域のこと。
&amp;hellip;わかりにくい。
言い換えると、ドメインエキスパートが専門性を持っている領域。
この理解はかなり実用的。なぜなら辞書で「請求」を調べて頭を悩ませるのではなく、シンプルに「請求部門のドメインエキスパートがやっていること」と表現できるようになるため。&lt;/p&gt;
&lt;p&gt;ドメインは重複しうるため、分割する際には注意が必要。
はっきり分けたくなるが、現実世界はそれほど単純ではない。&lt;/p&gt;
&lt;p&gt;ドメインは少し重複しているので、例えば受注部門の担当者は請求部門や配送部門の業務を少しだけ知っている必要がある。&lt;/p&gt;
&lt;h1 id=&#34;境界づけられたコンテキストを使って解決策を作る&#34;&gt;境界づけられたコンテキストを使って解決策を作る&lt;/h1&gt;
&lt;p&gt;ドメインの情報全てを反映する必要はない。
得られた情報の中から、解こうとしている問題に関するもののみを抽出する。ほとんどは無関係なはず&lt;/p&gt;
&lt;p&gt;なので「問題領域」と「解決領域」を分け、両者を別物として扱う必要がある:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;問題領域は現実世界&lt;/li&gt;
&lt;li&gt;解決領域はドメインモデル&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;問題領域は設計プロセスを経て解決領域になる&lt;/p&gt;
&lt;p&gt;なぜ「サブシステム」でなく「境界づけられたコンテキスト」という表現なのか？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理由: 解決策を考える際に、本当に重要なものに集中できるようになるため&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コンテキストと境界を常に意識せよ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;コンテキストが重要な理由: それぞれのコンテキストは解決策に独自の知識を反映するから
コンテキスト内では言語は共通し、デザインも一貫しているが、これらはコンテキストの外では使えなくなる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;境界が重要な理由: 現実世界では境界はぼやけているが、ソフトウェアの場合にはそれぞれを独立して開発できるようにするために分割したい。ソフトウェアでは API を使うなどして達成できるが、裏を返せばそのように作ったドメインモデルは現実世界に比べて情報量が減るということ。しかしこれは複雑さを減らし、メンテナンス性を手に入れるためのトレードオフ&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;問題領域のドメインは必ずしも解決領域のコンテキストと一対一対応しない:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;あるドメインが複数の境界づけられたコンテキストに分割されることもある&lt;/li&gt;
&lt;li&gt;複数のドメインが一つの境界づけられたコンテキストになるケースもある（レガシーソフトウェア）
&lt;ul&gt;
&lt;li&gt;例: ある企業が「受注」と「請求」をひとまとめに扱うシステムを既にインストールしていた場合、このレガシーシステムと連携するにはそれを一つの境界づけられたコンテキストとして扱う必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ドメインを分けるなら、それぞれの境界づけられたコンテキストが明確な責務を持つ必要がある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理由: モデルを実装するとき、境界づけられたコンテキストはそのままソフトウェアコンポーネント（DLL、サービス、名前空間など）になるため&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;コンテキストを正しくする&#34;&gt;コンテキストを正しくする&lt;/h2&gt;
&lt;p&gt;聞くは易し、実行するは難し。
というか DDD で1番難しいのがこの境界を正しく定めることで、これは科学ではなく一種の芸術といえる。&lt;/p&gt;
&lt;p&gt;ガイドライン:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;【ドメインエキスパートの声を聞け】彼らが共通言語を話し、同じ問題に注目しているならばおそらく同じサブドメインにいる。それが境界づけられたコンテキストになる&lt;/li&gt;
&lt;li&gt;【既存チームや部署の境界に着目せよ】ビジネスが何をドメイン・サブドメインと認識しているかの強力な手がかり。必ずしも一致はしない（部署内で違うことしてたり、他部署とコラボしたり）&lt;/li&gt;
&lt;li&gt;【境界づけられたコンテキストの「境界」に着目せよ】スコープクリープに気をつけろ。要求が変化する複雑なプロジェクトでは、無慈悲なまでに境界を守る必要がある。大きすぎる境界は何もないのと同じ。よいフェンスはよい隣人を作る&lt;/li&gt;
&lt;li&gt;【自律可能性が生まれるように設計せよ】足を結ばれた 2 人のランナーは独立した 2 人のランナーよりも速くなることはない。それぞれの境界づけられたコンテキストを独立して開発できるようにしろ&lt;/li&gt;
&lt;li&gt;【ビジネスフローの摩擦の摩擦を最小化するように設計せよ】複数の境界づけられたコンテキストと関わるビジネスワークフローがそれらによって遅くなっているなら、デザインを損ねてでもワークフローをスムーズにしろ。純粋なデザインよりもビジネスと顧客が重要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;変わらない設計などない。いかなるモデルも、ビジネス要件が変わるたびに進化する必要がある。これは受注システムに要件を追加する例として 13 章で話す。&lt;/p&gt;
&lt;h2 id=&#34;コンテキストマップをつくる&#34;&gt;コンテキストマップをつくる&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;コンテキストマップ&lt;/strong&gt;とは:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;境界づけられたコンテキスト間の関係を示した全体像。これによって、コンテキスト同士の関係性について技術的詳細に囚われずにコミュニケーションできるようになる&lt;/li&gt;
&lt;li&gt;コンテキストマップは高次に保つ。複雑なシステムにおいては、それぞれのコンテキストの詳細にフォーカスした個別のマップが必要になる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#x1f4dd; 境界づけられたコンテキスト同士が連携するならば、当然それらのコンテキストは、交換可能な共有メッセージのフォーマットについて合意している必要がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フォーマットの決定については主に上流側のコンテキストが主導権を持つ
&lt;ul&gt;
&lt;li&gt;例外: 【レガシーシステムが下流側にある場合など】上流側のコンテキストが、下流側のコンテキストが要求するフォーマットに合わせないといけない。その場合には翻訳コンポーネントが必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;最も重要な境界づけられたコンテキストに着目せよ&#34;&gt;最も重要な境界づけられたコンテキストに着目せよ&lt;/h2&gt;
&lt;p&gt;ここまでで、いくつか境界づけられたコンテキストを見つけた。
ドメインでの作業をすすめる過程でも、追加で見つかるだろう。
それらは等しく重要だろうか？&lt;/p&gt;
&lt;p&gt;どこから着手すべきだろう？ → &lt;strong&gt;需要なところから&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全ての境界づけられたコンテキストを同時に実装したりするのは NG &amp;#x274c;&lt;/li&gt;
&lt;li&gt;優先順位を付ける必要がある。何が重要かについて、コンセンサスがないこともあるが（各部署は自分こそが最重要だと思っている）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重要とは: &lt;strong&gt;ビジネス優位性&lt;/strong&gt;を生むドメインや&lt;strong&gt;売上げ&lt;/strong&gt;を生むドメイン&lt;/p&gt;
&lt;p&gt;ドメインの大分類:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コアドメイン: ビジネスの根幹となるもの&lt;/li&gt;
&lt;li&gt;補助ドメイン: 業務に必要であるもののビジネスの核ではないもの&lt;/li&gt;
&lt;li&gt;汎用ドメイン: 他のビジネスでも見られるもの（認証や配送など）。これは安全にアウトソースできる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#x1f4dd; 補助ドメインに見えるものがコアドメインになりうる例:
物販ビジネスにおいて、どの商品も常に出荷可能な状態が保たれていることが顧客満足に決定的に重要な場合、在庫管理ドメインはコアドメインになりうる。&lt;/p&gt;
&lt;h1 id=&#34;ユビキタス言語をつくる&#34;&gt;ユビキタス言語をつくる&lt;/h1&gt;
&lt;p&gt;コードとドメインエキスパートは同じモデルを共有しなければならない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメインエキスパートが「注文」と言ったならば、コードでもそれに対応し、同じように振る舞う「注文」というものを定義する &amp;#x2705;&lt;/li&gt;
&lt;li&gt;逆に、ドメインエキスパートのメンタルモデルにないもの（注文ファクトリ、注文マネージャ、注文ヘルパーなど）は設計に含めてはならない &amp;#x274c;
&lt;ul&gt;
&lt;li&gt;ドメインエキスパートはそれらの意味を理解できないので害にしかならない。もちろんそれらの技術的概念はコードベースの方には出てくるだろうが、それらを&lt;strong&gt;設計&lt;/strong&gt;に入れてはいけない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ユビキタス言語&lt;/strong&gt;で設計せよ&lt;/p&gt;
&lt;p&gt;ユビキタス言語とは: プロジェクトの関係者全員に共有される概念や用語のまとまり。これがビジネスドメインの共通メンタルモデルを定義する。プロジェクトのあらゆる場所で一貫して使われるべき。あらゆる場所とは、コードも含む。&lt;/p&gt;
&lt;p&gt;（確か、ドメインモデルを正確に反映するためにコード中のユビキタス言語も日本語で書いている日本のチームの事例があった。言語は Ruby だったと思う）&lt;/p&gt;
&lt;p&gt;ユビキタス言語の構築プロセス: 常に WIP。設計とともに進化する&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;not ドメインエキスパート起点の一方通行 &amp;#x274c;&lt;/li&gt;
&lt;li&gt;but プロジェクトみんなによるコラボレーション &amp;#x2705;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#x26a0;&amp;#xfe0f; ドメインの「方言」に注意&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ある用語が意味する概念が、ドメインによって微妙に異なる場合がある。イベントストーミング時には特にこれに気をつける必要がある
&lt;ul&gt;
&lt;li&gt;例: 配送部門が言う「注文」は請求部門が言うそれとは微妙に違う。配送部門の関心は在庫つまり数にあるが、請求部門の関心は価格と支払いにある。もし「注文」をコンテキストの明示なしにさまざまな場所で使ってしまうと誤解が生じてしまう&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 全てのドメインとコンテキストをカバーするユビキタス言語を作るのは無理&lt;/p&gt;
&lt;h1 id=&#34;ドメイン駆動設計の概念をまとめる&#34;&gt;ドメイン駆動設計の概念をまとめる&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;【ドメイン】 解こうとする問題に関係する知識領域。ドメインエキスパートが専門とする&lt;/li&gt;
&lt;li&gt;【ドメインモデル】 特定の問題に関わるドメインの側面を単純化したものの集合。ドメインモデルは解決領域の一部で、ドメインは問題領域。&lt;/li&gt;
&lt;li&gt;【ユビキタス言語】 ドメインと関連し、チームメンバーとソースコードに共有される概念や語彙の集合&lt;/li&gt;
&lt;li&gt;【境界づけられたコンテキスト】 明解な境界によって他と区別される、解決領域の子要素。&lt;/li&gt;
&lt;li&gt;【コンテキストマップ】 境界づけられたコンテキスト間の関係を示した高次の概念図&lt;/li&gt;
&lt;li&gt;【ドメインイベント】 システム内で起こった事実の記録。必ず過去形で記述され、何らかのコマンド（原文では &amp;ldquo;activity&amp;rdquo; と書いてある）をトリガーすることが多い&lt;/li&gt;
&lt;li&gt;【コマンド】 何らかのプロセスへの開始要求。人やイベントによってトリガーされる。プロセスが成功するとシステムが変化し、一つ以上のドメインイベントとが記録される&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;まとめ&#34;&gt;まとめ&lt;/h1&gt;
&lt;h2 id=&#34;イベントとプロセス&#34;&gt;イベントとプロセス&lt;/h2&gt;
&lt;p&gt;イベントストーミングによって、ドメイン内の全ての主要なドメインイベントが見えるようになった。
受注プロセスは注文書を郵便で受け取るところから始まり、見積書の作成、新規顧客の登録などのワークフローがあることもわかった。&lt;/p&gt;
&lt;p&gt;受注チームが注文を処理し終わると、そのイベントが配送部門の配送プロセスをスタートさせ、請求部門の請求プロセスをスタートさせることも学んだ&lt;/p&gt;
&lt;p&gt;他にもプロセスはたくさんあるが、本書では一つに着目する。&lt;/p&gt;
&lt;h2 id=&#34;サブドメインと境界づけられたコンテキスト&#34;&gt;サブドメインと境界づけられたコンテキスト&lt;/h2&gt;
&lt;p&gt;ここまでで、3 つのサブドメインが見つかった（受注、配送、請求）。
これらに対応する 3 つの境界づけられたコンテキストを作り、それぞれの関係を示したコンテキストマップをつくった。&lt;/p&gt;
&lt;p&gt;どれが注目すべきコアドメインだろう？
&lt;strong&gt;どこを自動化すると価値が最大化されるか&lt;/strong&gt;？ → 現時点では受注ドメインからとりかかることにしておく&lt;/p&gt;
&lt;p&gt;必要ならば、受注ドメインの仕事を紙に出力することで、他のチームが今まで通りの方法で仕事を続けることもできる。&lt;/p&gt;
&lt;h2 id=&#34;ユビキタス言語&#34;&gt;ユビキタス言語&lt;/h2&gt;
&lt;p&gt;ここまでで、「注文フォーム」「見積もり」「注文」という言葉を見つけた。
設計を深める過程でもっと見つかるだろう。
ユビキタス言語は、wiki などのライブなドキュメント（印刷した書類は固定化されてしまうが、wiki は更新が前提）でメンテナンスするといい。
チームメンバーの足並みが揃うし、新しいメンバーもキャッチアップしやすい。&lt;/p&gt;
&lt;h2 id=&#34;次にやることは&#34;&gt;次にやることは？&lt;/h2&gt;
&lt;p&gt;本章によって&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;問題の全体像と、解決策の概略が見えた &amp;#x1f4a1;&lt;/li&gt;
&lt;li&gt;しかし詳細設計やコーディングを始めるにはまだ多くの疑問がある &amp;#x1f4ad;
&lt;ul&gt;
&lt;li&gt;&amp;#x2753; 注文処理ワークフローでは何が行われているのだろう？&lt;/li&gt;
&lt;li&gt;&amp;#x2753; 入出力はどんな感じ？&lt;/li&gt;
&lt;li&gt;&amp;#x2753; このワークフローが連携する他のコンテキストはある？&lt;/li&gt;
&lt;li&gt;&amp;#x2753; 配送チームの「注文」と請求チームのそれはどう違う？&lt;/li&gt;
&lt;li&gt;などなど&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次の章では注文確定ワークフローに着目して、これらの問いに答えていく&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>第 2 章: ドメインを理解する</title>
      <link>https://rindrics.com/books/domain-model-made-functional/understanding-the-domain/</link>
      <pubDate>Sun, 17 Nov 2024 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/books/domain-model-made-functional/understanding-the-domain/</guid>
      <description>&lt;p&gt;&amp;ldquo;2. Understanding the Domain&amp;rdquo; from &amp;ldquo;&lt;a href=&#34;https://rindrics.com/books/domain-model-made-functional/&#34;&gt;Domain Modeling Made Functional: Tackle Software Complexity with Domain-Driven Design and F#&lt;/a&gt;&amp;rdquo; &amp;#x1f4da;&lt;/p&gt;
&lt;p&gt;一つのワークフローに着目して掘り下げていく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;何がそれをトリガーするのか？&lt;/li&gt;
&lt;li&gt;どんなデータが必要？&lt;/li&gt;
&lt;li&gt;どんな境界づけられたコンテキストと協働する必要がある？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここでは注意深く耳を傾ける能力が重要。
自分のメンタルモデルをドメインに押し付けないようにしたい。&lt;/p&gt;
&lt;h1 id=&#34;ドメインエキスパートへの聞き取り&#34;&gt;ドメインエキスパートへの聞き取り&lt;/h1&gt;
&lt;p&gt;ドメインエキスパート（文中では受注部門のメンバー）に聞き取り調査をしていく。&lt;/p&gt;
&lt;p&gt;ポイント:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;イベントストーミングで洗い出したコマンド・イベントを手がかりに、聞き取り調査をいくつかの小さい単位に分ける &amp;#x2705;
&lt;ul&gt;
&lt;li&gt;忙しいドメインエキスパートに時間をとってもらいやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;インタビューの初期は高次の視点を維持し、ワークフローの入出力だけに着目する &amp;#x2705;
&lt;ul&gt;
&lt;li&gt;詳細に囚われすぎずに済む&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;顧客がシステムをどう使うかの結論を急がず、人類学者のようにとにかく耳を傾ける &amp;#x2705;
&lt;ul&gt;
&lt;li&gt;文中では「顧客が注文フォームをオンラインで入力してくれたらいいのに」というドメインエキスパートの言葉に対して、開発者は一般的なカート &amp;amp; チェックアウトパターンのシステムを想像しかけた
&lt;ul&gt;
&lt;li&gt;しかしドメインエキスパートが求めるのはそのパターンではなかった &amp;#x1f4a3;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;理想的には、設計の前にドメインエキスパートが働く様子を観察したりするとよい &amp;#x2705;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;非機能要件を理解する&#34;&gt;非機能要件を理解する&lt;/h2&gt;
&lt;p&gt;一歩下がって、ワークフローのスケールとコンテキストについて議論する。&lt;/p&gt;
&lt;p&gt;文中では、後のアーキテクチャ決定に関わる下記の要件についてドメインエキスパートに尋ねている:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 日あたりのリクエスト数&lt;/li&gt;
&lt;li&gt;リクエスト数の年間変動&lt;/li&gt;
&lt;li&gt;ユーザーの属性（ビギナー or プロフェッショナル）&lt;/li&gt;
&lt;li&gt;サービスに期待されているレスポンス&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ワークフローの残りを理解する&#34;&gt;ワークフローの残りを理解する&lt;/h2&gt;
&lt;p&gt;ドメインエキスパートへの聞き取りによってドメインの知識を獲得していく。&lt;/p&gt;
&lt;p&gt;文中では「受け取ったそれぞれの注文フォームで何をするのか？」という質問から始めて、下記のドメイン知識を発見した:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検証作業&lt;/li&gt;
&lt;li&gt;協調すべき境界づけられたコンテキスト&lt;/li&gt;
&lt;li&gt;集計作業&lt;/li&gt;
&lt;li&gt;注文確認の返信作業&lt;/li&gt;
&lt;li&gt;同じ入力を利用する別のワークフロー（見積もり作業）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;入出力について考える&#34;&gt;入出力について考える&lt;/h2&gt;
&lt;p&gt;ワークフローの入出力について、聞き取りから学んだことを書き留める&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;入力: 明らかに注文フォーム &amp;#x2705;&lt;/li&gt;
&lt;li&gt;出力:
&lt;ul&gt;
&lt;li&gt;「処理済みの注文」という概念があることはわかった。しかしそれ自体は特に出力として使い道がない &amp;#x274c;&lt;/li&gt;
&lt;li&gt;注文確認はどうか？これは注文確定ワークフローの副作用であり、出力ではない &amp;#x274c;&lt;/li&gt;
&lt;li&gt;出力は常に生成イベントであるべき &amp;#x2705;
&lt;ul&gt;
&lt;li&gt;他の境界づけられたコンテキストのアクションをトリガーするもの&lt;/li&gt;
&lt;li&gt;ここでは&lt;code&gt;注文が確定された&lt;/code&gt;イベント&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;データベース駆動設計したくなる衝動と戦う-warning&#34;&gt;データベース駆動設計したくなる衝動と戦う &amp;#x26a0;&amp;#xfe0f;&lt;/h1&gt;
&lt;p&gt;&amp;#x1f4dd; この節は目からウロコだった・・・！
この節を読むべきなのは初学者よりむしろ、ビジネス要件から DB スキーマを設計することに慣れている人だと思う。&lt;/p&gt;
&lt;p&gt;ある程度経験を積んだプログラマなら、もう詳細設計して実装に入りたくなるだろう。
テーブル間の関連について、下記のように設計を始めるかもしれない:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;erDiagram
    Customers ||--o{ Orders : places
    Customers {
        string name
        string custNumber
        string sector
    }
    Orders ||--|{ OrderLines : contains
    Orders {
        string customerId
        string shippnigAddressId
        string billingAddressId
        bool isQuote
    }
    OrderLines {
        string orderId
        string productId
        float quantity
    }
    Addresses ||--|{ Orders : referred
&lt;/pre&gt;

&lt;p&gt;・・・しかしこれをやってしまったらオシマイ &amp;#x1f4a3;（マジか）&lt;/p&gt;
&lt;p&gt;DDD ではドメインを正確にモデリングすることに集中するために「永続性の無視」というアプローチで設計する:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメインに設計を駆動させる &amp;#x2705;&lt;/li&gt;
&lt;li&gt;DB スキーマではない &amp;#x274c;
&lt;ul&gt;
&lt;li&gt;実際、現実の紙ベースのシステムではデータベースなど存在しない&lt;/li&gt;
&lt;li&gt;&lt;code&gt;データベース&lt;/code&gt;はユビキタス言語には入らない
&lt;ul&gt;
&lt;li&gt;ユーザーはデータがどう永続化されているかには興味がない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なぜこれが重要？ → データベースの視点からデザインすると、&lt;strong&gt;データベースモデルに合うようにデータを歪めないといけなくなる&lt;/strong&gt;から&lt;/p&gt;
&lt;p&gt;例:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既に先ほどの ER 図では&lt;code&gt;注文&lt;/code&gt;と&lt;code&gt;見積り&lt;/code&gt;の違いを無視してしまっている &amp;#x1f4a3;
&lt;ul&gt;
&lt;li&gt;同じ外部キー（&lt;code&gt;orderId&lt;/code&gt; は &lt;code&gt;quoteId&lt;/code&gt; としても使われる）が二つのリレーションで責務を持つ状況は、データベースの機能ではサポートできない &amp;#x1f4a3;（なるほど・・・！！）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とにかく、技術的な先入観なしにドメインエキスパートの言葉に耳を傾けることに集中するのが重要。
ドメイン駆動で設計したモデルを関係データベースに永続化する方法は第 12 章で見ていく。&lt;/p&gt;
&lt;h1 id=&#34;クラス駆動デザインへの衝動と戦う-warning&#34;&gt;クラス駆動デザインへの衝動と戦う &amp;#x26a0;&amp;#xfe0f;&lt;/h1&gt;
&lt;p&gt;&amp;#x1f4dd; 本節のおかげで、私は&lt;a href=&#34;https://github.com/Rindrics/success-notification-aggregator/blob/08c3a71da7cf27b0126798617cc285c1d7214b54/README.md#architecture-overview&#34;&gt;個人開発でこの過ちを犯していた&lt;/a&gt;ことを自覚した&lt;/p&gt;
&lt;p&gt;オブジェクト指向の経験があるなら、特定の DB 実装に縛られないことの重要性は理解していることだろう。
しかし、ドメインではなくオブジェクトの観点で考えることによって、モデルに偏見を持ち込んでしまう（マジか）。&lt;/p&gt;
&lt;p&gt;クラス駆動デザインも、要求をちゃんと聞いていないという点でデータベース駆動デザインと同じくらい危険 &amp;#x1f4a3;&lt;/p&gt;
&lt;p&gt;こんなふうに設計するかもしれないが&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;classDiagram
    OrderBase &lt;|-- Order
    OrderBase &lt;|-- Quote

    OrderBase &#34;n&#34; -- &#34;1&#34; Customer
    Order &#34;n&#34; -- &#34;1&#34; Address : shipping address
    Order &#34;n&#34; -- &#34;1&#34; Address : billing address

    OrderBase &#34;1&#34; *-- &#34;n&#34; OrderLine
    OrderLine &#34;1&#34; -- &#34;n&#34; Product
&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;注文&lt;/code&gt;と&lt;code&gt;見積り&lt;/code&gt;の違いは表現できているできているものの、&lt;strong&gt;現実世界に存在しない&lt;code&gt;OrderBase&lt;/code&gt;という人工的なクラスを持ち込み、ドメインを歪めてしまった&lt;/strong&gt; &amp;#x1f4a3;
（まぁ「ドメインモデルと詳細設計は区別しましょう」で片付く話ではあるか）&lt;/p&gt;
&lt;p&gt;心をオープンに保て。
技術的な思考をドメインに持ち込むな。&lt;/p&gt;
&lt;h1 id=&#34;ドメインを文書化する&#34;&gt;ドメインを文書化する&lt;/h1&gt;
&lt;p&gt;技術的な実装による偏見に陥らず、要求をどのように記述すべきだろう？
UML のような可視化ダイアグラムを使うこともできるが、労力がかかる割にドメインの機微をとらえられるほどの表現力がない。&lt;/p&gt;
&lt;p&gt;正確なドメインモデルをコードで表現する方法は後ほど学ぶとして、今は、ドメインモデルを捉えられる簡単なテキストベース言語を使う:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ワークフローの表現法: 入出力を記述し、ビジネスロジックを記述するシンプルな疑似コードを使う&lt;/li&gt;
&lt;li&gt;データ構造の表現法
&lt;ul&gt;
&lt;li&gt;二つの部分が共に必要なときには &lt;code&gt;かつ&lt;/code&gt;を使う&lt;/li&gt;
&lt;li&gt;どちらかだけでいい時には&lt;code&gt;または&lt;/code&gt;を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このミニ言語を使って、注文確定ワークフローを記述すると下記のようになる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;境界づけられたコンテキスト: 受注
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ワークフロー: 注文確定
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  トリガー: &amp;#34;注文フォームを受け取った&amp;#34; イベント（&amp;#34;見積もり&amp;#34; にチェックが入っていたとき）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;初期入力:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  注文フォーム
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;その他の入力:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  商品カタログ
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;出力イベント:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;#34;注文が確定した&amp;#34; イベント
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;副作用:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  注文確定に伴って注文確認が顧客に送信された
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;データ構造は下記のように表現される:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;境界づけられたコンテキスト: 受注
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;注文 データ =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  顧客情報
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 配送先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 請求先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 注文明細 のリスト
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 請求金額
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;注文明細 データ =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  商品
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 数量
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 価格
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;顧客情報 データ = ???   // まだ不明
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;請求先住所 データ = ??? // まだ不明
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これはドメインを少し構造化された方法で捉えただけで、クラス構造もデータベーステーブルもない:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ノンプログラマにとってもこわくない &amp;#x2705;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ドメインエキスパートにも見てもらい、一緒に取り組んでもらえる&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;#x2753; コードもこれくらいシンプルにできるのか？
&lt;ul&gt;
&lt;li&gt;→ 第 5 章で学ぶ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;受注ワークフローを掘り下げる&#34;&gt;受注ワークフローを掘り下げる&lt;/h1&gt;
&lt;p&gt;入出力を記述できたので、聞き取り調査を再開してワークフローを掘り下げていく。&lt;/p&gt;
&lt;p&gt;下記のドメイン知識が明らかになった:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;注文&lt;/code&gt;か&lt;code&gt;見積り依頼&lt;/code&gt;かを判別
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;見積り依頼&lt;/code&gt;はあとで処理する
&lt;ul&gt;
&lt;li&gt;売上げを生む&lt;code&gt;注文&lt;/code&gt;のほうが重要だから&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検証作業におけるサードパーティサービスの利用&lt;/li&gt;
&lt;li&gt;用途の異なる書類の山
&lt;ul&gt;
&lt;li&gt;実装ではキューになるだろうが、聞き取り調査では技術的詳細からは距離を保っておく&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;商品コード&lt;/code&gt; のチェック
&lt;ul&gt;
&lt;li&gt;技術的に言うとシンタックスチェック&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;商品コード&lt;/code&gt; の照合
&lt;ul&gt;
&lt;li&gt;技術的に言うとデータベースルックアップ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;依存管理
&lt;ul&gt;
&lt;li&gt;「もし、商品部門のだれかがあなたの問い合わせに即座に答えられるとしても、商品カタログをやはり手元に持っておきたい？」「もちろん。電話が使えなかったり、彼らが忙しかったりしても、私の仕事が止まらずに済むから。」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;数量単位の仕様&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;複雑さをドメインモデルに反映させる&#34;&gt;複雑さをドメインモデルに反映させる&lt;/h1&gt;
&lt;p&gt;ワークフローを掘り下げたことによって、ドメインモデルがかなり複雑になった&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;これは良いこと &amp;#x2705;
&lt;ul&gt;
&lt;li&gt;実装する段になって複雑性が判明するのは大きな時間の無駄になる&lt;/li&gt;
&lt;li&gt;初期段階で、ドメインの理解に時間をかけるべき
&lt;ul&gt;
&lt;li&gt;「数週間のコーディングによって設計にかかる時間を数時間節約できる」という皮肉がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;制約を表現する&#34;&gt;制約を表現する&lt;/h2&gt;
&lt;p&gt;聞き取り調査の結果、商品コードと数量が単なる文字列あるいは整数でないことがわかった。
これをドキュメントに反映する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ウィジェットコード&lt;/code&gt;、&lt;code&gt;ギズモコード&lt;/code&gt;、&lt;code&gt;商品コード&lt;/code&gt;の制約は下記のように表現される:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;コンテキスト: 受注
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ウィジェットコード データ = &amp;#34;W&amp;#34; から始まり 4 つの数字からなる文字列
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ギズモコード データ = &amp;#34;G&amp;#34; から始まり 3 つの数字からなる文字列
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;商品コード データ = ウィジェットコード または ギズモコード
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x2753; この制約は厳しすぎるだろうか？
&lt;ul&gt;
&lt;li&gt;&amp;#x2753; 新しい商品コードを追加したくなったらどうする？
&lt;ul&gt;
&lt;li&gt;正しい答えはコンテキストによるが、設計をドメインエキスパートの視点からすることが重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここでは、この制約はドメインの設計に反映させるべきだろう。
なぜなら、商品コードのチェックは注文確認プロセスの重要な工程であることを学んだので、最終的には何らかの方法でドキュメント化が必要。
&lt;strong&gt;別のドキュメントに分散するより設計として書いた方が良い&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;ちなみに、設計が厳しいからといって必ずしも実装まで厳しくする必要はない。
不正な入力があったときの実装例:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注文全体を即座に拒否（これは厳しすぎるだろう）&lt;/li&gt;
&lt;li&gt;ユーザーに「要確認」の通知を出す（よい落とし所かもしれない）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数量に関する制約もドキュメントにしておく:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;単位数量 データ = 1 から 1000 までの整数
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;キログラム数量 データ = 0.05 から 100.00 までの小数
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;注文のライフサイクルを表現する&#34;&gt;注文のライフサイクルを表現する&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;注文&lt;/code&gt;（型）に着目し、学んだことを記述する。&lt;/p&gt;
&lt;p&gt;初期のバージョンでは下記のように表現したが、これはドメインを表現し切れていないことがわかった。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;境界づけられたコンテキスト: 受注
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;注文 データ =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  顧客情報
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 配送先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 請求先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 注文明細 のリスト
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 請求金額
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;聞き取り調査の結果、下記を学んだ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;注文&lt;/code&gt;にはライフサイクルがある
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;注文&lt;/code&gt;は初めは&lt;code&gt;請求金額&lt;/code&gt;を持たないが最後には必ず持つようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;未検証の注文や未集計の注文は他と区別できる
&lt;ul&gt;
&lt;li&gt;紙ベースの現在の業務では進捗をフォームに記録しているため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらをモデルにも反映する必要がある。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;未検証の注文 データ =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  未検証の顧客情報
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 未検証の配送先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 未検証の請求先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 未検証の注文明細 のリスト
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;未検証の注文明細 データ =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  未検証の商品コード
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 未検証の注文数量
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;各情報のステータスがわかるようになった（&lt;strong&gt;DB のフラグで済ませない！！！！&lt;/strong&gt;）。&lt;/p&gt;
&lt;p&gt;注文が確認されると下記のようになる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;検証済の注文 データ =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  検証済の顧客情報
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 検証済の配送先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 検証済の請求先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 検証済の注文明細 のリスト
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;検証済の注文明細 データ =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  検証済の商品コード
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 検証済の注文数量
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次は注文に金額を入力する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;集計済の注文 データ =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  検証済の顧客情報
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 検証済の配送先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 検証済の請求先住所
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 集計済の注文明細 のリスト  // 知識が反映されている
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 請求金額                   // 知識が反映されている
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;集計済の注文明細 データ =
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  検証済の商品コード
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  かつ 明細料金                   // 知識が反映されている
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ドメインモデルがビジネスロジックを反映するようになった &amp;#x1f389;
初めに考えていたよりも複雑になったが、逆に言えばもしモデルがこのように複雑でなかったとしたら、それは要件を正しく捉えられていなかったということ。&lt;/p&gt;
&lt;h2 id=&#34;ワークフロー中のステップを肉付けする&#34;&gt;ワークフロー中のステップを肉付けする&lt;/h2&gt;
&lt;p&gt;ワークフローが小さいステップに分割されることがわかった:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;確認作業&lt;/li&gt;
&lt;li&gt;集計作業&lt;/li&gt;
&lt;li&gt;などなど&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらのステップにも入力出力アプローチを適用しよう&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ワークフロー: 注文確定
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  入力: 注文フォーム
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  出力:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;注文が確定した&amp;#34; イベント（他のチームに送るための山に置く）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    または &amp;#34;不正な注文&amp;#34; （それ用の山に置く）
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  // ステップ 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  do 注文を検証
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  if 注文 が 不正 then:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    add 不正な注文 to 山
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    stop
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  // ステップ 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  do 注文集計
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  // ステップ 3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  do 顧客に確認を送る
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  // ステップ 4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  return 注文が確定された イベント（if エラーがないならば）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それぞれのサブステップもドキュメント化する&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ワークフロー: 注文を検証
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  入力: 未検証の注文
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  出力: 検証済の注文 また 検証エラー
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  依存: 商品コードの存在チェック, 住所の存在チェック
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  顧客の名前を検証する
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  配送先住所と請求先住所が存在することを確認する
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  for each 注文明細:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    商品コードをチェック
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    商品コードが商品カタログに存在することをチェック
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  if 全て OK ならば, then:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    return 検証済の注文
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  else:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    return 検証エラー
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ほぼ丸写しになってしまうのであとのステップは割愛。&lt;/p&gt;
&lt;h1 id=&#34;まとめ&#34;&gt;まとめ&lt;/h1&gt;
&lt;p&gt;次のモデリングフェーズでたくさんやることがあるので、要件の収集はここまで。&lt;/p&gt;
&lt;p&gt;ここで学んだことをまとめる:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;設計時には実装の詳細に立ち入らないことが重要&lt;/li&gt;
&lt;li&gt;代わりに、先入観やコーディング手法にとらわれずにドメインを捉えることに集中しよう&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文中で例として使われている受注システムのようなはかなり単純化されているが、それでもドメインエキスパートの言葉に耳を傾けると、多くの複雑性が明らかになることがわかる。
例えば一口に注文といっても、ライフサイクルを通して、データや振る舞いの異なるのバリエーションがあった。&lt;/p&gt;
&lt;h2 id=&#34;次にやることは&#34;&gt;次にやることは？&lt;/h2&gt;
&lt;p&gt;受注ワークフローを F# の型システムを使ってどのようにモデリングするかをみていきたい。
次章ではその前に、一歩下がって全体像を見て、システム全体をどうソフトウェアアーキテクチャに翻訳するかを議論する。&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>第 3 章: 関数型アーキテクチャ</title>
      <link>https://rindrics.com/books/domain-model-made-functional/functional-architecture/</link>
      <pubDate>Thu, 21 Nov 2024 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/books/domain-model-made-functional/functional-architecture/</guid>
      <description>&lt;p&gt;&amp;ldquo;3. A Functional Architecture&amp;rdquo; from &amp;ldquo;&lt;a href=&#34;https://rindrics.com/books/domain-model-made-functional/&#34;&gt;Domain Modeling Made Functional: Tackle Software Complexity with Domain-Driven Design and F#&lt;/a&gt;&amp;rdquo; &amp;#x1f4da;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;次の課題&lt;/strong&gt;: これまで得てきたドメインに対する理解を、どのように関数型プログラミングに基づいたソフトウェアアーキテクチャに翻訳するか&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;#x26a0;&amp;#xfe0f; 注意点: 現時点ではまだ具体的なアーキテクチャについて考えすぎないようにすること&lt;/li&gt;
&lt;li&gt;時間を使うならば: 引き続きイベントストーミングや聞き取り調査などによってドメインと要件をより深く理解する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本章で学ぶ内容:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;関数指向ドメインモデルのための典型的なソフトウェアアーキテクチャ&lt;/li&gt;
&lt;li&gt;DDD の概念（境界づけられたコンテキスト、ドメインイベントなど）がどのようにソフトウェアに翻訳されるのか&lt;/li&gt;
&lt;li&gt;ラフな実装方針&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本書が使うアーキテクチャ概念:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;システムンテキスト&lt;/strong&gt;: 業務システム全体
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コンテナ&lt;/strong&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;: システムコンテキストを構成するデプロイ可能単位
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コンポーネント&lt;/strong&gt;: 各コンテナを構成するコードの大きい構成単位
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;クラス&lt;/strong&gt;（あるいは&lt;strong&gt;モジュール&lt;/strong&gt;）: コンポーネントの構成要素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;自律的なソフトウェアコンポーネントとしての境界づけられたコンテキスト&#34;&gt;自律的なソフトウェアコンポーネントとしての境界づけられたコンテキスト&lt;/h1&gt;
&lt;p&gt;DDD の概念である &amp;ldquo;境界づけられたコンテキスト&amp;rdquo; とソフトウェアアーキテクチャとの関連を示す。&lt;/p&gt;
&lt;p&gt;コンテキストとは: うまく定義された境界に基づく自律的なサブシステム&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;このように定義を定めたとしても、アーキテクチャとしての構成方法はいくつものパターンをとりうる
&lt;ul&gt;
&lt;li&gt;コンテナとドメインのマッピング例:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;コンテナ = 業務&lt;/strong&gt;: システム=コンテナでもある。このとき、境界づけられたコンテキストはインターフェイスによって定義された個別のモジュール（.NET でいう &amp;ldquo;アセンブリ&amp;rdquo;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンテナ = 境界づけられたコンテキスト&lt;/strong&gt;: 伝統的なサービス指向アーキテクチャ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンテナ = ワークフロー&lt;/strong&gt;: こうなるとマイクロサービスアーキテクチャ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただし、ドメインについて理解しきれていないフェーズでは、まだ特定のアーキテクチャパターンを選ぶ必要はない。
最重要なのは&lt;strong&gt;境界づけられたコンテキストを疎結合に設計し、自律可能に保つこと&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;境界を正しく定めることの重要性は述べたが、実際にはプロジェクト初期から正しく定めるのは難しい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理由: 知識を得るにつれて境界は変わりうるから&lt;/li&gt;
&lt;li&gt;よって、開発初期にはまずはモノリスパターンで始めることをおすすめする
&lt;ul&gt;
&lt;li&gt;マイクロサービスパターンを使う明確なメリットが見えているならばこの限りではない&lt;/li&gt;
&lt;li&gt;本当に疎結合なマイクロサービスアーキテクチャを実現するのは難しいからでもある
&lt;ul&gt;
&lt;li&gt;あるマイクロサービスを止めたときに別の場所が壊れるならば、それはただの &amp;ldquo;分散モノリス&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;境界づけられたコンテキスト間におけるコミュニケーション&#34;&gt;境界づけられたコンテキスト間におけるコミュニケーション&lt;/h1&gt;
&lt;p&gt;どうコミュニケーションする？→ ドメインイベントを通じて&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注文処理を終えた受注部門が配送部門に対して配送を依頼する場合の例:
&lt;ul&gt;
&lt;li&gt;受注コンテキストは&lt;code&gt;注文が確定された&lt;/code&gt;イベントを発行する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;注文が確定された&lt;/code&gt;イベントはキューに入るか、直接発行される&lt;/li&gt;
&lt;li&gt;配送コンテキストは&lt;code&gt;注文が確定された&lt;/code&gt;イベントをリッスンする&lt;/li&gt;
&lt;li&gt;配送コンテキストがイベントを受け取ると&lt;code&gt;注文を配送せよ&lt;/code&gt;コマンドが作られる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;注文を配送せよ&lt;/code&gt;コマンドは注文配送ワークフローをトリガーする&lt;/li&gt;
&lt;li&gt;注文配送ワークフローが完了すると&lt;code&gt;注文が配送された&lt;/code&gt;イベントが発行される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このように設計すれば、受注・配送の両コンテキストは&lt;strong&gt;互いについて知る必要なく&lt;/strong&gt;、イベントを通じてコミュニケーション可能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;イベントを実際に発行する方法
&lt;ul&gt;
&lt;li&gt;選定したアーキテクチャによる
&lt;ul&gt;
&lt;li&gt;キューや関数呼び出しなどが考えうるが、今はまだ決めなくていい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;各コンテキストが自律できるよう、設計を疎結合に保つことが重要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;イベントをコマンドに変換するハンドラ
&lt;ul&gt;
&lt;li&gt;これも複数の実装パターンが考えうる
&lt;ul&gt;
&lt;li&gt;下流コンテキストの一部としたり、独立したルータやプロセスマネージャにしてもいい&lt;/li&gt;
&lt;li&gt;選定するアーキテクチャや、イベントとコマンドの対応づけをどこでしたいかによって決めればいい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#x1f4dd; イベントを利用したコミュニケーションの特徴は&lt;strong&gt;互いを意識せずに済む&lt;/strong&gt;ところ。
確かにイベント経由通信を使わなくとも、ある程度の疎結合性は「インターフェイス契約+非同期コミュニケーション」で獲得できる。
それでもやはり、通信時には相手にデータを投げるなり、相手のメソッドを呼び出すなり、コード中に必ず「相手」が出てきてしまう。&lt;/p&gt;
&lt;h2 id=&#34;境界づけられたコンテキスト間におけるデータのやりとり&#34;&gt;境界づけられたコンテキスト間におけるデータのやりとり&lt;/h2&gt;
&lt;p&gt;コミュニケーションに使われるイベントは、下流コンテキストが処理に必要としている全てのデータを含む。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;注文が確定された&lt;/code&gt;イベントは注文データ全体を含む
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;注文を配送せよ&lt;/code&gt;コマンドを作るのに必要な情報全てを配送コンテキストに渡すため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;データがイベントに含めるのには大きすぎるなら、共有データストレージを利用してもよい。&lt;/p&gt;
&lt;p&gt;このデータオブジェクト──Data Transfer Objects（DTO）と呼ぶ──は、境界づけられたコンテキスト内で定義されたオブジェクトと同じに見えるが、厳密には違う。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;シリアライズしてコンテキスト間で共有できるよう設計されている
&lt;ul&gt;
&lt;li&gt;上流コンテキストの境界付近でドメインオブジェクトは DTO に変換される
&lt;ul&gt;
&lt;li&gt;JSON や XML などにシリアライズされる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;下流コンテキストでは、このプロセスが逆方向に実行されてドメインオブジェクトが作られる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（例） &lt;code&gt;注文が確定された&lt;/code&gt;イベントの DTO の構造:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;イベント DTO
&lt;ul&gt;
&lt;li&gt;注文 DTO
&lt;ul&gt;
&lt;li&gt;注文明細 DTO のリスト&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;信頼性境界と検証&#34;&gt;信頼性境界と検証&lt;/h2&gt;
&lt;p&gt;境界づけられたコンテキストの輪郭は信頼性境界としてはたらく&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;境界の内側: 全て信頼可能で、有効であるとみなされる&lt;/li&gt;
&lt;li&gt;境界の外側: いかなるものも未検証で、不正になり得る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このような境界が機能するように、ワークフローの入口と出口にゲートを設置する必要がある。&lt;/p&gt;
&lt;h3 id=&#34;入力ゲート&#34;&gt;入力ゲート&lt;/h3&gt;
&lt;p&gt;渡された DTO がドメインの制約（例: ある属性が 非null かつ 50 文字以内であること）を満たしていることを保証するために、入力を必ず検証する。
検証失敗時には、残りのワークフローはスキップされて例外が送出される。&lt;/p&gt;
&lt;h3 id=&#34;出力ゲート&#34;&gt;出力ゲート&lt;/h3&gt;
&lt;p&gt;非公開情報が境界の外に出ないようにする役割を担う。&lt;/p&gt;
&lt;p&gt;目的:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテキスト間の意図しないカップリング（なるほど！）&lt;/li&gt;
&lt;li&gt;セキュリティ向上&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの目的を果たすため、出力ゲートはドメインオブジェクトを DTO に変換する際に、情報を意図的に捨てる。&lt;/p&gt;
&lt;h1 id=&#34;境界づけられたコンテキスト間の契約&#34;&gt;境界づけられたコンテキスト間の契約&lt;/h1&gt;
&lt;p&gt;境界づけられたコンテキスト間のカップリングをできるだけ減らしたい&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;しかし共有コミュニケーションは常に何らかの結合をもたらす
&lt;ul&gt;
&lt;li&gt;イベントと、関連する DTO は境界づけられたコンテキスト間に一種の契約をもたらす&lt;/li&gt;
&lt;li&gt;コミュニケーションを可能にするにはコミュニケーションに使う共通形式について両コンテキストが同意している必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;誰が契約の締結を決定する？→コンテキスト間の関係性による&lt;/p&gt;
&lt;p&gt;関係性の例:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;共有カーネル: 二つのコンテキストが共通のドメイン設計をいくつかもつ
&lt;ul&gt;
&lt;li&gt;よって関係するチームは協働する必要がある
&lt;ul&gt;
&lt;li&gt;例: 受注コンテキストは配送先住所を受け取り、検証する。配送コンテキストは配送にその住所を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;イベントや DTO の定義を変えるときには関係者のレビューが必要&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;顧客/供給者（または顧客駆動契約）: 下流のコンテキストが上流コンテキストに供給してほしいものを定義する
&lt;ul&gt;
&lt;li&gt;上流が契約を守っている限り、両ドメインは独立に進化できる
&lt;ul&gt;
&lt;li&gt;例: 請求コンテキストが契約を定義し、受注コンテキストがそれを供給する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;順応者: 顧客駆動とは逆に、上流の定義を下流が受け入れ、自らのドメインモデルをそれに合うように適応させる
&lt;ul&gt;
&lt;li&gt;例: 受注コンテキストは製品カタログが決めた契約に従っている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;腐敗防止層&#34;&gt;腐敗防止層&lt;/h2&gt;
&lt;p&gt;外部システムと通信したいとき、利用可能なインターフェイスが自コンテキストのドメインモデルと全く合わないことがある&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;腐敗防止層（入力ゲートがこの役割を果たすことが多い）を使って、やりとりやデータをコンテキストに合うものに変換する必要がある
&lt;ul&gt;
&lt;li&gt;理由: ドメインモデルが外部のシステムに合わせようとして「壊れて」しまうのを防ぐため&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;コンテキストマップと関係性&#34;&gt;コンテキストマップと関係性&lt;/h2&gt;
&lt;p&gt;設計が進み、コンテキスト間の関係が決まったとする:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;受注・配送コンテキスト間: 共有カーネル
&lt;ul&gt;
&lt;li&gt;なのでコミュニケーション契約を一緒に決める&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;受注・請求コンテキスト間: 顧客駆動契約
&lt;ul&gt;
&lt;li&gt;請求コンテキストが契約を決め、受注コンテキストがそれを提供する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;受注・製品カタログ間: 適合者パターン
&lt;ul&gt;
&lt;li&gt;受注コンテキストは製品カタログが定めたモデルを使う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;外部の住所確認サービス: 本システムのドメインモデルと全然合わない
&lt;ul&gt;
&lt;li&gt;腐敗防止層を介して利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コンテキストマップ&lt;strong&gt;コンテキストをもつチームがどのように連携すべきか&lt;/strong&gt;も示す&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;技術的な課題であると同時に組織的な課題でもある&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;境界づけられたコンテキスト内におけるワークフロー&#34;&gt;境界づけられたコンテキスト内におけるワークフロー&lt;/h1&gt;
&lt;p&gt;ビジネスワークフローの表現:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DDD の概念に基づく表現: コマンドにより起動され、いくつかのドメインイベントを発するミニプロセス&lt;/li&gt;
&lt;li&gt;関数型アーキテクチャにおける表現: コマンドオブジェクトを入力とし、イベントオブジェクトのリストを出力とする一つの関数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文中の模式図を使った説明:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ワークフローは常にただ一つの境界づけられたコンテキストに含まれる&lt;/li&gt;
&lt;li&gt;公開ワークフロー（コンテキスト外からトリガーされる）は境界の外側に少しはみ出している&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ワークフローの入力と出力&#34;&gt;ワークフローの入力と出力&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;入力: 常にコマンドとひもづくデータ&lt;/li&gt;
&lt;li&gt;出力: 他のコンテキストと通信するためのイベントのリスト&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;受注ワークフローにおける例:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;入力:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;注文を確定せよ&lt;/code&gt;コマンド&lt;/li&gt;
&lt;li&gt;紐づくデータ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;出力: &lt;code&gt;注文が確定された&lt;/code&gt;イベントなどのイベントのリスト&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;請求コンテキストにおける例: （顧客/供給者パターンであることに注意）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ただの&lt;code&gt;注文が確定された&lt;/code&gt;イベントを出すだけでなく、イベントに含めるデータはは&lt;strong&gt;請求に必要なデータのみ&lt;/strong&gt;に限る必要がある
&lt;ul&gt;
&lt;li&gt;例: 請求先住所と合計金額だけ。配送先住所と商品リストは入れない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、我々は新しいイベント（言うなれば&lt;code&gt;請求可能な注文が確定した&lt;/code&gt;イベント）を発行する必要があることを意味する。&lt;/p&gt;
&lt;p&gt;また注文確認が送信されたイベントも送りたい
なので前に作ったダイアグラムはもう古いので新しくしたい&lt;/p&gt;
&lt;p&gt;ワークフローの模式図の中で重要なのは、関数はイベントを&lt;strong&gt;発行して&lt;/strong&gt;はおらず、単に返しているだけであるところ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理由: どのように発行するかは別の関心事なため&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;境界づけられたコンテキスト内のドメインイベントを避ける&#34;&gt;境界づけられたコンテキスト内のドメインイベントを避ける&lt;/h2&gt;
&lt;p&gt;オブジェクト指向設計でよく見られるパターン: 境界づけられたコンテキスト内で、ドメインイベントを受けたリスナーが別のドメインイベントを発行 &amp;#x26a0;&amp;#xfe0f;&lt;/p&gt;
&lt;p&gt;関数型アプローチではやらない&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理由: 隠れた依存を生み出してしまうから
&lt;ul&gt;
&lt;li&gt;リスナーが必要な場合にはワークフローの終端に置く
&lt;ul&gt;
&lt;li&gt;効果:
&lt;ul&gt;
&lt;li&gt;ミュータブルなグローバルイベントマネージャがいないことが明示される &amp;#x2705;&lt;/li&gt;
&lt;li&gt;理解・メンテナンスしやすい &amp;#x2705;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;境界づけられたコンテキスト内のコード構造&#34;&gt;境界づけられたコンテキスト内のコード構造&lt;/h1&gt;
&lt;p&gt;伝統的な「レイヤーアプローチ」では、コードは下記のような層に分けられる:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コアドメインまたはビジネスロジック&lt;/li&gt;
&lt;li&gt;データベース&lt;/li&gt;
&lt;li&gt;サービス&lt;/li&gt;
&lt;li&gt;API またはユーザーインターフェイス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ワークフローは表面のインターフェイスから始まって最深部のデータベースに到達し、また表面に戻る&lt;/p&gt;
&lt;p&gt;この手法の問題点 &amp;#x26a0;&amp;#xfe0f;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「同時に変更されるコードは同じ場所に属するべき」という設計原則を破っている&lt;/li&gt;
&lt;li&gt;層が「水平に」組み合わさっているので、ワークフローの動きを変えようとする場合には全ての層を変更する必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;よりよい方法 &amp;#x2705;: 「垂直な」構成に移行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;それぞれのワークフローは各自の仕事を終えるために必要なコードを全て含む&lt;/li&gt;
&lt;li&gt;ワークフローに対する要求が変わったら特定の垂直スライスだけを変えればいい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これは理想論ではなく実際に可能&lt;/p&gt;
&lt;h2 id=&#34;オニオンアーキテクチャ&#34;&gt;オニオンアーキテクチャ&lt;/h2&gt;
&lt;p&gt;オニオンアーキテクチャ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメインを真ん中に置く&lt;/li&gt;
&lt;li&gt;その周りにその他の側面を配置する
&lt;ul&gt;
&lt;li&gt;配置ルール: それぞれの層は外側にでなく、内側にだけ依存する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この構造に対して関数型の依存注入を使う方法は第 9 章で述べる&lt;/p&gt;
&lt;h2 id=&#34;io-を外側に保つ&#34;&gt;I/O を外側に保つ&lt;/h2&gt;
&lt;p&gt;関数型プログラミングの主な狙い: 予測可能で、内部を見ることなく簡単に説明できる関数を使って仕事をすること&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;そのために、関数を下記のように設計する:
&lt;ul&gt;
&lt;li&gt;可能な限りイミュータブルなデータを使うことで依存を明示する&lt;/li&gt;
&lt;li&gt;ランダム性・関数外の変数の更新などの副作用や、いかなる I/O も持たないようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DB やファイルシステムを使って読み書きするシステムは「不純」とみなされる → そのような関数はコアドメインから取り除く&lt;/p&gt;
&lt;p&gt;&amp;#x2753; データの読み書きはどうやったらいい？ → I/O をオニオンアーキテクチャの最外殻に保つ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データベースにアクセスするのは、ワークフローの内部ではなく最初と最後のみ
&lt;ul&gt;
&lt;li&gt;ドメインモデルに DB が登場しないのなら、ワークフローでも内部から DB にアクセスできてはいけない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;利点:
&lt;ul&gt;
&lt;li&gt;関心が異なるもの同士を分離できる
&lt;ul&gt;
&lt;li&gt;コアドメインはビジネスロジックのみに集中&lt;/li&gt;
&lt;li&gt;永続化や他の I/O はインフラが管理する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;まとめ&#34;&gt;まとめ&lt;/h1&gt;
&lt;p&gt;DDD に関する概念と定義をいくつか紹介した&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメインオブジェクト: BC 内側でのみ使われるオブジェクト&lt;/li&gt;
&lt;li&gt;DTO: シリアライズされて bc 間で共有されるためのオブジェクト&lt;/li&gt;
&lt;li&gt;共有カーネル、顧客/サプライヤ、適合者: 境界づけられたコンテキスト間の関係パターン&lt;/li&gt;
&lt;li&gt;腐敗防止層: あるドメインの概念を他のドメインのものに翻訳するコンポーネント。カップリングを減らし、各ドメインが独自に進化できるようにする&lt;/li&gt;
&lt;li&gt;永続化の無視: ドメインモデルはドメイン自体の概念のみ基づくべきであり、永続化メカニズムへの意識は含むべきでない&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;次に学ぶこと&#34;&gt;次に学ぶこと&lt;/h1&gt;
&lt;p&gt;ドメインを理解し、解決策を設計するアプローチを理解したことで、それぞれのワークフローの設計と実装に取り組めるようになった。&lt;/p&gt;
&lt;p&gt;続く数章でやること:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;F# の型システムを使ってワークフローとデータを定義する&lt;/li&gt;
&lt;li&gt;実際にコンパイル可能ながら、ドメインエキスパートや非開発者にも理解可能なコードを書く&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのために次の章で学ぶこと:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;関数プログラマにとって型とは何を意味するのか&lt;/li&gt;
&lt;li&gt;クラスとどう違うのか&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Docker などの仮想環境技術の文脈における &amp;ldquo;コンテナ&amp;rdquo; ではないので注意&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>補足記事 &#34;PfEingのアプローチで働こう&#34;</title>
      <link>https://rindrics.com/posts/supplement-platform-engineering-approach/</link>
      <pubDate>Fri, 04 Sep 2026 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/posts/supplement-platform-engineering-approach/</guid>
      <description>&lt;h2 id=&#34;これはなに&#34;&gt;これはなに&lt;/h2&gt;
&lt;p&gt;下記の口頭発表に対する補足記事である。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;演題: &amp;ldquo;PfEingのアプローチで働こう&amp;rdquo;&lt;/li&gt;
&lt;li&gt;イベント名: 【3-shake × enechain】SRE Tech Talk #15&lt;/li&gt;
&lt;li&gt;日時: 2026年9月4日&lt;/li&gt;
&lt;li&gt;場所: 株式会社スリーシェイク（東京, 銀座）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この記事では、時間の制約から口頭発表には含められなかった情報を補足として紹介する。&lt;/p&gt;
&lt;p&gt;発表資料はこちら:&lt;/p&gt;
&lt;div class=&#34;speakerdeck-embed&#34;&gt;
  &lt;iframe
    class=&#34;speakerdeck-iframe&#34;
    src=&#34;https://speakerdeck.com/player/1e9dfa1f9fb84c049ff2d52837afd1be&#34;
    title=&#34;PfEingのアプローチで働こう&#34;
    allowfullscreen
    allow=&#34;web-share&#34;
    loading=&#34;lazy&#34;
    style=&#34;border: 0; background: rgba(0, 0, 0, 0.1); margin: 0; padding: 0; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0 5px 40px; width: 100%; height: auto; aspect-ratio: 16 / 9;&#34;
  &gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;h2 id=&#34;スライド各ページの補足&#34;&gt;スライド各ページの補足&lt;/h2&gt;
&lt;h3 id=&#34;タイトル&#34;&gt;（タイトル）&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/1.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;本発表で話したのは「PfEingアプローチ」 ではない。
これでは、私が新しい用語を考え出したことになってしまう。&lt;/p&gt;
&lt;p&gt;あくまでも「PfEing&lt;strong&gt;の&lt;/strong&gt;アプローチ」だ。&lt;/p&gt;
&lt;p&gt;「プラットフォームエンジニアリング」はスライド上では幅を取りすぎるので &amp;ldquo;PfEing&amp;rdquo; で統一した。
視覚上は短くなったが、読みは同じなので噛みそうなのは変わらない。&lt;/p&gt;
&lt;h3 id=&#34;自己紹介&#34;&gt;（自己紹介）&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/2.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;サイボウズが提供しているキントーン（kintone, Kintone）というサービスは、単一（というと語弊があるが）のアプリケーションソースコードを&lt;a href=&#34;https://blog.cybozu.io/entry/2025/04/11/112000&#34;&gt;国内向け（cybozu.com）&lt;/a&gt;・&lt;a href=&#34;https://blog.cybozu.io/entry/2019/04/24/080000&#34;&gt;国外向け（kintone.com）&lt;/a&gt;二つの基盤で動かすことでエンドユーザーに提供されている。&lt;/p&gt;
&lt;p&gt;ちなみに、キントーンのアルファベット表記は、国内向けでは小文字始まりの&lt;strong&gt;k&lt;/strong&gt;intoneなのに対し、海外向けでは&lt;strong&gt;K&lt;/strong&gt;intone。&lt;/p&gt;
&lt;p&gt;私のチームはkintone.comのプラットフォームを開発・運用しているプラットフォームチームで、社内では通称Yakumoチームと呼ばれている。&lt;/p&gt;
&lt;p&gt;10年近い歴史を持つチームなので、記事の中には古くなっているものもあるが、サイボウズのテックブログを &amp;ldquo;Yakumo&amp;rdquo; カテゴリで検索すると&lt;a href=&#34;https://blog.cybozu.io/archive/category/Yakumo&#34;&gt;技術記事がヒット&lt;/a&gt;する。&lt;/p&gt;
&lt;p&gt;名前の由来をふくむ、Yakumoチーム自体については下の記事にまとまっている。&lt;/p&gt;








&lt;div class=&#34;card&#34;&gt;
  &lt;a href=&#34;https://blog.cybozu.io/entry/2026/07/23/100000&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; class=&#34;card-link&#34;&gt;
    &lt;div class=&#34;card-content&#34;&gt;
      &lt;h4 class=&#34;card-title&#34;&gt;kintone.com プラットフォームを提供 ~ われら Yakumo にござる | blog.cybozu.io&lt;/h4&gt;
      
      &lt;span class=&#34;card-url&#34;&gt;https://blog.cybozu.io/entry/2026/07/23/100000&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;h3 id=&#34;やっていること&#34;&gt;「やっていること」&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/3.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;本発表はプラットフォームエンジニアリング的な働き方について述べたものだが、別のアプローチの働き方をした経験があるので前職の例と対比した。&lt;/p&gt;
&lt;p&gt;DevOpsをチーム名に冠すること自体についてはここには書ききれないので、別の機会に書こうと思う。&lt;/p&gt;
&lt;h3 id=&#34;pfeingチームの働き方&#34;&gt;「PfEingチームの働き方」&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/4.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;発表には含められなかったが、最近はプラットフォームエンジニアリングに関して、下記のテーマについて考えている:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PfEingというアプローチそれ自体&lt;/li&gt;
&lt;li&gt;プラットフォームの &amp;ldquo;&lt;a href=&#34;https://tag-app-delivery.cncf.io/whitepapers/platforms/#attributes-of-platforms:~:text=the%20database%20server.-,Optional,-and%20composable.%20Platforms&#34;&gt;optional&lt;/a&gt;&amp;rdquo; という特性と、それが満たされないときに起こること&lt;/li&gt;
&lt;li&gt;一応の運用が効果計測を目的とした計装と社内の信頼残高との関係&lt;/li&gt;
&lt;li&gt;責務境界のあるべき姿とストリームアラインドチームの負担増&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上記のうち、「PfEingというアプローチ」に関して、LTサイズに切り出せるメッセージが見つかったので本発表を作った。&lt;/p&gt;
&lt;p&gt;本スライドに示したのは、本発表が特に影響を受けた下記の記事・書籍である:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;&lt;a href=&#34;https://martinfowler.com/articles/talk-about-platforms.html&#34;&gt;What I Talk About When I Talk About Platforms&lt;/a&gt;&amp;rdquo; Bottcher (2018)&lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href=&#34;https://cloudnativeplatforms.com/whitepapers/platforms/&#34;&gt;CNCF Platforms White Paper&lt;/a&gt;&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href=&#34;https://chadxz.dev/platform/&#34;&gt;How Platform Engineering Works&lt;/a&gt;&amp;rdquo; McElligott (2023)&lt;/li&gt;
&lt;li&gt;『&lt;a href=&#34;https://www.oreilly.co.jp/books/9784814401413/&#34;&gt;プラットフォームエンジニアリング&lt;/a&gt;』Fournier &amp;amp; Nowland (2025) オライリー・ジャパン&lt;/li&gt;
&lt;li&gt;『&lt;a href=&#34;https://book.mynavi.jp/ec/products/detail/id=151794&#34;&gt;実践 プラットフォームエンジニアリング&lt;/a&gt;』Chankramath et al. (2026) マイナビブックス&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;損益分岐点がある&#34;&gt;「損益分岐点がある」&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/5.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;こんにち（2026年）では、「プラットフォームエンジニアリング」という言葉が定着しつつあるため、このデシジョンツリーを使うなどして「プラットフォームエンジニアリングをするかどうか」というメタ認知を持ってプラットフォームチームを立ち上げられる。
プラットフォームチームにとって（もちろん組織全体にとって）、これは本当に大きい利点だ。&lt;/p&gt;
&lt;p&gt;この言葉がなかった頃から、形を変えながら続いてきたプラットフォームチームでは、プラットフォームとして必ずしも適切とはいえない責務を抱えていることがあると思う。&lt;/p&gt;
&lt;h3 id=&#34;常に必要な自問&#34;&gt;「常に必要な自問」&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/6.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;「自分たちはPfEing&lt;strong&gt;できているか&lt;/strong&gt;？」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;現実世界でちゃんとPfEingするのは本当に難しいので「できているか」を強調してある。&lt;/p&gt;
&lt;p&gt;プラットフォームエンジニアは、自分達の働き方について、本当に自覚的になる必要がある。
プラットフォームエンジニアの場合、他チーム&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;から見て「いい仕事」をしているように見えても、プラットフォームエンジニアリング的に誤ったアプローチで働いてしまうというケースは、いくらでも生じうる。
顧客の満足が必ずしも&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;宿命的にROIが重要&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これには引用があるわけではなく、発表において言葉の簡潔さとパワーを得るためにこのフレーズを使った。&lt;/p&gt;
&lt;p&gt;といっても、プラットフォームエンジニアリングについて色々な情報を読んでいれば意味するところは理解いただけるのではないかと思う。&lt;/p&gt;
&lt;p&gt;関連する記述を具体的に揚げるとすれば、『プラットフォームエンジニアリング』では、プラットフォームチームは、より大きいものを管理するために自チームのサイズを大きくすることに慎重になる必要があることを指摘している（13.3「成長をコントロールすることによる複雑性の管理」）。
これは単純にROIの分母が大きくなってしまうだけではなく、働き方の質を変えるための吟味の機会を失うことも意味するからだ。&lt;/p&gt;
&lt;h3 id=&#34;pfeingのアプローチ&#34;&gt;「PfEingのアプローチ」&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/7.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;どこから取ろうがエッセンスは変わらないが、ここでは代表としてCNCFのPlatforms White Paperからの引用を示した。
このドキュメントは短いが、読むたびに新しいテーマについて考えるきっかけが得られるので、私は定期的に読むようにしている。&lt;/p&gt;
&lt;p&gt;ちなみに現時点のPlatforms White Paperは、雑にキーワード検索すると&lt;a href=&#34;https://tag-app-delivery.cncf.io/whitepapers/platforms/&#34;&gt;App Delivery TAG版の古いドキュメント&lt;/a&gt;がヒットしがち。
現行のドキュメントは&lt;a href=&#34;https://cloudnativeplatforms.com/whitepapers/platforms/&#34;&gt;cloudnativeplatforms.comのこちら&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&#34;気を抜くとかんたんに外れうる&#34;&gt;「気を抜くとかんたんに外れうる」&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/8.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;プラットフォームエンジニアリングチームが&lt;strong&gt;どう&lt;/strong&gt;働くべきチームなのかを、組織の中で最もよく理解しているのはプラットフォームチーム自身だ。
そもそも「依頼」という言葉自体、危険な香りがする。
プラットフォームチームとしては、TicketOps的な慣習をアンラーニングし、顧客チームとの関わり方自体も組織として成熟させていく必要がある。
『チームトポロジー』の用語で言うならば、ここで言っているのは「顧客チームとの &amp;ldquo;コラボレーションモード&amp;rdquo; を &amp;ldquo;X-as-a-Service&amp;rdquo; に変えていけ」という話&lt;strong&gt;ではない&lt;/strong&gt;。
新しいケイパビリティの探索フェーズでは、コラボレーションモードが必要になる。
ここでは「依頼を受けて作る」という働き方を、雑に「コラボレーションモード」と呼んだりはするな、という意味で言っている。&lt;/p&gt;
&lt;p&gt;余談だが、参考リンク先の「Terraformスタータキット」のアンチパターンの例&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;については、もしスタータキットの&lt;strong&gt;モジュール配布だけ&lt;/strong&gt;をやっていた場合には少しマシになる&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;という理解。&lt;/p&gt;
&lt;h3 id=&#34;どうしても断れない依頼&#34;&gt;「どうしても断れない依頼」&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/9.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;このケースは、最初からプラットフォームチームとして設計されて立ち上がった、新しいプラットフォームチームでは起こりにくいのかもしれない。&lt;/p&gt;
&lt;p&gt;一方で、形を変えながら続いてきたプラットフォームチームには、このパターンはよく発生するのではないだろうか。&lt;/p&gt;
&lt;h3 id=&#34;現実世界はいろいろあるけど&#34;&gt;「&amp;hellip;現実世界はいろいろあるけど」&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-09-02-pfeing/10.webp&#34; width=&#34;70%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;プラットフォームエンジニアリングは全体最適を追求する働き方だ。
全体最適は組織にとって善きものだが、それを推進する取組みもまた善きものと見られるかどうかは、他のタスクとの比重に因っている。
他チームに預けた信頼残高も関わってくる。&lt;/p&gt;
&lt;h2 id=&#34;謝辞&#34;&gt;謝辞&lt;/h2&gt;
&lt;p&gt;発表の機会を提供してくださったスリーシェイクさん、enechainさん、ありがとうございました。&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;「他チーム」とはもちろん、プラットフォームエンジニアリングについての解像度が低いチームのことだ。当然、他のプラットフォームチームの目はごまかせない&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;ここでいうアンチパターンとは「プラットフォームチームとしての」アンチパターンのこと。状況に応じた方法を選ぶことが重要&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;マシになるとは、プラットフォームエンジニアリング的な働き方にやや近づく、と言う意味&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>『実践 プラットフォームエンジニアリング』を読んだ</title>
      <link>https://rindrics.com/posts/book-review-effective-platform-engineering/</link>
      <pubDate>Sat, 29 Aug 2026 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/posts/book-review-effective-platform-engineering/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://effectiveplatformengineering.com/&#34;&gt;Effective Platform Engineering&lt;/a&gt;の邦訳版が出たので読んでみた。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-08-25-pfe/cover.webp&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;実践 プラットフォームエンジニアリング─開発者体験を加速するセルフサービス基盤の設計と構築&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;執筆: Ajay Chankramath, Nic Cheneweth, Bryan Oliver, Sean Alvarez&lt;/li&gt;
&lt;li&gt;翻訳: 株式会社スリーシェイク（元内柊也、小池玲斗、木曽和則、下村俊貴）&lt;/li&gt;
&lt;li&gt;マイナビブックス、2026年&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私が読んだのは&lt;a href=&#34;https://book.mynavi.jp/ec/products/detail/id=151794&#34;&gt;PDF板&lt;/a&gt;。
なお本書は会社の&lt;a href=&#34;https://cybozu.backstage.cybozu.co.jp/n/ncabe948d639c&#34;&gt;SLP（Self Learning Program）&lt;/a&gt;という仕組みを利用して購入した。&lt;/p&gt;
&lt;h2 id=&#34;どんな本か&#34;&gt;どんな本か&lt;/h2&gt;
&lt;p&gt;こんにち、プラットフォームエンジニアリングのマインドセットは言語化され、例えば &amp;ldquo;&lt;a href=&#34;https://cloudnativeplatforms.com/whitepapers/platforms/&#34;&gt;CNCF Platforms White Paper&lt;/a&gt;&amp;rdquo; などで参照可能になっている
一方で、それらを具体的にどのように実現するかについては、まだまだ情報は充分とはいえない。
本書は、コンサルタントとしてエンジニアリングプラットフォームの実装に関わり、多くの場数を踏んだ著者らによるものなのでこの &amp;ldquo;how&amp;rdquo; の部分が手厚く解説されている。
ちなみに著者陣のキャリアは、4人全員がThoughtworksあるいはBrillioにあり、これはつまりプラットフォームエンジニアリングにとって重要な要素であるスケール性を扱った経験が豊富ということを意味する。
また、特定のプラットフォームプロダクトのベンダー企業&lt;strong&gt;ではない&lt;/strong&gt;というところも、実践形式の書籍として良い点といえる。&lt;/p&gt;
&lt;p&gt;本書の他に、プラットフォームエンジニアリングに関して体系的に読める別の書籍としてはオライリージャパンの『プラットフォームエンジニアリング』&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;もあるが、本書のほうが後発なだけあって現時点におけるプラットフォームエンジニアリングの業界の標準が反映されている。
2026年時点において、プラットフォームエンジニアリングについて知りたい人がまず読むならば、あちらの本よりも本書を先に読むと良さそう。
本書で「どんな世界観をどう実装するか」を理解したあと、「それを社内（政治的制約がある環境）でどう推進するか」について『プラットフォームエンジニアリング』を読みながら考えてみるとよい。&lt;/p&gt;
&lt;p&gt;また本書はプラットフォームエンジニアリングの定義に成功指標の計測も含めており、オブザーバービリティを第一級市民として扱っているところも特徴といえる。&lt;/p&gt;
&lt;h2 id=&#34;個人的に目に止まったところ&#34;&gt;個人的に目に止まったところ&lt;/h2&gt;
&lt;h3 id=&#34;第1章-プラットフォームエンジニアリングとは何か&#34;&gt;第1章 プラットフォームエンジニアリングとは何か&lt;/h3&gt;
&lt;h4 id=&#34;プラットフォームはdevopsにとどまらないp4&#34;&gt;プラットフォームはDevOpsにとどまらない（p.4）&lt;/h4&gt;
&lt;p&gt;本節で書かれている &amp;ldquo;DevOps&amp;rdquo; の認識に同意しかねる部分がある。
コメントの分量が膨らんでしまいそうなので、別の記事で書くことにする。&lt;/p&gt;
&lt;h3 id=&#34;第2章-ソフトウェアデファインドのプロダクトとアーキテクチャ&#34;&gt;第2章 ソフトウェア・デファインドのプロダクトとアーキテクチャ&lt;/h3&gt;
&lt;h4 id=&#34;1年後にプラットフォームがどう使われるかを予測するのは不可能p44&#34;&gt;1年後にプラットフォームがどう使われるかを予測するのは不可能（p.44）&lt;/h4&gt;
&lt;p&gt;この解釈は難しいところだと思う。
本書は技術選定時にはなるべく少ない機能のものを選ぶことを推奨しているが、だからといってここの記述は「今だけを見て意思決定しろ」という意味ではないはず。
チームとして戦略的視点に基づいた動きをしていることは恐らく前提（&amp;hellip;そうだよな？）。
要はよくよく気をつけろというメッセージと理解した。&lt;/p&gt;
&lt;p&gt;それにしても「不可欠だと思われていたケイパビリティが実は不要だった」は肝に命じておきたい。
YAGNIとは昔から言われるが、ここで述べられているのは「あったら良いと思ったが不要だった」ではなく、「&lt;strong&gt;不可欠&lt;/strong&gt;だと思ったが不要だった」だから恐ろしい。
要件を考える段になってYAGNIを唱えるのではなく、戦略レベルから注意を払わないとだめということ（難しい）。&lt;/p&gt;
&lt;h4 id=&#34;ドメイン駆動プラットフォーム設計p54&#34;&gt;ドメイン駆動プラットフォーム設計（p.54）&lt;/h4&gt;
&lt;p&gt;プラットフォームエンジニアリングの文脈でDDDを強調しているのは本書の一つの特徴。
個人的には、ソフトウェア開発ど真ん中のキャリアではないながらも、DDDについては本業とは別に継続的に自己投資してきたので、これまで学んできたことが本書を読んで数年（5年くらい？）のタイムラグを経てつながった感じがある。&lt;/p&gt;
&lt;h4 id=&#34;スムーズな開発者体験を実現するインフラコスト配賦p59&#34;&gt;スムーズな開発者体験を実現するインフラコスト配賦（p.59）&lt;/h4&gt;
&lt;p&gt;ここで書かれているスムーズな開発者体験は、顧客チームにインフラのコスト配賦をできている前提。
バックオフィスとも連携がとれた組織のレベルが高い話だ。&lt;/p&gt;
&lt;h4 id=&#34;手動プロセスによる機会損失p60&#34;&gt;手動プロセスによる機会損失（p.60）&lt;/h4&gt;
&lt;p&gt;手動プロセスが機会損失につながることは誰でも知っているが、コストや効果の計測を第一級市民として扱う本書では、機会損失は言葉だけでなく実際に算出する値としての意味を持っている。
こういった広い意味でのオブザーバービリティは、短期的な顧客価値につながりづらいので推進が難しいが、裏を返せばオブザーバービリティ確保の先延ばしは、チームが「このプロダクトは（たぶん）顧客の生産性を高めた（んだと思う&amp;hellip;）」という状態で働き続けることを意味する。&lt;/p&gt;
&lt;h4 id=&#34;組織固有のケイパビリティをk8sのapi拡張でオーケストレーションするp62&#34;&gt;組織固有のケイパビリティをk8sのAPI拡張でオーケストレーションする（p.62）&lt;/h4&gt;
&lt;p&gt;自動化はソフトウェアエンジニアリング文化の空気みたいなものだが、オーケストレーション──確実に動き続ける──まで保証できるのはプラットフォームエンジニアリングならではのアプローチだと思う。&lt;/p&gt;
&lt;h3 id=&#34;第3章-計測で導くプラットフォームエンジニアリングの成功&#34;&gt;第3章 計測で導くプラットフォームエンジニアリングの成功&lt;/h3&gt;
&lt;h4 id=&#34;エンジニアリングプラットフォーム構築のデシジョンツリーp70&#34;&gt;エンジニアリングプラットフォーム構築のデシジョンツリー（p.70）&lt;/h4&gt;
&lt;p&gt;図3.2のデシジョンツリーは、プラットフォーム構築がプラスになるかどうかの境界フェーズにある組織にとってはなかなか役立ちそう。&lt;/p&gt;
&lt;h4 id=&#34;プラットフォーム価値モデリングp77&#34;&gt;プラットフォーム価値モデリング（p.77）&lt;/h4&gt;
&lt;p&gt;プラットフォームチームの取組みが組織のバリューストリームから遠ざかることについて、これまでにもアンチパターンとして認識されてきた（&lt;a href=&#34;https://cloudnativeplatforms.com/whitepapers/platforms/#:~:text=teams%2E-,Many,frustration%2E&#34;&gt;例&lt;/a&gt;）。
本書が「プラットフォーム価値モデリング」としてモデル化したことで、世のプラットフォームチームは「アンチパターンに陥らないようにする」という具体性を欠いた否定形ではなく「プラットフォーム価値モデリングする」と能動態で考えられるようになった。
これは一種のケイパビリティだと思う。&lt;/p&gt;
&lt;h4 id=&#34;パフォーマンスメトリクス--オンボーディング時間p86&#34;&gt;パフォーマンスメトリクス | オンボーディング時間（p.86）&lt;/h4&gt;
&lt;p&gt;社内プラットフォームだからといって認証をおろそかにすると、こういったオブザーバービリティ面でツケが回ってくる。&lt;/p&gt;
&lt;h4 id=&#34;エンジニアリングプラットフォームのプロダクトドメインp91&#34;&gt;エンジニアリングプラットフォームのプロダクトドメイン（p.91）&lt;/h4&gt;
&lt;p&gt;図3.8は抽象的だが、ここで表されているものは、AWS上にEKSで環境を構築しているチームならば普通に使っているリソースを、本書の基準で分類したもの。
この8つの分類は初見時にはあまりしっくりこないかもしれないが、&amp;ldquo;6.4 クラウド管理ID&amp;rdquo;（p.193）以降で登場するそれぞれの分類の解説を読めば、その合理性がだんだんわかってくる。&lt;/p&gt;
&lt;h3 id=&#34;第4章-ガバナンスコンプライアンス信頼&#34;&gt;第4章 ガバナンス・コンプライアンス・信頼&lt;/h3&gt;
&lt;h4 id=&#34;idプロバイダーソリューションp117&#34;&gt;IDプロバイダーソリューション（p.117）&lt;/h4&gt;
&lt;p&gt;チームの境界で見られがちな「依頼」という協働パターンを撲滅するヒントがある。&lt;/p&gt;
&lt;h3 id=&#34;第5章-進化するオブザーバービリティ&#34;&gt;第5章 進化するオブザーバービリティ&lt;/h3&gt;
&lt;h4 id=&#34;オブザーバービリティの8つのレンズp131&#34;&gt;オブザーバービリティの8つのレンズ（p.131）&lt;/h4&gt;
&lt;p&gt;2026年現在、「オブザーバービリティ」といえば一般にはアプリケーションのオブザーバービリティを指すと思うが、本書ではそれをエンドユーザー（社内の開発者ユーザーのこと）体験を制限するアンチパターンと言い切っている。
本書はオブザーバービリティを「エンジニアリング」カテゴリと「ビジネス」カテゴリそれぞれ4つづつの主要8軸に分類し、組織のすみずみまで可観測性がある世界観を提示している。
当然「データ分析基盤」と呼ばれるものまで含むので、恐らくすべてプラットフォームチームが担当するわけではないだろう。
もしくは、いま「データエンジニアリングチーム」と呼ばれるものもプラットフォーム組織配下のチームとして考えているのかもしれない。&lt;/p&gt;
&lt;h3 id=&#34;第6章-ソフトウェアデファインドなエンジニアリングプラットフォームの構築&#34;&gt;第6章 ソフトウェア・デファインドなエンジニアリングプラットフォームの構築&lt;/h3&gt;
&lt;h4 id=&#34;名前空間レベルのパイプラインp170&#34;&gt;名前空間レベルのパイプライン（p.170）&lt;/h4&gt;
&lt;p&gt;ここで解説されているpreviewクラスタはおもしろい。
社内顧客を抱えるチームとして、インフラのメンテを安心して当てるのに合理的な構成となっている。&lt;/p&gt;
&lt;h3 id=&#34;第7章-プラットフォームコントロールプレーンの基礎&#34;&gt;第7章 プラットフォームコントロールプレーンの基礎&lt;/h3&gt;
&lt;h4 id=&#34;クラウドアカウントのベースラインp214&#34;&gt;クラウドアカウントのベースライン（p.214）&lt;/h4&gt;
&lt;p&gt;ここに差し掛かると、本書がこの「クラウドアカウントベースライン」を、前章で解説された「クラウド管理ID」とは異なるレイヤーのリソースとして認識していることを理解できる。
本来、AWSのリソースモデルの構造としては「アカウント」の下に「IAMロール」があるわけだが、本書の認知モデルではまず「クラウド管理ID（IAMロールが含まれる）」があり、その上に「クラウドアカウントベースライン（AWSアカウントを指す）」が載っている。
もちろん、AWSのリソースモデルとは異なるこの認知モデルが常に最高なわけはないが、複数アカウントの運用そのものが業務ドメインの中心にあるプラットフォームエンジニアリングの文脈では、なるほどこの整理は合理的だ。&lt;/p&gt;
&lt;p&gt;ただ環境を動かすだけなら誰にでもできる。
きれいに運用するのが難しい。
こうやって見せてもらえれば腹落ちするのだが、この整理は自分では思いつけそうにない。
ここはなかなか勉強になった。&lt;/p&gt;
&lt;h3 id=&#34;第8章-コントロールプレーンのサービスとエクステンション&#34;&gt;第8章 コントロールプレーンのサービスとエクステンション&lt;/h3&gt;
&lt;h4 id=&#34;プラットフォームエンジニアリングとdevopsのアプローチの違いp317&#34;&gt;プラットフォームエンジニアリングとDevOpsのアプローチの違い（p.317）&lt;/h4&gt;
&lt;p&gt;「スターターキット」のプラクティスを例に、DevOpsとプラットフォームエンジニアリングの違いが解説されている。
この解像度での解説は本書ならではで、両者は全く違うことがわかる。
特にプラットフォームエンジニアリングをする立場にあるならば、きちんと理解しておく必要がある。&lt;/p&gt;
&lt;h3 id=&#34;第9章-スケールを支えるアーキテクチャの変更&#34;&gt;第9章 スケールを支えるアーキテクチャの変更&lt;/h3&gt;
&lt;h4 id=&#34;アジャイルプラクティスの導入p358&#34;&gt;アジャイルプラクティスの導入（p.358）&lt;/h4&gt;
&lt;p&gt;『プラットフォームエンジニアリング』はプラットフォームチームがアジャイルな進め方をすることにかなり注意深い態度だったが、本書はけっこうアジャイル派な印象。&lt;/p&gt;
&lt;h3 id=&#34;第10章-プラットフォームプロダクトの進化&#34;&gt;第10章 プラットフォームプロダクトの進化&lt;/h3&gt;
&lt;h4 id=&#34;内部開発者プラットフォームidpと開発者ポータルの比較p378&#34;&gt;内部開発者プラットフォーム（IDP）と開発者ポータルの比較（p.378）&lt;/h4&gt;
&lt;p&gt;名前からしてそもそも紛らわしいので、ここは多くの読者が注意深く読みそう。
解説されてみれば、両者は確かに全く異なるし、はっきり使い分ける必要がある。&lt;/p&gt;
&lt;h2 id=&#34;理解しにくかった箇所の個人的メモ&#34;&gt;理解しにくかった箇所の個人的メモ&lt;/h2&gt;
&lt;h3 id=&#34;p10&#34;&gt;p.10&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;3つの概念は互いに依存し合っています&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;&lt;strong&gt;4&lt;/strong&gt;つの概念&amp;rdquo; だろうか。&lt;/p&gt;
&lt;p&gt;余談だが、図1.3のような循環を表す模式図は、矢印を曲線にするだけで飛躍的に理解しやすくなる。&lt;/p&gt;
&lt;h3 id=&#34;p20&#34;&gt;p.20&lt;/h3&gt;
&lt;p&gt;ハンドオフ: 仕事の受け渡しのこと&lt;/p&gt;
&lt;h3 id=&#34;p21&#34;&gt;p.21&lt;/h3&gt;
&lt;h4 id=&#34;図18&#34;&gt;図1.8&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;SAST: static application security testing&lt;/li&gt;
&lt;li&gt;DAST: dynamic application security testing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;p29&#34;&gt;p.29&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;セキュリティステークホルダーが企業認証基準を、(1) 内部認証の単一の信頼できるソースを要求し、(2) 内部実装をOAuth 2.0 フレームワークに基づくものと定義する場合です&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは恐らく下記の意味だと思う。&lt;/p&gt;
&lt;p&gt;セキュリティステークホルダーが企業認証基準を下記のように定義する場合です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) 内部認証の単一の信頼できるソースを要求するもの&lt;/li&gt;
&lt;li&gt;(2) 内部実装をOAuth 2.0 フレームワークに基づくもの&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;p33&#34;&gt;p.33&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;成功は、独立してドメインに専念する開発チームから生まれます。各チームは自分たちのドメインに固有のアイデアを試行します。計測可能な体験と価値を生み出すためにソフトウェアを構築してテストします。そして、ソフトウェアを顧客にリリースし、質の高いユーザー体験を確保しながら結果を注視して管理します&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは恐らく下記の意味だと思う。&lt;/p&gt;
&lt;p&gt;成功は、独立してドメインに専念する&lt;strong&gt;アプリケーション&lt;/strong&gt;開発チームから生まれます。各チームは自分たちのドメインに固有のアイデアを試行します。計測可能な体験と価値を生み出すためにソフトウェアを構築してテストします。そして、ソフトウェアを&lt;strong&gt;社外&lt;/strong&gt;顧客にリリースし、質の高いユーザー体験を確保しながら結果を注視して管理します&lt;/p&gt;
&lt;h3 id=&#34;p80&#34;&gt;p.80&lt;/h3&gt;
&lt;p&gt;「認知負荷の増加は10%以内」はどう計測するんだろう。
p.82には「認知負荷の影響を評価する体系的な手法が存在します」とだけ書いてある。
認知心理学の分野では確立されていたりするんだろうか。&lt;/p&gt;
&lt;p&gt;ちなみに、複数のプラットフォームプロダクトが時間差でリリースされた場合、認知負荷の変化がどのプロダクトによるものなのかわからなくなりそう。
成功指標の計測を徹底している組織では、同じ認知コンテキストに影響する変更が一つづつになるよう、リリース管理するんだろうか？&lt;/p&gt;
&lt;h3 id=&#34;p89-表31-32&#34;&gt;p.89 表3.1, 3.2&lt;/h3&gt;
&lt;p&gt;これらの情報は表で表してはいけない（同じ行間を比較したくなる）。
実査には下記のように、単なるリストで表示するのが正しい。&lt;/p&gt;
&lt;p&gt;表3.1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;計画
&lt;ul&gt;
&lt;li&gt;開発者の関与&lt;/li&gt;
&lt;li&gt;顧客フィードバックループ&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;設計&lt;/li&gt;
&lt;li&gt;コード&lt;/li&gt;
&lt;li&gt;ビルド&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;表3.2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テスト
&lt;ul&gt;
&lt;li&gt;テストの種類&lt;/li&gt;
&lt;li&gt;テスト自動化&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;リリース&lt;/li&gt;
&lt;li&gt;監視&lt;/li&gt;
&lt;li&gt;運用&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;p138&#34;&gt;p.138&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;5.2.1 エンドユーザーのアクセス体験&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;エンドユーザーとは、プラットフォームサービスとしてのオブザーバービリティ機能を利用する社内開発者ユーザーのこと。
個人的には「エンド」と付くと本当の末端（会社が提供しているプロダクトのユーザー）をイメージしてしまうので紛らわしく感じる。&lt;/p&gt;
&lt;h3 id=&#34;p139&#34;&gt;p.139&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;5.2.2 顧客データの自動収集&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ここの「顧客」とは社内開発者ユーザーのことだと思う。
判断根拠は、p.140に「アプリケーションチームは、自分たちのデータがどのように収集され保存されるかという内部の仕組みを気にせず済みます」とあること。
よって「&lt;strong&gt;自分たちの&lt;/strong&gt;データ」とは「自分たちが&lt;strong&gt;所有する&lt;/strong&gt;データ」の意味であって、「自分たちが&lt;strong&gt;生成した&lt;/strong&gt;データ」ではないはず。
従って、実際にはデータの中身は会社が提供しているサービスのユーザーのアクセスデータなどが含まれているはず。&lt;/p&gt;
&lt;h3 id=&#34;p186-図614&#34;&gt;p.186 図6.14&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;誤: my-orb/name of job-in-orb&lt;/li&gt;
&lt;li&gt;正: my-orb/name-of-command-in-orb&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;p193-図616&#34;&gt;p.193 図6.16&lt;/h3&gt;
&lt;p&gt;「エンジニアリングプラットフォームドメイン」が指しているのはたぶん「EPステートアカウント」配下なんだろう。
「EPステートアカウント」は「Engineering Platformステートアカウント」と思われる。
「EP非本番アカウント」と「EP本番アカウント」はプラットフォームの社内顧客が使うんだと思う。
「domain-nameアカウント」はどこかのチームが何かの用途に使っているアカウントとの関係を示しているだけで、これらの解説は恐らく本書には出て来ていない。&lt;/p&gt;
&lt;h3 id=&#34;p214&#34;&gt;p.214&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;このドメインは、同じくクラウドアカウントレベルの設定を扱う点で前のドメインと似ている&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは下記の意味:&lt;/p&gt;
&lt;p&gt;「この概念は、同じくクラウドアカウントレベルの設定を扱う点で、前章（6.4）で説明したクラウド管理IDと似ている」&lt;/p&gt;
&lt;h3 id=&#34;p275&#34;&gt;p.275&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;エンジニアリングプラットフォームプロダクトのリーダー層に直接属さないチームも含めて作業を分担せざるを得ない圧力もかかる&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは恐らく下記の意味:&lt;/p&gt;
&lt;p&gt;「直接属さないチームも含めて作業を分担せざるを得ない圧力が、エンジニアリングプラットフォームプロダクトチームのリーダー層にかかる」&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;両者の違いをもう一度見てみましょう&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「もう一度」とあるが初出と思われる。&lt;/p&gt;
&lt;h3 id=&#34;p276&#34;&gt;p.276&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;エクステンション&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;私は「サービス」「エクステンション」という分類にあまり馴染みがなかったが、本書が示す分類基準でいえば、例えばCrossplaneは恐らく「エクステンション」に分類されるのだろう。&lt;/p&gt;
&lt;h3 id=&#34;p340-図911&#34;&gt;p.340 図9.11&lt;/h3&gt;
&lt;p&gt;図中に見慣れない黒い点があるが&amp;hellip;ストリームイベントを示している？&lt;/p&gt;
&lt;h3 id=&#34;p344-図915&#34;&gt;p.344 図9.15&lt;/h3&gt;
&lt;p&gt;2本の垂直線の太さが同じだが、恐らく左はy軸、右はリリースイベントがあったx軸上の位置を示すものと思われる。&lt;/p&gt;
&lt;h2 id=&#34;所感&#34;&gt;所感&lt;/h2&gt;
&lt;p&gt;本書を読むと、自チームでも適用 or 参考にしたくなるものが何かしら見つかるのではないかと思う。&lt;/p&gt;









&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.oreilly.co.jp/books/9784814401413/&#34;&gt;Camille Fournier, Ian Nowland (2025) &amp;ldquo;プラットフォームエンジニアリング―成功するプラットフォームとチームを作るガイドライン&amp;rdquo;　オライリー・ジャパン&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>プラットフォームエンジニアリング関連のカンファレンス</title>
      <link>https://rindrics.com/posts/platform-engineering-conferences/</link>
      <pubDate>Sat, 22 Aug 2026 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/posts/platform-engineering-conferences/</guid>
      <description>&lt;p&gt;今後開催されるプラットフォームエンジニアリング関連カンファレンスのスケジュールと過去実績の統計。&lt;/p&gt;
&lt;p&gt;内側が国内、外側が国外で開催されるカンファレンス。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;密度曲線: 開催日およびCfPの過去実績（前後7日の移動平均）&lt;/li&gt;
&lt;li&gt;点: 今後の開催日およびCfP締切。黄枠の青点はCfP未クローズの開催日&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;conferences-seasonal&#34; id=&#34;conferences-seasonal-0&#34; data-chart-data=&#34;conferences-seasonal-0-data&#34;&gt;
  &lt;div class=&#34;conferences-seasonal__chart&#34; role=&#34;group&#34; aria-label=&#34;カンファレンス開催日と CFP 受付期間の年間密度&#34;&gt;&lt;/div&gt;
  &lt;div class=&#34;conferences-seasonal__tooltip&#34; hidden&gt;&lt;/div&gt;
  &lt;div class=&#34;conferences-seasonal__legend&#34; aria-hidden=&#34;true&#34;&gt;
    &lt;span&gt;&lt;i class=&#34;conferences-seasonal__swatch conferences-seasonal__swatch--conference&#34;&gt;&lt;/i&gt;開催日&lt;/span&gt;
    &lt;span&gt;&lt;i class=&#34;conferences-seasonal__swatch conferences-seasonal__swatch--cfp&#34;&gt;&lt;/i&gt;CFP締切&lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;script type=&#34;application/json&#34; id=&#34;conferences-seasonal-0-data&#34;&gt;[{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-03-02&#34;,&#34;to&#34;:&#34;2024-03-02&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;jaws-days-2024&#34;,&#34;name&#34;:&#34;JAWS DAYS 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;AWS&#34;,&#34;Cloud&#34;,&#34;Infrastructure&#34;],&#34;url&#34;:&#34;https://jawsdays2024.jaws-ug.jp/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2023-10-31&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2024-03-18&#34;,&#34;to&#34;:&#34;2024-03-20&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;srecon-americas-2024&#34;,&#34;name&#34;:&#34;SREcon Americas 2024&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Reliability&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://www.usenix.org/conference/srecon24americas&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-03-19&#34;,&#34;to&#34;:&#34;2024-03-22&#34;},&#34;country&#34;:&#34;FR&#34;,&#34;id&#34;:&#34;kubecon-europe-2024&#34;,&#34;name&#34;:&#34;KubeCon + CloudNativeCon Europe Paris 2024&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Kubernetes&#34;,&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/archive/2024/kubecon-cloudnativecon-europe/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2024-02-20&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2024-04-09&#34;,&#34;to&#34;:&#34;2024-04-10&#34;},&#34;country&#34;:&#34;NL&#34;,&#34;id&#34;:&#34;grafanacon-2024-amsterdam&#34;,&#34;name&#34;:&#34;GrafanaCON Amsterdam 2024&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Grafana&#34;,&#34;Observability&#34;,&#34;Prometheus&#34;],&#34;url&#34;:&#34;https://grafana.com/events/grafanacon/2024/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2024-03-01&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2024-04-16&#34;,&#34;to&#34;:&#34;2024-04-17&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;devopsdays-tokyo-2024&#34;,&#34;name&#34;:&#34;DevOpsDays Tokyo 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;DevOps&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://www.devopsdaystokyo.org/2024&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-06-08&#34;,&#34;to&#34;:&#34;2024-06-08&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;go-conference-japan-2024&#34;,&#34;name&#34;:&#34;Go Conference 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Go&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://gocon.jp/2024/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2024-02-26&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2024-06-10&#34;,&#34;to&#34;:&#34;2024-06-14&#34;},&#34;country&#34;:null,&#34;id&#34;:&#34;platformcon-2024&#34;,&#34;name&#34;:&#34;PlatformCon 2024&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Platform Engineering&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://2024.platformcon.com/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-06-15&#34;,&#34;to&#34;:&#34;2024-06-15&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;cloudnative-days-2024-summer&#34;,&#34;name&#34;:&#34;CloudNative Days Summer 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://cloudnativedays.jp/cnds2024&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-06-16&#34;,&#34;to&#34;:&#34;2024-06-16&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;jjug-ccc-2024-spring&#34;,&#34;name&#34;:&#34;JJUG CCC 2024 Spring&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Java&#34;,&#34;JVM&#34;,&#34;Spring&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://ccc2024spring.java-users.jp/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-06-20&#34;,&#34;to&#34;:&#34;2024-06-21&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;aws-summit-japan-2024&#34;,&#34;name&#34;:&#34;AWS Summit Japan 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;AWS&#34;,&#34;Cloud&#34;,&#34;Infrastructure&#34;],&#34;url&#34;:&#34;https://aws.amazon.com/jp/blogs/news/aws-jam-report-aws-summit-japan-2024/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-06-22&#34;,&#34;to&#34;:&#34;2024-06-22&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;kotlin-fest-2024&#34;,&#34;name&#34;:&#34;Kotlin Fest 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Kotlin&#34;,&#34;JVM&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://2024.kotlinfest.dev/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-06-25&#34;,&#34;to&#34;:&#34;2024-06-26&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;datadog-dash-2024-new-york&#34;,&#34;name&#34;:&#34;DASH New York 2024&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Datadog&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://dash.datadoghq.com/2024/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-06-25&#34;,&#34;to&#34;:&#34;2024-06-25&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;opentelemetry-community-day-2024-seattle&#34;,&#34;name&#34;:&#34;OpenTelemetry Community Day Seattle 2024&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;OpenTelemetry&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/archive/2024/open-telemetry-community-day/&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2024-03-22&#34;,&#34;to&#34;:&#34;2024-04-26&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2024-07-09&#34;,&#34;to&#34;:&#34;2024-07-09&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;platform-engineering-kaigi-2024&#34;,&#34;name&#34;:&#34;Platform Engineering Kaigi 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Platform Engineering&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://www.cnia.io/pek2024&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-07-11&#34;,&#34;to&#34;:&#34;2024-07-12&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;db-tech-showcase-2024-tokyo&#34;,&#34;name&#34;:&#34;db tech showcase 東京 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Database&#34;,&#34;Data&#34;],&#34;url&#34;:&#34;https://www.db-tech-showcase.com/2024/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-08-03&#34;,&#34;to&#34;:&#34;2024-08-04&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;sre-next-2024&#34;,&#34;name&#34;:&#34;SRE NEXT 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://sre-next.dev/2024/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-10-27&#34;,&#34;to&#34;:&#34;2024-10-27&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;jjug-ccc-2024-fall&#34;,&#34;name&#34;:&#34;JJUG CCC 2024 Fall&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Java&#34;,&#34;JVM&#34;,&#34;Spring&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://ccc2024fall.java-users.jp/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2024-06-13&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2024-10-29&#34;,&#34;to&#34;:&#34;2024-10-31&#34;},&#34;country&#34;:&#34;IE&#34;,&#34;id&#34;:&#34;srecon-emea-2024&#34;,&#34;name&#34;:&#34;SREcon EMEA 2024&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Reliability&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://www.usenix.org/conference/srecon24emea&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2024-06-09&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2024-11-12&#34;,&#34;to&#34;:&#34;2024-11-15&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;kubecon-north-america-2024&#34;,&#34;name&#34;:&#34;KubeCon + CloudNativeCon North America 2024&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Kubernetes&#34;,&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/archive/2024/kubecon-cloudnativecon-north-america/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2024-11-28&#34;,&#34;to&#34;:&#34;2024-11-29&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;cloudnative-days-2024-winter&#34;,&#34;name&#34;:&#34;CloudNative Days Winter 2024&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://cloudnativedays.jp/cndw2024&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2024-09-04&#34;,&#34;to&#34;:&#34;2024-09-30&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-01-26&#34;,&#34;to&#34;:&#34;2025-01-26&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;sre-kaigi-2025&#34;,&#34;name&#34;:&#34;SRE Kaigi 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;SRE&#34;],&#34;url&#34;:&#34;https://2025.srekaigi.net/&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2024-12-16&#34;,&#34;to&#34;:&#34;2025-01-09&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-03-01&#34;,&#34;to&#34;:&#34;2025-03-01&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;jaws-days-2025&#34;,&#34;name&#34;:&#34;JAWS DAYS 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;AWS&#34;,&#34;Cloud&#34;,&#34;Infrastructure&#34;],&#34;url&#34;:&#34;https://jawsdays2025.jaws-ug.jp/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-03-18&#34;,&#34;to&#34;:&#34;2025-03-20&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;javaone-2025&#34;,&#34;name&#34;:&#34;JavaOne 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Java&#34;,&#34;JVM&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://www.oracle.com/javaone/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2024-11-04&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-03-25&#34;,&#34;to&#34;:&#34;2025-03-27&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;srecon-americas-2025&#34;,&#34;name&#34;:&#34;SREcon Americas 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Reliability&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://www.usenix.org/conference/srecon25americas&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2024-11-24&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-04-01&#34;,&#34;to&#34;:&#34;2025-04-04&#34;},&#34;country&#34;:&#34;GB&#34;,&#34;id&#34;:&#34;kubecon-europe-2025&#34;,&#34;name&#34;:&#34;KubeCon + CloudNativeCon Europe London 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Kubernetes&#34;,&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/archive/2025/kubecon-cloudnativecon-europe/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2025-03-01&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-04-15&#34;,&#34;to&#34;:&#34;2025-04-17&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;devopsdays-tokyo-2025&#34;,&#34;name&#34;:&#34;DevOpsDays Tokyo 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;DevOps&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://www.devopsdaystokyo.org/2025&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2025-01-30&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-05-06&#34;,&#34;to&#34;:&#34;2025-05-08&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;grafanacon-2025-seattle&#34;,&#34;name&#34;:&#34;GrafanaCON Seattle 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Grafana&#34;,&#34;Observability&#34;,&#34;Prometheus&#34;],&#34;url&#34;:&#34;https://grafana.com/blog/save-the-date-grafanacon-2025-is-coming-to-seattle-in-may/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-05-23&#34;,&#34;to&#34;:&#34;2025-05-23&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;cloudnative-days-2025-summer&#34;,&#34;name&#34;:&#34;CloudNative Days Summer 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://cloudnativedays.jp/cnds2025&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-06-07&#34;,&#34;to&#34;:&#34;2025-06-07&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;jjug-ccc-2025-spring&#34;,&#34;name&#34;:&#34;JJUG CCC 2025 Spring&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Java&#34;,&#34;JVM&#34;,&#34;Spring&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://ccc2025spring.java-users.jp/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-06-10&#34;,&#34;to&#34;:&#34;2025-06-11&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;datadog-dash-2025-new-york&#34;,&#34;name&#34;:&#34;DASH New York 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Datadog&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://dash.datadoghq.com/2025/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2025-02-02&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-06-16&#34;,&#34;to&#34;:&#34;2025-06-17&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;kubecon-japan-2025&#34;,&#34;name&#34;:&#34;KubeCon + CloudNativeCon Japan 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/archive/2025/kubecon-cloudnativecon-japan/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2025-02-23&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-06-23&#34;,&#34;to&#34;:&#34;2025-06-27&#34;},&#34;country&#34;:null,&#34;id&#34;:&#34;platformcon-2025&#34;,&#34;name&#34;:&#34;PlatformCon 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Platform Engineering&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://2025.platformcon.com/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-06-25&#34;,&#34;to&#34;:&#34;2025-06-26&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;aws-summit-japan-2025&#34;,&#34;name&#34;:&#34;AWS Summit Japan 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;AWS&#34;,&#34;Cloud&#34;,&#34;Infrastructure&#34;],&#34;url&#34;:&#34;https://aws.amazon.com/jp/blogs/news/aws-summit-japan-2025-resilience/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2025-03-28&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-06-26&#34;,&#34;to&#34;:&#34;2025-06-26&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;opentelemetry-community-day-2025-denver&#34;,&#34;name&#34;:&#34;OpenTelemetry Community Day Denver 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;OpenTelemetry&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/open-observability-summit-otel-community-day/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-07-10&#34;,&#34;to&#34;:&#34;2025-07-11&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;db-tech-showcase-2025-tokyo&#34;,&#34;name&#34;:&#34;db tech showcase 東京 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Database&#34;,&#34;Data&#34;],&#34;url&#34;:&#34;https://db-tech-showcase.com/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-07-11&#34;,&#34;to&#34;:&#34;2025-07-12&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;sre-next-2025&#34;,&#34;name&#34;:&#34;SRE NEXT 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://sre-next.dev/2025/&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2025-01-20&#34;,&#34;to&#34;:&#34;2025-03-03&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-08-25&#34;,&#34;to&#34;:&#34;2025-08-28&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;gophercon-2025&#34;,&#34;name&#34;:&#34;GopherCon 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Go&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://vendelux.com/app/event/gophercon-2025/03a33004-1b60-44d5-8092-1617faa3f9dd&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2025-06-04&#34;,&#34;to&#34;:&#34;2025-07-02&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-09-18&#34;,&#34;to&#34;:&#34;2025-09-18&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;platform-engineering-kaigi-2025&#34;,&#34;name&#34;:&#34;Platform Engineering Kaigi 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Platform Engineering&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://www.cnia.io/pek2025&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-09-27&#34;,&#34;to&#34;:&#34;2025-09-28&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;go-conference-japan-2025&#34;,&#34;name&#34;:&#34;Go Conference 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Go&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://gocon.jp/2025/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2025-05-21&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-10-07&#34;,&#34;to&#34;:&#34;2025-10-09&#34;},&#34;country&#34;:&#34;IE&#34;,&#34;id&#34;:&#34;srecon-emea-2025&#34;,&#34;name&#34;:&#34;SREcon EMEA 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Reliability&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://www.usenix.org/conference/srecon25emea&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2025-05-29&#34;,&#34;to&#34;:&#34;2025-07-07&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-11-01&#34;,&#34;to&#34;:&#34;2025-11-01&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;kotlin-fest-2025&#34;,&#34;name&#34;:&#34;Kotlin Fest 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Kotlin&#34;,&#34;JVM&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://2025.kotlinfest.dev/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2025-05-27&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2025-11-10&#34;,&#34;to&#34;:&#34;2025-11-13&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;kubecon-north-america-2025&#34;,&#34;name&#34;:&#34;KubeCon + CloudNativeCon North America 2025&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Kubernetes&#34;,&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/archive/2025/kubecon-cloudnativecon-north-america/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-11-15&#34;,&#34;to&#34;:&#34;2025-11-15&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;jjug-ccc-2025-fall&#34;,&#34;name&#34;:&#34;JJUG CCC 2025 Fall&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Java&#34;,&#34;JVM&#34;,&#34;Spring&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://ccc2025fall.java-users.jp/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2025-11-18&#34;,&#34;to&#34;:&#34;2025-11-19&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;cloudnative-days-2025-winter&#34;,&#34;name&#34;:&#34;CloudNative Days Winter 2025&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://cloudnativedays.jp/cndw2025&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2025-09-04&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-01-31&#34;,&#34;to&#34;:&#34;2026-01-31&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;sre-kaigi-2026&#34;,&#34;name&#34;:&#34;SRE Kaigi 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;SRE&#34;],&#34;url&#34;:&#34;https://2026.srekaigi.net/&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2025-11-20&#34;,&#34;to&#34;:&#34;2025-12-18&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-03-07&#34;,&#34;to&#34;:&#34;2026-03-07&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;jaws-days-2026&#34;,&#34;name&#34;:&#34;JAWS DAYS 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;AWS&#34;,&#34;Cloud&#34;,&#34;Infrastructure&#34;],&#34;url&#34;:&#34;https://jawsdays2026.jaws-ug.jp/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2026-03-17&#34;,&#34;to&#34;:&#34;2026-03-19&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;javaone-2026&#34;,&#34;name&#34;:&#34;JavaOne 2026&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Java&#34;,&#34;JVM&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://www.oracle.com/javaone/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2025-10-12&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-03-23&#34;,&#34;to&#34;:&#34;2026-03-26&#34;},&#34;country&#34;:&#34;NL&#34;,&#34;id&#34;:&#34;kubecon-europe-2026&#34;,&#34;name&#34;:&#34;KubeCon + CloudNativeCon Europe Amsterdam 2026&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Kubernetes&#34;,&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/archive/2026/kubecon-cloudnativecon-europe/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2025-11-04&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-03-24&#34;,&#34;to&#34;:&#34;2026-03-26&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;srecon-americas-2026&#34;,&#34;name&#34;:&#34;SREcon Americas 2026&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Reliability&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://www.usenix.org/conference/srecon26americas&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2025-11-01&#34;,&#34;to&#34;:&#34;2026-03-01&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-04-14&#34;,&#34;to&#34;:&#34;2026-04-16&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;devopsdays-tokyo-2026&#34;,&#34;name&#34;:&#34;DevOpsDays Tokyo 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;DevOps&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://devopsdays.org/events/2026-tokyo/welcome/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2026-01-19&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-04-20&#34;,&#34;to&#34;:&#34;2026-04-22&#34;},&#34;country&#34;:&#34;ES&#34;,&#34;id&#34;:&#34;grafanacon-2026-barcelona&#34;,&#34;name&#34;:&#34;GrafanaCON Barcelona 2026&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Grafana&#34;,&#34;Observability&#34;,&#34;Prometheus&#34;],&#34;url&#34;:&#34;https://grafana.com/events/grafanacon/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2026-05-14&#34;,&#34;to&#34;:&#34;2026-05-15&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;cloudnative-days-2026-nagoya&#34;,&#34;name&#34;:&#34;クラウドネイティブ会議 2026 名古屋&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://kaigi.cloudnativedays.jp/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2026-05-30&#34;,&#34;to&#34;:&#34;2026-05-30&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;jjug-ccc-2026-spring&#34;,&#34;name&#34;:&#34;JJUG CCC 2026 Spring&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Java&#34;,&#34;JVM&#34;,&#34;Spring&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://ccc2026spring.java-users.jp/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2026-06-09&#34;,&#34;to&#34;:&#34;2026-06-10&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;datadog-dash-2026-new-york&#34;,&#34;name&#34;:&#34;DASH New York 2026&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Datadog&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://dash.datadoghq.com/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2026-02-22&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-06-22&#34;,&#34;to&#34;:&#34;2026-06-26&#34;},&#34;country&#34;:null,&#34;id&#34;:&#34;platformcon-2026&#34;,&#34;name&#34;:&#34;PlatformCon 2026&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Platform Engineering&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://2026.platformcon.com/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2026-06-25&#34;,&#34;to&#34;:&#34;2026-06-26&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;aws-summit-japan-2026&#34;,&#34;name&#34;:&#34;AWS Summit Japan 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;AWS&#34;,&#34;Cloud&#34;,&#34;Infrastructure&#34;],&#34;url&#34;:&#34;https://aws.amazon.com/jp/events/summits/japan/&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2026-07-10&#34;,&#34;to&#34;:&#34;2026-07-11&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;sre-next-2026&#34;,&#34;name&#34;:&#34;SRE NEXT 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://sre-next.dev/2026/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2026-03-29&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-07-28&#34;,&#34;to&#34;:&#34;2026-07-30&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;kubecon-japan-2026&#34;,&#34;name&#34;:&#34;KubeCon + CloudNativeCon Japan 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-japan/&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2026-01-19&#34;,&#34;to&#34;:&#34;2026-03-04&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-08-03&#34;,&#34;to&#34;:&#34;2026-08-06&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;gophercon-2026&#34;,&#34;name&#34;:&#34;GopherCon 2026&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Go&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://www.gophercon.com/&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2026-05-15&#34;,&#34;to&#34;:&#34;2026-06-15&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-09-11&#34;,&#34;to&#34;:&#34;2026-09-11&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;go-conference-japan-2026&#34;,&#34;name&#34;:&#34;Go Conference 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Go&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://gocon.jp/&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2026-06-23&#34;,&#34;to&#34;:&#34;2026-07-20&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-09-26&#34;,&#34;to&#34;:&#34;2026-09-26&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;platform-engineering-kaigi-2026&#34;,&#34;name&#34;:&#34;Platform Engineering Kaigi 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Platform Engineering&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://www.cnia.io/pek2026/&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2026-05-27&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-10-13&#34;,&#34;to&#34;:&#34;2026-10-15&#34;},&#34;country&#34;:&#34;IE&#34;,&#34;id&#34;:&#34;srecon-emea-2026&#34;,&#34;name&#34;:&#34;SREcon EMEA 2026&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Reliability&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://www.usenix.org/conference/srecon26emea&#34;},{&#34;cfp&#34;:{&#34;to&#34;:&#34;2026-05-31&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-11-09&#34;,&#34;to&#34;:&#34;2026-11-12&#34;},&#34;country&#34;:&#34;US&#34;,&#34;id&#34;:&#34;kubecon-north-america-2026&#34;,&#34;name&#34;:&#34;KubeCon + CloudNativeCon North America 2026&#34;,&#34;region&#34;:&#34;international&#34;,&#34;tags&#34;:[&#34;Kubernetes&#34;,&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2026-06-08&#34;,&#34;to&#34;:&#34;2026-07-12&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-11-14&#34;,&#34;to&#34;:&#34;2026-11-14&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;kotlin-fest-2026&#34;,&#34;name&#34;:&#34;Kotlin Fest 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Kotlin&#34;,&#34;JVM&#34;,&#34;Developer Experience&#34;],&#34;url&#34;:&#34;https://2026.kotlinfest.dev/&#34;},{&#34;cfp&#34;:{&#34;from&#34;:&#34;2026-08-31&#34;,&#34;to&#34;:&#34;2026-09-20&#34;},&#34;conference&#34;:{&#34;from&#34;:&#34;2026-11-19&#34;,&#34;to&#34;:&#34;2026-11-20&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;cloudnative-days-2026-winter&#34;,&#34;name&#34;:&#34;CloudNative Days Winter 2026&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;Cloud Native&#34;,&#34;Platform Engineering&#34;],&#34;url&#34;:&#34;https://event.cloudnativedays.jp/cndw2026&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2027-02-20&#34;,&#34;to&#34;:&#34;2027-02-20&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;sre-kaigi-2027&#34;,&#34;name&#34;:&#34;SRE Kaigi 2027&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;SRE&#34;],&#34;url&#34;:&#34;https://blog.srekaigi.net/entry/2026/07/22/114937&#34;},{&#34;cfp&#34;:null,&#34;conference&#34;:{&#34;from&#34;:&#34;2027-07-09&#34;,&#34;to&#34;:&#34;2027-07-10&#34;},&#34;country&#34;:&#34;JP&#34;,&#34;id&#34;:&#34;sre-next-2027&#34;,&#34;name&#34;:&#34;SRE NEXT 2027&#34;,&#34;region&#34;:&#34;domestic&#34;,&#34;tags&#34;:[&#34;SRE&#34;,&#34;Observability&#34;],&#34;url&#34;:&#34;https://sre-next.dev/2027/&#34;}]&lt;/script&gt;





&lt;style&gt;
  .slider-switch {
    position: relative;
    width: 60px;
    height: 28px;
    background-color: #ddd;
    border-radius: 28px;
    cursor: pointer;
    transition: background-color 0.3s;
    display: inline-block;
  }
  .slider-switch.international {
    background-color: #0066cc;
  }
  .slider-switch::after {
    content: &#39;&#39;;
    position: absolute;
    height: 24px;
    width: 24px;
    left: 2px;
    top: 2px;
    background-color: white;
    border-radius: 50%;
    transition: transform 0.3s;
  }
  .slider-switch.international::after {
    transform: translateX(32px);
  }
  .region-label {
    font-size: 0.9rem;
    font-weight: 500;
    min-width: 40px;
    text-align: center;
  }
  .region-label.active {
    color: #0066cc;
    font-weight: bold;
  }
&lt;/style&gt;

&lt;div id=&#34;conferences-filter-container&#34; style=&#34;margin-bottom: 2rem;&#34;&gt;
  &lt;div style=&#34;display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.75rem;&#34;&gt;
    &lt;span class=&#34;region-label active&#34; id=&#34;region-label-domestic&#34;&gt;国内&lt;/span&gt;
    &lt;div class=&#34;slider-switch&#34; id=&#34;region-slider-display&#34;&gt;&lt;/div&gt;
    &lt;span class=&#34;region-label&#34; id=&#34;region-label-international&#34;&gt;海外&lt;/span&gt;
  &lt;/div&gt;

  &lt;div style=&#34;display: flex; gap: 1.25rem; flex-wrap: wrap; align-items: center; margin-bottom: 1rem;&#34;&gt;
    &lt;div style=&#34;display: flex; align-items: center; gap: 0.5rem;&#34;&gt;
      &lt;select id=&#34;tag-filter&#34; style=&#34;padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px;&#34;&gt;
        &lt;option value=&#34;&#34;&gt;すべてのタグ&lt;/option&gt;
      &lt;/select&gt;
    &lt;/div&gt;

    &lt;div style=&#34;display: flex; align-items: center; gap: 0.5rem;&#34;&gt;
      &lt;label for=&#34;cfp-month-filter&#34; style=&#34;font-size: 0.9rem; white-space: nowrap;&#34;&gt;CfP 締切&lt;/label&gt;
      &lt;select id=&#34;cfp-month-filter&#34; style=&#34;padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px;&#34;&gt;
        &lt;option value=&#34;&#34;&gt;すべての月&lt;/option&gt;
      &lt;/select&gt;
    &lt;/div&gt;

    &lt;div style=&#34;display: flex; align-items: center; gap: 0.5rem;&#34;&gt;
      &lt;label for=&#34;conference-month-filter&#34; style=&#34;font-size: 0.9rem; white-space: nowrap;&#34;&gt;開催日&lt;/label&gt;
      &lt;select id=&#34;conference-month-filter&#34; style=&#34;padding: 0.5rem; border: 1px solid #ccc; border-radius: 4px;&#34;&gt;
        &lt;option value=&#34;&#34;&gt;すべての月&lt;/option&gt;
      &lt;/select&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;div style=&#34;margin-bottom: 1rem; font-size: 0.9rem; color: #666;&#34;&gt;
    該当: &lt;span id=&#34;result-count&#34;&gt;0&lt;/span&gt; 件
  &lt;/div&gt;
&lt;/div&gt;

&lt;div style=&#34;max-height: 500px; overflow-y: auto; border: 1px solid #ddd; border-radius: 4px;&#34;&gt;
  &lt;table style=&#34;width: 100%; border-collapse: collapse; margin: 0;&#34;&gt;
    &lt;thead&gt;
      &lt;tr style=&#34;background: #f5f5f5; border-bottom: 2px solid #ddd; position: sticky; top: 0;&#34;&gt;
        &lt;th style=&#34;padding: 0.25rem; text-align: center; border: 1px solid #ddd;&#34;&gt;イベント&lt;/th&gt;
        &lt;th style=&#34;padding: 0.25rem; text-align: center; border: 1px solid #ddd;&#34;&gt;CfP締切&lt;/th&gt;
        &lt;th style=&#34;padding: 0.25rem; text-align: center; border: 1px solid #ddd;&#34;&gt;開催時期&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody id=&#34;conferences-tbody&#34;&gt;
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      &lt;tr class=&#34;conf-row&#34; data-region=&#34;international&#34; data-tags=&#34;Go,Developer Experience&#34; data-conf-from=&#34;2026-08-03&#34; data-conf-to=&#34;2026-08-06&#34; data-cfp-from=&#34;2026-01-19&#34; data-cfp-to=&#34;2026-03-04&#34; style=&#34;border-bottom: 1px solid #ddd;&#34;&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd;&#34;&gt;
          &lt;a href=&#34;https://www.gophercon.com/&#34; target=&#34;_blank&#34;&gt;GopherCon 2026&lt;/a&gt;
          &lt;div style=&#34;display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.25rem; font-size: 0.65rem;&#34;&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Go&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Developer Experience&lt;/span&gt;&lt;/div&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34;&gt;
          &lt;span class=&#34;cfp-date-display&#34; data-date=&#34;2026-03-04&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34; class=&#34;conf-date-cell&#34;&gt;
          &lt;span class=&#34;conf-date-display&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      
      
      
      
      &lt;tr class=&#34;conf-row&#34; data-region=&#34;domestic&#34; data-tags=&#34;Go,Developer Experience&#34; data-conf-from=&#34;2026-09-11&#34; data-conf-to=&#34;2026-09-11&#34; data-cfp-from=&#34;2026-05-15&#34; data-cfp-to=&#34;2026-06-15&#34; style=&#34;border-bottom: 1px solid #ddd;&#34;&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd;&#34;&gt;
          &lt;a href=&#34;https://gocon.jp/&#34; target=&#34;_blank&#34;&gt;Go Conference 2026&lt;/a&gt;
          &lt;div style=&#34;display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.25rem; font-size: 0.65rem;&#34;&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Go&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Developer Experience&lt;/span&gt;&lt;/div&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34;&gt;
          &lt;span class=&#34;cfp-date-display&#34; data-date=&#34;2026-06-15&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34; class=&#34;conf-date-cell&#34;&gt;
          &lt;span class=&#34;conf-date-display&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      
      
      
      
      &lt;tr class=&#34;conf-row&#34; data-region=&#34;domestic&#34; data-tags=&#34;Platform Engineering,Developer Experience&#34; data-conf-from=&#34;2026-09-26&#34; data-conf-to=&#34;2026-09-26&#34; data-cfp-from=&#34;2026-06-23&#34; data-cfp-to=&#34;2026-07-20&#34; style=&#34;border-bottom: 1px solid #ddd;&#34;&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd;&#34;&gt;
          &lt;a href=&#34;https://www.cnia.io/pek2026/&#34; target=&#34;_blank&#34;&gt;Platform Engineering Kaigi 2026&lt;/a&gt;
          &lt;div style=&#34;display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.25rem; font-size: 0.65rem;&#34;&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Platform Engineering&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Developer Experience&lt;/span&gt;&lt;/div&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34;&gt;
          &lt;span class=&#34;cfp-date-display&#34; data-date=&#34;2026-07-20&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34; class=&#34;conf-date-cell&#34;&gt;
          &lt;span class=&#34;conf-date-display&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      
      
      
      
      &lt;tr class=&#34;conf-row&#34; data-region=&#34;international&#34; data-tags=&#34;SRE,Reliability,Observability&#34; data-conf-from=&#34;2026-10-13&#34; data-conf-to=&#34;2026-10-15&#34; data-cfp-from=&#34;&#34; data-cfp-to=&#34;2026-05-27&#34; style=&#34;border-bottom: 1px solid #ddd;&#34;&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd;&#34;&gt;
          &lt;a href=&#34;https://www.usenix.org/conference/srecon26emea&#34; target=&#34;_blank&#34;&gt;SREcon EMEA 2026&lt;/a&gt;
          &lt;div style=&#34;display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.25rem; font-size: 0.65rem;&#34;&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;SRE&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Reliability&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Observability&lt;/span&gt;&lt;/div&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34;&gt;
          &lt;span class=&#34;cfp-date-display&#34; data-date=&#34;2026-05-27&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34; class=&#34;conf-date-cell&#34;&gt;
          &lt;span class=&#34;conf-date-display&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      
      
      
      
      &lt;tr class=&#34;conf-row&#34; data-region=&#34;international&#34; data-tags=&#34;Kubernetes,Cloud Native,Platform Engineering,Observability&#34; data-conf-from=&#34;2026-11-09&#34; data-conf-to=&#34;2026-11-12&#34; data-cfp-from=&#34;&#34; data-cfp-to=&#34;2026-05-31&#34; style=&#34;border-bottom: 1px solid #ddd;&#34;&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd;&#34;&gt;
          &lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/&#34; target=&#34;_blank&#34;&gt;KubeCon &amp;#43; CloudNativeCon North America 2026&lt;/a&gt;
          &lt;div style=&#34;display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.25rem; font-size: 0.65rem;&#34;&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Kubernetes&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Cloud Native&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Platform Engineering&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Observability&lt;/span&gt;&lt;/div&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34;&gt;
          &lt;span class=&#34;cfp-date-display&#34; data-date=&#34;2026-05-31&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34; class=&#34;conf-date-cell&#34;&gt;
          &lt;span class=&#34;conf-date-display&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      
      
      
      
      &lt;tr class=&#34;conf-row&#34; data-region=&#34;domestic&#34; data-tags=&#34;Kotlin,JVM,Developer Experience&#34; data-conf-from=&#34;2026-11-14&#34; data-conf-to=&#34;2026-11-14&#34; data-cfp-from=&#34;2026-06-08&#34; data-cfp-to=&#34;2026-07-12&#34; style=&#34;border-bottom: 1px solid #ddd;&#34;&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd;&#34;&gt;
          &lt;a href=&#34;https://2026.kotlinfest.dev/&#34; target=&#34;_blank&#34;&gt;Kotlin Fest 2026&lt;/a&gt;
          &lt;div style=&#34;display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.25rem; font-size: 0.65rem;&#34;&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Kotlin&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;JVM&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Developer Experience&lt;/span&gt;&lt;/div&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34;&gt;
          &lt;span class=&#34;cfp-date-display&#34; data-date=&#34;2026-07-12&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34; class=&#34;conf-date-cell&#34;&gt;
          &lt;span class=&#34;conf-date-display&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      
      
      
      
      &lt;tr class=&#34;conf-row&#34; data-region=&#34;domestic&#34; data-tags=&#34;Cloud Native,Platform Engineering&#34; data-conf-from=&#34;2026-11-19&#34; data-conf-to=&#34;2026-11-20&#34; data-cfp-from=&#34;2026-08-31&#34; data-cfp-to=&#34;2026-09-20&#34; style=&#34;border-bottom: 1px solid #ddd;&#34;&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd;&#34;&gt;
          &lt;a href=&#34;https://event.cloudnativedays.jp/cndw2026&#34; target=&#34;_blank&#34;&gt;CloudNative Days Winter 2026&lt;/a&gt;
          &lt;div style=&#34;display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.25rem; font-size: 0.65rem;&#34;&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Cloud Native&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Platform Engineering&lt;/span&gt;&lt;/div&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34;&gt;
          &lt;span class=&#34;cfp-date-display&#34; data-date=&#34;2026-09-20&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34; class=&#34;conf-date-cell&#34;&gt;
          &lt;span class=&#34;conf-date-display&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      
      
      
      
      &lt;tr class=&#34;conf-row&#34; data-region=&#34;domestic&#34; data-tags=&#34;SRE&#34; data-conf-from=&#34;2027-02-20&#34; data-conf-to=&#34;2027-02-20&#34; data-cfp-from=&#34;&#34; data-cfp-to=&#34;&#34; style=&#34;border-bottom: 1px solid #ddd;&#34;&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd;&#34;&gt;
          &lt;a href=&#34;https://blog.srekaigi.net/entry/2026/07/22/114937&#34; target=&#34;_blank&#34;&gt;SRE Kaigi 2027&lt;/a&gt;
          &lt;div style=&#34;display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.25rem; font-size: 0.65rem;&#34;&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;SRE&lt;/span&gt;&lt;/div&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34;&gt;
          未定
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34; class=&#34;conf-date-cell&#34;&gt;
          &lt;span class=&#34;conf-date-display&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      
      
      
      
      &lt;tr class=&#34;conf-row&#34; data-region=&#34;domestic&#34; data-tags=&#34;SRE,Observability&#34; data-conf-from=&#34;2027-07-09&#34; data-conf-to=&#34;2027-07-10&#34; data-cfp-from=&#34;&#34; data-cfp-to=&#34;&#34; style=&#34;border-bottom: 1px solid #ddd;&#34;&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd;&#34;&gt;
          &lt;a href=&#34;https://sre-next.dev/2027/&#34; target=&#34;_blank&#34;&gt;SRE NEXT 2027&lt;/a&gt;
          &lt;div style=&#34;display: flex; flex-wrap: wrap; gap: 0.25rem; margin-top: 0.25rem; font-size: 0.65rem;&#34;&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;SRE&lt;/span&gt;&lt;span class=&#34;tag-label&#34; style=&#34;white-space: nowrap;&#34;&gt;Observability&lt;/span&gt;&lt;/div&gt;
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34;&gt;
          未定
        &lt;/td&gt;
        &lt;td style=&#34;padding: 0.35rem; border: 1px solid #ddd; font-size: 0.9rem; text-align: center;&#34; class=&#34;conf-date-cell&#34;&gt;
          &lt;span class=&#34;conf-date-display&#34;&gt;&lt;/span&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
      
      
      &lt;tr id=&#34;conferences-empty-row&#34; style=&#34;display: none;&#34;&gt;
        &lt;td colspan=&#34;3&#34; style=&#34;padding: 1rem; border: 1px solid #ddd; text-align: center; color: #666;&#34;&gt;表示するデータがありません&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
&lt;/div&gt;

&lt;script&gt;
(function() {
  let currentFilters = {
    region: &#39;domestic&#39;,
    tag: &#39;&#39;,
    cfpMonth: &#39;&#39;,
    conferenceMonth: &#39;&#39;
  };

  function monthsCovered(fromStr, toStr) {
    const months = new Set();
    if (!fromStr) {
      return months;
    }

    const start = new Date(`${fromStr}T00:00:00Z`);
    const end = new Date(`${toStr || fromStr}T00:00:00Z`);
    const cursor = new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), 1));
    while (cursor &lt;= end) {
      months.add(String(cursor.getUTCMonth() + 1));
      cursor.setUTCMonth(cursor.getUTCMonth() + 1);
    }
    return months;
  }

  
  const allTags = new Set();
  document.querySelectorAll(&#39;.conf-row&#39;).forEach(row =&gt; {
    const tags = row.dataset.tags.split(&#39;,&#39;).filter(t =&gt; t);
    tags.forEach(tag =&gt; allTags.add(tag));
  });

  const tagSelect = document.getElementById(&#39;tag-filter&#39;);
  Array.from(allTags).sort().forEach(tag =&gt; {
    const option = document.createElement(&#39;option&#39;);
    option.value = tag;
    option.textContent = tag;
    tagSelect.appendChild(option);
  });

  const monthSelects = [
    document.getElementById(&#39;cfp-month-filter&#39;),
    document.getElementById(&#39;conference-month-filter&#39;)
  ];
  monthSelects.forEach((select) =&gt; {
    for (let month = 1; month &lt;= 12; month += 1) {
      const option = document.createElement(&#39;option&#39;);
      option.value = String(month);
      option.textContent = `${month}月`;
      select.appendChild(option);
    }
  });

  function updateDisplay() {
    const rows = document.querySelectorAll(&#39;.conf-row&#39;);
    let visibleCount = 0;

    rows.forEach(row =&gt; {
      const region = row.dataset.region;
      const tags = row.dataset.tags.split(&#39;,&#39;).filter(t =&gt; t);
      const cfpFrom = row.dataset.cfpFrom;
      const cfpTo = row.dataset.cfpTo;
      const conferenceMatch = !currentFilters.conferenceMonth ||
        monthsCovered(row.dataset.confFrom, row.dataset.confTo).has(currentFilters.conferenceMonth);
      const cfpMatch = !currentFilters.cfpMonth || (
        Boolean(cfpFrom || cfpTo) &amp;&amp;
        monthsCovered(cfpFrom || cfpTo, cfpTo || cfpFrom).has(currentFilters.cfpMonth)
      );

      let regionMatch = region === currentFilters.region;
      let tagMatch = !currentFilters.tag || tags.includes(currentFilters.tag);

      if (regionMatch &amp;&amp; tagMatch &amp;&amp; conferenceMatch &amp;&amp; cfpMatch) {
        row.style.display = &#39;&#39;;
        visibleCount++;
      } else {
        row.style.display = &#39;none&#39;;
      }
    });

    document.getElementById(&#39;result-count&#39;).textContent = visibleCount;
    document.getElementById(&#39;conferences-empty-row&#39;).style.display = visibleCount === 0 ? &#39;&#39; : &#39;none&#39;;
  }

  
  const regionSlider = document.getElementById(&#39;region-slider-display&#39;);
  regionSlider.addEventListener(&#39;click&#39;, function() {
    if (currentFilters.region === &#39;domestic&#39;) {
      currentFilters.region = &#39;international&#39;;
      document.getElementById(&#39;region-label-domestic&#39;).classList.remove(&#39;active&#39;);
      document.getElementById(&#39;region-label-international&#39;).classList.add(&#39;active&#39;);
    } else {
      currentFilters.region = &#39;domestic&#39;;
      document.getElementById(&#39;region-label-domestic&#39;).classList.add(&#39;active&#39;);
      document.getElementById(&#39;region-label-international&#39;).classList.remove(&#39;active&#39;);
    }
    regionSlider.classList.toggle(&#39;international&#39;);
    updateDisplay();
  });

  
  document.getElementById(&#39;tag-filter&#39;).addEventListener(&#39;change&#39;, function() {
    currentFilters.tag = this.value;
    updateDisplay();
  });

  document.getElementById(&#39;cfp-month-filter&#39;).addEventListener(&#39;change&#39;, function() {
    currentFilters.cfpMonth = this.value;
    updateDisplay();
  });

  document.getElementById(&#39;conference-month-filter&#39;).addEventListener(&#39;change&#39;, function() {
    currentFilters.conferenceMonth = this.value;
    updateDisplay();
  });

  
  const weekdays = [&#39;日&#39;, &#39;月&#39;, &#39;火&#39;, &#39;水&#39;, &#39;木&#39;, &#39;金&#39;, &#39;土&#39;];
  document.querySelectorAll(&#39;.cfp-date-display&#39;).forEach(span =&gt; {
    span.textContent = span.dataset.date.replaceAll(&#34;-&#34;, &#34;/&#34;);
  });

  document.querySelectorAll(&#39;.conf-date-cell&#39;).forEach(cell =&gt; {
    const row = cell.closest(&#39;.conf-row&#39;);
    const fromStr = row.dataset.confFrom;
    const toStr = row.dataset.confTo;

    if (fromStr) {
      const from = new Date(fromStr + &#39;T00:00:00Z&#39;);
      const to = new Date(toStr + &#39;T00:00:00Z&#39;);

      const fromWeekday = weekdays[from.getUTCDay()];
      const toWeekday = weekdays[to.getUTCDay()];

      let displayText;
      if (fromStr === toStr) {
        displayText = `${fromStr} (${fromWeekday})`;
      } else {
        displayText = `${fromStr} (${fromWeekday}) – ${toStr} (${toWeekday})`;
      }
      const span = cell.querySelector(&#39;.conf-date-display&#39;);
      if (span) {
        span.textContent = displayText;
      }
    }
  });

  
  updateDisplay();
})();
&lt;/script&gt;</description>
    </item>
    
    <item>
      <title>Organizational efficiencyとProduct and feature deliveryは何が違うのか</title>
      <link>https://rindrics.com/posts/organizational-efficiency-product-delivery/</link>
      <pubDate>Wed, 12 Aug 2026 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/posts/organizational-efficiency-product-delivery/</guid>
      <description>&lt;p&gt;&amp;ldquo;&lt;a href=&#34;https://cloudnativeplatforms.com/whitepapers/platforms/&#34;&gt;CNCF Platforms White Paper&lt;/a&gt;&amp;rdquo; に紛らわしい箇所があったが、自分なりに理解できた気がするので、思考の整理を兼ねて言語化しておく。&lt;/p&gt;
&lt;p&gt;扱うテーマは &amp;ldquo;How to measure the success of platforms&amp;rdquo;: プラットフォームの成功を客観的・定量的に計測するためのガイドラインの部分&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;ここで推奨されている計測対象は、下記の3カテゴリに分かれている。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;カテゴリ&lt;/th&gt;
          &lt;th&gt;指標&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;User satisfaction and productivity&lt;/td&gt;
          &lt;td&gt;アクティブユーザーと定着率、NPS、&lt;a href=&#34;https://queue.acm.org/detail.cfm?id=3454124&#34;&gt;SPACE&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Organizational efficiency&lt;/td&gt;
          &lt;td&gt;各種のレイテンシ（後述）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Product and feature delivery&lt;/td&gt;
          &lt;td&gt;DORA の（旧）4指標&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;当初、第二カテゴリと第三カテゴリの違いがいまいち腑に落ちなかった。
&amp;ldquo;Organizational efficiency&amp;rdquo; も &amp;ldquo;Product and feature delivery&amp;rdquo; も、要は効率に関する計測として一括りにできるようにも思えてしまい、別カテゴリとされる理由がわからなかった。&lt;/p&gt;
&lt;p&gt;それぞれについて少し注意深く読んでみると、両者の違いは、「計測しているイベントの性質」および「誰が誰を待たせているか」にあるような気がする。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Product and feature delivery&amp;rdquo; で計測するDORAの4指標はいずれも、反復的なデリバリー性能を示すものだ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deployment Frequency&lt;/li&gt;
&lt;li&gt;Lead Time for Changes&lt;/li&gt;
&lt;li&gt;Change Failure Rate&lt;/li&gt;
&lt;li&gt;Time to Restore Service&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一方で、&amp;ldquo;Organizational efficiency&amp;rdquo; とされる下記の3指標は、いずれも何かが初めて実現されるまでの時間に関するメトリクスであることがわかる:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;指標&lt;/th&gt;
          &lt;th&gt;観点&lt;/th&gt;
          &lt;th&gt;支配的な要因&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Latency from request to fulfillment of a service or capability, such as a database or test environment&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;開発リソース&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;セルフサービス化の度合い&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Latency to build and deploy a brand new service into production&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;サービス&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;ゴールデンパスとテンプレートの整備度&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Time for a new user to submit their first code changes to their product&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;ヒト&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;ドキュメント・権限・開発環境の整備度&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これらの理解をふまえると、両カテゴリは概ね下記のように表現しても良いと思う:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organizational efficiency: プラットフォームが顧客である開発者を待たせている時間&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Product and feature delivery: 組織がエンドユーザーを待たせている時間&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それぞれを計測した場合の効果については、たぶん下記のような整理になるのではと思う:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;程度の差ではあるが、プラットフォームチームの取組みの効果を純粋に見たいのであれば、実装やレビューの所要時間の影響を受ける &amp;ldquo;Product and feature delivery&amp;rdquo; に比べて、&amp;ldquo;Organizational efficiency&amp;rdquo; のほうが適しているだろう&lt;/li&gt;
&lt;li&gt;ただし、プラットフォームチームの取組みは組織としてのバリューストリームに関わるものになっていないとまずい。原文にもあるように &amp;ldquo;Product and feature delivery&amp;rdquo; のほうが &amp;ldquo;true measure of the success of a platform&amp;rdquo; だ。ここを外してしまうと、プラットフォームが &amp;ldquo;an expense quite disconnected from their primary value streams&amp;rdquo; と見なされがちになる&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本記事を書きながら、2年ほど前に組織メトリクスに関する一過性ブーム的な盛り上がりがあったことを思い出していた。
最近は落ち着いてきた（飽きる企業が出てきた？）ように思うが、当時は組織メトリクスに対して、計測するだけで何かが起こるかのような、過度の期待があったのではないかと想像する。
組織メトリクスは、それぞれのカテゴリが何を映しているのかを踏まえた上で、必要な情報を得るための普通の手段として運用したらいい。&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;執筆時点では &amp;ldquo;platform engineering white paper&amp;rdquo; で検索すると、&lt;a href=&#34;https://tag-app-delivery.cncf.io/whitepapers/platforms/&#34;&gt;旧サイトのドキュメント&lt;/a&gt;（&lt;a href=&#34;https://cloudnativeplatforms.com/whitepapers/platforms/v1/&#34;&gt;新サイトのv1&lt;/a&gt;相当）がトップに出てきてしまう。本記事の大半はこのあたりの事情を知らずに旧サイトのv1を読んで書いたのだが、執筆時点の最新版である&lt;a href=&#34;https://github.com/Cloud-Native-Platform-Engineering/cnpe-community/blob/9db35ef39ff8a22ad20e97007105d87f79bc68cb/platforms-whitepaper/latest/index.md&#34;&gt;v1.1&lt;/a&gt;においても &amp;ldquo;How to measure the success of platforms&amp;rdquo; の内容は同一だった&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;原文が参照しているDORAの指標は2019年ごろのものなので（原文で参照されているのは&lt;a href=&#34;https://cloud.google.com/blog/products/devops-sre/the-2019-accelerate-state-of-devops-elite-performance-productivity-and-scaling&#34;&gt;こちら&lt;/a&gt;だが、内容的には&lt;a href=&#34;https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance&#34;&gt;こちら&lt;/a&gt;のほうが適当に思える）、&amp;ldquo;time to restore service&amp;rdquo; の改称や第5メトリクスの追加・分類軸の変更（&lt;a href=&#34;https://dora.dev/insights/dora-metrics-history&#34;&gt;ref&lt;/a&gt;）は反映されていない。
これらは次の版で取り込まれるのかもしれない&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;もっとも、二つ目の &amp;ldquo;Latency to build and deploy a brand new service into production&amp;rdquo; と三つ目の &amp;ldquo;Time for a new user to submit their first code changes to their product&amp;quot;については、実装やコードレビューの所要時間も含まれうる&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;ちなみに、プラットフォームの利用は個人・チーム・組織の性能を向上させる一方で、&amp;ldquo;throughput&amp;rdquo; と &amp;ldquo;stability&amp;rdquo; の各指標を低下させることが報告されている（&lt;a href=&#34;https://dora.dev/research/2024/dora-report/2024-dora-accelerate-state-of-devops-report.pdf&#34;&gt;ref&lt;/a&gt;）&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Model the Data, Not the Interface</title>
      <link>https://rindrics.com/posts/model-the-data-not-the-interface/</link>
      <pubDate>Sat, 08 Aug 2026 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/posts/model-the-data-not-the-interface/</guid>
      <description>&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-08-08-cms/shared-file.webp&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;How a simple YAML data model let me add a client-facing CMS without touching the existing implementation.&lt;/p&gt;
&lt;h2 id=&#34;the-story&#34;&gt;The Story&lt;/h2&gt;
&lt;p&gt;A client asked for a profile page featuring his career timeline. Straightforward request. I built it, deployed it, and moved on.&lt;/p&gt;
&lt;p&gt;Months later, he came back with a new request: he wanted to update the timeline himself—to add new positions and modify past entries.&lt;/p&gt;
&lt;p&gt;Until then, I had been making those changes for him. Giving him direct access to the data wasn&amp;rsquo;t an option either: he was a non-technical user, and GitHub access was deliberately off the table.&lt;/p&gt;
&lt;p&gt;At first glance, adding a content management interface sounded like a change that might ripple through the existing implementation.&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;The reason went back to a small design decision I had made months earlier, before a CMS was even a consideration.&lt;/p&gt;
&lt;h2 id=&#34;the-initial-design-choice-yaml-over-markdown&#34;&gt;The Initial Design Choice: YAML Over Markdown&lt;/h2&gt;
&lt;p&gt;When I first built the profile page, I didn&amp;rsquo;t hard-code the timeline into HTML, but I didn&amp;rsquo;t put it in Markdown either. I started by asking what kind of content a career timeline actually is.&lt;/p&gt;
&lt;p&gt;A career history isn&amp;rsquo;t really a document. It&amp;rsquo;s structured data: a collection of dates, each associated with one or more events. So I represented it that way:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# data/timeline.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;entries&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#268bd2&#34;&gt;date&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;2020&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;events&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - Joined the neighborhood cat council
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - Took responsibility for afternoon naps
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#268bd2&#34;&gt;date&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;2021&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#268bd2&#34;&gt;events&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - Became a boss cat
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - Led a team of 5 cats
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I then rendered the data with Hugo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;&amp;lt;!-- layouts/shortcodes/timeline.html --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;dl&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;timeline&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ range .Site.Data.timeline.entries }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;timeline-entry&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;dt&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;timeline-date&amp;#34;&lt;/span&gt;&amp;gt;{{ .date }}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;dt&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;timeline-events&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {{ range .events }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &amp;lt;&lt;span style=&#34;color:#268bd2&#34;&gt;dd&lt;/span&gt; class&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;timeline-event&amp;#34;&lt;/span&gt;&amp;gt;{{ . }}&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;dd&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#268bd2&#34;&gt;dl&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This kept both the data structure and the implementation simple.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-08-08-cms/rendered.webp&#34;
    alt=&#34;The career timeline rendered from the YAML data&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;The career timeline rendered from the YAML data&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;why-yaml-instead-of-markdown&#34;&gt;Why YAML Instead of Markdown?&lt;/h3&gt;
&lt;p&gt;Many static-site workflows are Markdown-first, and for good reason. Markdown is excellent for prose: articles, documentation, and other document-shaped content. But not all content is document-shaped.&lt;/p&gt;
&lt;p&gt;A career timeline is fundamentally a collection of structured records: dates with associated events. The same is often true of navigation menus, pricing tables, office locations, product specifications, and similar content.&lt;/p&gt;
&lt;p&gt;Representing those structures as Markdown would mean making the data fit the document format rather than choosing a format that fits the data. For the timeline, YAML was the more natural representation.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t thinking about CMS support at this point, nor was I trying to make the architecture extensible. I was simply representing the content in the form that best matched its nature.&lt;/p&gt;
&lt;p&gt;That distinction became useful later.&lt;/p&gt;
&lt;h2 id=&#34;the-requirement-change&#34;&gt;The Requirement Change&lt;/h2&gt;
&lt;p&gt;Months later, the client wanted to manage his own career history. The new editing workflow had a few constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It had to work for a non-technical user.&lt;/li&gt;
&lt;li&gt;GitHub access was off the table.&lt;/li&gt;
&lt;li&gt;Inputs needed validation: a year should be a number, and an entry should contain at least one event.&lt;/li&gt;
&lt;li&gt;Changes had to be committed and deployed automatically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The existing YAML files were already a perfectly good representation of the content. The problem wasn&amp;rsquo;t the data model; the problem was that the only interface for changing it was a text editor and Git.&lt;/p&gt;
&lt;p&gt;So instead of replacing the existing content model, I added another interface to it.&lt;/p&gt;
&lt;h2 id=&#34;the-solution-add-an-interface-not-a-new-data-model&#34;&gt;The Solution: Add an Interface, Not a New Data Model&lt;/h2&gt;
&lt;p&gt;I used Decap CMS, a Git-based CMS that can map an editing UI onto files stored in a repository.&lt;/p&gt;
&lt;p&gt;The configuration for the timeline looked roughly like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;# static/admin/config.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#268bd2&#34;&gt;label&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Profile&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;profile&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;files&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#268bd2&#34;&gt;label&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Career History&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;timeline_data&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;file&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;data/timeline.yml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#268bd2&#34;&gt;fields&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#268bd2&#34;&gt;label&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Career entries&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#268bd2&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;entries&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#268bd2&#34;&gt;widget&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#268bd2&#34;&gt;fields&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#268bd2&#34;&gt;label&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Year&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;date&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;widget&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;number&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;value_type&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;int&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;min&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;1980&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;max&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;2050&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#268bd2&#34;&gt;label&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Events&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;events&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;widget&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;list&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;field&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#268bd2&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;event&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#268bd2&#34;&gt;widget&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#268bd2&#34;&gt;min&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Decap CMS could now present the existing data as a form suitable for the client.&lt;/p&gt;
&lt;div class=&#34;info&#34;&gt;&lt;strong&gt;Resources&lt;/strong&gt;
&lt;p&gt;A minimal working example is available on GitHub, with a live demo deployed on Netlify.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live demo: &lt;a href=&#34;https://rindrics-model-data-not-interface.netlify.app/&#34;&gt;https://rindrics-model-data-not-interface.netlify.app/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Source: &lt;a href=&#34;https://github.com/rindrics/examples/tree/main/model-the-data-not-the-interface&#34;&gt;https://github.com/rindrics/examples/tree/main/model-the-data-not-the-interface&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;

&lt;p&gt;The important part was what I didn&amp;rsquo;t change.&lt;/p&gt;
&lt;p&gt;The YAML structure? ──Unchanged; The Hugo templates? ──Untouched; The site still rendered exactly the same way.&lt;/p&gt;
&lt;p&gt;I had simply added a new way to edit the existing data.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-08-08-cms/before-after.webp&#34;
    alt=&#34;Before (top) and after (bottom) adding a CMS: the existing data flow remains unchanged.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Before (top) and after (bottom) adding a CMS: the existing data flow remains unchanged.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;No refactor, no breaking changes.&lt;/p&gt;
&lt;h2 id=&#34;why-so-little-had-to-change&#34;&gt;Why So Little Had to Change&lt;/h2&gt;
&lt;p&gt;What made this work was surprisingly simple: the editing side and the rendering side could depend on the same file-based data model.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-08-08-cms/shared-file.webp&#34;
    alt=&#34;File-based integration via a shared data contract&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;File-based integration via a shared data contract&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The Hugo templates depend on the structure of the YAML to render the timeline, while the Decap CMS configuration depends on the same structure to provide an editing interface. But the two sides don&amp;rsquo;t need to know about each other: Decap CMS doesn&amp;rsquo;t know how Hugo renders the timeline, and Hugo doesn&amp;rsquo;t know that Decap CMS exists.&lt;/p&gt;
&lt;p&gt;They only agree on the shape of the data.&lt;/p&gt;
&lt;p&gt;The YAML structure acts as a shared data contract between authoring and publishing. Adding another way to display the same data means writing another consumer of the model; adding another way to edit it means adding another authoring interface. Neither necessarily requires changing the underlying content model.&lt;/p&gt;
&lt;p&gt;Of course, if the content itself changes—if a career entry suddenly needs locations, employers, categories, or relationships—the data model should change too. The point isn&amp;rsquo;t that the model never changes; it&amp;rsquo;s that adding an interface doesn&amp;rsquo;t inherently require it to change.&lt;/p&gt;
&lt;h2 id=&#34;model-the-content-for-what-it-is&#34;&gt;Model the Content for What It Is&lt;/h2&gt;
&lt;p&gt;What&amp;rsquo;s interesting to me is that none of this was planned. When I chose YAML, I wasn&amp;rsquo;t anticipating a CMS. There was no abstraction layer waiting for future requirements, no repository interface, and no elaborate content architecture.&lt;/p&gt;
&lt;p&gt;I simply looked at the content and asked:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is this thing?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The answer was structured data, so I represented it as structured data. That gave the later CMS integration a clean boundary almost for free.&lt;/p&gt;
&lt;p&gt;This is different from trying to future-proof a system through speculative abstraction. I didn&amp;rsquo;t predict the future requirement; I represented the requirement I already had accurately enough that the future requirement fit naturally around it.&lt;/p&gt;
&lt;p&gt;This applies beyond career timelines. A blog post or an article is usually document-shaped, making Markdown a natural fit. But a timeline is a collection of records, a navigation menu is a tree, and a pricing table is a collection of products, attributes, and prices. Different kinds of content have different natural structures.&lt;/p&gt;
&lt;p&gt;So rather than starting with the tool—&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How should I write this in Markdown?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;—I find it more useful to start with the content:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What is this content, really?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The representation follows from there. Markdown is often ideal for document-shaped content. YAML, JSON, or another structured store may better represent structured content. Relational or highly dynamic data may belong in a database.&lt;/p&gt;
&lt;p&gt;The specific format is secondary. What matters is whether the model reflects the structure of the thing being represented.&lt;/p&gt;
&lt;h2 id=&#34;takeaway&#34;&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;Adding CMS support to this site turned out to be surprisingly small—not because I had designed the system for a CMS or anticipated the requirement, and not because I had introduced abstractions to protect against future changes. I had simply modeled a career timeline as what it was: structured data.&lt;/p&gt;
&lt;p&gt;When the client later needed an editing interface, Decap CMS could depend on that same model while Hugo continued rendering it exactly as before. The CMS became another interface to the data, rather than a replacement for the architecture.&lt;/p&gt;
&lt;p&gt;That experience left me with a simple design heuristic:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&amp;rsquo;t model content around the tool that happens to consume it today. Model it around what the content actually is.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this case, the flexibility followed naturally.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>イミュータブルなデータレジストリの設計とAlloyによる形式検証</title>
      <link>https://rindrics.com/posts/immutable-data-registry-alloy-design/</link>
      <pubDate>Fri, 07 Aug 2026 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/posts/immutable-data-registry-alloy-design/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;../stock-assess-data-registry-1/&#34;&gt;前回&lt;/a&gt;に引き続き、data-registryサービスを実装していく。
今回はdatasetVersionの生成ロジック周りを設計する。&lt;/p&gt;
&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://rindrics.com/posts/stock-assess-api-contract-postmortem/#:~:text=data%20service%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E7%8B%AC%E7%AB%8B%E3%81%97%E3%81%9F%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AB%E6%80%9D%E3%82%8F%E3%82%8C%E3%82%8B&#34;&gt;データを登録するためのサービスが必要&lt;/a&gt;ということがわかったので、下の記事で、データ登録サービス: data-registryの構築に必要なセットアップを終え、ハンドラの実装まで完了した。








&lt;div class=&#34;card&#34;&gt;
  &lt;a href=&#34;https://rindrics.com/posts/stock-assess-data-registry-1/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34; class=&#34;card-link&#34;&gt;
    &lt;div class=&#34;card-content&#34;&gt;
      &lt;h4 class=&#34;card-title&#34;&gt;データ登録サービスの構築 その1 | rindrics.com&lt;/h4&gt;
      
      &lt;span class=&#34;card-url&#34;&gt;https://rindrics.com/posts/stock-assess-data-registry-1/&lt;/span&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;作業の進捗は下記の通り:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; API契約を書く&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ルーティングの動作確認&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; db セットアップ&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; リポジトリ・ハンドラの実装&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; datasetVersion生成ロジックの設計&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; リファクタリング&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; エラーハンドリングの追加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;データセットの生成ロジックは、Alloyでモデル検証しつつ設計する。&lt;/p&gt;
&lt;h2 id=&#34;要求と要件の整理&#34;&gt;要求と要件の整理&lt;/h2&gt;
&lt;p&gt;正常ケースのレスポンスとして、まずUUID形式の&lt;code&gt;version&lt;/code&gt;を返してほしい旨については&lt;a href=&#34;https://gist.github.com/rindrics/8504980873e631a7f692543090995e8e#file-gistfile1-txt-L100-L111&#34;&gt;OpenAPI&lt;/a&gt;に既に書いた。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#268bd2&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;019f8bff-a5b8-7014-bfc8-41561eaac24c&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将来的にはもっと有用なレスポンスを返したほうがよさそうだが、ひとまずの仕様としてシンプルなこの動作について、ロジックを設計したい。&lt;/p&gt;
&lt;p&gt;ここで設計するのは、この文字列を何のアルゴリズムで得るかという話ではなく、この値がレスポンスとして返るまでにどんな事項を考慮しないといけないかという話。
コンシューマのユースケース支援の観点と、バックエンドサービスとしての堅牢性や処理速度をバランスさせながら考えていく。&lt;/p&gt;
&lt;h3 id=&#34;要求requirements&#34;&gt;要求（Requirements）&lt;/h3&gt;
&lt;p&gt;仕様を検討するにあたり、data-registryのコンシューマのユースケースを想定し、要求を洗い出したい。
&lt;a href=&#34;../stock-assess-data-registry-ubiquitous-language&#34;&gt;こちらの記事&lt;/a&gt;で定義したユビキタス言語を使い、要求を次のように整理する:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;ID&lt;/th&gt;
          &lt;th&gt;説明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;R001&lt;/td&gt;
          &lt;td&gt;同一の登録要求に対して、常に同じ応答を返すこと&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R002&lt;/td&gt;
          &lt;td&gt;同一の版に対する取得要求には、常に同じ内容を返すこと&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R003&lt;/td&gt;
          &lt;td&gt;評価データまたはパラメータセットの登録成功後、その版を取得できること&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R004&lt;/td&gt;
          &lt;td&gt;評価データまたはパラメータセットの登録に失敗した場合、コンシューマが失敗を検知できること&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R005&lt;/td&gt;
          &lt;td&gt;登録要求に対して有限時間内に応答すること&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R006&lt;/td&gt;
          &lt;td&gt;評価データ、パラメータセットまたはシナリオを、通常の利用対象から外せること&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R007&lt;/td&gt;
          &lt;td&gt;評価データまたはパラメータセットを修正した場合でも、修正前の版を取得できること&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R008&lt;/td&gt;
          &lt;td&gt;任意の版を指定して取得できること&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R009&lt;/td&gt;
          &lt;td&gt;外部公開済みの版を訂正した場合でも、訂正前の版を追跡できること&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R010&lt;/td&gt;
          &lt;td&gt;アーカイブと、機密情報などを除去するための物理削除を区別できること&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;R011&lt;/td&gt;
          &lt;td&gt;評価データおよびパラメータセットの版の履歴を追跡できること&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;immutableなサービスにしようと意気込んでいたので&lt;code&gt;R010&lt;/code&gt;は当初入れてなかったが、リソースのリビジョン機能をサポートするAPIでは物理削除が必須という記述を読んだので追加した&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;h3 id=&#34;システム要件system-requirements&#34;&gt;システム要件（System Requirements）&lt;/h3&gt;
&lt;p&gt;上で整理した要求から、下記のシステム要件が導かれた:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;ID&lt;/th&gt;
          &lt;th&gt;説明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;SR001&lt;/td&gt;
          &lt;td&gt;各評価データおよびパラメータセットは、版を用いて管理されなければならない&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SR002&lt;/td&gt;
          &lt;td&gt;登録後の版の内容を変更してはならない&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SR003&lt;/td&gt;
          &lt;td&gt;評価データまたはパラメータセットを修正するときは、既存の版を更新せず、新しい版を作成しなければならない&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SR004&lt;/td&gt;
          &lt;td&gt;新しい版は、修正元となった版を0個または1個参照しなければならない&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SR005&lt;/td&gt;
          &lt;td&gt;同一の登録要求識別子を持つ登録要求に対しては同一の結果を返し、新たな版を重複して作成してはならない&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SR006&lt;/td&gt;
          &lt;td&gt;登録処理が成功した場合、取得APIから登録された版の内容を取得できなければならない&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SR007&lt;/td&gt;
          &lt;td&gt;版を指定した取得要求には、その版に記録された内容を返さなければならない&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SR008&lt;/td&gt;
          &lt;td&gt;評価データおよびパラメータセットは、それぞれ高々1つの最新版を持たなければならない&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SR009&lt;/td&gt;
          &lt;td&gt;新しい版の登録成功後、最新版は新しい版を指さなければならない&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;SR010&lt;/td&gt;
          &lt;td&gt;新しい版が登録されても、過去の版を変更または削除してはならない&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これらの要件を出発点とし、データ登録機能を提供するバックエンドサービスとしてあるべき姿に照らして、追加で必要な要件をモデル検証であぶり出していく。&lt;/p&gt;
&lt;p&gt;モデル検証には&lt;a href=&#34;https://alloytools.org/alloy6.html&#34;&gt;Alloy 6&lt;/a&gt;を利用する。
動作環境は下記の通り:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS 15.6.1（Apple M1 Max）&lt;/li&gt;
&lt;li&gt;Alloy Analyzer 6.1.0.20211119T054551&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;要件を満たすモデルの探索&#34;&gt;要件を満たすモデルの探索&lt;/h2&gt;
&lt;h3 id=&#34;システム基本構造の定義&#34;&gt;システム基本構造の定義&lt;/h3&gt;
&lt;p&gt;data-registryサービスのドメイン構造として、下記を表現することにした:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;#&lt;/th&gt;
          &lt;th&gt;Alloy signature&lt;/th&gt;
          &lt;th&gt;意味&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;Resource&lt;/td&gt;
          &lt;td&gt;ユビキタス言語より&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;AnnualAssessment&lt;/td&gt;
          &lt;td&gt;ユビキタス言語より&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;AssessmentTarget&lt;/td&gt;
          &lt;td&gt;ユビキタス言語より&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;AssessmentDataRevision&lt;/td&gt;
          &lt;td&gt;評価データの版&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5&lt;/td&gt;
          &lt;td&gt;ParameterSetRevision&lt;/td&gt;
          &lt;td&gt;パラメータセットの版&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;6&lt;/td&gt;
          &lt;td&gt;Registry&lt;/td&gt;
          &lt;td&gt;data-registryサービス&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;その他、Alloyによるシミュレーションを動かすために必要なstutterなどを足して、下記のコードから始めることにする:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-alloy:model.als&#34; data-lang=&#34;alloy:model.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;commit &lt;span style=&#34;color:#2aa198&#34;&gt;46&lt;/span&gt;d22f240c3b20868818dcbf6d5b09dba5d161d7
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Author: Akira Hayashi &lt;span style=&#34;color:#719e07&#34;&gt;&amp;lt;&lt;/span&gt;rindrics@gmail&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;com&lt;span style=&#34;color:#719e07&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date:   Thu Jul &lt;span style=&#34;color:#2aa198&#34;&gt;30&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;06&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;04&lt;/span&gt;:&lt;span style=&#34;color:#2aa198&#34;&gt;25&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2026&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;0900&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    feat: define fundamental model structure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;diff &lt;span style=&#34;color:#586e75&#34;&gt;--git a/services/data-registry/docs/model.als b/services/data-registry/docs/model.als&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new file mode &lt;span style=&#34;color:#2aa198&#34;&gt;100644&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;index &lt;span style=&#34;color:#2aa198&#34;&gt;0000000&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;36&lt;/span&gt;a45f9
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;--- /dev/null&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+++&lt;/span&gt; b&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;services&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;data&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;registry&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;docs&lt;span style=&#34;color:#719e07&#34;&gt;/&lt;/span&gt;model&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;als
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;84&lt;/span&gt; @@
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;module&lt;/span&gt; DataRegistry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    1. System Requirements
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR001: AssessmentData and ParameterSet, along with their respective versions, must be managed separately.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR002: Each version must be assigned a unique identifier, and the contents must not be modified after registration.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR003: When modifying AssessmentData or ParameterSet, a new version must be created instead of updating the existing version.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR004: A new version must reference exactly zero or one previous version as its source.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR005: For registration requests with identical IdempotencyKey, the same result must be returned without creating duplicate versions.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR006: After successful registration, the registered version must be retrievable via the retrieval API.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR007: Retrieval requests specifying a version must return the contents recorded in that version.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR008: AssessmentData and ParameterSet must each have at most one current version.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR009: After successful registration of a new version, the current version must point to the new version.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR010: Past versions must not be modified or deleted even after a new version is registered.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    2. Domain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Resource &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AnnualAssessment &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; resource: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; Resource,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; year: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AnnualAssessment
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    3. State
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Registry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; assessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; parameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    4. Operations
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; init &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at: AssessmentTarget, adr: AssessmentDataRevision&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at: AssessmentTarget, psr: ParameterSetRevision&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; stutter &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; step &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; stutter
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, adr&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, psr&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; traces &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;always&lt;/span&gt; step
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    5. Properties
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;run&lt;/code&gt;を実行してみると、下図のような関係が表示された:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/init.webp&#34;
    alt=&#34;システムの初期状態&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;システムの初期状態&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;（Alloyのおさらい）この図が意味していることは下記だ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AssessmentTarger0&lt;/code&gt; は &lt;code&gt;AnnualAssessment&lt;/code&gt; と &lt;code&gt;Resource1&lt;/code&gt; からなる評価対象である&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AssessmentTarger1&lt;/code&gt; も同じ年の評価だが、対象資源は &lt;code&gt;Resource0&lt;/code&gt; である&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Registry&lt;/code&gt; にはまだなにも登録されていない（= エッジが一本もない）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AssessmentDataRevision&lt;/code&gt; という概念がモデリングされているが使われていない（= データが登録されていない）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;registerParameterSet&lt;/code&gt; predicateをstepに含めているにも関わらずデータが登録されていないことになっている理由は下記だ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a. step内で&lt;code&gt;registerParameterSet&lt;/code&gt;の遷移が&lt;code&gt;or&lt;/code&gt;の一つの選択肢として定義されているだけであり、その遷移が少なくとも一度選択されることは保証されていないため
&lt;ul&gt;
&lt;li&gt;stutterが常に選択可能なら、すべてのステップで&lt;code&gt;stutter&lt;/code&gt;だけが選択され、登録が一度も起きないトレースも許される&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;b. Alloyによるケース探索ではインスタンスから生成されがちだから&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;逆に、データが登録された状況を見てみたければ下記のようにすれば良い:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:model.als&#34; data-lang=&#34;diff:model.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; step &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;  stutter
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, adr&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, psr&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, adr&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑力技でやるならこう。&lt;/p&gt;
&lt;p&gt;こちらのほうがスマートか↓&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:model.als&#34; data-lang=&#34;diff:model.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行すると、下図のようにデータが登録された状態を一応見ることができる:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/init-registered.webp&#34;
    alt=&#34;データが登録されたケースの一例&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;データが登録されたケースの一例&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;図示のためのこの変更は不要だったので元に戻しておく。&lt;/p&gt;
&lt;p&gt;ここから、各要件をAlloyで形式化し、全ての要件が常に満たされるシステム仕様となっているかを検証していく。
「すべての要件が常に」と強めに書いたのは、各要件は私が定義した: つまり調整余地があるもなので、要件全体として整合するようにしたいからだ&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;h3 id=&#34;sr001-版による管理&#34;&gt;SR001: 版による管理&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SR001: 各評価データおよびパラメータセットは、版を用いて管理されなければならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この要件は下記のように表現できる。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:model.als&#34; data-lang=&#34;diff:model.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#2aa198&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; Properties
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#719e07&#34;&gt;============================================================&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;assert&lt;/span&gt; SR001_revision_belongs_to_at_most_one_target &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;        &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;        &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;check&lt;/span&gt; SR001_revision_belongs_to_at_most_one_target &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR001_revisions_can_be_registered &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR001_revisions_can_be_registered &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Execute Allしてみる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Executing &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Check SR001_revision_belongs_to_at_most_one_target for 2 but 1..3 steps&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Actual scopes: &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;Resource&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AnnualAssessment, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AssessmentDataRevision, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; ParameterSetRevision, exactly &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; Registry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Solver&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;sat4j Steps&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1.&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; Bitwidth&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt; MaxSeq&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; SkolemDepth&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; Symmetry&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;20&lt;/span&gt; Mode&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;batch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#2aa198&#34;&gt;1.&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; steps&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1553&lt;/span&gt; vars&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;108&lt;/span&gt; primary vars&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2564&lt;/span&gt; clauses&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;10&lt;/span&gt;ms&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   No counterexample found&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; Assertion may be valid&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;0&lt;/span&gt;ms&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Executing &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Run SR001_revisions_can_be_registered for 2 but 1..3 steps, 1 AssessmentTarget&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Actual scopes: &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;Resource&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AnnualAssessment, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AssessmentDataRevision, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; ParameterSetRevision, exactly &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; Registry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Solver&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;sat4j Steps&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1.&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; Bitwidth&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt; MaxSeq&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; SkolemDepth&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; Symmetry&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;20&lt;/span&gt; Mode&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;batch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#2aa198&#34;&gt;1.&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; steps&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2479&lt;/span&gt; vars&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;198&lt;/span&gt; primary vars&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3967&lt;/span&gt; clauses&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt;ms&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; found&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; Predicate is consistent&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt;ms&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Executing &lt;span style=&#34;color:#2aa198&#34;&gt;&amp;#34;Run run$3 for 2 but 1..3 steps&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Actual scopes: &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#cb4b16&#34;&gt;Resource&lt;/span&gt;, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AnnualAssessment, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AssessmentDataRevision, &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; ParameterSetRevision, exactly &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; Registry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Solver&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;sat4j Steps&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1.&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; Bitwidth&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt; MaxSeq&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; SkolemDepth&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; Symmetry&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;20&lt;/span&gt; Mode&lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt;batch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#2aa198&#34;&gt;1.&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; steps&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2769&lt;/span&gt; vars&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;225&lt;/span&gt; primary vars&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;4415&lt;/span&gt; clauses&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;ms&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; found&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; Predicate is consistent&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt;ms&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; commands were executed&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; The results are:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#586e75&#34;&gt;#1: No counterexample found. SR001_revision_belongs_to_at_most_one_target may be valid.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#586e75&#34;&gt;#2: Instance found. SR001_revisions_can_be_registered is consistent.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#586e75&#34;&gt;#3: Instance found. run$3 is consistent.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑反例なし、全要件を満たすインスタンスあり（以下 OK &amp;#x2705; と表現）。&lt;/p&gt;
&lt;h3 id=&#34;sr002-不変性&#34;&gt;SR002: 不変性&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SR002: 登録後の版の内容を変更してはならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは下のように表現する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:model.als&#34; data-lang=&#34;diff:model.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  year: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AnnualAssessment
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; ParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; RevisionId &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; RevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    assessmentData: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; RevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    parameterSet: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; ParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; revisionIdUnique &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; r1, r2: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  r1&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r2&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; r1 &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; r1, r2: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  r1&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r2&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; r1 &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     3. State
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;@@ -96,6 +115,28 @@ pred SR001_revisions_can_be_registered {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; run SR001_revisions_can_be_registered for 2 but 1 AssessmentTarget, 1..3 steps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+// SR002: The contents of a revision should not be modified after registration.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+// (Automatically satisfied by definition)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+pred SR002_registered_revision_contents_remain_available {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ eventually (some at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  adr: AssessmentDataRevision, psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  data: AssessmentData, params: ParameterSet |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  Registry.assessmentData[at] = adr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and adr.assessmentData = data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.parameterSet[at] = psr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and psr.parameterSet = params
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and after (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   Registry.assessmentData[at] = adr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and adr.assessmentData = data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and Registry.parameterSet[at] = psr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and psr.parameterSet = params
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  ))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+run SR002_registered_revision_contents_remain_available
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ for 2 but 1 AssessmentTarget, 1..4 steps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; /*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑各Revisionに、非&lt;code&gt;var&lt;/code&gt;のフィールドとして &lt;code&gt;one AssessmentData&lt;/code&gt; と &lt;code&gt;one ParameterSet&lt;/code&gt; を定義することによって保証する（保証といっても実装時の契約ではあるが）。&lt;/p&gt;
&lt;p&gt;assertは追加していないが、この変更によって不整合が出ていないかをExecute Allで確認する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4 commands were executed. The results are:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #1: No counterexample found. SR001_revision_belongs_to_at_most_one_target may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #2: Instance found. SR001_revisions_can_be_registered is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #3: Instance found. SR002_registered_revision_contents_remain_available is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #4: Instance found. run$4 is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK &amp;#x2705;&lt;/p&gt;
&lt;p&gt;こちらは全体のsanity check:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/sr002.webp&#34;
    alt=&#34;現時点のsanity checkを持たすモデル&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;現時点のsanity checkを持たすモデル&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

↑&lt;code&gt;AssessmentDataRevision&lt;/code&gt; と &lt;code&gt;ParameterSetRevision&lt;/code&gt; が導入されたことで、モデルの構造が変わったのがわかる（スペース的に辛いのでノード数を減らしている）。&lt;/p&gt;
&lt;p&gt;また、SR002の正常ケースの例をひとつ見てみたいので、明示的に&lt;code&gt;egistered_revision_contents_remain_available&lt;/code&gt;という&lt;code&gt;run&lt;/code&gt;も追加した:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/sr002-run.webp&#34;
    alt=&#34;SR002を満たすケースの一例&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;SR002を満たすケースの一例&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&amp;hellip;いや待て。
あるAssessmentDataRevisonと、あるParameterSetRevisionが同じRevisionIdを持ちうることになっているのか？
それは意図と違う。&lt;/p&gt;
&lt;p&gt;確かにちゃんとモデリングできていなかった:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:model.als&#34; data-lang=&#34;diff:model.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; ParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; RevisionId &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; RevisionId &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevisionId, ParameterSetRevisionId &lt;span style=&#34;color:#719e07&#34;&gt;extends&lt;/span&gt; RevisionId &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;    id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; RevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AssessmentDataRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     assessmentData: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;    id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; RevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; ParameterSetRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     parameterSet: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; ParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もう一度状態を見てみる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4 commands were executed. The results are:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #1: No counterexample found. SR001_revision_belongs_to_at_most_one_target may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #2: Instance found. SR001_revisions_can_be_registered is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #3: Instance found. SR002_registered_cont_available is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #4: Instance found. run$4 is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK &amp;#x2705;&lt;/p&gt;
&lt;p&gt;これで、AssessmentDataRevisonとParameterSetRevisionはそれぞれのRevisionIdを持つようになった。
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/sr002-fixed.webp&#34;
    alt=&#34;SR002を満たすケースの一例（修正版）&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;SR002を満たすケースの一例（修正版）&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Alloyの可視化機能に助けられた。&lt;/p&gt;
&lt;h3 id=&#34;sr003-不変性その2&#34;&gt;SR003: 不変性その2&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SR003 : 評価データまたはパラメータセットを修正するときは、既存の版を更新せず、新しい版を作成しなければならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:model.als&#34; data-lang=&#34;diff:model.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevisionId, ParameterSetRevisionId &lt;span style=&#34;color:#719e07&#34;&gt;extends&lt;/span&gt; RevisionId &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR002: Each revision has unique identifier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AssessmentDataRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; assessmentData: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; assessmentData: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AssessmentData,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; previousSource: &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; AssessmentDataRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; ParameterSetRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; parameterSet: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; ParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; parameterSet: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; ParameterSet,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; previousSource: &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; revisionIdUnique &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; r1, r2: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;  r1&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r2&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; r1 &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; r1, r2: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;  r1&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r2&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; r1 &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR002: Unique identifier enforcement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; revisionIdUniqueAssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; adr1, adr2: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  adr1&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr2&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; adr1 &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; revisionIdUniqueParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; psr1, psr2: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  psr1&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr2&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; psr1 &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; noCyclicSource &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; adr not &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.^&lt;/span&gt;previousSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; psr not &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.^&lt;/span&gt;previousSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;@@ -54,8 +66,8 @@ fact revisionIdUnique {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Registry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; assessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; parameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentAssessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentParameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;@@ -63,23 +75,33 @@ one sig Registry {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; init &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at: AssessmentTarget, adr: AssessmentDataRevision&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at: AssessmentTarget, psr: ParameterSetRevision&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; stutter &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; step &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;97&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;40&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;119&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;32&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; traces &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#2aa198&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt; Properties
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#719e07&#34;&gt;============================================================&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;assert&lt;/span&gt; SR001_revision_belongs_to_at_most_one_target &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;        &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;        &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;check&lt;/span&gt; SR001_revision_belongs_to_at_most_one_target &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR001: At most one current version per AssessmentTarget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Automatically satisfied by Registry definition: lone AssessmentDataRevision)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR001_revisions_can_be_registered &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR001_revisions_can_be_registered &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;// SR002: The contents of a revision should not be modified after registration.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;// (Automatically satisfied by definition)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR002_registered_cont_available &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   adr: AssessmentDataRevision, psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   data: AssessmentData, params: ParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; params
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;after&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;   Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; params
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;138&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;152&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;46&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR002_registered_cont_available &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR002_registered_cont_available
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR003: When modifying, a new version must be created instead of updating the existing version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;assert&lt;/span&gt; SR003_new_version_on_change &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;always&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; at: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]).~&lt;/span&gt;previousSource&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; at: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]).~&lt;/span&gt;previousSource&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;check&lt;/span&gt; SR003_new_version_on_change &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR003_assessment_data_can_be_changed_with_new_revision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  source, newRevision: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; source
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; source&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; source
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR003_parameter_set_can_be_changed_with_new_revision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  source, newRevision: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; source
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; source&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; source
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR003_assessment_data_can_be_changed_with_new_revision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR003_parameter_set_can_be_changed_with_new_revision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;assert SR003_new_version_on_change&lt;/code&gt; の下記の部分は「current revisionが同じまま（変わらない）、または next revisionが current revision から派生している」を意味している:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-alloy&#34; data-lang=&#34;alloy&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]).~&lt;/span&gt;previousSource&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Execute All:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;6 commands were executed. The results are:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #1: Instance found. SR001_revisions_can_be_registered is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #2: Instance found. SR002_registered_cont_available is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #3: No counterexample found. SR003_new_version_on_change may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #4: Instance found. SR003_assessment_data_can_be_changed_with_new_revision is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #5: Instance found. SR003_parameter_set_can_be_changed_with_new_revision is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #6: Instance found. run$6 is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OK &amp;#x2705;&lt;/p&gt;
&lt;p&gt;AssessmentDataが変わった際には、別のRevisionとなるようになっている:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/sr003.webp&#34;
    alt=&#34;SR003を満たすケースの一例&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;SR003を満たすケースの一例&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

（末尾の数字が交差しているが、これは自動付与されたものなので気にしなくて良いはず。）&lt;/p&gt;
&lt;h3 id=&#34;sr004-版の参照規則&#34;&gt;SR004: 版の参照規則&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SR004: 新しい版は、修正元となった版を0個または1個参照しなければならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは、&lt;code&gt;previousSource: lone AssessmentDataRevision&lt;/code&gt; の &lt;code&gt;lone&lt;/code&gt; によって、既に定義レベルで保証されている。
一応、状態を見てみたいので&lt;code&gt;run&lt;/code&gt;を追加した:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:moodel.als&#34; data-lang=&#34;diff:moodel.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR004: Each revision can reference exactly zero or one previous version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Enforced by previousSource: lone field definition - no explicit assertion needed)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR004_root_and_derived_revisions_can_exist &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; rootAdr, derivedAdr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  rootPsr, derivedPsr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  rootAdr &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; derivedAdr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; rootAdr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; derivedAdr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; rootAdr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; rootPsr &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; derivedPsr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; rootPsr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; derivedPsr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; rootPsr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR004_root_and_derived_revisions_can_exist
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;exactly&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;exactly&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;exactly&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AssessmentDataRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;exactly&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; ParameterSetRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一例を見てみる:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/sr004.webp&#34;
    alt=&#34;SR004を満たすケースの一例&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;SR004を満たすケースの一例&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

なるほど、データの内容が同じでも親が違う状況が示されていて、この場合には違う版として扱われるらしい。
少し意図と違うが、これについては次の&lt;code&gt;SR005&lt;/code&gt;で考える。&lt;/p&gt;
&lt;h3 id=&#34;sr005-冪等性&#34;&gt;SR005: 冪等性&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SR005: 同一の登録要求識別子を持つ登録要求に対しては同一の結果を返し、新たな版を重複して作成してはならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;先ほど述べた問題にも関係する冪等性。
下記のようにモデリングしてみる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:moodel.als&#34; data-lang=&#34;diff:moodel.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevisionId, ParameterSetRevisionId &lt;span style=&#34;color:#719e07&#34;&gt;extends&lt;/span&gt; RevisionId &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; HashKey &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Status &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Success, Failure &lt;span style=&#34;color:#719e07&#34;&gt;extends&lt;/span&gt; Status &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Response &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; revision: &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; ParameterSetRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; status: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; Status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;// SR002: Each revision has unique identifier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AssessmentDataRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;67&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;7&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;77&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;9&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; noCyclicSource &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Registry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentAssessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentParameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentParameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;// SR005: Track responses by HashKey (idempotency key) for idempotency verification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; responseLog: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; Response
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;@@ -77,37 +89,80 @@ one sig Registry {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; pred init {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  no Registry.currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  no Registry.currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ no Registry.responseLog
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-pred registerAssessmentData[at: AssessmentTarget, adr: AssessmentDataRevision] {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;- (no Registry.currentAssessmentData[at] and no adr.previousSource)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+// SR005: Log response by idempotency key
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+pred registerAssessmentData[
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ data: AssessmentData,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ idempotencyKey: HashKey
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+] {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  adr.assessmentData = data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  no Registry.responseLog[idempotencyKey]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   (no Registry.currentAssessmentData[at] and no adr.previousSource)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   or (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    some Registry.currentAssessmentData[at]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    and adr.previousSource = Registry.currentAssessmentData[at]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.currentAssessmentData&amp;#39; = Registry.currentAssessmentData ++ at -&amp;gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.currentParameterSet&amp;#39; = Registry.currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and some r: Response |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   r.revision = adr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and r.status = Success
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and Registry.responseLog&amp;#39; = Registry.responseLog + idempotencyKey -&amp;gt; r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  or (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  some Registry.currentAssessmentData[at]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  and adr.previousSource = Registry.currentAssessmentData[at]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  some Registry.responseLog[idempotencyKey]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.currentAssessmentData&amp;#39; = Registry.currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.currentParameterSet&amp;#39; = Registry.currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.responseLog&amp;#39; = Registry.responseLog
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;- Registry.currentAssessmentData&amp;#39; = Registry.currentAssessmentData ++ at -&amp;gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;- Registry.currentParameterSet&amp;#39; = Registry.currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-pred registerParameterSet[at: AssessmentTarget, psr: ParameterSetRevision] {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;- (no Registry.currentParameterSet[at] and no psr.previousSource)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+pred registerParameterSet[
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ params: ParameterSet,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ idempotencyKey: HashKey
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+] {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  psr.parameterSet = params
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  no Registry.responseLog[idempotencyKey]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   (no Registry.currentParameterSet[at] and no psr.previousSource)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   or (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    some Registry.currentParameterSet[at]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    and psr.previousSource = Registry.currentParameterSet[at]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.currentAssessmentData&amp;#39; = Registry.currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.currentParameterSet&amp;#39; = Registry.currentParameterSet ++ at -&amp;gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and some r: Response |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   r.revision = psr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and r.status = Success
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and Registry.responseLog&amp;#39; = Registry.responseLog + idempotencyKey -&amp;gt; r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  or (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  some Registry.currentParameterSet[at]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  and psr.previousSource = Registry.currentParameterSet[at]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  some Registry.responseLog[idempotencyKey]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.currentAssessmentData&amp;#39; = Registry.currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.currentParameterSet&amp;#39; = Registry.currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and Registry.responseLog&amp;#39; = Registry.responseLog
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;- Registry.currentAssessmentData&amp;#39; = Registry.currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;- Registry.currentParameterSet&amp;#39; = Registry.currentParameterSet ++ at -&amp;gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; pred stutter {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  Registry.currentAssessmentData&amp;#39; = Registry.currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  Registry.currentParameterSet&amp;#39; = Registry.currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ Registry.responseLog&amp;#39; = Registry.responseLog
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; pred step {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  stutter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;- or (some at: AssessmentTarget, adr: AssessmentDataRevision | registerAssessmentData[at, adr])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;- or (some at: AssessmentTarget, psr: ParameterSetRevision | registerParameterSet[at, psr])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ or (some at: AssessmentTarget, adr: AssessmentDataRevision, data: AssessmentData, hk: HashKey |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  registerAssessmentData[at, adr, data, hk])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ or (some at: AssessmentTarget, psr: ParameterSetRevision, params: ParameterSet, hk: HashKey |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  registerParameterSet[at, psr, params, hk])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; fact traces {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;@@ -171,20 +226,22 @@ check SR003_new_version_on_change for 2 but 1..3 steps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; pred SR003_assessment_update {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  eventually (some at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  source, newRevision: AssessmentDataRevision |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  source, newRevision: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  data: AssessmentData, hk: HashKey |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;   Registry.currentAssessmentData[at] = source
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  and source.assessmentData != newRevision.assessmentData
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and source.assessmentData != data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;   and newRevision.previousSource = source
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  and registerAssessmentData[at, newRevision])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and registerAssessmentData[at, newRevision, data, hk])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; pred SR003_parameter_update {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  eventually (some at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  source, newRevision: ParameterSetRevision |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  source, newRevision: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  params: ParameterSet, hk: HashKey |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;   Registry.currentParameterSet[at] = source
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  and source.parameterSet != newRevision.parameterSet
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and source.parameterSet != params
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;   and newRevision.previousSource = source
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;-  and registerParameterSet[at, newRevision])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  and registerParameterSet[at, newRevision, params, hk])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; run SR003_assessment_update
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;@@ -214,6 +271,51 @@ run SR004_revision_chain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  exactly 2 ParameterSetRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;  1..2 steps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+// SR005: Idempotency - same HashKey (idempotency key) returns same response
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+assert SR005_idempotency {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ always (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  all hk: HashKey |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   (some Registry.responseLog[hk]) implies always Registry.responseLog[hk] = Registry.responseLog&amp;#39;[hk]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+check SR005_idempotency for 2 but 1..3 steps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+pred SR005_assessment_data_retry_returns_same_response {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ some at: AssessmentTarget, adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  data: AssessmentData, hk: HashKey, r: Response |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  eventually (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   no Registry.responseLog[hk]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and registerAssessmentData[at, adr, data, hk]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and Registry.responseLog&amp;#39;[hk] = r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and after (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    Registry.responseLog[hk] = r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    and registerAssessmentData[at, adr, data, hk]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    and Registry.responseLog&amp;#39;[hk] = r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+pred SR005_parameter_set_retry_returns_same_response {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ some at: AssessmentTarget, psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  params: ParameterSet, hk: HashKey, r: Response |
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  eventually (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   no Registry.responseLog[hk]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and registerParameterSet[at, psr, params, hk]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and Registry.responseLog&amp;#39;[hk] = r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   and after (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    Registry.responseLog[hk] = r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    and registerParameterSet[at, psr, params, hk]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+    and Registry.responseLog&amp;#39;[hk] = r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+   )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+  )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+run SR005_assessment_data_retry_returns_same_response
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ for 2 but 1 AssessmentTarget, 1..3 steps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+run SR005_parameter_set_retry_returns_same_response
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+ for 2 but 1 AssessmentTarget, 1..3 steps
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt; /*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;var responseLog: HashKey -&amp;gt; lone Response&lt;/code&gt; の右辺が&lt;code&gt;one&lt;/code&gt;ではなく&lt;code&gt;lone&lt;/code&gt;なのは、データが未登録の状況を表現するため。
実装時における冪等性保証を助けるために、リクエストには&lt;a href=&#34;https://datatracker.ietf.org/doc/draft-ietf-httpapi-idempotency-key-header/07/&#34;&gt;idempotency key&lt;/a&gt;を使う想定。
このkeyの計算には、親とする版のIDも含める必要がある。
始めはAssessmentDataなどの&lt;strong&gt;内容の&lt;/strong&gt;みからkeyを生成して、同一の内容の登録リクエストは拒否してしまおうと考えていたが、そうすると履歴の復元: 内容が同じデータの再登録の時に不都合が出そう。&lt;/p&gt;
&lt;p&gt;ともあれ、同一性の定義については詳細設計に回すとして、ひとまず次に進む。&lt;/p&gt;
&lt;p&gt;Execute All:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10 commands were executed. The results are:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #1: Instance found. SR001_registration is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #2: Instance found. SR002_content_stability is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #3: No counterexample found. SR003_new_version_on_change may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #4: Instance found. SR003_assessment_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #5: Instance found. SR003_parameter_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #6: Instance found. SR004_revision_chain is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #7: No counterexample found. SR005_idempotency may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #8: Instance found. SR005_assessment_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #9: Instance found. SR005_parameter_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #10: Instance found. run$10 is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑OK :white_check_mark&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/sr005.webp&#34;
    alt=&#34;SR005を満たすケースの一例&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;SR005を満たすケースの一例&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;↑同一のHashKeyとともに何度リクエストしても、Revisionは変化しない様子が示されている。&lt;/p&gt;
&lt;h3 id=&#34;sr006-取得可能性&#34;&gt;SR006: 取得可能性&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SR006: 登録処理が成功した場合、取得APIから登録された版の内容を取得できなければならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この要件は「成功レスポンスがあるならRevisionが存在する」として表現する:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:moodel.als&#34; data-lang=&#34;diff:moodel.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Registry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentAssessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentParameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; registeredAssessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;set&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; registeredParameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;set&lt;/span&gt; ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#586e75&#34;&gt;// SR005: Track responses by HashKey (idempotency key) for idempotency verification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; responseLog: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; Response
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;89&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;91&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Registry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; init &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;109&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;113&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;118&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;124&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;idempotencyKey&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;138&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;146&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;147&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;157&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;idempotencyKey&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;154&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;166&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;8&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; stutter &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@@ &lt;span style=&#34;color:#719e07&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;316&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;330&lt;/span&gt;,&lt;span style=&#34;color:#2aa198&#34;&gt;47&lt;/span&gt; @@ &lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR005_assessment_retry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR005_parameter_retry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR006: After successful registration, the registered version must be retrievable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// If response is logged as successful, the revision must remain registered&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;assert&lt;/span&gt; SR006_retrievability &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;always&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; hk: HashKey, r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;     r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;     r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;check&lt;/span&gt; SR006_retrievability &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR006_registered_assessment_data_can_be_retrieved &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  hk: HashKey, r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR006_registered_parameter_set_can_be_retrieved &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  hk: HashKey, r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR006_registered_assessment_data_can_be_retrieved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR006_registered_parameter_set_can_be_retrieved
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Execute All:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;13 commands were executed. The results are:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #1: Instance found. SR001_registration is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #2: Instance found. SR002_content_stability is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #3: No counterexample found. SR003_new_version_on_change may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #4: Instance found. SR003_assessment_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #5: Instance found. SR003_parameter_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #6: Instance found. SR004_revision_chain is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #7: No counterexample found. SR005_idempotency may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #8: Instance found. SR005_assessment_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #9: Instance found. SR005_parameter_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #10: No counterexample found. SR006_retrievability may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #11: Instance found. SR006_assessment_retrieval is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #12: Instance found. SR006_parameter_retrieval is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #13: Instance found. run$13 is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑OK &amp;#x2705;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SR006&lt;/code&gt;の例示結果は&lt;code&gt;SR005&lt;/code&gt;と変わらなかった。&lt;/p&gt;
&lt;h3 id=&#34;sr007-取得可能性その2&#34;&gt;SR007: 取得可能性その2&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;R007: 版を指定した取得要求には、その版に記録された内容を返さなければならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは原理的には&lt;code&gt;SR001&lt;/code&gt;と&lt;code&gt;SR002&lt;/code&gt;で既に満たされている:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:moodel.als&#34; data-lang=&#34;diff:moodel.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR006_parameter_retrieval
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR007: Retrieval requests return the contents recorded in that version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Automatically satisfied because revision content is immutable)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR007_assessment_data_can_be_retrieved_by_revision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  data: AssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  adr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; data &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR007_parameter_set_can_be_retrieved_by_revision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  params: ParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  psr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; params &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR007_assessment_data_can_be_retrieved_by_revision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR007_parameter_set_can_be_retrieved_by_revision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実際の挙動がこれを満たすようにするのは実装時の責任。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;15 commands were executed. The results are:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #1: Instance found. SR001_registration is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #2: Instance found. SR002_content_stability is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #3: No counterexample found. SR003_new_version_on_change may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #4: Instance found. SR003_assessment_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #5: Instance found. SR003_parameter_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #6: Instance found. SR004_revision_chain is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #7: No counterexample found. SR005_idempotency may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #8: Instance found. SR005_assessment_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #9: Instance found. SR005_parameter_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #10: No counterexample found. SR006_retrievability may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #11: Instance found. SR006_assessment_retrieval is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #12: Instance found. SR006_parameter_retrieval is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #13: Instance found. SR007_assessment_by_revision is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #14: Instance found. SR007_parameter_by_revision is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #15: Instance found. run$15 is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑OK &amp;#x2705;&lt;/p&gt;
&lt;p&gt;今回の変更も、モデルに構造的な変化はなかった。&lt;/p&gt;
&lt;h3 id=&#34;sr008-最新版の参照&#34;&gt;SR008: 最新版の参照&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SR008 評価データおよびパラメータセットは、それぞれ高々1つの最新版を持たなければならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この要件は、既に&lt;code&gt;Registry&lt;/code&gt;の設計レベルで保証されている。
保証しているのは、下記&lt;code&gt;current-&lt;/code&gt;の&lt;code&gt;lone&lt;/code&gt;参照だ:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-alloy&#34; data-lang=&#34;alloy&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Registry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Registry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentAssessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentParameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; registeredAssessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;set&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; registeredParameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;set&lt;/span&gt; ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;// SR005: Track responses by HashKey (idempotency key) for idempotency verification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; responseLog: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; Response
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一応、ここでも正常ケースを例示しておく:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:moodel.als&#34; data-lang=&#34;diff:moodel.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR007_parameter_by_revision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR008: AssessmentData and ParameterSet each have at most one current revision&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Enforced by the lone multiplicity of the current revision fields)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR008_assessment_data_has_one_current_among_registered_revisions &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, currentRevision: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  previousRevision &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; currentRevision &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; currentRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR008_parameter_set_has_one_current_among_registered_revisions &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, currentRevision: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  previousRevision &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; currentRevision &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; currentRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR008_assessment_data_has_one_current_among_registered_revisions
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR008_parameter_set_has_one_current_among_registered_revisions
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Execute All:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;17 commands were executed. The results are:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #1: Instance found. SR001_registration is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #2: Instance found. SR002_content_stability is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #3: No counterexample found. SR003_new_version_on_change may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #4: Instance found. SR003_assessment_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #5: Instance found. SR003_parameter_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #6: Instance found. SR004_revision_chain is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #7: No counterexample found. SR005_idempotency may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #8: Instance found. SR005_assessment_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #9: Instance found. SR005_parameter_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #10: No counterexample found. SR006_retrievability may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #11: Instance found. SR006_assessment_retrieval is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #12: Instance found. SR006_parameter_retrieval is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #13: Instance found. SR007_assessment_by_revision is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #14: Instance found. SR007_parameter_by_revision is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #15: Instance found. SR008_assessment_current is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #16: Instance found. SR008_parameter_current is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #17: Instance found. run$17 is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑ OK &amp;#x2705;&lt;/p&gt;
&lt;p&gt;正常系を図示する:
&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/sr008.webp&#34;
    alt=&#34;SR008を満たすケースの一例&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;SR008を満たすケースの一例&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

↑この例では、RegistryはAssessmentDataRevision0を最新版として参照している。&lt;/p&gt;
&lt;h3 id=&#34;sr009-登録成功後の最新版の参照&#34;&gt;SR009: 登録成功後の最新版の参照&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SR009: 新しい版の登録成功後、最新版は新しい版を指さなければならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この要件は、&lt;code&gt;registerAssessmentData&lt;/code&gt; などのpredの定義で保証済み。
具体的には下記の部分だ:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-alloy&#34; data-lang=&#34;alloy&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at: AssessmentTarget, assessmentData: AssessmentData, idempotencyKey: HashKey&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  idempotencyKey &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; adr &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; idempotencyKey &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この定義は、例えば下記のような状況を表現している:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;AssessmentTarget&lt;/code&gt;が&lt;code&gt;2026年度カタクチ太平洋&lt;/code&gt;、&lt;code&gt;currentAssessmentData&lt;/code&gt;が&lt;code&gt;someRevisionHash&lt;/code&gt;に紐づくデータである状態&lt;/li&gt;
&lt;li&gt;新しい登録リクエストが届く: 「&lt;code&gt;2026年度カタクチ太平洋&lt;/code&gt;、&lt;code&gt;新しいassessmentData&lt;/code&gt;、&lt;code&gt;新しいidempotency key&lt;/code&gt;」&lt;/li&gt;
&lt;li&gt;&lt;code&gt;newRevisionHash&lt;/code&gt;と紐づいた&lt;code&gt;currentAssessmentData&lt;/code&gt;が&lt;code&gt;2026年度のカタクチ太平洋&lt;/code&gt;の最新版として保持される&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここでも正常系を明示的に例示してみる:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff:model.als&#34; data-lang=&#34;diff:model.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR008_parameter_current
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR009: Successful registration makes the new revision current&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR009_assessment_advance &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, newRevision: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  data: AssessmentData, hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision, data, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR009_parameter_advance &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, newRevision: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  params: ParameterSet, hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision, params, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR009_assessment_advance
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR009_parameter_advance
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;     ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Execute Allはall green &amp;#x2705;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;https://rindrics.com/images/2026-07-29-data/sr009.webp&#34;
    alt=&#34;SR009を満たすケースの一例&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;SR009を満たすケースの一例&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

こちらも、モデルに構造的な変化は見られないように思う。&lt;/p&gt;
&lt;h3 id=&#34;sr010-不変性その3&#34;&gt;SR010: 不変性その3&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;SR010: 新しい版が登録されても、過去の版を変更または削除してはならない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;こちらは実装の責任なのでモデル検証はスキップ。&lt;/p&gt;
&lt;h3 id=&#34;モデル全体&#34;&gt;モデル全体&lt;/h3&gt;
&lt;p&gt;ここまでの検証で、Alloyのコード全体は最終的に下記のようになった:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-alloy:model.als&#34; data-lang=&#34;alloy:model.als&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;module&lt;/span&gt; DataRegistry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    1. System Requirements
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR001: Each AssessmentData and ParameterSet should be managed through revisions.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR002: The contents of a revision should not be modified after registration.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR003: When modifying AssessmentData or ParameterSet, a new version must be created instead of updating the existing version.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR004: A new version must reference exactly zero or one previous version as its source.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR005: For registration requests with identical IdempotencyKey, the same result must be returned without creating duplicate versions.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR006: After successful registration, the registered version must be retrievable via the retrieval API.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR007: Retrieval requests specifying a version must return the contents recorded in that version.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR008: AssessmentData and ParameterSet must each have at most one current version.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR009: After successful registration of a new version, the current version must point to the new version.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR010: Past versions must not be modified or deleted even after a new version is registered.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    2. Domain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Resource &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AnnualAssessment &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; resource: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; Resource,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    year: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AnnualAssessment
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; ParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; RevisionId &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevisionId, ParameterSetRevisionId &lt;span style=&#34;color:#719e07&#34;&gt;extends&lt;/span&gt; RevisionId &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; HashKey &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Status &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Success, Failure &lt;span style=&#34;color:#719e07&#34;&gt;extends&lt;/span&gt; Status &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Response &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; revision: &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; ParameterSetRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; status: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; Status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR002: Each revision has unique identifier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AssessmentDataRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; assessmentData: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; AssessmentData,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; previousSource: &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; AssessmentDataRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; id: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; ParameterSetRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; parameterSet: &lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; ParameterSet,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; previousSource: &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR002: Unique identifier enforcement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; revisionIdUniqueAssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; adr1, adr2: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  adr1&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr2&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; adr1 &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; revisionIdUniqueParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; psr1, psr2: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  psr1&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr2&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;id &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; psr1 &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; noCyclicSource &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; adr not &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.^&lt;/span&gt;previousSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt; psr not &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.^&lt;/span&gt;previousSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    3. State
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;one&lt;/span&gt; &lt;span style=&#34;color:#268bd2&#34;&gt;sig&lt;/span&gt; Registry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentAssessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; currentParameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; registeredAssessmentData: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;set&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; registeredParameterSet: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;set&lt;/span&gt; ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#586e75&#34;&gt;// SR005: Track responses by HashKey (idempotency key) for idempotency verification&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;var&lt;/span&gt; responseLog: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;lone&lt;/span&gt; Response
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    4. Operations
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; init &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR005: Log response by idempotency key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; idempotencyKey: HashKey
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;idempotencyKey&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; idempotencyKey &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;idempotencyKey&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; idempotencyKey: HashKey
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;idempotencyKey&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;++&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; at &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; idempotencyKey &lt;span style=&#34;color:#719e07&#34;&gt;-&amp;gt;&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;idempotencyKey&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; stutter &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; step &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; stutter
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision, hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, adr, hk&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision, hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, psr, hk&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;fact&lt;/span&gt; traces &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;always&lt;/span&gt; step
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    5. Properties
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR001: At most one current version per AssessmentTarget&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Automatically satisfied by Registry definition: lone AssessmentDataRevision)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR001_registration &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR001_registration &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR002: The contents of a revision should not be modified after registration.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Automatically satisfied by definition)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR002_content_stability &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  adr: AssessmentDataRevision, psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  data: AssessmentData, params: ParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; params
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;after&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; params
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR002_content_stability
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR003: When modifying, a new version must be created instead of updating the existing version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;assert&lt;/span&gt; SR003_new_version_on_change &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;always&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; at: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]).~&lt;/span&gt;previousSource&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; at: AssessmentTarget &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]).~&lt;/span&gt;previousSource&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;check&lt;/span&gt; SR003_new_version_on_change &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR003_assessment_update &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  source, newRevision: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; source
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; source&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; source
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision, hk&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR003_parameter_update &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  source, newRevision: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; source
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; source&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; source
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision, hk&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR003_assessment_update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR003_parameter_update
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR004: Each revision can reference exactly zero or one previous version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Enforced by previousSource: lone field definition - no explicit assertion needed)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR004_revision_chain &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; rootAdr, derivedAdr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  rootPsr, derivedPsr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  rootAdr &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; derivedAdr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; rootAdr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; derivedAdr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; rootAdr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; rootPsr &lt;span style=&#34;color:#719e07&#34;&gt;!=&lt;/span&gt; derivedPsr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; rootPsr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; derivedPsr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; rootPsr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR004_revision_chain
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;exactly&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;exactly&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;exactly&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; AssessmentDataRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;exactly&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; ParameterSetRevisionId,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR005: Idempotency - same HashKey (idempotency key) returns same response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;assert&lt;/span&gt; SR005_idempotency &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;always&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;always&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;check&lt;/span&gt; SR005_idempotency &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR005_assessment_retry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey, r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, adr, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;after&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, adr, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR005_parameter_retry &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey, r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, psr, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;after&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, psr, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR005_assessment_retry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR005_parameter_retry
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR006: After successful registration, the registered version must be retrievable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// If response is logged as successful, the revision must remain registered&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;assert&lt;/span&gt; SR006_retrievability &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;always&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;all&lt;/span&gt; hk: HashKey, r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;implies&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;or&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;check&lt;/span&gt; SR006_retrievability &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR006_assessment_retrieval &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey, r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; adr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR006_parameter_retrieval &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey, r: Response &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; Success
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; r&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;revision &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; psr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR006_assessment_retrieval
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR006_parameter_retrieval
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR007: Retrieval requests return the contents recorded in that version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Automatically satisfied because revision content is immutable)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR007_assessment_by_revision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, adr: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  data: AssessmentData &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  adr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; data &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; adr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;assessmentData&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR007_parameter_by_revision &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget, psr: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  params: ParameterSet &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  psr &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; params &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; psr&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;parameterSet&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR007_assessment_by_revision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR007_parameter_by_revision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR008: AssessmentData and ParameterSet each have at most one current revision&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Enforced by the lone multiplicity of the current revision fields)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR008_assessment_current &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, currentRevision: AssessmentDataRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  previousRevision &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; currentRevision &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; currentRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR008_parameter_current &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, currentRevision: ParameterSetRevision &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  previousRevision &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; currentRevision &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; currentRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR008_assessment_current
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR008_parameter_current
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR009: Successful registration makes the new revision current&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR009_assessment_advance &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, newRevision: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR009_parameter_advance &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, newRevision: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR009_assessment_advance
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR009_parameter_advance
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// SR010: Past versions must not be modified or deleted even after a new version is registered&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;// (Automatically satisfied by operation design: registerAssessmentData/registerParameterSet only extend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;//  the mapping with new versions; they never modify or remove existing entries)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR010_assessment_history &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, newRevision: AssessmentDataRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; previousRevision &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; previousRevision &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; newRevision &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentAssessmentData&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;pred&lt;/span&gt; SR010_parameter_history &lt;span style=&#34;color:#719e07&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;eventually&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;some&lt;/span&gt; at: AssessmentTarget,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;disj&lt;/span&gt; previousRevision, newRevision: ParameterSetRevision,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hk: HashKey &lt;span style=&#34;color:#719e07&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; previousRevision &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;previousSource &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; previousRevision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;no&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;responseLog&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; registerParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;[&lt;/span&gt;at, newRevision, hk&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; previousRevision &lt;span style=&#34;color:#719e07&#34;&gt;+&lt;/span&gt; newRevision &lt;span style=&#34;color:#719e07&#34;&gt;in&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;registeredParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#719e07&#34;&gt;and&lt;/span&gt; Registry&lt;span style=&#34;color:#719e07&#34;&gt;.&lt;/span&gt;currentParameterSet&lt;span style=&#34;color:#719e07&#34;&gt;&amp;#39;[&lt;/span&gt;at&lt;span style=&#34;color:#719e07&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;=&lt;/span&gt; newRevision&lt;span style=&#34;color:#719e07&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR010_assessment_history
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; SR010_parameter_history
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt; AssessmentTarget, &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;/*  ============================================================
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    6. Sanity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#586e75&#34;&gt;    ============================================================ */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;run&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;{}&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;but&lt;/span&gt; &lt;span style=&#34;color:#2aa198&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#719e07&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#2aa198&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#719e07&#34;&gt;steps&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Execute Allの結果:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;21 commands were executed. The results are:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #1: Instance found. SR001_registration is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #2: Instance found. SR002_content_stability is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #3: No counterexample found. SR003_new_version_on_change may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #4: Instance found. SR003_assessment_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #5: Instance found. SR003_parameter_update is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #6: Instance found. SR004_revision_chain is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #7: No counterexample found. SR005_idempotency may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #8: Instance found. SR005_assessment_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #9: Instance found. SR005_parameter_retry is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #10: No counterexample found. SR006_retrievability may be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #11: Instance found. SR006_assessment_retrieval is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #12: Instance found. SR006_parameter_retrieval is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #13: Instance found. SR007_assessment_by_revision is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #14: Instance found. SR007_parameter_by_revision is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #15: Instance found. SR008_assessment_current is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #16: Instance found. SR008_parameter_current is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #17: Instance found. SR009_assessment_advance is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #18: Instance found. SR009_parameter_advance is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #19: Instance found. SR010_assessment_history is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #20: Instance found. SR010_parameter_history is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #21: Instance found. run$21 is consistent.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;↑ OK &amp;#x2705;&lt;/p&gt;
&lt;h2 id=&#34;学んだこと&#34;&gt;学んだこと&lt;/h2&gt;
&lt;p&gt;今回は反省点が多い。
途中から雲行きの怪しさを感じていた。
まとめると下記だ:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;要件定義が雑すぎた&lt;/li&gt;
&lt;li&gt;スコープを決めていなかった&lt;/li&gt;
&lt;li&gt;進め方の戦略がなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;要件定義が雑すぎた&#34;&gt;要件定義が雑すぎた&lt;/h3&gt;
&lt;p&gt;一つ一つの要件の検証にかなり時間をかけているわけだが、そもそもそれぞれの要件自体の吟味が足りていないかった。要件をかっちり決める手法として、昔（確か2022年くらい）&lt;a href=&#34;https://www.shoeisha.co.jp/book/detail/9784798146522&#34;&gt;この本&lt;/a&gt;を読んだことでICONIXを知ったのだが、当時は重厚すぎるような印象を持っていた。&lt;/p&gt;
&lt;p&gt;今回設計しているdata-registryは、&lt;a href=&#34;https://rindrics.com/posts/stock-assess-api-contract-postmortem/#:~:text=data%20service%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E7%8B%AC%E7%AB%8B%E3%81%97%E3%81%9F%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AB%E6%80%9D%E3%82%8F%E3%82%8C%E3%82%8B&#34;&gt;構想当時&lt;/a&gt;にはとてもシンプルなものという見立てだったが、少し設計してみると考えるべきことがどんどん出てくる（なお今、この設計でも観点が全然足りていないだろう）。&lt;/p&gt;
&lt;h3 id=&#34;スコープを決めていなかった&#34;&gt;スコープを決めていなかった&lt;/h3&gt;
&lt;p&gt;今回は合計で10要件を検証したように書いているが、実は途中でどんどん要件が増えてしまい、最終的に20を超えてしまっていた。
収集がつかなくなりそうだったので、記事としてはいったん10の要件で一区切りとすることにした。
ちなみに区切りとするために捨てた機能は「アーカイブ」「物理削除」「外部公開」の三つ。
非機能要件としては並行性への対処を無視している。
時間の関係から、そもそも「機能」「スコープ」について言及していない内容になってしまったが、このやり方は是非真似しないでほしい（？）。&lt;/p&gt;
&lt;h3 id=&#34;進め方の戦略がなかった&#34;&gt;進め方の戦略がなかった&lt;/h3&gt;
&lt;p&gt;これは上記二つの反省点と同列ではなく、より上位の観点にある。
Alloyで検証することが決まっているような形で走り始めてしまったため、Alloyでの検証に向かないような要件が出てきたときに管理できなくなった。
今後の管理を考えると、サービスごとにユースケース・要求・要件にIDをふってドキュメント化しておくといいかもしれない。
そろそろカンバンを作るか。&lt;/p&gt;
&lt;p&gt;・・・&lt;/p&gt;
&lt;p&gt;反省点は多いし、設計にまだ穴もあるだろうが、そろそろ動くものを作りたい。
いや、その前に冪等性の定義とDB設計があるか。&lt;/p&gt;
&lt;p&gt;作業の進捗としてはこんな感じだろうか:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; API契約を書く&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ルーティングの動作確認&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; db セットアップ&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; リポジトリ・ハンドラの実装&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;del&gt;datasetVersion生成ロジックの設計&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; API基本設計&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Revision生成ロジックの設計&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; データベース設計&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; リファクタリング&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; エラーハンドリングの追加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つづく&lt;/p&gt;
&lt;h2 id=&#34;参考情報&#34;&gt;参考情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Geewax (2022)『APIデザインパターン』マイナビ出版&lt;/li&gt;
&lt;/ul&gt;









&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;たまたま『&lt;a href=&#34;https://book.mynavi.jp/ec/products/detail/id=131252&#34;&gt;APIデザインパターン&lt;/a&gt;』を読んでいたのだった。第28章「リソースリビジョン」がドンピシャの内容だった&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;『抽象によるソフトウェア設計』でも解説されており、特異な例を見つけるのに有用とされている。それはたしかにそうかも。ちなみに、このAlloyの挙動を決めているのは解析エンジンの挙動。私の環境ではSAT4Jソルバーだったので、SAT4Jのコードを見てみたところ、&lt;a href=&#34;https://gitlab.ow2.org/sat4j/sat4j/-/commit/b0f351ab54a30fa9cb787e2a197954a700da5872?file_path=org.sat4j.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fsat4j%2Fminisat%2Forders%2FSolutionPhaseSelectionStrategy.java#line_0f73d4584_A60&#34;&gt;この部分&lt;/a&gt;によって、解決フェーズでまず&lt;code&gt;false&lt;/code&gt;が試されそうだった&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Alloyによる探索が有限スコープなのは実用観点で脇に置いておく&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>ユビキタス言語でデータ登録サービスを整理する</title>
      <link>https://rindrics.com/posts/stock-assess-data-registry-ubiquitous-language/</link>
      <pubDate>Sat, 01 Aug 2026 00:00:00 +0900</pubDate>
      
      <guid>https://rindrics.com/posts/stock-assess-data-registry-ubiquitous-language/</guid>
      <description>&lt;p&gt;アプリケーションの設計を実際の資源評価事業のメンタルモデルが反映されたものにするために、資源評価事業で使うユビキタス言語を整理した。&lt;/p&gt;
&lt;h2 id=&#34;はじめに&#34;&gt;はじめに&lt;/h2&gt;
&lt;p&gt;ユビキタス言語がないと、アプリケーションの仕様をちゃんとモデリングできない。
例えばこの記事を書いた時点では&lt;a href=&#34;../stock-assess-data-registry-1/&#34;&gt;データ登録サービス&lt;/a&gt;を作っていて、設計中に「データ」や「データセット」などの表現が混在してしまっていた。
設計を整理する中で「メタデータ」なる表現も出てきたが、資源評価担当者だった当時を振り返っても、こんな表現を使ったことは一度もなかったように思う。&lt;/p&gt;
&lt;p&gt;データ登録サービスを開発しようとしている現時点に限って言えば、いま必要なのは&lt;a href=&#34;https://www.fra.go.jp/shigen/fisheries_resources/meeting/stock_assessment_meeting/2019-2022/files/glossary20190610.pdf&#34;&gt;水産研究・教育機構が掲載している &amp;ldquo;用語集&amp;rdquo;&lt;/a&gt;にあるような、評価・管理観点の用語ではなく、データを扱う評価担当者が使っている用語だ。
それゆえに対外的に公表されにくい&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;ということで、本記事ではデータ登録サービスのユビキタス言語を整理していく。&lt;/p&gt;
&lt;h2 id=&#34;設計に必要な用語の種類&#34;&gt;設計に必要な用語の種類&lt;/h2&gt;
&lt;p&gt;用語の整理は、下記二つに分類する:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメイン語彙（ユビキタス言語）: 業務で実際に使われているもの&lt;/li&gt;
&lt;li&gt;モデル語彙: 業務で使われることはないが、期待される動作を実現するためにモデリング上必要な語彙&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前者は問題空間の用語、後者は解決空間の用語。&lt;/p&gt;
&lt;h3 id=&#34;ドメイン語彙&#34;&gt;ドメイン語彙&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;用語&lt;/th&gt;
          &lt;th&gt;形式言語内での表現&lt;/th&gt;
          &lt;th&gt;意味&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;資源&lt;/td&gt;
          &lt;td&gt;Resource&lt;/td&gt;
          &lt;td&gt;評価対象となる種名と系群の組。例：「カタクチイワシ・太平洋系群」。日常会話では「カタクチ太平洋」のように略して呼ぶことがある&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;年度評価&lt;/td&gt;
          &lt;td&gt;AnnualAssessment&lt;/td&gt;
          &lt;td&gt;特定の年度に実施する資源評価。例：「2026年度評価」&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;評価対象&lt;/td&gt;
          &lt;td&gt;AssessmentTarget&lt;/td&gt;
          &lt;td&gt;年度評価と資源の組。例：「2026年度のカタクチ太平洋」&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;評価データ&lt;/td&gt;
          &lt;td&gt;AssessmentData&lt;/td&gt;
          &lt;td&gt;年度評価で利用するデータ。例：年齢別漁獲尾数、年齢別体重、年齢別成熟率&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;パラメータセット&lt;/td&gt;
          &lt;td&gt;ParameterSet&lt;/td&gt;
          &lt;td&gt;評価計算で使用するパラメータの集合&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;シナリオ&lt;/td&gt;
          &lt;td&gt;Scenario&lt;/td&gt;
          &lt;td&gt;評価作業中に比較・検討する論理的な単位。例：「昨年度踏襲」「手法A検討用」。シナリオは、使用する評価データやパラメータセットを参照する&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;版&lt;/td&gt;
          &lt;td&gt;Revision&lt;/td&gt;
          &lt;td&gt;評価データまたはパラメータセットの不変なスナップショット。内容を修正するときは、既存の版を変更せず、新しい版を作成する&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;最新版&lt;/td&gt;
          &lt;td&gt;CurrentRevision&lt;/td&gt;
          &lt;td&gt;評価データまたはパラメータセットについて、現在使用するものとして選択されている版&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;外部公開&lt;/td&gt;
          &lt;td&gt;Publish&lt;/td&gt;
          &lt;td&gt;評価データまたはパラメータセットの特定の版を、組織外から利用可能な状態にすること&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;モデル語彙&#34;&gt;モデル語彙&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;用語&lt;/th&gt;
          &lt;th&gt;形式言語内での表現&lt;/th&gt;
          &lt;th&gt;意味&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;アーカイブ&lt;/td&gt;
          &lt;td&gt;Archive&lt;/td&gt;
          &lt;td&gt;評価データ、パラメータセットまたはシナリオを通常の利用対象から外すこと。版の内容は保持する&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;物理削除&lt;/td&gt;
          &lt;td&gt;Erase&lt;/td&gt;
          &lt;td&gt;機密情報の誤登録などに対応するため、版に記録された内容そのものを削除すること&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;登録要求識別子&lt;/td&gt;
          &lt;td&gt;IdempotencyKey&lt;/td&gt;
          &lt;td&gt;同一の登録要求を識別するために、コンシューマーが登録要求に付与する識別子&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;手元でのモデリングを進めるうえで必要だったので、ひとまずはこんなところでいいだろう。&lt;/p&gt;
&lt;p&gt;確認のために「エヴァンス本」の第2章を読み返していたのだが、「高次の構成原理（コンテキストマップや大規模な構造など）」も、今後必要になったら整理したほうがいいかも。&lt;/p&gt;
&lt;h2 id=&#34;参考情報&#34;&gt;参考情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.shoeisha.co.jp/book/detail/9784798126708&#34;&gt;Eric Evans（2013）『エリック・エヴァンスのドメイン駆動設計』翔泳社（邦訳版）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;









&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;公表されないのは機密的な問題ではなく、インセンティブの問題。内部で（何気なく）しか使わない専門表現をわざわざ整理して公開するインセンティブなどどこにもない。専門用語として認識されてすらいないこともある。&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
  </channel>
</rss>
