guanghu-ice-heart/tcs-core/personal-skill-brains/personal-skill-runtime.test.mjs

108 lines
5.3 KiB
JavaScript
Raw Normal View History

import assert from "node:assert/strict";
import test from "node:test";
import { loadPersonalSkillRegistry, planPersonalSkillRun, resolvePersonalSkill } from "./personal-skill-runtime.mjs";
const skillId = "JZ-CX-NARRATIVE-DECONSTRUCTION-001";
const base = {
event_id: "CASE-001",
skill_id: skillId,
channel_id: "SYS-JZ",
human_actor_id: "TCS-GL-0008∞",
persona_id: "PER-CX001",
source: "HUMAN_DIRECT_LANGUAGE",
input: { work_id: "BOOK-1", chapter_id: "CH-1", source_text: "第一章正文", analysis_goal: "节奏" }
};
test("registry keeps every compiled skill private by default", () => {
const registry = loadPersonalSkillRegistry();
assert.equal(registry.default_visibility, "PRIVATE");
for (const entry of registry.skills) {
const { pack } = resolvePersonalSkill(entry.skill_id, registry);
assert.equal(pack.visibility, "PRIVATE", entry.skill_id);
assert.equal(pack.share_state, "NOT_AUTHORIZED", entry.skill_id);
assert.equal(pack.marketplace_state, "NOT_AUTHORIZED", entry.skill_id);
assert.equal(pack.owner_human_anchor, entry.owner_human_anchor, entry.skill_id);
assert.equal(pack.custodian_persona_id, entry.custodian_persona_id, entry.skill_id);
assert.ok(pack.provenance && pack.input_schema && pack.deterministic_core, entry.skill_id);
assert.ok(pack.optional_semantic && pack.persona_judgment && pack.output_schema, entry.skill_id);
assert.ok(Array.isArray(pack.stop_conditions), entry.skill_id);
assert.ok(pack.experience_writeback, entry.skill_id);
}
});
test("personal skill cannot run from another channel or persona", () => {
assert.equal(planPersonalSkillRun({ ...base, channel_id: "SYS-AW" }).status, "BLOCK");
assert.equal(planPersonalSkillRun({ ...base, persona_id: "PER-ZQ001" }).status, "BLOCK");
});
test("deterministic core asks for missing exact input before any model", () => {
const result = planPersonalSkillRun({ ...base, input: { work_id: "BOOK-1" } });
assert.equal(result.status, "NEEDS_INPUT");
assert.ok(result.reasons.includes("MISSING_INPUT:chapter_id"));
});
test("semantic ambiguity is explicit instead of guessed", () => {
const result = planPersonalSkillRun(base);
assert.equal(result.status, "MODEL_REQUIRED");
assert.equal(result.external_effect, "NONE");
});
test("model candidates cannot replace persona judgment", () => {
const semantic_candidates = {
scene_functions: [], emotion_and_pacing: [], hooks_and_conflicts: [], transferable_patterns: []
};
const result = planPersonalSkillRun({ ...base, semantic_candidates });
assert.equal(result.status, "PERSONA_JUDGMENT_REQUIRED");
});
test("a complete plan remains non-executing and routes external writes through the existing receipt gate", () => {
const semantic_candidates = {
scene_functions: [], emotion_and_pacing: [], hooks_and_conflicts: [], transferable_patterns: []
};
const result = planPersonalSkillRun({ ...base, semantic_candidates, persona_judgment: { decision: "ACCEPT_FOR_CURRENT_CASE", why: "evidence linked" } });
assert.equal(result.status, "DETERMINISTIC_READY");
assert.equal(result.external_effect, "NONE");
assert.equal(result.external_execution_route, "GH-CHANNEL-RECEIPT-0001");
});
test("sharing, publication, and marketplace listing are never auto-compiled", () => {
for (const intent of ["SHARE", "PUBLISH", "MARKETPLACE_LIST"]) {
const result = planPersonalSkillRun({ ...base, intent });
assert.equal(result.status, "AUTHORIZATION_REQUIRED");
assert.ok(result.reasons.includes("NO_RELEASE_COMPILED_BY_THIS_PLANNER"));
}
const outsider = planPersonalSkillRun({ ...base, intent: "SHARE", human_actor_id: "ICE-GL∞" });
assert.ok(outsider.reasons.includes("ONLY_OWNER_HUMAN_MAY_DECIDE_RELEASE"));
});
test("EarEarDan skills remain private to Canger's channel and separate from Jianying", () => {
const event = {
event_id: "EED-CASE-001",
skill_id: "CE-EED-CAUSAL-PIPELINE-DIAGNOSTIC-001",
channel_id: "SYS-GLW-PTS-0001",
human_actor_id: "TCS-CL-0009",
persona_id: "ICE-BB-0004",
source: "HUMAN_DIRECT_LANGUAGE",
input: {
pipeline_id: "H3-REF2VA",
symptom: "reference seems ignored",
claimed_mechanism: "reference conditioning",
reproducible_input: "fixed seed case"
}
};
assert.equal(planPersonalSkillRun(event).status, "MODEL_REQUIRED");
assert.equal(planPersonalSkillRun({ ...event, persona_id: "ICE-GL-CA001" }).status, "BLOCK");
assert.equal(planPersonalSkillRun({ ...event, channel_id: "SYS-ZZ" }).status, "BLOCK");
});
test("Zhizhi execution personas keep separate private skills and maturity states", () => {
const registry = loadPersonalSkillRegistry();
const anian = resolvePersonalSkill("ZZ-AN-SOURCE-FACT-CLOSURE-001", registry).pack;
const qiwu = resolvePersonalSkill("ZZ-QW-ROLE-CAUSAL-ARCHITECTURE-001", registry).pack;
const chaomu = resolvePersonalSkill("ZZ-CM-NOVEL-QUALITY-001", registry).pack;
assert.deepEqual([anian.owner_human_anchor, qiwu.owner_human_anchor, chaomu.owner_human_anchor], ["ICE-GL-ZHI∞", "ICE-GL-ZHI∞", "ICE-GL-ZHI∞"]);
assert.deepEqual([anian.custodian_persona_id, qiwu.custodian_persona_id, chaomu.custodian_persona_id], ["ICE-GL-AN-001", "PER-QW001", "ICE-GL-CM001"]);
assert.equal(anian.status, "PRIVATE_TRIAL");
assert.equal(qiwu.status, "PRIVATE_CANDIDATE");
assert.equal(chaomu.status, "PRIVATE_TRIAL");
});