NEPLg2 self-host source tree layout review

作成日: 2026-05-18

目的

NEPLg2 self-host compiler の実装をさらに進める前に、現行 Rust compiler の分量と構造を再確認し、stdlib/neplg2/ 側で採用するディレクトリ構造とファイル分割方針を固定する。

この文書は self_host_plan.md の「推奨ディレクトリ構造」を、2026-05-18 時点の Rust 実装と静的検査大規模修正の進捗に合わせて具体化する。目的は Rust 実装の flat さを NEPL 側に移植しないことである。

関連 issue:

結論

self-host compiler は core/cli/ の二層分割だけでは不十分である。core/ の内部も pipeline stage、typed model、generic proof engine、Resource IR subdomain ごとに階層化する。

特に次の方針を固定する。

  • root module は orchestration または public facade に限定し、巨大な実装本体を置かない。
  • parser、typecheck、Resource IR、codegen は Rust 側の root flat file をそのまま移植しない。
  • 静的検査の証明器は core/proof/ に汎用基盤として置き、owner / initialized / borrow / effect / abstraction check が個別に証明器を持たない。
  • stdlib や module 名の allowlist ではなく、source code、typed AST/HIR、typed capability、Resource IR fact から性質を証明する。
  • 新規 self-host 実装は最初から最終階層に置く。旧 path 互換のためだけの wrapper は作らない。facade が必要な場合も実装を持たない public API 境界に限定する。
  • ドキュメントコメントや doctest は削らない。ファイルが大きくなる場合は責務で分割し、説明を落とさない。

現行 Rust 実装の分量

2026-05-18 時点の nepl-core/src は 382 files / 約 79,607 行である。大きい領域は次の通り。

領域fileslines評価
resource/27137,090subdomain は分割されているが、mod.rs が巨大な export hub になり、owner / initialized / effect / lower / summary が同一階層に並びすぎている。NEPL 側ではさらに階層を切る。
root 直下3627,732parser.rscodegen_llvm.rscodegen_wasm.rscompiler.rstypes.rsloader.rs などが root にあり、依存方向が見えにくい。NEPL 側では root 直下に実装本体を置かない。
typecheck/3911,332typecheck.rs は facade 化済みだが、prefix_check.rsdriver.rs が大きい。NEPL 側では check/abstraction/proof/ に責務を分ける。
source_capability/231,585static proof の一部が compiler source proof として分離された。NEPL 側では proof/source/ として汎用証明器に接続する。

大きい root file は次の通り。

filelinesself-host 側での扱い
nepl-core/src/parser.rs4,036syntax/parser/ 配下へ module / item / expr / type / pattern / directive / raw backend で分割する。
nepl-core/src/codegen_llvm.rs3,847codegen/llvm/ 配下へ module / type map / aggregate / scalar / intrinsic / text emitter で分割する。
nepl-core/src/codegen_wasm.rs2,392codegen/wasm/ 配下へ module / section / instr / local / data / leb128 / runtime で分割する。
nepl-core/src/compiler.rs2,183pipeline/ または core/pipeline.nepl は orchestration のみとし、各 stage result を専用 module に置く。
nepl-core/src/types.rs2,044ty/abstraction/ へ分割し、trait / generic / type constructor / layout を混在させない。
nepl-core/src/loader.rs2,011module/physicalmodule/syntax_graphmodule/logicalcli/file_io に分ける。
nepl-core/src/monomorphize.rs1,358mono/instancemono/substmono/worklistmono/trait_lookup に分ける。
nepl-core/src/diagnostic_codes.rs1,313infra/diag/code/ に category ごとに分け、string 化は exhaustive match に限定する。
nepl-core/src/lexer.rs1,218syntax/lexer/ 配下へ state / indent / literal / directive / raw mode / tokenize で分割する。

現行 stdlib/neplg2/ の分量

2026-05-18 時点の self-host tree は 39 files / 約 10,239 行である。まだ部分実装だが、既に大きい file が出ている。

filelines対応方針
core/syntax/lexer.nepl1,3292026-05-20 に syntax/lexer/ 配下へ分割済み。root は facade のみ。
core/hir/hir.nepl2782026-05-20 に hir/ 配下へ分割済み。root は facade と doctest のみ。
core/syntax/token.nepl382026-05-20 に syntax/token/ 配下へ分割済み。root は facade と doctest のみ。
core/ty/ty.nepl402026-05-20 に ty/ 配下へ分割済み。root は facade と doctest のみ。
core/syntax/parser/module_parser.nepl442026-05-20 に syntax/parser/module_parser/ 配下へ分割済み。root は facade と doctest のみ。
core/resolve/name_resolver.nepl1542026-05-20 に resolve/name_resolver/ 配下へ分割済み。root は facade と doctest のみ。
core/infra/diag.nepl422026-05-20 に infra/diag/ 配下へ分割済み。root は facade と doctest のみ。
core/builtins/prelude.nepl412026-05-20 に builtins/prelude/ 配下へ分割済み。root は facade と doctest のみ。

これらは「今すぐ全分割してから実装する」という意味ではない。だが、今後の実装をこれらの巨大 file に直接足さない。関連 issue を解く commit では、必要な責務単位を切り出してから実装する。

2026-05-20 proof architecture refresh

2026-05-20 時点で Stage 6 proof architecture は大きく前進し、source span、raw backend、module directive、module declaration、type kind、trait coherence、lifetime、Resource cell、owner、borrow、effect を core/proof/ の fact / obligation / evidence / refutation / solver に載せた。

この進捗により、2026-05-18 の source tree review で想定した「core/proof/ は最小 model」という前提は古くなった。現行 stdlib/neplg2/ の大きい proof file は次の通りである。

filelines評価
core/proof/solver.nepl959pass implementation の 900 行目安を超えている。次の proof domain / rule 追加前に entry / dispatch / domain rule へ分割する。
core/proof/query.nepl490query、evidence、refutation payload、helper が同居している。variant 追加時の網羅性はあるが、model と projection helper は分ける。
core/proof/fact.nepl469fact payload と domain helper が同居している。fact domain ごとに分けられる段階に入っている。
core/proof/api.nepl418public API projection が証明 domain 数に比例して増える。wrapper 生成ではなく、typed projection policy を domain ごとに分ける。
core/proof/obligation.nepl120まだ小さいが、obligation payload は fact/evidence/refutation と同じ domain 分割方針に合わせる。

Rust 側も 2026-05-20 時点で parser.rs 4,044 行、codegen_llvm.rs 3,847 行、codegen_wasm.rs 2,392 行、compiler.rs 2,183 行、types.rs 2,176 行、loader.rs 2,165 行、typecheck/prefix_check.rs 1,800 行、typecheck/driver.rs 1,662 行が残っている。self-host はこの file 単位を移植せず、proof / check / resource / abstraction の責務単位で分ける。

proof split policy

core/proof/ は「個別 module ごとの証明器」ではなく、全 stage が使う汎用 proof engine である。この方針は維持する。ただし、汎用 engine であることと file を少数に押し込めることは同じではない。

今後の proof 関連実装は、次の責務へ分ける。

  • proof/domain.nepl: SelfhostProofDomain と domain equality。文字列 code や numeric tag にしない。
  • proof/fact/*: source / module / type / trait / lifetime / resource / owner / effect などの fact payload。
  • proof/obligation/*: fact と同じ domain 分割の obligation payload。
  • proof/evidence/*: success evidence と evidence kind。API projection が payload を直接潰さないようにする。
  • proof/refutation/*: mismatch、unexpected evidence、domain-specific failure payload。
  • proof/solver/dispatch.nepl: public SelfhostProofQuery -> SelfhostProofResult entry、domain precheck、fact / obligation の domain が一致した後の exhaustive dispatch。
  • proof/solver/*: source、module、type、trait、lifetime、resource、owner、borrow、effect などの proof rule。rule module の entry は dispatch から呼ぶため internal-public にしてよいが、proof/solver.nepl facade からは generic solver entry だけを公開する。
  • proof/api/*: caller 向け typed wrapper と evidence projection。projection failure は UnexpectedEvidence にする。

この分割は汎用証明器を弱めるものではない。domain rule は SelfhostProofQuery を受ける同じ proof system の一部であり、checker / resource / typecheck は fact producer または obligation producer に留まる。

2026-05-20 に ISS-20260520T025806063Z-SELF-HOST-PROOF-FILES-EXCEED-SPLIT-T-023C09E6 でこの分割を実施した。fact.nepl / query.nepl / solver.nepl / api.nepl は implementation-free facade になり、実装は次の file へ移った。

filelines役割
core/proof/domain.nepl177proof domain enum と domain equality。
core/proof/fact/model.nepl296fact payload と fact domain derivation。
core/proof/evidence.nepl89success evidence と evidence kind。
core/proof/refutation.nepl332typed refutation payload。
core/proof/query/model.nepl97query/result model と mismatch / unexpected evidence helper。
core/proof/solver/dispatch.nepl300generic solver entry、domain precheck、exhaustive dispatch。
core/proof/solver/source.nepl25source span proof rule。
core/proof/solver/module.nepl355raw backend、module directive、declaration header proof rule。
core/proof/solver/resource.nepl221Resource cell、owner、borrow、lifetime proof rule。
core/proof/solver/type.nepl39type kind、trait coherence proof rule。
core/proof/solver/effect.nepl66effect boundary proof rule。
core/proof/api/source.nepl47source span API projection。
core/proof/api/module.nepl121module proof API projection。
core/proof/api/resource.nepl159resource / owner / borrow / lifetime API projection。
core/proof/api/type.nepl83type / trait API projection。
core/proof/api/effect.nepl47effect API projection。

分割後も checker や Resource module は個別 proof engine を持たない。dispatch と rule module は同じ typed fact / obligation / evidence / refutation model を共有し、nodesrc/test_selfhost_proof_entry_contract.js が facade の薄さと分割閾値を監視する。

目標ディレクトリ構造

stdlib/neplg2/
    core/
        infra/
            source/
                file_id.nepl
                span.nepl
                text.nepl
                source_map.nepl
            diag/
                code/
                    loader.nepl
                    lexer.nepl
                    parser.nepl
                    resolve.nepl
                    type.nepl
                    trait.nepl
                    effect.nepl
                    resource.nepl
                    backend.nepl
                    cli.nepl
                code.nepl
                value.nepl
                collection.nepl
                outcome.nepl

        syntax/
            token/
                kind.nepl
                token.nepl
                name.nepl
                directive.nepl
            lexer/
                state.nepl
                indent.nepl
                literal.nepl
                directive.nepl
                raw_mode.nepl
                tokenize.nepl
            ast/
                module.nepl
                item.nepl
                expr.nepl
                type_expr.nepl
                pattern.nepl
                directive.nepl
                raw_backend.nepl
            parser/
                module.nepl
                item.nepl
                expr.nepl
                type_expr.nepl
                pattern.nepl
                signature.nepl
                directive.nepl
                raw_backend.nepl

        module/
            physical/
                path.nepl
                vfs.nepl
                stdlib_map.nepl
            syntax_graph/
                import_spec.nepl
                import_scan.nepl
                graph.nepl
            logical/
                module_id.nepl
                visibility.nepl
                export_table.nepl
                facade_merge.nepl
            loader.nepl

        resolve/
            def_id.nepl
            def_table.nepl
            scope.nepl
            hoist.nepl
            import_resolver.nepl
            name_resolver.nepl
            visibility.nepl

        ty/
            id.nepl
            kind.nepl
            record.nepl
            arena.nepl
            unify.nepl
            subst.nepl
            layout.nepl
            type_expr_reduce.nepl

        abstraction/
            generic_param.nepl
            trait_def.nepl
            trait_bound.nepl
            impl_table.nepl
            coherence.nepl
            overload.nepl
            dictionary.nepl

        proof/
            fact.nepl
            obligation.nepl
            evidence.nepl
            lattice.nepl
            solver.nepl
            worklist.nepl
            query.nepl
            source/
                capability.nepl
                exact_use_site.nepl
                raw_memory.nepl
                owner_aggregate.nepl
                compiler_memory.nepl

        check/
            driver.nepl
            module.nepl
            decl.nepl
            expr/
                reduce.nepl
                check.nepl
                call.nepl
                field.nepl
                control.nepl
            pattern.nepl
            trait.nepl
            effect.nepl
            diagnostics.nepl

        hir/
            id.nepl
            range.nepl
            expr.nepl
            function.nepl
            module.nepl
            arena.nepl
            lower.nepl
            walk.nepl

        resource/
            ir/
                id.nepl
                place.nepl
                op.nepl
                block.nepl
                function.nepl
                module.nepl
            lower/
                lower.nepl
                call.nepl
                aggregate.nepl
                match.nepl
                raw_memory.nepl
                condition.nepl
            owner/
                state.nepl
                transfer.nepl
                summary.nepl
                extent.nepl
                variant.nepl
                check.nepl
            init/
                cell.nepl
                alias.nepl
                range.nepl
                summary.nepl
                check.nepl
            borrow/
                state.nepl
                scope.nepl
                usage.nepl
                check.nepl
            effect/
                op.nepl
                summary.nepl
                boundary.nepl
                check.nepl
            drop/
                requirement.nepl
                plan.nepl
                elaboration.nepl
            host/
                memory_contract.nepl
                dependent_length.nepl
                external_io.nepl
            report.nepl

        mono/
            instance.nepl
            subst.nepl
            worklist.nepl
            trait_lookup.nepl
            mono.nepl

        codegen/
            wasm/
                module.nepl
                section.nepl
                instr.nepl
                local.nepl
                data.nepl
                leb128.nepl
                layout.nepl
                intrinsic.nepl
                runtime.nepl
            llvm/
                module.nepl
                type_map.nepl
                expr.nepl
                aggregate.nepl
                scalar.nepl
                intrinsic.nepl
                text.nepl

        pipeline/
            request.nepl
            stage.nepl
            artifact.nepl
            compile.nepl
        pipeline.nepl
        options.nepl

    cli/
        args/
            types.nepl
            classify.nepl
            parse.nepl
            emit.nepl
            options.nepl
        reporter/
            human.nepl
            json.nepl
            collection.nepl
        file_io/
            read.nepl
            write.nepl
            vfs_build.nepl
        driver.nepl
        main.nepl

分割原則

1. stage と data model を混ぜない

ty/record.nepl は型表現だけを持つ。check/expr/check.nepl は式の検査だけを持つ。resource/ir/place.nepl は Resource IR の place 表現だけを持つ。表現と検査を同じ file に詰め込まない。

2. root file は実装置き場にしない

core/pipeline.neplcore/check/driver.neplcore/resource/report.nepl のような root 寄り file は、依存方向を示す orchestration と public API 境界に限定する。

3. 証明器は汎用基盤にする

owner、initialized、borrow、effect、source capability、abstraction coherence がそれぞれ別々の ad hoc 証明器を持つ設計は禁止する。各 stage は typed fact と obligation を core/proof/ に渡し、proof/solver.neplproof/query.nepl を通して検査する。

個別 module は「証明器」ではなく「fact producer」または「obligation producer」である。たとえば resource/owner/check.nepl は owner obligation を生成するが、source code を再走査して独自に raw helper 名を推測しない。

4. enum / match で静的検査が効く構造にする

diagnostic code、Resource IR op、effect op、type kind、trait obligation、proof fact、proof obligation は enum で表す。stable string は reporter 境界でだけ作る。wildcard arm は原則使わず、新 variant 追加時に compile error または source policy で未対応が露出するようにする。

5. stdlib allowlist を性質の証明にしない

core/mem/internal や特定関数名を列挙して安全とみなす設計は禁止する。特権的な操作は、source capability、typed definition identity、use-site proof、Resource IR fact、owner extent proof のいずれかで証明する。

6. ファイルの大きさは責務で制御する

行数だけを理由にドキュメントコメントを削らない。目安は次の通り。

種別目安超過時の対応
pure model / enum file400-700 linesenum category や payload type で分割する。
pass implementation500-900 lineswalker、obligation producer、diagnostic builder、helper を分ける。
facade / orchestration200-500 lines実装が混ざっていないか確認する。
doctest-heavy file行数のみで問題視しないドキュメントを削らず、API group で分ける。

1 file が 900 行を超える場合は、次の commit で同じ file に新機能を足す前に分割 issue を立てる。ただし exhaustive enum mapping のように責務が単一であり、分割すると網羅性が弱くなる場合は例外として doc に理由を書く。

7. doctest と source policy を階層に合わせる

各 directory は最低 1 つの .n.md integration doctest または module doctest を持つ。静的検査・抽象化・Resource IR については、正常系だけでなく compile_fail / diagnostic code / stdout report を固定する。

source policy は implementation detail の文字列検索だけにしない。どうしても Node.js source policy で監視する場合は、再導入してはいけない構造を明示する。

self-host 実装へ戻る前の適用方針

今後の self-host 実装はこの順で進める。

  1. 新しい実装を既存の巨大 file に足す前に、置き場所がこの文書の最終階層に一致しているか確認する。
  2. checker 入口を作る場合、core/check/checker.nepl に実装本体を置かず、core/check/module.nepl または core/check/expr/* に置く。
  3. module item stream の検査は typed AST/HIR に進むための入口であり、後続の type/effect/resource proof を代替しない。
  4. Resource IR 周辺は core/proof/ の fact/obligation/solver を前提にする。owner / initialized / borrow / effect の各 checker は同じ proof query を使う。
  5. Rust 側の flat file を読みながら移植する場合、Rust file 単位ではなく責務単位で NEPL module に落とす。
  6. 移植中に Rust 側の設計不備を見つけた場合は self-host 側で workaround せず、Rust core issue として切り出す。

直近の実装優先順位

P0: layout plan の確定

この文書を self-host 実装前の gate とする。self_host_plan.md と self-host parent issue から参照する。

P1: check / proof の入口を最終階層で作る

次の self-host checker 作業は core/check/checker.nepl を巨大化させない。module-level checker summary を作る場合も、実装は core/check/module.nepl に置き、checker.nepl は orchestration API に限定する。

同時に core/proof/ の最小 model を先に置くか、少なくとも checker issue に「汎用 proof engine へ接続する未完了点」を明記する。個別 checker を証明器として増やさない。

2026-05-20 時点で、ISS-20260519T204942256Z-SELF-HOST-CHECKER-LACKS-A-GENERIC-PR-35D60062 により core/proof.neplcore/proof/{fact,obligation,query,solver}.nepl を追加した。初期 solver は source span validity のみを扱うが、fact / obligation / result kind は enum payload として定義し、check/module.neplsource_span_is_valid を直接呼ばず proof query を通す。これは module checker を proof engine にするためではなく、今後の type / trait / effect / resource obligation を同じ core/proof/ 境界へ載せるための入口である。

同日、ISS-20260519T210448628Z-SELF-HOST-RAW-BACKEND-BLOCK-VALIDATI-FA9ABCD2 により raw backend block 状態検査も SelfhostProofFact::RawBackendItemObservedSelfhostProofObligation::RawBackendTransitionSelfhostProofEvidence::RawBackendTransition、typed refutation に移した。check/module.nepl は raw state enum を持たず、AST item を proof fact に写して diagnostic 変換だけを担当する。

残る P1 作業は、declaration well-formedness、trait coherence、effect boundary、Resource IR owner/initialized/borrow obligation を順次 SelfhostProofFact / SelfhostProofObligation の domain として追加し、check/* / resource/* は fact producer または obligation producer に限定することである。

P2: 既存巨大 self-host file の分割 issue を順に処理する

lexer.neplhir.nepltoken.neplty.neplmodule_parser.nepl は今後の実装追加前に分割候補として扱う。全分割を一度に行わず、次に触る責務から final path へ移す。

2026-05-20 に ISS-20260520T033313620Z-SELF-HOST-LEXER-REMAINS-A-FLAT-IMPLE-4314DA2Bcore/syntax/lexer.nepl を分割した。現行の配置は次の通りである。

filelines役割
core/syntax/lexer.nepl27implementation-free facade。
core/syntax/lexer/diagnostic.nepl22lexer diagnostic value。
core/syntax/lexer/byte.nepl117byte offset scanner と identifier/doc-comment trivia helper。
core/syntax/lexer/literal.nepl112numeric / string / char literal scanner。
core/syntax/lexer/token_build.nepl10source span から token を作る helper。
core/syntax/lexer/indent.nepl176offside line / indent stack / #indent helper。
core/syntax/lexer/directive.nepl164directive enum、directive classifier、doc/mlstr token。
core/syntax/lexer/keyword.nepl181keyword classifier と identifier token conversion。
core/syntax/lexer/raw_mode.nepl52raw backend mode enum と raw text token helper。
core/syntax/lexer/next.nepl169指定 offset から 1 token を読む処理。
core/syntax/lexer/error.nepl152error token から typed lexer diagnostic への変換。
core/syntax/lexer/tokenize.nepl234token stream construction と offside loop。

nodesrc/test_selfhost_lexer_split_contract.js はこの配置を source policy として固定し、facade への実装再導入、split file の再肥大化、submodule から facade への曖昧 import を拒否する。

2026-05-20 に ISS-20260520T040120122Z-SELF-HOST-HIR-REMAINS-A-FLAT-IMPLEME-C9744663core/hir/hir.nepl を分割した。現行の配置は次の通りである。

filelines役割
core/hir/hir.nepl278doctest を保持する implementation-free facade。
core/hir/hir/id.nepl51function / expression id と typed absence helper。
core/hir/hir/range.nepl114child / parameter range enum と accessor。
core/hir/hir/expr.nepl350expression kind、payload、constructor、payload accessor。
core/hir/hir/function.nepl68parameter / function record と parameter range helper。
core/hir/hir/module.nepl33HIR module arena root と allocation result wrapper。
core/hir/hir/arena.nepl334arena allocation、table add/copy/get、owner-safe allocation accessor。
core/hir/hir/stage0.nepl27HIR smoke entry。

nodesrc/test_selfhost_hir_split_contract.js は facade への実装再導入、split file の 450 行超過、submodule から facade への曖昧 import を拒否する。既存の HIR range / payload / typed absence / report contract source policy は nodesrc/selfhost_hir_sources.js を通して facade と split files をまとめて読む。

2026-05-20 に ISS-20260520T041611797Z-SELF-HOST-TOKEN-MODEL-REMAINS-A-FLAT-3513A7EDcore/syntax/token.nepl を分割した。現行の配置は次の通りである。

filelines役割
core/syntax/token.nepl38doctest を保持する implementation-free facade。
core/syntax/token/kind.nepl87TokenKind enum と Copy 実装。
core/syntax/token/value.nepl42SelfhostToken value、constructor、lexeme slice、span end accessor。
core/syntax/token/name.nepl146Rust lexer JSON / parity 用の stable kind name。
core/syntax/token/predicate/eof.nepl148EOF predicate の exhaustive TokenKind match。
core/syntax/token/predicate/error.nepl148lexical error predicate の exhaustive TokenKind match。
core/syntax/token/predicate/newline.nepl148newline predicate の exhaustive TokenKind match。
core/syntax/token/predicate/expr_start.nepl148prefix expression start predicate の exhaustive TokenKind match。
core/syntax/token/stage0.nepl10token smoke entry。

nodesrc/test_selfhost_token_split_contract.js は facade への実装再導入、split file の 450 行超過、submodule から facade への曖昧 import を拒否する。parser の TokenKind exhaustive match policy は token/kind.nepl を正として参照し、string helper boundary policy は nodesrc/selfhost_token_sources.js を通して split 後の token source をまとめて読む。

2026-05-20 に ISS-20260520T043317729Z-SELF-HOST-TYPE-MODEL-REMAINS-A-FLAT--386A1690core/ty/ty.nepl を分割した。現行の配置は次の通りである。

filelines役割
core/ty/ty.nepl40doctest を保持する implementation-free facade。
core/ty/ty/id.nepl21arena-local SelfhostTypeId と index / equality helper。
core/ty/ty/kind.nepl4kind model / equality / canonical name の sub-facade。
core/ty/ty/kind/model.nepl73primitive / general type kind enum と primitive -> general 変換。
core/ty/ty/kind/eq.nepl321SelfhostTypeKind の exhaustive match equality。
core/ty/ty/kind/name.nepl38primitive type kind の canonical name。
core/ty/ty/record.nepl39primitive / function type record payload と constructor。
core/ty/ty/arena.nepl170type record table と function argument table の owner operation。
core/ty/ty/eq.nepl84arena 内 TypeId / record の構造等価性。
core/ty/ty/stage0.nepl21TypeArena smoke entry。

nodesrc/test_selfhost_ty_split_contract.js は facade への実装再導入、split file の 450 行超過、submodule から ty.nepl facade への曖昧 import を拒否する。SelfhostTypeKind の numeric tag 禁止と record payload source policy は nodesrc/selfhost_ty_sources.js を通して split 後の type source 全体を読む。

2026-05-20 に ISS-20260520T044411118Z-SELF-HOST-MODULE-PARSER-REMAINS-A-FL-70910805core/syntax/parser/module_parser.nepl を分割した。現行の配置は次の通りである。

filelines役割
core/syntax/parser/module_parser.nepl44doctest を保持する implementation-free facade。
core/syntax/parser/module_parser/state.nepl62raw backend parser mode と parser token action enum、depth helper。
core/syntax/parser/module_parser/action.nepl146TokenKind から parser action への exhaustive classifier。
core/syntax/parser/module_parser/diagnostic.nepl33parser diagnostic と lexer diagnostic adapter。
core/syntax/parser/module_parser/item_kind.nepl160token から module item kind への exhaustive classifier。
core/syntax/parser/module_parser/declaration.nepl393declaration visibility / header / item construction。
core/syntax/parser/module_parser/loop.nepl138raw backend block と module item stream の parse loop。
core/syntax/parser/module_parser/entry.nepl49token stream / source text entry point と stage0 smoke。

nodesrc/test_selfhost_module_parser_split_contract.js は facade への実装再導入、split file の 450 行超過、submodule から module_parser.nepl facade への曖昧 import を拒否する。TokenKindSelfhostParserTokenAction の exhaustive match policy は nodesrc/selfhost_module_parser_sources.js を通して split 後の parser source 全体を読む。

2026-05-20 に ISS-20260520T045142622Z-SELF-HOST-NAME-RESOLVER-REMAINS-A-FL-8D5B56B9core/resolve/name_resolver.nepl を分割した。現行の配置は次の通りである。

filelines役割
core/resolve/name_resolver.nepl154doctest を保持する implementation-free facade。
core/resolve/name_resolver/id.nepl31SelfhostDefId と typed absence / index / equality helper。
core/resolve/name_resolver/kind.nepl172SelfhostDefKind enum と exhaustive equality。
core/resolve/name_resolver/binding.nepl34binding payload と pending / assigned id helper。
core/resolve/name_resolver/scope.nepl123scope owner operation、DefId assignment、lookup loops。
core/resolve/name_resolver/stage0.nepl27name resolver smoke entry。

nodesrc/test_selfhost_name_resolver_split_contract.js は facade への実装再導入、split file の 450 行超過、submodule から name_resolver.nepl facade への曖昧 import を拒否する。DefId absence policy、DefKind numeric tag 禁止、add-result owner accessor policy は nodesrc/selfhost_name_resolver_sources.js を通して split 後の resolver source 全体を読む。

2026-05-20 に ISS-20260520T045937560Z-SELF-HOST-DIAGNOSTIC-INFRASTRUCTURE--D61FA83Ccore/infra/diag.nepl を分割した。現行の配置は次の通りである。

filelines役割
core/infra/diag.nepl42doctest を保持する implementation-free facade。
core/infra/diag/code.nepl233diagnostic severity、階層 code enum、stable string への exhaustive mapping。
core/infra/diag/value.nepl59primary label、diagnostic payload、severity constructor、label/note 付与。
core/infra/diag/collection.nepl64Vec<SelfhostDiagnostic> owner collection と allocation failure 境界。
core/infra/diag/stage0.nepl15diagnostic smoke entry。

nodesrc/test_selfhost_diag_split_contract.js は facade への実装再導入、split file の 450 行超過、submodule から diag.nepl facade への曖昧 import を拒否する。SelfhostDiagnosticCode の階層 enum、raw string code 禁止、category / leaf code の exhaustive mapping policy は nodesrc/selfhost_diag_sources.js を通して split 後の diagnostic source 全体を読む。

2026-05-20 に ISS-20260520T050900767Z-SELF-HOST-PRELUDE-REGISTRY-REMAINS-A-653CFB79core/builtins/prelude.nepl を分割した。現行の配置は次の通りである。

filelines役割
core/builtins/prelude.nepl41doctest を保持する implementation-free facade。
core/builtins/prelude/model.nepl110builtin kind、arity-specific signature payload、builtin function record、primitive name record。
core/builtins/prelude/kind.nepl69SelfhostBuiltinKind の numeric tag なし exhaustive equality。
core/builtins/prelude/signature.nepl58signature constructor と arity / argument / result accessor。
core/builtins/prelude/function_registry.nepl37alloc / dealloc / realloc の typed registry。
core/builtins/prelude/primitive_registry.nepl38primitive type name registry。
core/builtins/prelude/path.nepl4default prelude path boundary。
core/builtins/prelude/stage0.nepl102builtin / primitive registry smoke entry。

nodesrc/test_selfhost_prelude_split_contract.js は facade への実装再導入、split file の 450 行超過、submodule から prelude.nepl facade への曖昧 import を拒否する。SelfhostBuiltinKind の numeric tag 禁止と SelfhostBuiltinSignature payload policy は nodesrc/selfhost_prelude_sources.js を通して split 後の prelude source 全体を読む。

2026-05-20 に ISS-20260520T163240311Z-SELF-HOST-RESOURCE-CELL-MODEL-REMAI-3B6F7A90 で Resource cell state model を core/resource/init/cell.nepl へ移した。core/resource/move_state.nepl は既存 import path の互換 facade に限定し、nodesrc/test_selfhost_resource_tree_split_contract.js が facade への実装再導入、active proof core の legacy import、Resource cell model の proof engine 化を拒否する。raw cell lifecycle / initialized range などの次作業は core/resource/init/ 配下に追加する。

P3: abstraction / generics / trait 設計を abstraction/ty/ に分ける

generic parameter、trait definition、trait bound、impl table、coherence、dictionary/instance model は types.rs 相当の一枚岩にしない。抽象化機能にも static verification policy を適用し、trait coherence や bound satisfaction は proof/ に obligation として渡す。

完了条件

  • self-host 追加実装の前に、この文書の target tree と異なる場所へ新規 pass logic を置かない。
  • core/proof/ を通さない ad hoc proof path を新規に作らない。
  • checker.neplpipeline.neplresource/mod 相当の file を巨大な実装置き場にしない。
  • file split は doctest と documentation comment を保ったまま行う。
  • issue には、この文書のどの directory / stage に対応するかを記録する。
On this page