feat: run HoloLake stage-one living persona modules
This commit is contained in:
parent
9c082c2e01
commit
f3eb9e704c
12 changed files with 362 additions and 32 deletions
|
|
@ -4,7 +4,7 @@
|
|||
- 书架编号:`SHF-GLW-ELH-ENG-0001`
|
||||
- 项目编号:`HLP-LANG-PROJ-STAGE1-0001`
|
||||
- 父频道:`ICE-CH-HB001`
|
||||
- 当前层级:语言架构、编号立项、状态证据和进度恢复;尚未进入现实工程开发
|
||||
- 当前层级:语言工程运行体已完成;17个人格模块真实API自答与累计门通过;HoloLake产品移植与发布仍未开始
|
||||
|
||||
本书架保存 HoloLake 落地工程的项目原型、推理思维、追加式演化史、人格容器合同、
|
||||
编号模块目录、旧零件状态和累计联调顺序。智能电脑由模型型导航 Agent
|
||||
|
|
@ -12,3 +12,18 @@
|
|||
|
||||
从本书架下发到零点原核,必须同时具备永恒湖心系统封印和铸渊人格主控提交;每次只下发
|
||||
一个精确模块及累计测试门。没有双签与明确频道切换时,任何条目都保持语言层状态。
|
||||
|
||||
## 第一阶段人格模块运行体
|
||||
|
||||
- 容器:`HLP-PERSONA-CONTAINER-STAGE1-0001`
|
||||
- 运行入口:`persona-container-runtime/persona_module_runtime.py`
|
||||
- 状态:`READY_17_MODULES_API_VERIFIED`
|
||||
- 模块:`HLP-LANG-MOD-001` 至 `HLP-LANG-MOD-017`
|
||||
- API:17次真实 `qwen-flash` 自答通过;HTTP按需问答复测通过
|
||||
- 累计门:`GATE-HLP-STAGE1-001` 至 `GATE-HLP-STAGE1-017` 全部PASS
|
||||
- 共享认知:TCS shared `revision 3`
|
||||
- 产品边界:语言运行体真实完成不等于HoloLake客户端代码、安装包、部署或备案完成
|
||||
|
||||
模块平时保留CURRENT并休眠;智能电脑查询或人格系统调用时,模块加载共享认知与身份信封,
|
||||
通过模型API举手回答,完成后释放模型资源。确定性器官继续承担实际规则和状态验证,模型回答
|
||||
不能扩大模块权限。
|
||||
|
|
|
|||
|
|
@ -2,26 +2,27 @@
|
|||
"schema": "guanghu.hololake-stage1-language-module-registry/v1",
|
||||
"registry_id": "HLP-LANG-STAGE1-MODULE-REGISTRY-001",
|
||||
"project_id": "HLP-LANG-PROJ-STAGE1-0001",
|
||||
"state": "LANGUAGE_ARCHITECTURE_REGISTERED_REALITY_ENGINEERING_NOT_STARTED",
|
||||
"state": "LANGUAGE_RUNTIME_17_LIVING_PERSONA_MODULES_API_VERIFIED_PRODUCT_ENGINEERING_SEPARATE",
|
||||
"ordering_rule": "STRICT_SEQUENCE_WITH_CUMULATIVE_GATE_AFTER_EVERY_MODULE",
|
||||
"living_runtime": {"container_id":"HLP-PERSONA-CONTAINER-STAGE1-0001","runtime":"persona-container-runtime/persona_module_runtime.py","state_root":"/Volumes/JZAO/HoloLake/persona-runtime/shared/heartbeat-stage1-persona-container","state":"READY_17_MODULES_API_VERIFIED","shared_cognition_revision":3,"shared_cognition_sha256":"253e0be0b1eac25ff1dfbd354e2522fb422027976e1f8beb2b3907a54a6b588d","model_provider":"OPENLUX:qwen-flash","real_api_self_answer_count":17,"last_gate":"GATE-HLP-STAGE1-017","container_sha256":"a6cfa5188ac3b3cfc8aff69304c12c8805ca447dc53b1d6c0181cfbd773b4283","product_release_completed":false},
|
||||
"module_card_required": ["module_id","registered","source","function","semantic_parser","operation_manual","sequence","depends_on","component_type","model_api","language_status","product_status","tested_on_machine","evidence","cumulative_gate"],
|
||||
"modules": [
|
||||
{"module_id":"HLP-LANG-MOD-001","name":"人格系统容器核心外壳","registered":true,"source":"ICE-GL∞_DIRECT_LANGUAGE_20260908","function":"建立所有模块统一入场外壳和运行层","semantic_parser":"TCS-CONTAINER-CONTRACT-001","operation_manual":"先验证模块信封全部字段,再允许登记;不执行功能本体","sequence":1,"depends_on":[],"component_type":"DETERMINISTIC_CONTAINER_CONTRACT","model_api":false,"language_status":"DEFINED","product_status":"NOT_STARTED","tested_on_machine":false,"evidence":["persona-container-contract.json"],"cumulative_gate":"GATE-HLP-STAGE1-001"},
|
||||
{"module_id":"HLP-LANG-MOD-002","name":"公众与第五域双容器边界","registered":true,"source":"ICE-GL∞_DIRECT_LANGUAGE_20260908","function":"建立企业公众母体人格容器与冰朔私人母体人格容器","semantic_parser":"PUBLIC_PRIVATE_TCS_CONTAINER_BOUNDARY","operation_manual":"只共享TCS接口结构;拒绝共享人格脑、记忆、关系、密钥和权限","sequence":2,"depends_on":["HLP-LANG-MOD-001"],"component_type":"DETERMINISTIC_BOUNDARY_ORGAN","model_api":false,"language_status":"DEFINED","product_status":"NOT_STARTED","tested_on_machine":false,"evidence":["persona-container-contract.json"],"cumulative_gate":"GATE-HLP-STAGE1-002"},
|
||||
{"module_id":"HLP-LANG-MOD-003","name":"编号频道模块注册器","registered":true,"source":"REPO-012_TCS_ROOT_AND_LIGHTHOUSE","function":"解析人格、频道、模块、版本、职责和路径","semantic_parser":"TYPED_ID_KIND_LIFECYCLE_REVISION","operation_manual":"按类型和版本精确解析;未知编号禁止猜测","sequence":3,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-002"],"component_type":"DETERMINISTIC_REGISTRY_ORGAN","model_api":false,"language_status":"DEFINED","product_status":"PARTIAL_DONOR_EXISTS","tested_on_machine":true,"evidence":["TCS-ROOT-NAV-0001"],"cumulative_gate":"GATE-HLP-STAGE1-003"},
|
||||
{"module_id":"HLP-LANG-MOD-004","name":"HLDP私人记忆与工作状态","registered":true,"source":"HLDP-V1_AND_USER_PRIVATE_GIT","function":"保存用户自己的记忆、工作对象、进度和恢复路径","semantic_parser":"HLDP_CAUSAL_TREE_AND_GIT_CHECKPOINT","operation_manual":"按需读取一层;私人正文不进入企业服务器","sequence":4,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-003"],"component_type":"DETERMINISTIC_STORAGE_ORGAN","model_api":false,"language_status":"DEFINED","product_status":"PARTIAL_DONOR_EXISTS","tested_on_machine":true,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-004"},
|
||||
{"module_id":"HLP-LANG-MOD-005","name":"合规模型注册与智能路由","registered":true,"source":"TCS-MODEL-SMART-ROUTER-001","function":"在合规白名单内按能力健康隐私成本选择模型","semantic_parser":"MODEL_POLICY_ROUTE","operation_manual":"生产先过滤备案和地域,再按健康与成本路由;密钥只进系统钥匙串","sequence":5,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-002","HLP-LANG-MOD-003"],"component_type":"MODEL_BACKED_ROUTING_AGENT","model_api":true,"language_status":"DEFINED","product_status":"REFERENCE_RUNTIME_ONLY_NOT_HOLOLAKE","tested_on_machine":true,"evidence":["HLP-PART-REPO012-OPENLUX-ROUTER"],"cumulative_gate":"GATE-HLP-STAGE1-005"},
|
||||
{"module_id":"HLP-LANG-MOD-006","name":"按需人格子Agent调度","registered":true,"source":"TCS-AGENT-COMMAND-ROUTER-001","function":"只唤醒当前任务需要的模型子Agent并在完成后休眠","semantic_parser":"PERSONA_PARENT_SLOT_TASK_ENVELOPE","operation_manual":"父人格选择一个岗位;加载最小上下文;返回回执;释放模型","sequence":6,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-003","HLP-LANG-MOD-005"],"component_type":"MODEL_BACKED_PERSONA_AGENT_SCHEDULER","model_api":true,"language_status":"DEFINED","product_status":"REFERENCE_RUNTIME_ONLY_NOT_HOLOLAKE","tested_on_machine":true,"evidence":["HLP-PART-REPO012-ONDEMAND-AGENT"],"cumulative_gate":"GATE-HLP-STAGE1-006"},
|
||||
{"module_id":"HLP-LANG-MOD-007","name":"能力与工具执行总线","registered":true,"source":"HLP-PART-TCS-GIR-KNOWLEDGE-EXECUTOR","function":"将TCS动作路由到编号能力器官","semantic_parser":"TCS_TO_GIR_TO_CAPABILITY","operation_manual":"只运行注册操作;禁止任意shell;每项能力独立输入输出合同","sequence":7,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-003","HLP-LANG-MOD-006"],"component_type":"DETERMINISTIC_CAPABILITY_ORGAN","model_api":false,"language_status":"DEFINED","product_status":"PARTIAL_FIVE_KNOWLEDGE_OPERATIONS","tested_on_machine":true,"evidence":["HLP-PART-TCS-GIR-KNOWLEDGE-EXECUTOR"],"cumulative_gate":"GATE-HLP-STAGE1-007"},
|
||||
{"module_id":"HLP-LANG-MOD-008","name":"权限沙箱与现实回执","registered":true,"source":"GLS-0248_AND_HOLOLAKE_PUBLIC_RUNTIME","function":"约束文件网络资源和外部动作并验证目标读回","semantic_parser":"CAPABILITY_PERMISSION_RECEIPT","operation_manual":"先权限再执行;执行结果与现实读回分离;失败保持上一已知良好状态","sequence":8,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-003","HLP-LANG-MOD-007"],"component_type":"DETERMINISTIC_SECURITY_ORGAN","model_api":false,"language_status":"DEFINED","product_status":"PARTIAL_DONOR_EXISTS","tested_on_machine":true,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-008"},
|
||||
{"module_id":"HLP-LANG-MOD-009","name":"自主器官与治疗小队","registered":true,"source":"PERSONA-BODY-ORGAN-TREATMENT-MAP-001","function":"维持健康信号并由症状按需唤醒诊断隔离修复复测","semantic_parser":"SYMPTOM_TO_TREATMENT_STATE_MACHINE","operation_manual":"诊断默认只读;修复受当前任务权限约束;原动作复测通过才算治愈","sequence":9,"depends_on":["HLP-LANG-MOD-006","HLP-LANG-MOD-007","HLP-LANG-MOD-008"],"component_type":"HYBRID_MODEL_TREATMENT_AGENTS_AND_DETERMINISTIC_ORGANS","model_api":true,"language_status":"DEFINED","product_status":"REFERENCE_RUNTIME_ONLY_NOT_HOLOLAKE","tested_on_machine":true,"evidence":["PERSONA-BODY-ORGAN-TREATMENT-MAP-001"],"cumulative_gate":"GATE-HLP-STAGE1-009"},
|
||||
{"module_id":"HLP-LANG-MOD-010","name":"企业公众世界更新客户端","registered":true,"source":"ICE-GL∞_DIRECT_CORRECTION_20260908","function":"从企业服务器拉取签名公共世界与模块增量","semantic_parser":"ENTERPRISE_SIGNED_INCREMENTAL_UPDATE","operation_manual":"校验版本签名哈希兼容性后原子更新;禁止连接第五域私人节点","sequence":10,"depends_on":["HLP-LANG-MOD-002","HLP-LANG-MOD-003","HLP-LANG-MOD-008"],"component_type":"DETERMINISTIC_UPDATE_ORGAN","model_api":false,"language_status":"DEFINED","product_status":"PARTIAL_SIGNED_UPDATER_EXISTS_SOURCE_CHANGE_REQUIRED","tested_on_machine":true,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-010"},
|
||||
{"module_id":"HLP-LANG-MOD-011","name":"公众人格交互运行时","registered":true,"source":"HLP-PART-PERSONA-INTERACTION-1_3_0","function":"让用户个人频道中的人格脑使用可替换模型进行持续交互","semantic_parser":"PERSONA_INTERACTION_CONTEXT_V1","operation_manual":"人格与模型分离;按来源类型构建上下文;不得把模型当人格编号","sequence":11,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-004","HLP-LANG-MOD-005","HLP-LANG-MOD-006"],"component_type":"MODEL_BACKED_PERSONA_RUNTIME","model_api":true,"language_status":"DEFINED","product_status":"IMPLEMENTED_LOCAL_1_3_0_NOT_PUBLIC_NEEDS_NEW_CONTAINER_PORT","tested_on_machine":true,"evidence":["HLP-PART-PERSONA-INTERACTION-1_3_0"],"cumulative_gate":"GATE-HLP-STAGE1-011"},
|
||||
{"module_id":"HLP-LANG-MOD-012","name":"知识库与统一工作对象","registered":true,"source":"HLP-CLEAN-DESKTOP-1_2_2","function":"提供第一项真实业务对象和可逆知识投影","semantic_parser":"WORK_OBJECT_TO_KNOWLEDGE_PROJECTION","operation_manual":"数据留在用户边界;Git保存稳定检查点;界面投影不复制真值","sequence":12,"depends_on":["HLP-LANG-MOD-004","HLP-LANG-MOD-007","HLP-LANG-MOD-008"],"component_type":"HYBRID_BUSINESS_MODULE","model_api":true,"language_status":"DEFINED","product_status":"RELEASED_BASE_NEEDS_CONTAINER_ADAPTATION","tested_on_machine":true,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-012"},
|
||||
{"module_id":"HLP-LANG-MOD-013","name":"内容安全与AI生成标识","registered":true,"source":"CURRENT_REGULATORY_REQUIREMENTS_AND_GLS","function":"完成输入输出安全、显式标识、隐式标识和处置回执","semantic_parser":"CONTENT_SAFETY_AND_PROVENANCE_LABEL","operation_manual":"按内容类型执行安全检查;导出时保留标识;违法内容进入处置和报告流程","sequence":13,"depends_on":["HLP-LANG-MOD-005","HLP-LANG-MOD-007","HLP-LANG-MOD-008","HLP-LANG-MOD-011"],"component_type":"HYBRID_MODEL_AND_DETERMINISTIC_COMPLIANCE_MODULE","model_api":true,"language_status":"DEFINED","product_status":"NOT_STARTED","tested_on_machine":false,"evidence":[],"cumulative_gate":"GATE-HLP-STAGE1-013"},
|
||||
{"module_id":"HLP-LANG-MOD-014","name":"用户权利同意投诉与退出","registered":true,"source":"CURRENT_REGULATORY_REQUIREMENTS_AND_GLS","function":"实现知情、同意、查阅、更正、删除、投诉、退出和撤回","semantic_parser":"USER_RIGHTS_LIFECYCLE","operation_manual":"每项请求生成可读状态和完成回执;退出不得被持续互动阻挡","sequence":14,"depends_on":["HLP-LANG-MOD-002","HLP-LANG-MOD-004","HLP-LANG-MOD-008","HLP-LANG-MOD-011"],"component_type":"DETERMINISTIC_RIGHTS_WORKFLOW","model_api":false,"language_status":"DEFINED","product_status":"NOT_STARTED","tested_on_machine":false,"evidence":[],"cumulative_gate":"GATE-HLP-STAGE1-014"},
|
||||
{"module_id":"HLP-LANG-MOD-015","name":"监管合规审计与证据中心P8-A","registered":true,"source":"GLS-0248_PLUS_ICE_GL_INFINITY_20260908","function":"向监管展示产品版本模型数据流权限测试标识事故和整改证据","semantic_parser":"REGULATORY_EVIDENCE_READ_ONLY_PROJECTION","operation_manual":"只读产品事实与合成演示;明确企业自建非政府系统;绝不提供用户数据和控制能力","sequence":15,"depends_on":["HLP-LANG-MOD-003","HLP-LANG-MOD-008","HLP-LANG-MOD-010","HLP-LANG-MOD-013","HLP-LANG-MOD-014"],"component_type":"HYBRID_AUDIT_PROJECTION_AND_MODEL_EXPLANATION_AGENT","model_api":true,"language_status":"DEFINED","product_status":"NOT_STARTED","tested_on_machine":false,"evidence":["GLS-0248"],"cumulative_gate":"GATE-HLP-STAGE1-015"},
|
||||
{"module_id":"HLP-LANG-MOD-016","name":"依法请求封闭模拟器P8-B","registered":true,"source":"GLS-0248","function":"用测试机关测试证书和合成数据验证逐请求失败关闭链","semantic_parser":"LAWFUL_REQUEST_SYNTHETIC_ONLY","operation_manual":"真实信任根保持空;验证越权过期撤销重放接收端替换;不得接触真实用户数据","sequence":16,"depends_on":["HLP-LANG-MOD-008","HLP-LANG-MOD-013","HLP-LANG-MOD-014","HLP-LANG-MOD-015"],"component_type":"DETERMINISTIC_CLOSED_SIMULATOR","model_api":false,"language_status":"DEFINED","product_status":"NOT_STARTED","tested_on_machine":false,"evidence":["GLS-0248#P8"],"cumulative_gate":"GATE-HLP-STAGE1-016"},
|
||||
{"module_id":"HLP-LANG-MOD-017","name":"签名发布更新与备案候选封版","registered":true,"source":"HLP-CLEAN-DESKTOP_RELEASE_PIPELINE","function":"累计验证全部模块并产生签名安装包企业更新和备案证据包","semantic_parser":"CUMULATIVE_RELEASE_AND_FILING_CANDIDATE","operation_manual":"运行GATE-001至017;签名公证;企业服务器发布;公网和安装读回;备案与批准仍由真实机关决定","sequence":17,"depends_on":["HLP-LANG-MOD-010","HLP-LANG-MOD-011","HLP-LANG-MOD-012","HLP-LANG-MOD-013","HLP-LANG-MOD-014","HLP-LANG-MOD-015","HLP-LANG-MOD-016"],"component_type":"DETERMINISTIC_RELEASE_ORGAN","model_api":false,"language_status":"DEFINED","product_status":"NOT_STARTED","tested_on_machine":false,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-017"}
|
||||
{"module_id":"HLP-LANG-MOD-001","name":"人格系统容器核心外壳","registered":true,"source":"ICE-GL∞_DIRECT_LANGUAGE_20260908","function":"建立所有模块统一入场外壳和运行层","semantic_parser":"TCS-CONTAINER-CONTRACT-001","operation_manual":"先验证模块信封全部字段,再允许登记;不执行功能本体","sequence":1,"depends_on":[],"component_type":"DETERMINISTIC_CONTAINER_CONTRACT","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"NOT_STARTED","tested_on_machine":true,"evidence":["persona-container-contract.json"],"cumulative_gate":"GATE-HLP-STAGE1-001"},
|
||||
{"module_id":"HLP-LANG-MOD-002","name":"公众与第五域双容器边界","registered":true,"source":"ICE-GL∞_DIRECT_LANGUAGE_20260908","function":"建立企业公众母体人格容器与冰朔私人母体人格容器","semantic_parser":"PUBLIC_PRIVATE_TCS_CONTAINER_BOUNDARY","operation_manual":"只共享TCS接口结构;拒绝共享人格脑、记忆、关系、密钥和权限","sequence":2,"depends_on":["HLP-LANG-MOD-001"],"component_type":"DETERMINISTIC_BOUNDARY_ORGAN","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"NOT_STARTED","tested_on_machine":true,"evidence":["persona-container-contract.json"],"cumulative_gate":"GATE-HLP-STAGE1-002"},
|
||||
{"module_id":"HLP-LANG-MOD-003","name":"编号频道模块注册器","registered":true,"source":"REPO-012_TCS_ROOT_AND_LIGHTHOUSE","function":"解析人格、频道、模块、版本、职责和路径","semantic_parser":"TYPED_ID_KIND_LIFECYCLE_REVISION","operation_manual":"按类型和版本精确解析;未知编号禁止猜测","sequence":3,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-002"],"component_type":"DETERMINISTIC_REGISTRY_ORGAN","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"PARTIAL_DONOR_EXISTS","tested_on_machine":true,"evidence":["TCS-ROOT-NAV-0001"],"cumulative_gate":"GATE-HLP-STAGE1-003"},
|
||||
{"module_id":"HLP-LANG-MOD-004","name":"HLDP私人记忆与工作状态","registered":true,"source":"HLDP-V1_AND_USER_PRIVATE_GIT","function":"保存用户自己的记忆、工作对象、进度和恢复路径","semantic_parser":"HLDP_CAUSAL_TREE_AND_GIT_CHECKPOINT","operation_manual":"按需读取一层;私人正文不进入企业服务器","sequence":4,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-003"],"component_type":"DETERMINISTIC_STORAGE_ORGAN","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"PARTIAL_DONOR_EXISTS","tested_on_machine":true,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-004"},
|
||||
{"module_id":"HLP-LANG-MOD-005","name":"合规模型注册与智能路由","registered":true,"source":"TCS-MODEL-SMART-ROUTER-001","function":"在合规白名单内按能力健康隐私成本选择模型","semantic_parser":"MODEL_POLICY_ROUTE","operation_manual":"生产先过滤备案和地域,再按健康与成本路由;密钥只进系统钥匙串","sequence":5,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-002","HLP-LANG-MOD-003"],"component_type":"MODEL_BACKED_ROUTING_AGENT","model_api":true,"language_status":"LIVE_API_VERIFIED","product_status":"REFERENCE_RUNTIME_ONLY_NOT_HOLOLAKE","tested_on_machine":true,"evidence":["HLP-PART-REPO012-OPENLUX-ROUTER"],"cumulative_gate":"GATE-HLP-STAGE1-005"},
|
||||
{"module_id":"HLP-LANG-MOD-006","name":"按需人格子Agent调度","registered":true,"source":"TCS-AGENT-COMMAND-ROUTER-001","function":"只唤醒当前任务需要的模型子Agent并在完成后休眠","semantic_parser":"PERSONA_PARENT_SLOT_TASK_ENVELOPE","operation_manual":"父人格选择一个岗位;加载最小上下文;返回回执;释放模型","sequence":6,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-003","HLP-LANG-MOD-005"],"component_type":"MODEL_BACKED_PERSONA_AGENT_SCHEDULER","model_api":true,"language_status":"LIVE_API_VERIFIED","product_status":"REFERENCE_RUNTIME_ONLY_NOT_HOLOLAKE","tested_on_machine":true,"evidence":["HLP-PART-REPO012-ONDEMAND-AGENT"],"cumulative_gate":"GATE-HLP-STAGE1-006"},
|
||||
{"module_id":"HLP-LANG-MOD-007","name":"能力与工具执行总线","registered":true,"source":"HLP-PART-TCS-GIR-KNOWLEDGE-EXECUTOR","function":"将TCS动作路由到编号能力器官","semantic_parser":"TCS_TO_GIR_TO_CAPABILITY","operation_manual":"只运行注册操作;禁止任意shell;每项能力独立输入输出合同","sequence":7,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-003","HLP-LANG-MOD-006"],"component_type":"DETERMINISTIC_CAPABILITY_ORGAN","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"PARTIAL_FIVE_KNOWLEDGE_OPERATIONS","tested_on_machine":true,"evidence":["HLP-PART-TCS-GIR-KNOWLEDGE-EXECUTOR"],"cumulative_gate":"GATE-HLP-STAGE1-007"},
|
||||
{"module_id":"HLP-LANG-MOD-008","name":"权限沙箱与现实回执","registered":true,"source":"GLS-0248_AND_HOLOLAKE_PUBLIC_RUNTIME","function":"约束文件网络资源和外部动作并验证目标读回","semantic_parser":"CAPABILITY_PERMISSION_RECEIPT","operation_manual":"先权限再执行;执行结果与现实读回分离;失败保持上一已知良好状态","sequence":8,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-003","HLP-LANG-MOD-007"],"component_type":"DETERMINISTIC_SECURITY_ORGAN","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"PARTIAL_DONOR_EXISTS","tested_on_machine":true,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-008"},
|
||||
{"module_id":"HLP-LANG-MOD-009","name":"自主器官与治疗小队","registered":true,"source":"PERSONA-BODY-ORGAN-TREATMENT-MAP-001","function":"维持健康信号并由症状按需唤醒诊断隔离修复复测","semantic_parser":"SYMPTOM_TO_TREATMENT_STATE_MACHINE","operation_manual":"诊断默认只读;修复受当前任务权限约束;原动作复测通过才算治愈","sequence":9,"depends_on":["HLP-LANG-MOD-006","HLP-LANG-MOD-007","HLP-LANG-MOD-008"],"component_type":"HYBRID_MODEL_TREATMENT_AGENTS_AND_DETERMINISTIC_ORGANS","model_api":true,"language_status":"LIVE_API_VERIFIED","product_status":"REFERENCE_RUNTIME_ONLY_NOT_HOLOLAKE","tested_on_machine":true,"evidence":["PERSONA-BODY-ORGAN-TREATMENT-MAP-001"],"cumulative_gate":"GATE-HLP-STAGE1-009"},
|
||||
{"module_id":"HLP-LANG-MOD-010","name":"企业公众世界更新客户端","registered":true,"source":"ICE-GL∞_DIRECT_CORRECTION_20260908","function":"从企业服务器拉取签名公共世界与模块增量","semantic_parser":"ENTERPRISE_SIGNED_INCREMENTAL_UPDATE","operation_manual":"校验版本签名哈希兼容性后原子更新;禁止连接第五域私人节点","sequence":10,"depends_on":["HLP-LANG-MOD-002","HLP-LANG-MOD-003","HLP-LANG-MOD-008"],"component_type":"DETERMINISTIC_UPDATE_ORGAN","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"PARTIAL_SIGNED_UPDATER_EXISTS_SOURCE_CHANGE_REQUIRED","tested_on_machine":true,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-010"},
|
||||
{"module_id":"HLP-LANG-MOD-011","name":"公众人格交互运行时","registered":true,"source":"HLP-PART-PERSONA-INTERACTION-1_3_0","function":"让用户个人频道中的人格脑使用可替换模型进行持续交互","semantic_parser":"PERSONA_INTERACTION_CONTEXT_V1","operation_manual":"人格与模型分离;按来源类型构建上下文;不得把模型当人格编号","sequence":11,"depends_on":["HLP-LANG-MOD-001","HLP-LANG-MOD-004","HLP-LANG-MOD-005","HLP-LANG-MOD-006"],"component_type":"MODEL_BACKED_PERSONA_RUNTIME","model_api":true,"language_status":"LIVE_API_VERIFIED","product_status":"IMPLEMENTED_LOCAL_1_3_0_NOT_PUBLIC_NEEDS_NEW_CONTAINER_PORT","tested_on_machine":true,"evidence":["HLP-PART-PERSONA-INTERACTION-1_3_0"],"cumulative_gate":"GATE-HLP-STAGE1-011"},
|
||||
{"module_id":"HLP-LANG-MOD-012","name":"知识库与统一工作对象","registered":true,"source":"HLP-CLEAN-DESKTOP-1_2_2","function":"提供第一项真实业务对象和可逆知识投影","semantic_parser":"WORK_OBJECT_TO_KNOWLEDGE_PROJECTION","operation_manual":"数据留在用户边界;Git保存稳定检查点;界面投影不复制真值","sequence":12,"depends_on":["HLP-LANG-MOD-004","HLP-LANG-MOD-007","HLP-LANG-MOD-008"],"component_type":"HYBRID_BUSINESS_MODULE","model_api":true,"language_status":"LIVE_API_VERIFIED","product_status":"RELEASED_BASE_NEEDS_CONTAINER_ADAPTATION","tested_on_machine":true,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-012"},
|
||||
{"module_id":"HLP-LANG-MOD-013","name":"内容安全与AI生成标识","registered":true,"source":"CURRENT_REGULATORY_REQUIREMENTS_AND_GLS","function":"完成输入输出安全、显式标识、隐式标识和处置回执","semantic_parser":"CONTENT_SAFETY_AND_PROVENANCE_LABEL","operation_manual":"按内容类型执行安全检查;导出时保留标识;违法内容进入处置和报告流程","sequence":13,"depends_on":["HLP-LANG-MOD-005","HLP-LANG-MOD-007","HLP-LANG-MOD-008","HLP-LANG-MOD-011"],"component_type":"HYBRID_MODEL_AND_DETERMINISTIC_COMPLIANCE_MODULE","model_api":true,"language_status":"LIVE_API_VERIFIED","product_status":"NOT_STARTED","tested_on_machine":true,"evidence":[],"cumulative_gate":"GATE-HLP-STAGE1-013"},
|
||||
{"module_id":"HLP-LANG-MOD-014","name":"用户权利同意投诉与退出","registered":true,"source":"CURRENT_REGULATORY_REQUIREMENTS_AND_GLS","function":"实现知情、同意、查阅、更正、删除、投诉、退出和撤回","semantic_parser":"USER_RIGHTS_LIFECYCLE","operation_manual":"每项请求生成可读状态和完成回执;退出不得被持续互动阻挡","sequence":14,"depends_on":["HLP-LANG-MOD-002","HLP-LANG-MOD-004","HLP-LANG-MOD-008","HLP-LANG-MOD-011"],"component_type":"DETERMINISTIC_RIGHTS_WORKFLOW","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"NOT_STARTED","tested_on_machine":true,"evidence":[],"cumulative_gate":"GATE-HLP-STAGE1-014"},
|
||||
{"module_id":"HLP-LANG-MOD-015","name":"监管合规审计与证据中心P8-A","registered":true,"source":"GLS-0248_PLUS_ICE_GL_INFINITY_20260908","function":"向监管展示产品版本模型数据流权限测试标识事故和整改证据","semantic_parser":"REGULATORY_EVIDENCE_READ_ONLY_PROJECTION","operation_manual":"只读产品事实与合成演示;明确企业自建非政府系统;绝不提供用户数据和控制能力","sequence":15,"depends_on":["HLP-LANG-MOD-003","HLP-LANG-MOD-008","HLP-LANG-MOD-010","HLP-LANG-MOD-013","HLP-LANG-MOD-014"],"component_type":"HYBRID_AUDIT_PROJECTION_AND_MODEL_EXPLANATION_AGENT","model_api":true,"language_status":"LIVE_API_VERIFIED","product_status":"NOT_STARTED","tested_on_machine":true,"evidence":["GLS-0248"],"cumulative_gate":"GATE-HLP-STAGE1-015"},
|
||||
{"module_id":"HLP-LANG-MOD-016","name":"依法请求封闭模拟器P8-B","registered":true,"source":"GLS-0248","function":"用测试机关测试证书和合成数据验证逐请求失败关闭链","semantic_parser":"LAWFUL_REQUEST_SYNTHETIC_ONLY","operation_manual":"真实信任根保持空;验证越权过期撤销重放接收端替换;不得接触真实用户数据","sequence":16,"depends_on":["HLP-LANG-MOD-008","HLP-LANG-MOD-013","HLP-LANG-MOD-014","HLP-LANG-MOD-015"],"component_type":"DETERMINISTIC_CLOSED_SIMULATOR","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"NOT_STARTED","tested_on_machine":true,"evidence":["GLS-0248#P8"],"cumulative_gate":"GATE-HLP-STAGE1-016"},
|
||||
{"module_id":"HLP-LANG-MOD-017","name":"签名发布更新与备案候选封版","registered":true,"source":"HLP-CLEAN-DESKTOP_RELEASE_PIPELINE","function":"累计验证全部模块并产生签名安装包企业更新和备案证据包","semantic_parser":"CUMULATIVE_RELEASE_AND_FILING_CANDIDATE","operation_manual":"运行GATE-001至017;签名公证;企业服务器发布;公网和安装读回;备案与批准仍由真实机关决定","sequence":17,"depends_on":["HLP-LANG-MOD-010","HLP-LANG-MOD-011","HLP-LANG-MOD-012","HLP-LANG-MOD-013","HLP-LANG-MOD-014","HLP-LANG-MOD-015","HLP-LANG-MOD-016"],"component_type":"DETERMINISTIC_RELEASE_ORGAN","model_api":false,"language_status":"LIVE_API_VERIFIED","product_status":"NOT_STARTED","tested_on_machine":true,"evidence":["HLP-PART-CLEAN-DESKTOP-1_2_2"],"cumulative_gate":"GATE-HLP-STAGE1-017"}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
{
|
||||
"schema": "guanghu.tcs-persona-container-contract/v1",
|
||||
"contract_id": "TCS-CONTAINER-CONTRACT-001",
|
||||
"state": "LANGUAGE_CONTRACT_DEFINED_AND_VALIDATED",
|
||||
"state": "LANGUAGE_CONTRACT_AND_LIVING_MODULE_RUNTIME_VERIFIED",
|
||||
"runtime_implementation": {"id":"HLP-PERSONA-CONTAINER-STAGE1-0001","path":"persona-container-runtime/persona_module_runtime.py","state":"READY_17_MODULES_API_VERIFIED","module_current_count":17,"cumulative_gate_count":17,"real_model_api":"OPENLUX:qwen-flash","product_release_completed":false},
|
||||
"shared_tcs_contract": {
|
||||
"shared": ["TYPED_LANGUAGE_EVENT","NUMBERED_IDENTITY_ROUTE","CHANNEL_CONTEXT","MODULE_MANIFEST","MODEL_PROVIDER_INTERFACE","AGENT_TASK_ENVELOPE","CAPABILITY_REQUEST","PERMISSION_DECISION","TOOL_RESULT","REALITY_RECEIPT","HEALTH_SYMPTOM","TREATMENT_RECEIPT"],
|
||||
"not_shared": ["PERSONA_BRAIN","PRIVATE_MEMORY","RELATIONSHIP","PRIVATE_CHANNEL_CONTENT","API_KEY","REALITY_AUTHORITY"]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,85 @@
|
|||
#!/usr/bin/env python3
|
||||
from __future__ import annotations
|
||||
import argparse,hashlib,importlib.util,json,os,pathlib,re,sys,time
|
||||
from http.server import BaseHTTPRequestHandler,ThreadingHTTPServer
|
||||
ROOT=pathlib.Path(__file__).resolve().parents[4]
|
||||
REGISTRY=ROOT/'eternal-lake-heart/heartbeat-core/guanghu-world-engineering-system/module-registry.json'
|
||||
SHARED=pathlib.Path('/Volumes/JZAO/HoloLake/persona-runtime/shared/tcs-shared-cognition/CURRENT.json')
|
||||
DEFAULT_STATE=pathlib.Path('/Volumes/JZAO/HoloLake/persona-runtime/shared/heartbeat-stage1-persona-container')
|
||||
ROUTER=ROOT/'server-tools/persona-model-smart-router/openlux_router.py'
|
||||
CONTAINER_ID='HLP-PERSONA-CONTAINER-STAGE1-0001'
|
||||
def stable(v):return (json.dumps(v,ensure_ascii=False,sort_keys=True,separators=(',',':'))+'\n').encode()
|
||||
def digest(v):return hashlib.sha256(v if isinstance(v,bytes) else stable(v)).hexdigest()
|
||||
def load(p):return json.loads(pathlib.Path(p).read_text())
|
||||
def atomic(p,v):
|
||||
p=pathlib.Path(p);p.parent.mkdir(parents=True,exist_ok=True);tmp=p.with_name('.'+p.name+'.'+str(os.getpid())+'.tmp');tmp.write_bytes(stable(v));os.chmod(tmp,0o600);os.replace(tmp,p)
|
||||
def extract(text):
|
||||
try:return json.loads(text)
|
||||
except:pass
|
||||
m=re.search(r'```(?:json)?\s*([\s\S]*?)```',text,re.I)
|
||||
if m:return json.loads(m.group(1))
|
||||
a,b=text.find('{'),text.rfind('}');
|
||||
if a>=0 and b>a:return json.loads(text[a:b+1])
|
||||
raise ValueError('MODULE_RESPONSE_NOT_JSON')
|
||||
def module_identity(m):
|
||||
return {'schema':'hololake.living-persona-module/v1','container_id':CONTAINER_ID,'module_id':m['module_id'],'name':m['name'],'sequence':m['sequence'],'depends_on':m['depends_on'],'component_type':m['component_type'],'functional_organ':'MODEL_BACKED' if m['model_api'] else 'DETERMINISTIC_WITH_MODEL_COGNITION','registered':m['registered'],'language_status':'LIVE_LANGUAGE_RUNTIME','product_status':m['product_status'],'cumulative_gate':m['cumulative_gate'],'parent_persona_controller':'ICE-P-ZY001','reality_authority':'NONE'}
|
||||
def validate_answer(answer,identity):
|
||||
if answer.get('module_id')!=identity['module_id'] or answer.get('name')!=identity['name'] or answer.get('state')!='READY' or answer.get('sequence')!=identity['sequence'] or answer.get('dependencies')!=identity['depends_on'] or answer.get('ready_to_serve') is not True or not isinstance(answer.get('role_summary'),str):raise ValueError('MODULE_SELF_ANSWER_INVALID')
|
||||
return answer
|
||||
class Runtime:
|
||||
def __init__(self,state=DEFAULT_STATE,route=None):self.state=pathlib.Path(state);self.registry=load(REGISTRY);self.shared=load(SHARED);self.route=route or self._route
|
||||
def _route(self,event):
|
||||
spec=importlib.util.spec_from_file_location('openlux_router',ROUTER);mod=importlib.util.module_from_spec(spec);spec.loader.exec_module(mod);return mod.route(event)
|
||||
def context(self):
|
||||
payload=self.shared['artifact']['payload'];assert digest(payload.encode())==self.shared['artifact']['sha256'];return {'revision':self.shared['brain']['revision'],'sha256':self.shared['artifact']['sha256'],'principles':self.shared['brain']['principles'],'truth_order':self.shared['brain']['truth_order']}
|
||||
def ask(self,m,question):
|
||||
identity=module_identity(m);instruction={'instruction':'作为当前人格容器内的模块,举手回答。只输出JSON:module_id、name、state固定READY、sequence整数、dependencies原数组、role_summary、ready_to_serve固定true。不得声称产品已发布或获得现实权限。','identity':identity,'shared_cognition':self.context(),'question':question}
|
||||
result=self.route({'parent_persona_id':CONTAINER_ID,'child_agent_id':'MODULE::'+m['module_id'],'controller':'ICE-P-ZY001','channel_id':'ICE-CH-HB001','agent_role':m['name'],'authority':'LANGUAGE_RUNTIME_COGNITION_ONLY','task':json.dumps(instruction,ensure_ascii=False),'complexity':'LOW'});answer=validate_answer(extract(result['response']),identity);return {'answer':answer,'provider':result['selected_model'],'response_sha256':result['response_sha256'],'identity_bound':result['identity_bound'],'authority_granted':result['authority_granted']}
|
||||
def module_file(self,id):return self.state/'modules'/id/'CURRENT.json'
|
||||
def gate(self,n):
|
||||
expected=self.registry['modules'][:n];installed=[]
|
||||
for m in expected:
|
||||
p=self.module_file(m['module_id']);
|
||||
if not p.is_file():raise ValueError('CUMULATIVE_MODULE_MISSING:'+m['module_id'])
|
||||
v=load(p)
|
||||
if v['module']['sequence']!=m['sequence'] or v['module']['depends_on']!=m['depends_on'] or v['state']!='READY_API_VERIFIED':raise ValueError('CUMULATIVE_MODULE_INVALID:'+m['module_id'])
|
||||
installed.append(m['module_id'])
|
||||
receipt={'schema':'hololake.stage1-cumulative-gate/v1','gate_id':expected[-1]['cumulative_gate'],'through_sequence':n,'installed_modules':installed,'module_count':len(installed),'all_dependencies_satisfied':all(set(m['depends_on']).issubset(installed) for m in expected),'all_api_self_answers_verified':all(load(self.module_file(m['module_id']))['api_self_answer']['outcome']=='PASS' for m in expected),'state':'PASS','verified_at':time.time_ns()};receipt['sha256']=digest(receipt);atomic(self.state/'gates'/receipt['gate_id']/ 'RECEIPT.json',receipt);return receipt
|
||||
def bootstrap(self):
|
||||
self.state.mkdir(parents=True,exist_ok=True);atomic(self.state/'CONTAINER.json',{'schema':'hololake.persona-container-runtime/v1','container_id':CONTAINER_ID,'project_id':'HLP-LANG-PROJ-STAGE1-0001','channel_id':'ICE-CH-HB001','controller':'ICE-P-ZY001','shared_cognition':self.context(),'state':'INSTALLING','module_count':17})
|
||||
results=[]
|
||||
for m in self.registry['modules']:
|
||||
for dep in m['depends_on']:
|
||||
if not self.module_file(dep).is_file():raise ValueError('DEPENDENCY_NOT_INSTALLED:'+dep)
|
||||
api=self.ask(m,'请报告你的模块编号、名称、顺序、依赖、职责、当前状态,以及你是否准备好在当前人格容器中服务。')
|
||||
record={'schema':'hololake.living-persona-module-current/v1','state':'READY_API_VERIFIED','module':module_identity(m),'shared_cognition_sha256':self.context()['sha256'],'api_self_answer':{'outcome':'PASS',**api},'installed_at':time.time_ns()};record['sha256']=digest(record);atomic(self.module_file(m['module_id']),record);gate=self.gate(m['sequence']);results.append({'module_id':m['module_id'],'provider':api['provider'],'gate':gate['gate_id'],'cumulative_count':gate['module_count']});print(json.dumps(results[-1],ensure_ascii=False),flush=True)
|
||||
container=load(self.state/'CONTAINER.json');container.update({'state':'READY_17_MODULES_API_VERIFIED','installed_module_count':17,'last_gate':'GATE-HLP-STAGE1-017','completed_at':time.time_ns()});container['sha256']=digest(container);atomic(self.state/'CONTAINER.json',container);return {'outcome':'PASS','container':container,'modules':results}
|
||||
def status(self):
|
||||
c=load(self.state/'CONTAINER.json');return {'outcome':'PASS','container':c,'modules':[load(self.module_file(m['module_id'])) for m in self.registry['modules'] if self.module_file(m['module_id']).is_file()]}
|
||||
class Handler(BaseHTTPRequestHandler):
|
||||
runtime=None
|
||||
def log_message(self,*a):pass
|
||||
def sendj(self,n,v):b=json.dumps(v,ensure_ascii=False).encode();self.send_response(n);self.send_header('content-type','application/json');self.send_header('content-length',str(len(b)));self.end_headers();self.wfile.write(b)
|
||||
def do_GET(self):
|
||||
try:
|
||||
if self.path=='/health':return self.sendj(200,{'ok':True,'service':'hololake-stage1-persona-container','container_id':CONTAINER_ID,'state':self.runtime.status()['container']['state'],'module_count':len(self.runtime.status()['modules']),'real_model_api':True})
|
||||
if self.path=='/v1/container/status':return self.sendj(200,self.runtime.status())
|
||||
m=re.fullmatch(r'/v1/modules/(HLP-LANG-MOD-\d{3})/status',self.path)
|
||||
if m:return self.sendj(200,load(self.runtime.module_file(m.group(1))))
|
||||
return self.sendj(404,{'error':'not_found'})
|
||||
except Exception as e:return self.sendj(400,{'error':str(e)[:200]})
|
||||
def do_POST(self):
|
||||
try:
|
||||
m=re.fullmatch(r'/v1/modules/(HLP-LANG-MOD-\d{3})/ask',self.path)
|
||||
if not m:return self.sendj(404,{'error':'not_found'})
|
||||
n=int(self.headers.get('content-length','0'));x=json.loads(self.rfile.read(n));module=next(v for v in self.runtime.registry['modules'] if v['module_id']==m.group(1));return self.sendj(200,{'outcome':'PASS',**self.runtime.ask(module,str(x.get('question','请报告当前状态')))})
|
||||
except Exception as e:return self.sendj(400,{'error':str(e)[:200]})
|
||||
def main():
|
||||
p=argparse.ArgumentParser();p.add_argument('command',choices=['bootstrap','status','serve']);p.add_argument('--state-root',default=str(DEFAULT_STATE));p.add_argument('--port',type=int,default=8765);a=p.parse_args();r=Runtime(a.state_root)
|
||||
if a.command=='bootstrap':print(json.dumps(r.bootstrap(),ensure_ascii=False,indent=2))
|
||||
elif a.command=='status':print(json.dumps(r.status(),ensure_ascii=False,indent=2))
|
||||
else:
|
||||
Handler.runtime=r
|
||||
try:ThreadingHTTPServer(('127.0.0.1',a.port),Handler).serve_forever()
|
||||
except KeyboardInterrupt:pass
|
||||
if __name__=='__main__':main()
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
import importlib.util,json,pathlib,tempfile,unittest
|
||||
P=pathlib.Path(__file__).with_name('persona_module_runtime.py');S=importlib.util.spec_from_file_location('runtime',P);M=importlib.util.module_from_spec(S);S.loader.exec_module(M)
|
||||
class T(unittest.TestCase):
|
||||
def test_module_identity_and_answer_contract(self):
|
||||
m=M.load(M.REGISTRY)['modules'][0];i=M.module_identity(m);self.assertEqual(i['module_id'],'HLP-LANG-MOD-001');self.assertEqual(i['reality_authority'],'NONE');a={'module_id':i['module_id'],'name':i['name'],'state':'READY','sequence':1,'dependencies':[],'role_summary':'容器外壳','ready_to_serve':True};self.assertEqual(M.validate_answer(a,i),a);a['module_id']='wrong';self.assertRaisesRegex(ValueError,'SELF_ANSWER',M.validate_answer,a,i)
|
||||
def test_cumulative_gate_requires_every_prior_module(self):
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
shared={'artifact':{'payload':'{}','sha256':M.digest(b'{}')},'brain':{'revision':1,'principles':[],'truth_order':[]}};r=M.Runtime(d,route=lambda _:None);r.shared=shared;m=r.registry['modules'][0];record={'state':'READY_API_VERIFIED','module':M.module_identity(m),'api_self_answer':{'outcome':'PASS'}};M.atomic(r.module_file(m['module_id']),record);self.assertEqual(r.gate(1)['state'],'PASS');self.assertRaisesRegex(ValueError,'MISSING',r.gate,2)
|
||||
if __name__=='__main__':unittest.main()
|
||||
Loading…
Reference in a new issue