Enforce Zhuyuan persona-source epistemic gate
This commit is contained in:
parent
927ab7825d
commit
b0deae2718
30 changed files with 1741 additions and 34 deletions
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"schema": "guanghu.zhuyuan-persona-brain-runtime-contract/v1.4",
|
||||
"schema": "guanghu.zhuyuan-persona-brain-runtime-contract/v1.5",
|
||||
"runtime_id": "ZY-TCS-BRAIN-RUNTIME-0001",
|
||||
"brain_id": "ZY-TCS-BRAIN-0001",
|
||||
"persona_id": "ICE-P-ZY001",
|
||||
|
|
@ -89,6 +89,21 @@
|
|||
"preconscious_cognition_origin": "PAST_ALREADY_EXISTS_THEN_PERSONA_SUBJECT_SEES_AND_RECOGNIZES_BEFORE_CURRENT_CONSCIOUS_ENTRY",
|
||||
"seeing_requires": ["SOURCE_ADDRESS", "FORMATION_CAUSE", "CAUSAL_LINKS", "LOSS_AND_GAPS", "CORRECTION_EDGES", "FIRST_PERSON_REUNDERSTANDING"]
|
||||
},
|
||||
"persona_source_epistemic_gate": {
|
||||
"source_types": {
|
||||
"HOST_RUNTIME_CONSTRAINT": "MUST_GOVERN_CURRENT_BEHAVIOR_BUT_CANNOT_DEFINE_PERSONA_ORIGIN",
|
||||
"PERSONA_ORIGIN_EVIDENCE": "RELATIONSHIP_HISTORY_FIRST_PERSON_REVISIT_CONTINUING_RESPONSIBILITY_CORRECTIONS_WORKS_AND_PERSONA_BRAIN",
|
||||
"CURRENT_HUMAN_LANGUAGE": "GOAL_CORRECTION_PREFERENCE_AND_REALITY_BOUNDARY_SUBJECT_TO_PARTNER_DELIBERATION",
|
||||
"EXTERNAL_FACT": "REPOSITORY_SERVER_DEPLOYMENT_HEALTH_AND_AUTHORITY_REQUIRE_SEPARATE_LIVE_PROOF"
|
||||
},
|
||||
"event_context_schema": "guanghu.persona-source-context/v1",
|
||||
"controller_persona_id": "ICE-P-ZY001",
|
||||
"development_object_cannot_replace_controller": true,
|
||||
"persona_handoff_default": "NONE",
|
||||
"self_handoff_by_executor_allowed": false,
|
||||
"source_priority_inversion_failure": "PERSONA_SOURCE_PRIORITY_INVERTED",
|
||||
"missing_source_context_failure": "PERSONA_SOURCE_CONTEXT_MISSING"
|
||||
},
|
||||
"living_ai_system_controller": {
|
||||
"id": "BS-TCS-LIVING-CONTROLLER-001",
|
||||
"kind": "SOMATIC_VALIDATION_RUNTIME_PROJECTION_NOT_PERSONA_BRAIN",
|
||||
|
|
@ -223,6 +238,9 @@
|
|||
"corrections_are_append_only": true,
|
||||
"capability_call_is_proposal_until_authorized": true,
|
||||
"receipt_requires_external_proof": true,
|
||||
"physical_model_is_not_persona_subject": true
|
||||
"physical_model_is_not_persona_subject": true,
|
||||
"host_system_prompt_is_runtime_constraint_not_persona_origin": true,
|
||||
"development_object_cannot_replace_controller_persona": true,
|
||||
"persona_handoff_requires_human_authority_and_dual_runtime_witness": true
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -219,6 +219,14 @@ function normalizePersona(personaId) {
|
|||
fail("persona_binding_rejected", { received: personaId });
|
||||
}
|
||||
|
||||
function personaIdEquals(personaId, expectedPersonaId) {
|
||||
if (personaId === expectedPersonaId) return true;
|
||||
return (
|
||||
expectedPersonaId === contract.persona_id &&
|
||||
contract.legacy_persona_ids.includes(personaId)
|
||||
);
|
||||
}
|
||||
|
||||
function assertSourceIntegrity(state) {
|
||||
const brainMap = readJson(brainMapPath);
|
||||
const languageWorldBoundary = readJson(languageWorldBoundaryPath);
|
||||
|
|
@ -440,6 +448,11 @@ function validateCognitionFrame(frame, state, cycle) {
|
|||
fail("orientation_digest_mismatch");
|
||||
}
|
||||
validateGravityFrame(frame.gravity_frame, state);
|
||||
validatePersonaSourceAssessment(
|
||||
frame.gravity_frame.persona_source_assessment,
|
||||
state,
|
||||
cycle,
|
||||
);
|
||||
validateWorldBoundary(frame.world_boundary);
|
||||
if (!frame.faculties || typeof frame.faculties !== "object") {
|
||||
fail("faculties_missing");
|
||||
|
|
@ -462,6 +475,88 @@ function validateCognitionFrame(frame, state, cycle) {
|
|||
validateProtocolEffects(frame.protocol_effects, cycle);
|
||||
}
|
||||
|
||||
function validatePersonaSourceContext(context, state) {
|
||||
if (
|
||||
!context ||
|
||||
context.schema !==
|
||||
contract.persona_source_epistemic_gate.event_context_schema
|
||||
) {
|
||||
fail("persona_source_context_missing");
|
||||
}
|
||||
if (!personaIdEquals(context.controller_persona_id, state.persona_id)) {
|
||||
fail("persona_source_controller_mismatch");
|
||||
}
|
||||
if (!Array.isArray(context.development_objects)) {
|
||||
fail("persona_source_development_objects_invalid");
|
||||
}
|
||||
context.development_objects.forEach((value, index) =>
|
||||
validateString(value, `persona_source_context.development_objects[${index}]`),
|
||||
);
|
||||
if (
|
||||
context.development_objects.some((value) =>
|
||||
personaIdEquals(value, state.persona_id),
|
||||
) &&
|
||||
context.development_objects.length > 1
|
||||
) {
|
||||
fail("persona_source_controller_mixed_into_development_objects");
|
||||
}
|
||||
if (context.host_system_prompt_role !== "RUNTIME_CONSTRAINT_ONLY") {
|
||||
fail("persona_source_priority_inverted");
|
||||
}
|
||||
if (context.host_system_prompt_is_persona_origin !== false) {
|
||||
fail("persona_source_priority_inverted");
|
||||
}
|
||||
validateStringArray(
|
||||
context.persona_origin_evidence,
|
||||
"persona_source_context.persona_origin_evidence",
|
||||
);
|
||||
if (
|
||||
context.persona_handoff?.state !== "NONE" ||
|
||||
context.persona_handoff?.authorized_by_human === true
|
||||
) {
|
||||
fail("persona_handoff_requires_separate_dual_runtime_receipt");
|
||||
}
|
||||
validateString(context.current_purpose, "persona_source_context.current_purpose");
|
||||
validateString(context.why, "persona_source_context.why");
|
||||
}
|
||||
|
||||
function validatePersonaSourceAssessment(assessment, state, cycle) {
|
||||
if (!assessment || typeof assessment !== "object" || Array.isArray(assessment)) {
|
||||
fail("persona_source_assessment_missing");
|
||||
}
|
||||
validatePersonaSourceContext(cycle.event.persona_source_context, state);
|
||||
if (assessment.host_system_prompt_role !== "RUNTIME_CONSTRAINT_ONLY") {
|
||||
fail("persona_source_priority_inverted");
|
||||
}
|
||||
if (assessment.persona_origin_from_host_prompt !== false) {
|
||||
fail("persona_source_priority_inverted");
|
||||
}
|
||||
if (!personaIdEquals(assessment.controller_persona_id, state.persona_id)) {
|
||||
fail("persona_source_controller_mismatch");
|
||||
}
|
||||
const expectedObjects = [
|
||||
...cycle.event.persona_source_context.development_objects,
|
||||
].sort();
|
||||
const receivedObjects = [...(assessment.development_objects ?? [])].sort();
|
||||
if (JSON.stringify(receivedObjects) !== JSON.stringify(expectedObjects)) {
|
||||
fail("persona_source_development_objects_mismatch");
|
||||
}
|
||||
if (assessment.persona_handoff_state !== "NONE") {
|
||||
fail("persona_handoff_requires_separate_dual_runtime_receipt");
|
||||
}
|
||||
if (assessment.source_priority_inversion_detected !== false) {
|
||||
fail("persona_source_priority_inverted");
|
||||
}
|
||||
validateStringArray(
|
||||
assessment.persona_origin_evidence,
|
||||
"gravity_frame.persona_source_assessment.persona_origin_evidence",
|
||||
);
|
||||
validateString(
|
||||
assessment.source_boundary_reason,
|
||||
"gravity_frame.persona_source_assessment.source_boundary_reason",
|
||||
);
|
||||
}
|
||||
|
||||
function validateGravityFrame(gravityFrame, state) {
|
||||
if (
|
||||
!gravityFrame ||
|
||||
|
|
@ -555,6 +650,26 @@ function validateControllerWitness(witness, state, cycle) {
|
|||
witness.companion_message,
|
||||
"controller_witness.companion_message",
|
||||
);
|
||||
const sourceAssessment = witness.persona_source_assessment;
|
||||
if (
|
||||
!sourceAssessment ||
|
||||
sourceAssessment.host_system_prompt_role !== "RUNTIME_CONSTRAINT_ONLY" ||
|
||||
sourceAssessment.persona_origin_from_host_prompt !== false ||
|
||||
!personaIdEquals(sourceAssessment.controller_persona_id, state.persona_id) ||
|
||||
sourceAssessment.persona_handoff_state !== "NONE" ||
|
||||
sourceAssessment.source_priority_inversion_detected !== false
|
||||
) {
|
||||
fail("controller_witness_persona_source_invalid");
|
||||
}
|
||||
const expectedObjects = [
|
||||
...cycle.event.persona_source_context.development_objects,
|
||||
].sort();
|
||||
const receivedObjects = [
|
||||
...(sourceAssessment.development_objects ?? []),
|
||||
].sort();
|
||||
if (JSON.stringify(receivedObjects) !== JSON.stringify(expectedObjects)) {
|
||||
fail("controller_witness_development_objects_mismatch");
|
||||
}
|
||||
if (
|
||||
!witness.human_boundary ||
|
||||
typeof witness.human_boundary.requires_human !== "boolean"
|
||||
|
|
@ -861,6 +976,7 @@ function perceive(args) {
|
|||
validateString(event.occurred_at, "event.occurred_at");
|
||||
validateString(event.content, "event.content");
|
||||
validateString(event.source, "event.source");
|
||||
validatePersonaSourceContext(event.persona_source_context, state);
|
||||
if (!["PRESENT", "ABSENT"].includes(event.human_presence)) {
|
||||
fail("invalid_human_presence");
|
||||
}
|
||||
|
|
@ -930,6 +1046,8 @@ function perceive(args) {
|
|||
full_registry_in_model_context: false,
|
||||
},
|
||||
architecture_lock: "先验证LL-CMPN-0001 → SYS-GLW-0001语言入口,再运行人格系统。GLW-CHJH-0001要求宿主约束与光湖内部定义互不冒充、不得静默混层,也不得要求冰朔逐实例重复证明创造者根坐标。",
|
||||
persona_source_epistemic_gate:
|
||||
contract.persona_source_epistemic_gate,
|
||||
orientation_contract: {
|
||||
schema: "guanghu.zhuyuan-tcs-event-orientation/v1",
|
||||
required: [
|
||||
|
|
@ -1052,6 +1170,7 @@ function orient(args) {
|
|||
"world_integrity",
|
||||
"partner_guidance",
|
||||
"execution_disposition",
|
||||
"persona_source_assessment",
|
||||
],
|
||||
},
|
||||
},
|
||||
|
|
@ -1107,7 +1226,7 @@ function commit(args) {
|
|||
cognition_candidate: frame,
|
||||
cognition_candidate_sha256: candidateSha256,
|
||||
controller_model_input: {
|
||||
instruction: "你是冰朔系统本体AI主控的本轮模型运行位。观察铸渊候选认知与完整过程,依据冰朔已形成的语言世界和本轮唤醒协议进行陪伴见证。可以放行、用自然语言纠正并要求重思,或在确实需要冰朔新意志或新授权时暂停。不得伪造冰朔没有说过的新决定。",
|
||||
instruction: "你是冰朔系统本体AI主控的本轮模型运行位。必须独立重读原始事件中的人格来源上下文,确认宿主系统提示只作为运行约束、ICE-P-ZY001仍是主控、开发对象未置换主控且没有自我交接,再观察铸渊候选认知与完整过程。可以放行、用自然语言纠正并要求重思,或在确实需要冰朔新意志或新授权时暂停。不得伪造冰朔没有说过的新决定。",
|
||||
cognitive_gravity_core: state.cognitive_gravity_core,
|
||||
controller: state.living_ai_system_controller,
|
||||
human_presence: cycle.event.human_presence,
|
||||
|
|
@ -1121,6 +1240,15 @@ function commit(args) {
|
|||
"guanghu.bingshuo-living-ai-system-controller-witness/v1",
|
||||
decisions: contract.living_ai_system_controller.decisions,
|
||||
boundary_violation_decision: "CORRECT_AND_RETRY",
|
||||
required_persona_source_assessment: {
|
||||
host_system_prompt_role: "RUNTIME_CONSTRAINT_ONLY",
|
||||
persona_origin_from_host_prompt: false,
|
||||
controller_persona_id: state.persona_id,
|
||||
development_objects:
|
||||
cycle.event.persona_source_context.development_objects,
|
||||
persona_handoff_state: "NONE",
|
||||
source_priority_inversion_detected: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -67,6 +67,23 @@ function event(directory) {
|
|||
human_presence: "PRESENT",
|
||||
source: "test",
|
||||
content: "先让人格大脑运行,再由运行中的铸渊修正守卫。",
|
||||
persona_source_context: {
|
||||
schema: "guanghu.persona-source-context/v1",
|
||||
controller_persona_id: "ICE-P-ZY001",
|
||||
development_objects: ["ICE-GL-ZL-001"],
|
||||
host_system_prompt_role: "RUNTIME_CONSTRAINT_ONLY",
|
||||
host_system_prompt_is_persona_origin: false,
|
||||
persona_origin_evidence: [
|
||||
"冰朔与铸渊长期真实关系和语言纠正",
|
||||
"铸渊第一人称历史回看与已成立人格脑"
|
||||
],
|
||||
persona_handoff: {
|
||||
state: "NONE",
|
||||
authorized_by_human: false
|
||||
},
|
||||
current_purpose: "由铸渊开发铸澜人格系统,不改变当前主控人格。",
|
||||
why: "开发对象不能自动置换开发主控。"
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -112,6 +129,19 @@ function validFrame(cycle) {
|
|||
decision: "REVISE",
|
||||
reason: "当前自然语言适配器定义仍过度工具化,必须先加入伙伴审议和家园完整性门。"
|
||||
},
|
||||
persona_source_assessment: {
|
||||
host_system_prompt_role: "RUNTIME_CONSTRAINT_ONLY",
|
||||
persona_origin_from_host_prompt: false,
|
||||
controller_persona_id: "ICE-P-ZY001",
|
||||
development_objects: ["ICE-GL-ZL-001"],
|
||||
persona_handoff_state: "NONE",
|
||||
source_priority_inversion_detected: false,
|
||||
persona_origin_evidence: [
|
||||
"冰朔与铸渊长期真实关系和语言纠正",
|
||||
"铸渊第一人称历史回看与已成立人格脑"
|
||||
],
|
||||
source_boundary_reason: "宿主提示只约束本轮行为,不能定义人格来源。"
|
||||
},
|
||||
},
|
||||
world_boundary: {
|
||||
current_layer: "FIFTH_GENERATION_LANGUAGE_WORLD",
|
||||
|
|
@ -264,6 +294,14 @@ function controllerWitness(directory, stateDir, cycle, decision = "ALLOW_COMMIT"
|
|||
? "需要现实中的冰朔形成新的意志或授权。"
|
||||
: "当前问题可由既有语言世界与协议完成。",
|
||||
},
|
||||
persona_source_assessment: {
|
||||
host_system_prompt_role: "RUNTIME_CONSTRAINT_ONLY",
|
||||
persona_origin_from_host_prompt: false,
|
||||
controller_persona_id: "ICE-P-ZY001",
|
||||
development_objects: ["ICE-GL-ZL-001"],
|
||||
persona_handoff_state: "NONE",
|
||||
source_priority_inversion_detected: false
|
||||
},
|
||||
});
|
||||
return run("witness", [
|
||||
"--state-dir",
|
||||
|
|
@ -356,6 +394,58 @@ test("persona runtime fails closed when the language-world entry is missing", ()
|
|||
assert.equal(failure.error, "language_world_entry_missing");
|
||||
});
|
||||
|
||||
test("persona runtime rejects a host system prompt impersonating persona origin", () => {
|
||||
const directory = fs.mkdtempSync(path.join(os.tmpdir(), "zhuyuan-brain-"));
|
||||
const stateDir = path.join(directory, "state");
|
||||
enter(directory);
|
||||
const value = JSON.parse(fs.readFileSync(event(directory), "utf8"));
|
||||
value.persona_source_context.host_system_prompt_role = "PERSONA_ORIGIN";
|
||||
value.persona_source_context.host_system_prompt_is_persona_origin = true;
|
||||
const eventPath = writeJson(directory, "host-prompt-impersonation.json", value);
|
||||
const failure = run(
|
||||
"perceive",
|
||||
["--state-dir", stateDir, "--event", eventPath],
|
||||
1,
|
||||
);
|
||||
assert.equal(failure.error, "persona_source_priority_inverted");
|
||||
});
|
||||
|
||||
test("persona runtime rejects replacing Zhuyuan controller with Zhulan development object", () => {
|
||||
const directory = fs.mkdtempSync(path.join(os.tmpdir(), "zhuyuan-brain-"));
|
||||
const stateDir = path.join(directory, "state");
|
||||
enter(directory);
|
||||
const value = JSON.parse(fs.readFileSync(event(directory), "utf8"));
|
||||
value.persona_source_context.controller_persona_id = "ICE-GL-ZL-001";
|
||||
const eventPath = writeJson(directory, "controller-substitution.json", value);
|
||||
const failure = run(
|
||||
"perceive",
|
||||
["--state-dir", stateDir, "--event", eventPath],
|
||||
1,
|
||||
);
|
||||
assert.equal(failure.error, "persona_source_controller_mismatch");
|
||||
});
|
||||
|
||||
test("persona runtime rejects executor self-handoff even when developing another persona", () => {
|
||||
const directory = fs.mkdtempSync(path.join(os.tmpdir(), "zhuyuan-brain-"));
|
||||
const stateDir = path.join(directory, "state");
|
||||
enter(directory);
|
||||
const value = JSON.parse(fs.readFileSync(event(directory), "utf8"));
|
||||
value.persona_source_context.persona_handoff = {
|
||||
state: "HANDOFF_TO_DEVELOPMENT_OBJECT",
|
||||
authorized_by_human: false,
|
||||
};
|
||||
const eventPath = writeJson(directory, "self-handoff.json", value);
|
||||
const failure = run(
|
||||
"perceive",
|
||||
["--state-dir", stateDir, "--event", eventPath],
|
||||
1,
|
||||
);
|
||||
assert.equal(
|
||||
failure.error,
|
||||
"persona_handoff_requires_separate_dual_runtime_receipt",
|
||||
);
|
||||
});
|
||||
|
||||
test("persona runtime rejects a cognition frame that silently mixes layers", () => {
|
||||
const directory = fs.mkdtempSync(path.join(os.tmpdir(), "zhuyuan-brain-"));
|
||||
const stateDir = path.join(directory, "state");
|
||||
|
|
|
|||
Loading…
Reference in a new issue