STEP 1711 · self-description-contract v2.1 2026-09-03

宣言から契約を導出する

STEP 1676 の shape check(型 level:publicApistring[] か等)から一歩進んで、moduleInfo の宣言内容から検証可能命題を導出し、実 code や filesystem との drift を semantic level で検出する。

関連 STEP 1608 / 1676 / 1690 / 1707 / 1711 MODULE_VERSION 2.0.0 → 2.1.0(additive) Test 46/46 PASS + regression 35/35 (STEP 1676)

2 layer 構造

self-description-contract は 2 layer で verify を掛ける:

Layer 1 · STEP 1676
shape check
+
Layer 2 · STEP 1711
semantic check

Layer 1verifyModuleInfo)は型を見る — publicApi は string 配列か、version は semver か、step は正整数か。Layer 2deriveAndVerify)は宣言から 導出契約 を作って実 code / filesystem に当てる — 「publicApi に "detect" と書いてあるなら、実 module source に detect という identifier が出現するはず」「relatedModules にパスがあるなら、そのパスは存在するはず」。宣言が真ならば通り、drift があれば NONCONFORM を返す。

4 kind of derived contracts

Semantic layer

01export_symbol_present

from: publicApi[]
各 entry の先頭 identifier-like token を抽出し、module source に word-boundary match で出現するか確認。「宣言した API が実装されているか」の drift 検出。
CONFORM: symbol 出現 / NONCONFORM: 消失(rename or removal) / INDETERMINATE: entry から identifier 抽出不能

02related_module_exists

from: relatedModules[]
各 entry の先頭 path token を抽出し、fs.existsSync() で filesystem 上の実在確認。「宣言した関連 module が実際にあるか」の drift 検出。
CONFORM: 実在 / NONCONFORM: 不在(moved / renamed) / INDETERMINATE: なし

03honest_scope_non_trivial

from: honestScope[]
各 entry が 20+ chars か確認。「主張しないことを、ちゃんと文章として書いているか」の内容性チェック。空 padding や 1 語だけを弾く。
CONFORM: 20+ chars / NONCONFORM: 短すぎ / INDETERMINATE: なし

04version_consistency

from: version
module source 内の export const MODULE_VERSION = 'x.y.z'info.version が一致するか確認。「宣言した version と constant が同期しているか」の drift 検出。
CONFORM: 一致 / NONCONFORM: drift / INDETERMINATE: MODULE_VERSION constant なし

Pilot round 実測(7 module aggregate)

Real drift detection

pilot round in-scope 7 module(コンビナート 4 + soft catalog + hard template + agent connector)に pilotRoundDerivation() を適用。93 contract 中 80 CONFORM(86%)+ 13 NONCONFORM + 0 INDETERMINATE。宣言と実装の drift が 13 件見つかりました — tool がちゃんと動いている証拠です。

Module Total CONFORM NONCONFORM INDET
agent-connector v2.5 22 22 0 0
combinato-time-connector-runtime 11 10 1 0
combinato-open-end-tags 9 7 2 0
combinato-ghost-wire-detector 10 8 2 0
hard-connector-template 14 12 2 0
combinato-connector-graph 12 9 3 0
soft-connector-catalog 15 12 3 0
合計 (7 modules) 93 80 13 0

Dogfood — 開発中に tool が自分で見つけた drift

Meta-value
Real finding during implementation

self-description-contract が自分の宣言の中に drift を持っていた

STEP 1711 実装中、tool を self-description-contract module 自身に当てたら、relatedModules'src/mcp/connector-catalog (STEP 1556/1673) — moduleInfo + per-entry version target' と書いてあるのに、実 file は src/mcp/connector-catalog.ts(拡張子付き)でした。.ts が宣言に欠落。

Tool を作った直後に自分で使って修正 —「宣言と実装の drift は書いた人にも気づきにくい」ことの実演になりました。同じ pattern が pilot round 6 module にも 13 件残っています(宣言の書き方の統一が課題、STEP 1712+ candidate)。

使い方

API
import { deriveAndVerify } from './aios/self-description-contract/index.js';
import { moduleInfo } from './agent-connector/index.js';

const summary = deriveAndVerify(
  moduleInfo(),
  'src/agent-connector/index.ts',
);
console.log(`${summary.conform}/${summary.total} CONFORM`);
// → "22/22 CONFORM"

for (const r of summary.results) {
  if (r.verdict !== 'CONFORM') {
    console.log(`${r.contract.kind} ${r.contract.target}: ${r.reason}`);
  }
}

Pilot round 全 7 module 一括:

import { pilotRoundDerivation } from './aios/self-description-contract/index.js';

const pilot = await pilotRoundDerivation();
console.log(`${pilot.totalConform}/${pilot.totalContracts} CONFORM across ${pilot.totalModules} modules`);
// → "80/93 CONFORM across 7 modules"

Honest scope

主張しないこと
  1. これは shape check の代替ではなく、追加 layer。 STEP 1676 の verifyModuleInfo は今も動きます(型 layer)。deriveAndVerify は semantic layer で drift を検出するだけで、shape が壊れた module は先に verifyModuleInfoNONCONFORM になります。両方揃って「宣言が真である」ことの完全な verify になります。
  2. 4 kind は 4 kind、full spec 化ではありません。 purpose の内容妥当性、keyConcepts の code 反映、step の memory file 存在などは verify していません。「実装コスト vs 見つかる drift」 の trade-off で 4 kind を選びました。v0.3 candidate: step_memory_existskeyconcept_grep_coverage
  3. publicApi の identifier 抽出は regex heuristic。 先頭の identifier-like token を抽出しますが、「detect / detectAll (agent 実在検出)」のような複数 API 記述で 2 個目以降は verify しません。説明的 string で識別子が無いと INDETERMINATE。false negative の可能性 = 「drift があっても見逃す」パターンあり。
  4. related_module_exists は path 存在のみ。 file の内容 sanity や module として import 可能かは verify しません。symbolic link の追跡は fs.existsSync の default 挙動に従います。
  5. version_consistency は "export const MODULE_VERSION = ..." pattern に限定。 別 form(const { MODULE_VERSION } = require(...)、条件付き const、動的計算 version)は検出不能 → INDETERMINATE。TypeScript の型 annotation 付き(MODULE_VERSION: string = 'x.y.z')は regex が対応済みです。
  6. 13 NONCONFORM の内訳は STEP 1712+ で cleanup 対象。 本 STEP のスコープは「tool を作る」であって「drift を全部直す」ではありません。drift 一覧は memory file と source から辿れます。