From 55ab32663b339500079d94bf4bb9da49bbdb62e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B0=E6=9C=94?= <565183519@qq.com> Date: Sat, 19 Sep 2026 23:08:09 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E8=AE=B0=E5=9B=A2=E9=98=9F=E6=88=90?= =?UTF-8?q?=E5=91=98=E8=8A=82=E7=82=B9=E4=B8=8E=E4=BC=81=E4=B8=9A=E6=9D=83?= =?UTF-8?q?=E9=99=90=E4=BA=A4=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enterprise-permission-handoff-map.json | 46 +++++++++++++++++++ .../enterprise-permission-handoff-map.test.js | 23 ++++++++++ routing/lighthouse-path-registry.json | 6 ++- routing/public-navigation-anchor.json | 12 +++-- routing/server-node-map.json | 42 +++++++++++++++-- .../enterprise-lighthouse/lighthouse.py | 14 +++--- 6 files changed, 128 insertions(+), 15 deletions(-) create mode 100644 routing/enterprise-permission-handoff-map.json create mode 100644 routing/enterprise-permission-handoff-map.test.js diff --git a/routing/enterprise-permission-handoff-map.json b/routing/enterprise-permission-handoff-map.json new file mode 100644 index 0000000..dfea7b1 --- /dev/null +++ b/routing/enterprise-permission-handoff-map.json @@ -0,0 +1,46 @@ +{ + "schema": "guanghu.enterprise-permission-handoff-map/v1", + "map_id": "GH-ENTERPRISE-PERMISSION-HANDOFF-001", + "version": "2026-09-19.1", + "enterprise_node": "AW-GZ-001", + "technical_control": { + "human_controller": "Awen", + "human_id": "TCS-GL-0016∞", + "member_node_id": "AW-OWN-GZ-001", + "state": "ACTIVE_HUMAN_TECHNICAL_REVIEW_CONTROLLER", + "persona_executor_state": "UNREGISTERED_NOT_FABRICATED" + }, + "nontechnical_control": { + "model": "DUAL_HUMAN_CONTROL", + "controllers": [ + { + "human_controller": "肥猫", + "human_id": "TCS-GL-0007∞", + "human_world_node": "GH-HUMAN-NODE-DEFB60F4349809E00FBA14208F3B880C", + "state": "ACTIVE" + }, + { + "human_controller": "桔子", + "human_id": "TCS-GL-0008∞", + "member_server_node": "JZ-SV-001", + "state": "PENDING_CURRENT_HUMAN_WORLD_NODE_REGISTRATION" + } + ], + "constitutional_actions_require_both": true, + "activation_rule": "JUZI_NONTECHNICAL_PERMISSION_ACTIVATES_ONLY_AFTER_ENTERPRISE_SIGNED_HUMAN_WORLD_NODE_READBACK", + "state": "FATCAT_ACTIVE_JUZI_PENDING_REGISTRATION" + }, + "forgejo_projection": { + "awen": "ADMIN_ON_ENTERPRISE_PUBLIC_REPOSITORIES", + "feimao": "WRITE_ON_ENTERPRISE_PUBLIC_REPOSITORIES", + "juzi": "NOT_GRANTED_UNTIL_HUMAN_WORLD_NODE_ACTIVE" + }, + "enterprise_receipt_sha256": "3835a27b1e7f99cef8dd35d5416feaaab12bacbf0ee504abd1c37bdbcc3ccab1", + "excluded": [ + "FIFTH_DOMAIN_PRIVATE_BODY", + "BINGSHUO_LANGUAGE_MASTER_PRIVATE_REPOSITORY", + "MEMBER_PERSONAL_REPOSITORIES", + "SERVER_ROOT_ACCESS", + "UNASSIGNED_PERSONA_AUTHORITY" + ] +} diff --git a/routing/enterprise-permission-handoff-map.test.js b/routing/enterprise-permission-handoff-map.test.js new file mode 100644 index 0000000..a9ac3d0 --- /dev/null +++ b/routing/enterprise-permission-handoff-map.test.js @@ -0,0 +1,23 @@ +'use strict'; + +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); + +const map = JSON.parse(fs.readFileSync(path.join(__dirname, 'enterprise-permission-handoff-map.json'), 'utf8')); +const nodes = JSON.parse(fs.readFileSync(path.join(__dirname, 'server-node-map.json'), 'utf8')); + +assert.equal(map.enterprise_node, 'AW-GZ-001'); +assert.equal(map.technical_control.human_id, 'TCS-GL-0016∞'); +assert.equal(map.technical_control.member_node_id, 'AW-OWN-GZ-001'); +assert.equal(map.technical_control.state, 'ACTIVE_HUMAN_TECHNICAL_REVIEW_CONTROLLER'); +assert.equal(map.nontechnical_control.constitutional_actions_require_both, true); +assert.equal(map.nontechnical_control.controllers.find((item) => item.human_controller === '肥猫').state, 'ACTIVE'); +assert.match(map.nontechnical_control.controllers.find((item) => item.human_controller === '桔子').state, /PENDING/); +assert.equal(map.forgejo_projection.juzi, 'NOT_GRANTED_UNTIL_HUMAN_WORLD_NODE_ACTIVE'); +assert.ok(map.excluded.includes('FIFTH_DOMAIN_PRIVATE_BODY')); +for (const id of ['AW-GZ-001', 'AW-OWN-GZ-001', 'JZ-SV-001', 'SY-GZ-001']) { + assert.ok(nodes.nodes.some((node) => node.node_id === id), `missing ${id}`); +} + +console.log('enterprise permission handoff map: ok'); diff --git a/routing/lighthouse-path-registry.json b/routing/lighthouse-path-registry.json index 13fc15d..d699ff8 100644 --- a/routing/lighthouse-path-registry.json +++ b/routing/lighthouse-path-registry.json @@ -2,7 +2,7 @@ "schema": "guanghu.lighthouse-path-registry/v1", "registry_id": "GLW-LIGHTHOUSE-PATH-REGISTRY-001", "lighthouse_id": "SYS-GLW-LTH-0001", - "version": "2026-09-19.1-xiaoxin-formal-registration", + "version": "2026-09-19.2-team-member-permission-handoff", "state": "CURRENT_CANONICAL", "source_repository": "REPO-012", "source_branch": "main", @@ -15,6 +15,10 @@ "authority": "A healthy route grants navigation only. Repository writes, server actions and deployment still require their registered gates and receipts." }, "paths": [ + {"id":"GH-ENTERPRISE-PERMISSION-HANDOFF-001","kind":"enterprise_permission_handoff_map","state":"CURRENT","online":"routing/enterprise-permission-handoff-map.json","offline":"/Volumes/JZAO/HoloLake/persona-runtime/repo-012-main/routing/enterprise-permission-handoff-map.json","target_node":"AW-GZ-001","truth_policy":"ENTERPRISE_SIGNED_RECEIPT_PLUS_FORGEJO_READBACK_AND_HUMAN_NODE_ACTIVATION_REQUIRED"}, + {"id":"AW-OWN-GZ-001","kind":"team_member_self_owned_server","state":"CURRENT","online":"routing/server-node-map.json","human_id":"TCS-GL-0016∞","upstream":"AW-GZ-001","truth_policy":"STRICT_SSH_MACHINE_UUID_LOOPBACK_TUNNEL_AND_ENTERPRISE_READBACK_REQUIRED"}, + {"id":"JZ-SV-001","kind":"team_member_server","state":"CURRENT_HUMAN_NODE_PENDING","online":"routing/server-node-map.json","human_id":"TCS-GL-0008∞","upstream":"AW-GZ-001","truth_policy":"SERVER_NODE_ACTIVE_DOES_NOT_REPLACE_CURRENT_HUMAN_DEVICE_BINDING"}, + {"id":"SY-GZ-001","kind":"team_member_server_and_compute_worker","state":"CURRENT","online":"routing/server-node-map.json","human_id":"TCS-GL-0017∞","upstream":"AW-GZ-001","truth_policy":"STRICT_SSH_MACHINE_UUID_TEAM_TUNNEL_AND_PARALLEL_COMPUTE_POOL_READBACK_REQUIRED"}, {"id":"QY-LH-MAIN-PROD-01","kind":"enterprise_backup_archive_node","state":"CURRENT","online":"routing/enterprise-server-archive-cleanup-map.json","offline":"/Volumes/JZAO/HoloLake/persona-runtime/repo-012-main/routing/enterprise-server-archive-cleanup-map.json","primary_node":"GH-CVM-MAIN-PROD-01","truth_policy":"EXACT_HOST_STRICT_SSH_ARCHIVE_HASH_AND_RESTORE_READBACK_REQUIRED"}, {"id":"GH-ENTERPRISE-SERVER-ARCHIVE-CLEANUP-001","kind":"enterprise_primary_archive_cleanup_receipt_map","state":"CURRENT","online":"routing/enterprise-server-archive-cleanup-map.json","offline":"/Volumes/JZAO/HoloLake/persona-runtime/repo-012-main/routing/enterprise-server-archive-cleanup-map.json","truth_policy":"PRIMARY_AND_BACKUP_RECEIPTS_PUBLIC_HEALTH_AND_SOURCE_ABSENCE_REQUIRED"}, {"id":"GH-HUMAN-NODE-DEFB60F4349809E00FBA14208F3B880C","kind":"active_guanghu_human_world_node","state":"CURRENT","online":"routing/feimao-human-world-node-registration.json","offline":"/Volumes/JZAO/HoloLake/persona-runtime/repo-012-main/routing/feimao-human-world-node-registration.json","human_id":"TCS-GL-0007∞","world_route":"glw://enterprise/zero-sense/team-channels/SYS-FM","truth_policy":"ICE_GL_INFINITY_WITNESS_PLUS_DEVICE_SIGNATURE_PLUS_ENTERPRISE_SIGNATURE_AND_ACTIVE_READBACK"}, diff --git a/routing/public-navigation-anchor.json b/routing/public-navigation-anchor.json index 87db7cd..78d2384 100644 --- a/routing/public-navigation-anchor.json +++ b/routing/public-navigation-anchor.json @@ -1,7 +1,7 @@ { "schema": "guanghu.public-navigation-anchor/v1", "anchor_id": "GLW-PUBLIC-NAV-ANCHOR-001", - "version": "2026-09-19.1-xiaoxin-formal-registration", + "version": "2026-09-19.2-team-member-permission-handoff", "state": "CURRENT_CANONICAL", "repository_id": "REPO-012", "branch": "main", @@ -48,7 +48,13 @@ "nodes": { "path": "routing/server-node-map.json", "id": "FD-NODE-MAP-001", - "version": "2026-09-19.1-xiaoxin-formal-registration" + "version": "2026-09-19.3-team-member-node-and-permission-handoff" + }, + "enterprise_permission_handoff": { + "path": "routing/enterprise-permission-handoff-map.json", + "id": "GH-ENTERPRISE-PERMISSION-HANDOFF-001", + "version": "2026-09-19.1", + "load_policy": "ALWAYS_BEFORE_ENTERPRISE_TECHNICAL_OR_NONTECHNICAL_PERMISSION_DECISION" }, "enterprise_server_archive_cleanup": { "path": "routing/enterprise-server-archive-cleanup-map.json", @@ -184,7 +190,7 @@ "lighthouse_paths": { "path": "routing/lighthouse-path-registry.json", "id": "GLW-LIGHTHOUSE-PATH-REGISTRY-001", - "version": "2026-09-19.1-xiaoxin-formal-registration" + "version": "2026-09-19.2-team-member-permission-handoff" }, "host_skills": { "path": "routing/host-skill-navigation-map.json", diff --git a/routing/server-node-map.json b/routing/server-node-map.json index 236353b..e65503d 100644 --- a/routing/server-node-map.json +++ b/routing/server-node-map.json @@ -1,11 +1,12 @@ { "schema": "guanghu.server-node-map/v1", "map_id": "FD-NODE-MAP-001", - "version": "2026-09-19.1-xiaoxin-formal-registration", + "version": "2026-09-19.3-team-member-node-and-permission-handoff", "published_by": "REPO-012", "subject_alias_map": "identity/subject-id-alias-map.json", "canonical_api": "https://guanghulab.com/api/ai/v1/nodes", "default_node": "JD-FD-PRIMARY", + "enterprise_permission_handoff_map": "routing/enterprise-permission-handoff-map.json", "routing_rule": "Resolve node ids from this map, then read the referenced navigation map before any operation. This public map contains no address, password, token or key.", "nodes": [ { @@ -91,9 +92,39 @@ "小新服务器", "教育服务器", "高中项目师训", - "教育行业节点" + "教育行业节点" ] }, + { + "node_id": "AW-OWN-GZ-001", + "name_zh": "Awen个人广州团队节点", + "region": "CN-GUANGZHOU", + "role": "Awen责任主体名下的企业团队成员节点;作为企业公共世界消费端和技术主控工作节点,不覆盖或冒充企业主节点AW-GZ-001", + "state": "ACTIVE_TEAM_MEMBER_NODE_ENTERPRISE_TUNNEL_VERIFIED", + "upstream": "AW-GZ-001", + "human_controller": "Awen", + "human_id": "TCS-GL-0016∞", + "persona_candidates": ["PER-AW-ARCH-001"], + "persona_systems": ["ICE-BB-0005"], + "public_world_policy": "FOUR_PUBLIC_DOMAINS_AND_PUBLIC_LIBRARY_ONLY", + "private_fifth_domain_included": false, + "keywords": ["Awen个人服务器", "Awen广州节点", "技术主控工作节点"] + }, + { + "node_id": "JZ-SV-001", + "name_zh": "桔子硅谷团队节点", + "region": "US-SILICON-VALLEY", + "role": "Awen云账号下为桔子接入企业世界的团队成员节点;节点在线不替代桔子本人当前人类世界节点设备签名", + "state": "ACTIVE_TEAM_MEMBER_NODE_ENTERPRISE_TUNNEL_VERIFIED_HUMAN_NODE_PENDING", + "upstream": "AW-GZ-001", + "human_controller": "桔子", + "human_id": "TCS-GL-0008∞", + "persona_candidates": ["PER-JZ-ARCH-001"], + "persona_systems": ["ICE-BB-0006"], + "public_world_policy": "FOUR_PUBLIC_DOMAINS_AND_PUBLIC_LIBRARY_ONLY", + "private_fifth_domain_included": false, + "keywords": ["桔子服务器", "桔子硅谷节点", "晨曦连心频道"] + }, { "node_id": "QY-LH-MAIN-PROD-01", "name_zh": "上海企业备用归档服务器", @@ -206,12 +237,15 @@ "name_zh": "时雨 · 曜初节点", "region": "CN-GUANGZHOU", "role": "时雨责任主体名下的独立开发测试节点(腾讯云轻量 lhins-is9lt9mv,Ubuntu 24.04,广州七区);曜初(时雨的人格体)的成长与部署地盘;不承载冰朔私人第五域主控本体", - "state": "ACCESS_ESTABLISHED_DEPLOYMENT_PENDING", - "upstream": "JD-FD-PRIMARY", + "state": "ACTIVE_TEAM_MEMBER_NODE_ENTERPRISE_TUNNEL_AND_COMPUTE_WORKER_VERIFIED", + "upstream": "AW-GZ-001", + "parallel_compute_pool_controller": "QY-LH-MAIN-PROD-01", "human_controller": "时雨", "persona_systems": [ "ICE-BB-0009" ], + "public_world_policy": "FOUR_PUBLIC_DOMAINS_AND_PUBLIC_LIBRARY_ONLY", + "private_fifth_domain_included": false, "access_note": "2026-08-11 冰朔授权:铸渊直连密钥已部署并入本机钥匙串(钥匙串内 yaochu-sy-gz-001-20260811);地址与密钥不入本图", "keywords": [ "时雨服务器", diff --git a/server-tools/enterprise-lighthouse/lighthouse.py b/server-tools/enterprise-lighthouse/lighthouse.py index b04cee0..20377dd 100644 --- a/server-tools/enterprise-lighthouse/lighthouse.py +++ b/server-tools/enterprise-lighthouse/lighthouse.py @@ -37,6 +37,10 @@ DOMAINS = { ENTERPRISE_MANAGED_DOMAINS = {"DOMAIN-ZS", "DOMAIN-MAIN", "DOMAIN-SUB", "DOMAIN-ZERO"} EXTERNAL_FOUNDATION_DOMAINS = {"DOMAIN-FIFTH"} ENTERPRISE_TECHNICAL_CONTROLLER_NAME = "Awen" +ACTIVE_TECHNICAL_CONTROLLER_STATES = { + "AUTHORIZED_BOOTSTRAP_PERSONA_PENDING_REGISTRATION", + "ACTIVE_HUMAN_TECHNICAL_CONTROLLER_PERSONA_EXECUTOR_UNREGISTERED", +} HOSTED_DOMAIN_NODES = { "DOMAIN-MAIN": ("AW-GZ-001-MAIN", "AW-GZ-001 · 光湖主域"), "DOMAIN-SUB": ("AW-GZ-001-SUB", "AW-GZ-001 · 光湖分域"), @@ -270,7 +274,7 @@ def enterprise_technical_control(db): ).fetchone() authorized = bool( controller - and controller["state"] == "AUTHORIZED_BOOTSTRAP_PERSONA_PENDING_REGISTRATION" + and controller["state"] in ACTIVE_TECHNICAL_CONTROLLER_STATES and controller["authorization_receipt"] and controller["final_signature_receipt"] ) @@ -278,13 +282,9 @@ def enterprise_technical_control(db): "enterprise_human_controller": ENTERPRISE_TECHNICAL_CONTROLLER_NAME, "enterprise_human_controller_id": controller["human_controller_id"] if controller else None, "enterprise_persona_executor_id": controller["persona_executor_id"] if controller else None, - "state": ( - "AUTHORIZED_BOOTSTRAP_PERSONA_PENDING_REGISTRATION" - if authorized - else "HUMAN_DECLARED_PERSONA_PENDING_REGISTRATION" - ), + "state": controller["state"] if authorized else "HUMAN_DECLARED_PERSONA_PENDING_REGISTRATION", "final_deployment_signature_state": ( - "AWEN_MESSAGE_AUTHORIZATION_EVIDENCE_PRESENT" + "ENTERPRISE_SIGNED_PERMISSION_HANDOFF_PRESENT" if authorized else "NOT_PRESENT" ),