/** * provenance.ts — IR の出自(provenance)を保証する unforgeable compile capability(SA1/SA2/SA7)。 * * scp-only-authoring-contract.md §5 の token 方式の実装。**この module だけ**が capability * token を発行でき、consumer は forge 不能。IR(`ComponentGraphIR` handle)の唯一の正規生産者を * compile seam(`compileBehaviors` とロード時 fingerprint-gated loader)に一本化する。 * * ## 二層の門 * * - **プロセス内 capability(token)— authoring 迂回の完全封鎖** * {@link COMPILED} は **module-private な `unique symbol`**。IR handle にこの symbol を鍵とする * 非列挙・symbol-keyed プロパティ(token 参照)を刻む。consumer はこの symbol を参照できないため、 * token を持つ値を**構築できない**(TS 型 = brand、実行時 = symbol 同一性)。{@link assertCompiled} * は `ir[COMPILED]` の同一性を O(1) で照合する(hot path 非依存)。→ 手組み IR(proposal 経路 B/C)は * authoring 時点で不可能。 * * - **シリアライズ境界 fingerprint — 改竄/stale 検出** * token はプロセス内 capability ゆえ JSON 境界を越えない。JSON で届く IR(conformance vector / * cross-language / codegen fixture)は {@link loadCompiledIR} を通す。loader は canonical fingerprint * を**ロード時 1 回だけ**再計算・照合し([[codegen-purity-no-ir-no-json]] / graphddb#315 の per-call * skew は禁止)、通ったものにだけプロセス内 token を再発行する。stale/改竄は loud reject。 * * ## 不可視性(goldens / fingerprint を一切変えない) * * token は **`Object.defineProperty` で `enumerable:false` の symbol-keyed プロパティ**として刻む。 * `canonicalValue` / `canonicalJson` / `fingerprintComponentGraph` / `JSON.stringify` はいずれも * `Object.keys`(列挙可能な文字列キー)しか見ないため、token は正準化・fingerprint・直列化に * **一切現れない**。既存の goldens・fingerprint・5 言語境界 self-check は byte-for-byte 不変。 */ import type { Catalog, ComponentGraphIR as ComponentGraphIRShape } from "./behavior.js"; import type { ComponentGraphIR } from "./ir-handle.js"; /** * DeclarationMeta — compile 済み handle に随伴する**宣言由来メタの全体**(IR に載らない事実の唯一の * 置き場。第 2 の side-channel を作らない)。各フィールドは codegen 入口 `generateModule` が読み、 * emitter が消費する: * - `leafCatalog` — `@leaf` シグネチャから導いた `CatalogEntry` 群。`CatalogEntry.async`(#210)が * per-terminal-handler の I/O モデルの出所。 * - `entryPortOrder` — component 名 → **authored な引数順**の input port 名列(#192 規則 1: 生成 * エントリは authored シグネチャの 1:1 写像 = 引数はそのままの位置引数)。IR の `inputPorts` は * canonical 正規化でキーが code-point 順に並び替わるため、**宣言順は IR からは復元できない**。 */ export interface DeclarationMeta { readonly leafCatalog: Catalog; readonly entryPortOrder: Readonly>; } /** * {@link DeclarationMeta} のフィールド閉集合(値の runtime-enumerable SoT)。宣言由来メタは * 「IR に載らないが codegen が読む事実」であり、**産出(reader)と消費(emitter)の両端が要る**。 * 片端しか無いものは #210 と同じ死んだ能力になるので、両端をゲート(ast-equivalence.test.ts / * cli-from-ts.test.ts の `[completeness]`)が実測で照合する。 */ export declare const DECLARATION_META_KEYS: readonly ["leafCatalog", "entryPortOrder"]; /** * NON_COMPILED_IR — 出自ゲート(run/generate/fingerprint 入口)の fail-closed 失敗。 * un-tokened / hand-built / tampered IR を拒否する(0.8.0 end-state = fail-closed)。 */ export declare class ProvenanceError extends Error { code: "NON_COMPILED_IR"; constructor(message: string); } /** * mintCompiled — 検証済みルート IR に token を刻んで opaque handle にする(**内部専用 seam**)。 * * `compileBehaviors`(authoring.ts)と {@link loadCompiledIR}(境界 loader)の**両方**が使う * 唯一の mint 点。export するが index.ts では公開しない(package の内部 API)。ここが唯一 * cast が許される seam である(brand は module-private symbol ゆえ型でも構築できないため)。 * * token は `enumerable:false` の symbol-keyed プロパティとして刻む → 正準化・fingerprint・ * `JSON.stringify` に一切現れない(不可視性の要)。 * * @param declaration 省略可。compile seam がソース宣言から導いた {@link DeclarationMeta}。token と * 同じ非列挙 symbol-keyed 規律で退避する(IR 本体・fingerprint・JSON には現れない = C4 不変)。 * 境界 loader({@link loadCompiledIR})は JSON 由来で宣言を持たないため渡さない。 */ export declare function mintCompiled(ir: ComponentGraphIRShape, declaration?: DeclarationMeta): ComponentGraphIR; /** * getDeclarationMeta — compile 済み handle に随伴する {@link DeclarationMeta} を取り出す(**内部専用 * seam** — codegen 入口 `generateModule` が宣言メタを読む唯一の点)。宣言を持たない handle * (`loadCompiledIR` / `--in` で adopt した境界 IR)は `undefined`(宣言が無い = 注記も無い)。 */ export declare function getDeclarationMeta(ir: unknown): DeclarationMeta | undefined; /** * assertCompiled — 出自ゲート(SA7)。`ir` が compile seam を通った handle であることを * O(1) で照合する。un-tokened / hand-built / tampered IR は `NON_COMPILED_IR` で loud reject。 * * `runBehavior` / `runBehaviorAsync` / `generateModule` / `fingerprintComponentGraph` の入口に * 必ず配置する(0.8.0 fail-closed end-state)。 */ export declare function assertCompiled(ir: unknown): asserts ir is ComponentGraphIR; /** * loadCompiledIR — シリアライズ境界の fingerprint-gated loader(SA3)。JSON で届いた IR * ドキュメントを受け取り、canonical fingerprint を**ロード時 1 回だけ**再計算・照合してから * プロセス内 token を再発行する。stale/改竄(期待 fingerprint 不一致)は loud reject。 * * **`expectedFingerprint` は必須**(#203)。省略を許すと「再計算するだけで token を発行する」 * 経路になり、**手組みのオブジェクトリテラルが正規 token を得られてしまう** —— それは * {@link assertCompiled} が名指しで拒む対象(hand-built / un-tokened)そのもので、 * 「IR の唯一の producer は compile seam」という不変(本ファイル冒頭)と矛盾する。正規の * fingerprint は **bc が生成時に artifact へ焼いた定数**(生成モジュールの `IR_FINGERPRINT`) * からしか得られない: 公開面にある {@link fingerprintComponentGraph} は `assertCompiled` を * 先に通すので、token を持たない doc からは取り出せない。ゆえに必須化がそのまま穴を塞ぐ。 * * CLI 内部の `--in`(開発者が書いた IR JSON を build-time に読む test 入力)は焼かれた * fingerprint を持たないので、公開 loader ではなく内部 seam {@link adoptIrDoc} を通る。 * * @param doc JSON 由来の可搬 IR ドキュメント(token は持たない)。 * @param expectedFingerprint 生成モジュールが焼いた canonical fingerprint。再計算値と一致する * ことを要求し、不一致は改竄/stale として `NON_COMPILED_IR` で reject する。 * @returns token 済み opaque handle(`runBehavior`/`generateModule` にそのまま渡せる)。 */ export declare function loadCompiledIR(doc: unknown, expectedFingerprint: string): ComponentGraphIR; /** * adoptIrDoc — 可搬 IR ドキュメントの形を検証して token を発行する **内部専用 seam** * (`index.ts` / `runtime.ts` から export しない = consumer からは到達不能)。 * * {@link loadCompiledIR} と同じ受理条件({@link assertIrDocShape})を読み、違いは「照合すべき * 焼き込み fingerprint を持つか」だけ。持たないのは **package の内側の入力**に限る: CLI の `--in` * (build-time に開発者自身が渡す IR JSON)と、bc 自身のテスト/conformance ベクタ(手組みの可搬 IR)。 * どちらもランタイム API の出自ゲートではない。consumer から到達する経路は 1 つ(公開 loader)だけで、 * そこは fingerprint 必須のまま。 */ export declare function adoptIrDoc(doc: unknown, where?: string): ComponentGraphIR; /** * fingerprintComponentGraph — 公開の canonical fingerprint(出自ゲート付き)。 * * consumer 向けの入口。`assertCompiled` を通した compile 済み handle にだけ fingerprint を * 計算する(SA7)。手組み/無 token/改竄 IR は `NON_COMPILED_IR` で reject。境界越えの * 生 JSON から fingerprint を得たい内部経路({@link loadCompiledIR} / codegen core)は * generator/fingerprint.ts の raw 実装を直接使う(gate を通さない)。 */ export declare function fingerprintComponentGraph(ir: unknown): string; //# sourceMappingURL=provenance.d.ts.map