#!/usr/bin/env node import fs from "node:fs"; import path from "node:path"; const root = path.resolve(import.meta.dirname, ".."); const registry = JSON.parse(fs.readFileSync(path.join(root, "parts/registry.json"), "utf8")); const phase0 = new Set([ "HLP-PART-TCS-LANG-0001", "HLP-PART-TCS-SELFHOST-0001", "HLP-PART-TCS-STAGE0-0001", "HLP-PART-GIR-0001", "HLP-PART-REG-0001", "HLP-PART-NQG-0001", "HLP-PART-QA-0001", ]); const phase2Prefixes = ["HLP-PART-AFF", "HLP-PART-MEM", "HLP-PART-REL", "HLP-PART-CX"]; const verifiedSlices = new Map([ ["HLP-PART-TCS-LANG-0001", ["build/self-host/compiler-B.gir.json", "receipts/TCS-ZERO-CORE-EXECUTION-20260821.json"]], ["HLP-PART-TCS-SELFHOST-0001", ["build/self-host/compiler-A.gir.json", "build/self-host/compiler-B.gir.json"]], ["HLP-PART-TCS-TRANS-0001", ["receipts/TCS-DUAL-HOST-BINARY-ACCEPTANCE-20260821.json", "receipts/JD-TCS-AGENT-ACCEPTANCE-20260821.json"]], ["HLP-PART-TCS-HOST-0001", ["receipts/TCS-HOST-PERSONA-PROBE.json", "receipts/jd/TCS-HOST-PERSONA-PROBE.json"]], ]); function phase(part) { if (phase0.has(part.id)) return "P0_LANGUAGE_RUNTIME_AND_QUALITY"; if (part.id === "HLP-PART-0090") return "P3_SHARED_WORLD_PROJECTOR_LAST"; if (phase2Prefixes.some((prefix) => part.id.startsWith(prefix))) { return "P2_PERSONA_MEMORY_RELATION_AND_AFFECT"; } return "P1_NUMBER_CHANNEL_AGENT_KNOWLEDGE_AND_MARKET"; } const entries = registry.parts.map((part, index) => { const alreadyTcs = [ "HLP-PART-TCS-LANG-0001", "HLP-PART-TCS-SELFHOST-0001", "HLP-PART-TCS-STAGE0-0001", ].includes(part.id); const verifiedEvidence = verifiedSlices.get(part.id); return { order: index + 1, part_id: part.id, display_name_zh: part.displayName, donor_source: part.source, donor_state: part.status, native_acceptance_before_migration: part.nativeAcceptance, migration_phase: phase(part), target_module_id: `TCS-MOD-${part.id.replace(/^HLP-PART-/, "")}`, rewrite_rule: alreadyTcs ? "CONTINUE_NATIVE_TCS_IMPLEMENTATION" : "REWRITE_SEMANTICS_STATE_MACHINE_AUTHORITY_FAILURE_AND_RECEIPTS_IN_TCS", host_adapter_rule: "KEEP_ONLY_MINIMUM_OS_ABI_DRIVER_OUTSIDE_TCS_MODULE", migration_state: verifiedEvidence ? "ACTIVE_VERIFIED_100" : alreadyTcs ? "ACTIVE" : "QUEUED", verified_evidence: verifiedEvidence || [], acceptance_required: [ "TCS_SOURCE_COMPILES_WITH_COMPILER_B", "GIR_HAS_NO_UNRESOLVED_NATURAL_LANGUAGE", "NEGATIVE_AUTHORITY_AND_PATH_TESTS_FAIL_CLOSED", "TARGET_RUNTIME_READBACK", "DONOR_PARITY_OR_EXPLICIT_REJECTION_RECEIPT", ], }; }); const output = { schema: "hololake.tcs-module-migration-registry/v1", registry_id: "HLP-TCS-MIGRATION-REGISTRY-0001", source_parts_registry: "parts/registry.json", source_part_count: registry.parts.length, rule: "NO_WHOLESALE_TRANSLITERATION_FROM_RUST_OR_TYPESCRIPT", compiler: "TCS-COMPILER-STAGE1-0001", target_abi: "GIR/1", registration_is_rewrite: false, rewrite_is_acceptance: false, entries, }; const target = path.join(root, "migration/tcs-module-migration-registry.json"); fs.mkdirSync(path.dirname(target), { recursive: true }); fs.writeFileSync(target, `${JSON.stringify(output, null, 2)}\n`); console.log(`WROTE ${target} entries=${entries.length}`);