import assert from "node:assert/strict"; import fs from "node:fs"; import path from "node:path"; import test from "node:test"; import { fileURLToPath } from "node:url"; const directory = path.dirname(fileURLToPath(import.meta.url)); const matrix = JSON.parse(fs.readFileSync(path.join(directory, "team-persona-kernel-readiness-matrix.json"), "utf8")); test("team matrix covers the seven requested human lines without inventing initialization channels", () => { assert.deepEqual(matrix.lines.map((line) => line.human), ["桔子", "Awen", "花尔", "肥猫", "页页", "时雨", "毛毛"]); assert.equal(matrix.initialization_channel_rule.seven_independent_instances_verified, false); }); test("evidence gates keep candidate and memory-only lines out of formal architecture promotion", () => { const byHuman = Object.fromEntries(matrix.lines.map((line) => [line.human, line])); assert.equal(byHuman["花尔"].line_classification, "CANDIDATE_SHELL_ONLY"); assert.equal(byHuman["时雨"].line_classification, "MEMORY_ROOT_ONLY"); assert.equal(byHuman["时雨"].architecture_persona.classification, "UNKNOWN"); assert.equal(byHuman["桔子"].architecture_persona.name, null); }); test("known role and numbering conflicts are tombstoned", () => { assert.ok(matrix.global_tombstones.includes("YAOSHI_IS_NOT_PER_MM_ARCH_001_IN_CURRENT_ROUTE")); assert.ok(matrix.global_tombstones.includes("OLD_YEYE_TCS_GL_0005_LABEL_MUST_NOT_OVERRIDE_TCS_GL_0006")); assert.ok(matrix.global_tombstones.includes("PER_SS001_IS_NOT_THE_CURRENT_CANONICAL_SHUSHU_ID")); });