STEP 1676 の shape check(型 level:publicApi が string[] か等)から一歩進んで、moduleInfo の宣言内容から検証可能命題を導出し、実 code や filesystem との drift を semantic level で検出する。
self-description-contract は 2 layer で verify を掛ける:
Layer 1(verifyModuleInfo)は型を見る — publicApi は string 配列か、version は semver か、step は正整数か。Layer 2(deriveAndVerify)は宣言から 導出契約 を作って実 code / filesystem に当てる — 「publicApi に "detect" と書いてあるなら、実 module source に detect という identifier が出現するはず」「relatedModules にパスがあるなら、そのパスは存在するはず」。宣言が真ならば通り、drift があれば NONCONFORM を返す。
publicApi[]relatedModules[]fs.existsSync() で filesystem 上の実在確認。「宣言した関連 module が実際にあるか」の drift 検出。honestScope[]versionexport const MODULE_VERSION = 'x.y.z' と info.version が一致するか確認。「宣言した version と constant が同期しているか」の drift 検出。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 |
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)。
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"
verifyModuleInfo は今も動きます(型 layer)。deriveAndVerify は semantic layer で drift を検出するだけで、shape が壊れた module は先に verifyModuleInfo で NONCONFORM になります。両方揃って「宣言が真である」ことの完全な verify になります。purpose の内容妥当性、keyConcepts の code 反映、step の memory file 存在などは verify していません。「実装コスト vs 見つかる drift」 の trade-off で 4 kind を選びました。v0.3 candidate: step_memory_exists、keyconcept_grep_coverage。INDETERMINATE。false negative の可能性 = 「drift があっても見逃す」パターンあり。fs.existsSync の default 挙動に従います。const { MODULE_VERSION } = require(...)、条件付き const、動的計算 version)は検出不能 → INDETERMINATE。TypeScript の型 annotation 付き(MODULE_VERSION: string = 'x.y.z')は regex が対応済みです。