10. Profile・埋め込み・実行入口

方針

ソース上の相互埋め込みとcrate依存を分離する。suiteが登録済みlanguage package、domain operation、output adapterを接続する。

1. Profile

Profileはlanguage alias→SchemaRef、category mode、provider allowlist、operation bridge、resource snapshot、Limitsを持つ不変値。root languageはファイル拡張子またはCLI引数で選び、全ソースを一律のlexerで先にtoken化しない。

design/profile.json はsource manifestであり、解決済みruntime Profileではない。R009の解消では生成結果の閉じた型、各schema/package/provider digest、許可capability、resource identityと整合検査を先に定める。T05/T11で実際の検査済みpackageから生成・差分検査し、UI/Workerはこの値を利用する。R006の操作・bundle型の未定義を文字列signatureや仮digestで補わない。

解析の実入口はengineのParseProfileとし、suite Profileから渡す不変なprojectionとして扱う。interfaces/engine.jsonにlanguage登録、category mode、選択schema、provider要件、operation allowlist、resource identity、Limitsの型を置く。resolveは独立したhost RuntimeCatalogとfinalize済みregistryを使い、実package意味digest、schema参照閉包、guest category/mode、host provider登録の実装identity、resourceの実byte列digestを照合する。外部Profileの自己申告をそのままhost登録へ複写して検査済みとしない。

provider identityはhostが実assetまたは版管理された実装manifestから確定する。coreはbinaryを読み込まず、binary自身のhashを同じbinary内の定数へ埋める自己hash循環も要求しない。operationのschema署名が既知でもcallbackが登録されたことにはならない。parseに使うreader providerは許可済み実登録を要求し、未実行のfacts等のextensionは署名を検査するが自動実行しない。

解析ProfileのidentityはNEPL3-PARSE-PROFILE-1、zero byte、canonical JSONのSHA-256。id、language登録、schema、category-mode指定、providerの実装identity、allowlist、resource identity、Limitsを含める。宣言はalias/idまたは完全OperationRef/SchemaRef順、Limits列はsourceBytes/work/depth/nodes/allocationUnits/outputBytes/diagnostics/events順とする。実resource bytesはhash照合し、Profileへ全文複製しない。

HeadProviderの登録はheadProvidersのHeadRegistration(alias,category,provider)で選ぶ。同じpackageを登録した別aliasの設定を共有したと推定しない。(alias,category)重複を拒否し、shape/childContextの両OperationRefについて純粋なHeadCall→HeadReply署名、allowlist、独立host catalogの実装identityを検査する。標準操作名はheadShape/headChildContextだが、登録済みの同署名操作も選択できる。Profile identityにはheadProviders keyを含め、alias/category順の [alias,category,shapeOperation,childContextOperation] 列で記述する。列挙順だけの変更はidentityを変えず、操作の役割・alias/categoryへの割当変更は変える。

ここでのallowlistはoperation呼出可否を表す。providerのtransport、隔離、ネットワーク等の権限、強制停止方法、bridge、EnvironmentProjectionを含むfull suite Profileの契約は引き続き実装対象である。この解析projectionだけではR009全体を完了しない。hostは実行環境のcapabilityを別途検査し、解析projectionはその承認を代行しない。

配布拡張子は .neplg.nepld.neplm.neplc。汎用 .nepl ではlanguage指定を必須にする。既存NCGやGlossのファイルを新言語として黙って解釈しない。

ParseProfile.limitsは解析操作に対するresource別上限であり、単なる既定値ではない。操作開始時に実Budgetの全LimitsがProfile上限以下であることを照合し、超える場合はLimitsMismatchで拒否する。小さい操作予算を使うことは許す。既に消費したUsageはresetせず、継続も同じ操作Limitsと単調なUsageを保持する。Profileのresolve自体を行う開発・host側Budgetはこの解析操作Budgetとは別であり、解決時の消費を解析へ済んだものとして移さない。

EntryContextはaliasを明示保存する。同じpackage identityを異なるaliasで登録してcategory-mode overrideだけを変えることを許し、子のLocal解決も親の実aliasを使う。Profileのlanguage列の並び順は意味に含めず、aliasから選ぶ対応を継続へ保持する。alias別のreader stateとenvironmentも明示し、guest不足をUnitやhost環境で補わない。

2. 標準bridge

host slotsource入口guest root操作
Doc InlineMathMathMath.Exprlower/check、17章の生成policyによるrender
Doc DisplayMathMathMath.Expr同上、display style
Doc CircuitFigureCircuitCircuit.Designlower/check/elaborate/diagram
Doc CodeGrammar/Doc/Math/Circuit対応する根source/viewの表示のみ
Math LabelDocDoc.Sentencelower/check/render phrasing

MathのDoc注記は文書全体やparagraphを受け入れない。これでMathMLの注記位置へblock文書が混入しない。Code内の不正なguestはRecover構文として保持できる。render時にもevaluate/compileを開始しない。

言語の切替えは一つの引数の範囲に限定し、終了時にhostのmodeへ戻る。たとえばDoc/math/Math/add内からDoc sentenceへ戻っても、そのguestの外側のtriviaを読み過ぎない。

3. 相互依存と再帰

ソース上の有限な入れ子は許す。ForeignSyntaxはroot node、language revision、originと環境参照を保持する。操作グラフは対象nodeとoperationの組を頂点に持ち、suiteが必要な依存順に処理する。

Doc→Math→Docの有限の注記は循環ではない。同じnodeのrenderが再び自分のrenderを要求する等の循環はCyclicOperation。生成によって構造が増える場合も共通予算とoriginを維持する。

4. 環境の受渡し

各guestの名前空間は既定で新しく分離する。DocLabel、MathSymbol、CircuitSignalを一つの名前辞書へ入れない。bridgeは必要に応じて EnvironmentProjection として、どのnamespace/entityをどの型の外部値として渡すかを明示する。

配布bridgeはMathのfree symbol値をRenderContextから明示的に受け取り、DocLabelとCircuitSignalは自動exportしない。Doc annotation内のlabelはそのsentenceの局所scopeで検査する。呼出し側のlabel参照が必要ならprofileのprojectionで明示する。

5. artifactの準備

backendsに任意raw HTML stringを渡さない。suiteがforeign subtreeをtyped MarkupFragmentへ変換し、そのslotに適合する内容モデルを検査する。doc-htmlはPreparedEmbedsの対応表を入力として受け取る。math-mathml/circuit-svgを直接importしない。

asset参照は固定内容とdigestを持つResourceSnapshot。coreがpathから読んだりURLへ接続したりしない。HTML出力は既定で外部network無しで閲覧できる。KaTeX生成時は同じ固定版のCSS/fontをartifactへ同梱し、相対参照とlicenseを保持する。host生成・独立MathML fallback・出力検査・asset identityは17章に従う。全資源を明示的なartifact dependencyとして報告する。

6. CLI

nepl3 parse --language doc input.nepld --format ndf|json はRecover treeと診断を出す。 nepl3 check input.nepld は必要なdomain検査と参照検査を行う。 nepl3 render input.nepld --output out.html は埋め込みをprepareしHTMLを出す。 nepl3 render input.neplm --output out.html は生成済み数式を含むHTMLと必要assetを出す。Doc/Mathのrenderは --math-renderer katex-preferred|mathml-only を取り、既定はKaTeX優先。生成能力不足等のMathML fallbackは診断を保持する。 nepl3 evaluate input.neplm --bindings bindings.ndf はExact/Symbolic/Invalidを構造化出力する。 nepl3 grammar compile input.neplg --output out.ndf はLanguagePackageを出す。 nepl3 circuit test input.neplc は全testを実行する。 nepl3 circuit compile input.neplc --target nor --output out.ndf はNOR IRを出す。 nepl3 circuit diagram input.neplc --output out.svg はSVGを出す。 nepl3 format input --style prefix|compact は明示的なformatter。既定はstdoutで、--write時だけファイルを置換する。

終了code: 0 成功(Symbolicは操作が許す正常結果)、1 入力/検査/テスト失敗、2 CLI/config/protocolエラー、3 limit/cancel、4 provider内部違反。stdoutは成果物だけ。sourceのdecode失敗を成功空文書にしない。

7. browser/native/WASI

同じsuite APIを利用する。browserではWorkerで計算し、未応答時はWorkerを終了できる。ファイル/ネットワーク権限はWeb shellに限定する。wasm-bindgenのJS undefined/nullは境界でOption/Resultへ変換し、domainへ流さない。

wasm32-wasip2 CLIはWASI I/O adapterを使う。nativeのprocess provider呼出しをbrowser/WASIへ無条件に持ち込まない。該当hostが提供するregistry/runnerのcapabilityを検査する。組込み4言語の基本操作は全targetで使える。

現在の正本: Markdown原文。NEPL3dへの移行は別途進めています。