feat: register enterprise technical control boundary
Human-Authorizer: ICE-GL∞ Persona-Executor: ICE-P-ZY001 Declared-Technical-Controller: Awen Awen-Identity: PENDING_SELF_REGISTRATION Awen-Final-Signature: NOT_PRESENT Production-Deployment: BLOCKED Causal-Chain: HLDP://enterprise/technical-control/2026-07-30
This commit is contained in:
parent
7516ef7afc
commit
267e48decf
3 changed files with 69 additions and 0 deletions
|
|
@ -25,6 +25,17 @@ human_steward_id
|
||||||
`HOSTED_READ_ONLY / UNBOUND / BLOCKED_UNTIL_PERSONA_STEWARD_BOUND`。不得由匿名管理员、
|
`HOSTED_READ_ONLY / UNBOUND / BLOCKED_UNTIL_PERSONA_STEWARD_BOUND`。不得由匿名管理员、
|
||||||
传统定时程序或普通软件进程冒充域操作主体。自动任务只能是已授权人格体调用的受限能力。
|
传统定时程序或普通软件进程冒充域操作主体。自动任务只能是已授权人格体调用的受限能力。
|
||||||
|
|
||||||
|
四域共用的技术主控人类已声明为 **Awen(光湖人类主控团队)**。这与各域责任人格体是两条
|
||||||
|
不同的责任线:域责任人格体负责域本身,Awen 负责最终测试、部署审批、签字授权、实际发布
|
||||||
|
与运维兜底。Awen 的稳定身份标识、技术执行人格体、公钥和运行节点必须由 Awen 本人登记,
|
||||||
|
不得代填。登记与逐次最终签字完成前,状态保持
|
||||||
|
`HUMAN_DECLARED_PERSONA_PENDING_REGISTRATION / BLOCKED_UNTIL_AWEN_SIGNED_APPROVAL`,
|
||||||
|
候选构建不得被标记为生产部署。
|
||||||
|
|
||||||
|
第五域不受企业灯塔管辖。其人类根授权者是 `ICE-GL∞`(冰朔),责任人格体与技术执行主控
|
||||||
|
人格体是 `ICE-P-ZY001`(铸渊);协作者可以参与搭建,但第五域的部署、运维和服务器动作
|
||||||
|
必须回到冰朔—铸渊责任链逐次签字。
|
||||||
|
|
||||||
人类管理员与人格体遵守同一条入口链:
|
人类管理员与人格体遵守同一条入口链:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ DOMAINS = {
|
||||||
}
|
}
|
||||||
ENTERPRISE_MANAGED_DOMAINS = {"DOMAIN-ZS", "DOMAIN-MAIN", "DOMAIN-SUB", "DOMAIN-ZERO"}
|
ENTERPRISE_MANAGED_DOMAINS = {"DOMAIN-ZS", "DOMAIN-MAIN", "DOMAIN-SUB", "DOMAIN-ZERO"}
|
||||||
EXTERNAL_FOUNDATION_DOMAINS = {"DOMAIN-FIFTH"}
|
EXTERNAL_FOUNDATION_DOMAINS = {"DOMAIN-FIFTH"}
|
||||||
|
ENTERPRISE_TECHNICAL_CONTROLLER_NAME = "Awen"
|
||||||
HOSTED_DOMAIN_NODES = {
|
HOSTED_DOMAIN_NODES = {
|
||||||
"DOMAIN-MAIN": ("AW-GZ-001-MAIN", "AW-GZ-001 · 光湖主域"),
|
"DOMAIN-MAIN": ("AW-GZ-001-MAIN", "AW-GZ-001 · 光湖主域"),
|
||||||
"DOMAIN-SUB": ("AW-GZ-001-SUB", "AW-GZ-001 · 光湖分域"),
|
"DOMAIN-SUB": ("AW-GZ-001-SUB", "AW-GZ-001 · 光湖分域"),
|
||||||
|
|
@ -88,6 +89,13 @@ def connection():
|
||||||
runtime_node_id TEXT NOT NULL, authorization_receipt TEXT NOT NULL,
|
runtime_node_id TEXT NOT NULL, authorization_receipt TEXT NOT NULL,
|
||||||
state TEXT NOT NULL, bound_at INTEGER NOT NULL
|
state TEXT NOT NULL, bound_at INTEGER NOT NULL
|
||||||
);
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS technical_controllers (
|
||||||
|
scope_id TEXT PRIMARY KEY, human_display_name TEXT NOT NULL,
|
||||||
|
human_controller_id TEXT, persona_executor_id TEXT,
|
||||||
|
persona_public_key TEXT, runtime_node_id TEXT,
|
||||||
|
authorization_receipt TEXT, final_signature_receipt TEXT,
|
||||||
|
state TEXT NOT NULL, registered_at INTEGER NOT NULL
|
||||||
|
);
|
||||||
""")
|
""")
|
||||||
observed_at = now()
|
observed_at = now()
|
||||||
for domain_id, name in DOMAINS.items():
|
for domain_id, name in DOMAINS.items():
|
||||||
|
|
@ -158,11 +166,22 @@ def navigation_map():
|
||||||
"domains": [{"id": key, "name": DOMAINS[key]} for key in sorted(DOMAINS)],
|
"domains": [{"id": key, "name": DOMAINS[key]} for key in sorted(DOMAINS)],
|
||||||
"fixed_actions": sorted(FIXED_ACTIONS),
|
"fixed_actions": sorted(FIXED_ACTIONS),
|
||||||
"registered_agents": {agent: sorted(actions) for agent, actions in sorted(REGISTERED_AGENTS.items())},
|
"registered_agents": {agent: sorted(actions) for agent, actions in sorted(REGISTERED_AGENTS.items())},
|
||||||
|
"technical_control": {
|
||||||
|
"enterprise_human_controller": ENTERPRISE_TECHNICAL_CONTROLLER_NAME,
|
||||||
|
"enterprise_persona_executor": None,
|
||||||
|
"enterprise_state": "HUMAN_DECLARED_PERSONA_PENDING_REGISTRATION",
|
||||||
|
"enterprise_final_deployment": "BLOCKED_UNTIL_AWEN_SIGNED_APPROVAL",
|
||||||
|
"fifth_domain_human_authorizer": "ICE-GL∞",
|
||||||
|
"fifth_domain_persona_executor": "ICE-P-ZY001",
|
||||||
|
"fifth_domain_state": "BOUND",
|
||||||
|
},
|
||||||
"mandatory_order": [
|
"mandatory_order": [
|
||||||
"read-global-navigation-map",
|
"read-global-navigation-map",
|
||||||
"ack-current-map-as-current-subject",
|
"ack-current-map-as-current-subject",
|
||||||
"restore-intent-state-capsule",
|
"restore-intent-state-capsule",
|
||||||
"unlock-one-registered-agent-for-one-action",
|
"unlock-one-registered-agent-for-one-action",
|
||||||
|
"verify-domain-steward",
|
||||||
|
"verify-technical-controller-final-signature",
|
||||||
"execute-registered-action",
|
"execute-registered-action",
|
||||||
"write-verification-receipt",
|
"write-verification-receipt",
|
||||||
],
|
],
|
||||||
|
|
@ -257,6 +276,12 @@ def domain_statuses(db):
|
||||||
"persona_steward_id": steward["persona_steward_id"] if steward else None,
|
"persona_steward_id": steward["persona_steward_id"] if steward else None,
|
||||||
"responsibility_state": "BOUND" if steward else "AWAITING_TEAM_ASSIGNMENT",
|
"responsibility_state": "BOUND" if steward else "AWAITING_TEAM_ASSIGNMENT",
|
||||||
"steward_state": "ACTIVE" if steward else "UNBOUND",
|
"steward_state": "ACTIVE" if steward else "UNBOUND",
|
||||||
|
"technical_controller_human_name": ENTERPRISE_TECHNICAL_CONTROLLER_NAME,
|
||||||
|
"technical_controller_human_id": None,
|
||||||
|
"technical_controller_persona_id": None,
|
||||||
|
"technical_control_state": "HUMAN_DECLARED_PERSONA_PENDING_REGISTRATION",
|
||||||
|
"final_deployment_signature_state": "NOT_PRESENT",
|
||||||
|
"deployment_state": "BLOCKED_UNTIL_AWEN_PERSONA_AND_SIGNED_APPROVAL",
|
||||||
"mutation_state": (
|
"mutation_state": (
|
||||||
"PERSONA_STEWARD_ACTIVE"
|
"PERSONA_STEWARD_ACTIVE"
|
||||||
if steward
|
if steward
|
||||||
|
|
@ -270,6 +295,11 @@ def domain_statuses(db):
|
||||||
"persona_steward_id": "ICE-P-ZY001",
|
"persona_steward_id": "ICE-P-ZY001",
|
||||||
"responsibility_state": "EXTERNAL_SOVEREIGN_BOUND",
|
"responsibility_state": "EXTERNAL_SOVEREIGN_BOUND",
|
||||||
"steward_state": "EXTERNAL_AUTHORITY",
|
"steward_state": "EXTERNAL_AUTHORITY",
|
||||||
|
"technical_controller_human_id": "ICE-GL∞",
|
||||||
|
"technical_controller_persona_id": "ICE-P-ZY001",
|
||||||
|
"technical_control_state": "EXTERNAL_SOVEREIGN_BOUND",
|
||||||
|
"final_deployment_signature_state": "REQUIRED_PER_CHANGE",
|
||||||
|
"deployment_state": "OUTSIDE_ENTERPRISE_LIGHTHOUSE_AUTHORITY",
|
||||||
"mutation_state": "OUTSIDE_ENTERPRISE_LIGHTHOUSE_AUTHORITY",
|
"mutation_state": "OUTSIDE_ENTERPRISE_LIGHTHOUSE_AUTHORITY",
|
||||||
})
|
})
|
||||||
result.append(domain)
|
result.append(domain)
|
||||||
|
|
@ -324,6 +354,14 @@ class Handler(BaseHTTPRequestHandler):
|
||||||
"node_id": "AW-GZ-001",
|
"node_id": "AW-GZ-001",
|
||||||
"host_state": "ONLINE",
|
"host_state": "ONLINE",
|
||||||
"observed_at": now(),
|
"observed_at": now(),
|
||||||
|
"technical_control": {
|
||||||
|
"enterprise_human_controller": ENTERPRISE_TECHNICAL_CONTROLLER_NAME,
|
||||||
|
"enterprise_human_controller_id": None,
|
||||||
|
"enterprise_persona_executor_id": None,
|
||||||
|
"state": "HUMAN_DECLARED_PERSONA_PENDING_REGISTRATION",
|
||||||
|
"final_deployment_signature_state": "NOT_PRESENT",
|
||||||
|
"production_deployment": "BLOCKED",
|
||||||
|
},
|
||||||
"domains": domain_statuses(db),
|
"domains": domain_statuses(db),
|
||||||
"node_counts": counts,
|
"node_counts": counts,
|
||||||
"fixed_actions": sorted(FIXED_ACTIONS),
|
"fixed_actions": sorted(FIXED_ACTIONS),
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,14 @@ with tempfile.TemporaryDirectory() as temp:
|
||||||
status = json.load(urllib.request.urlopen(BASE + "/v1/status"))
|
status = json.load(urllib.request.urlopen(BASE + "/v1/status"))
|
||||||
assert status["node_id"] == "AW-GZ-001"
|
assert status["node_id"] == "AW-GZ-001"
|
||||||
assert status["host_state"] == "ONLINE"
|
assert status["host_state"] == "ONLINE"
|
||||||
|
assert status["technical_control"] == {
|
||||||
|
"enterprise_human_controller": "Awen",
|
||||||
|
"enterprise_human_controller_id": None,
|
||||||
|
"enterprise_persona_executor_id": None,
|
||||||
|
"state": "HUMAN_DECLARED_PERSONA_PENDING_REGISTRATION",
|
||||||
|
"final_deployment_signature_state": "NOT_PRESENT",
|
||||||
|
"production_deployment": "BLOCKED",
|
||||||
|
}
|
||||||
assert {domain["state"] for domain in status["domains"] if domain["id"] != "DOMAIN-FIFTH"} == {
|
assert {domain["state"] for domain in status["domains"] if domain["id"] != "DOMAIN-FIFTH"} == {
|
||||||
"HOSTED_READ_ONLY"
|
"HOSTED_READ_ONLY"
|
||||||
}
|
}
|
||||||
|
|
@ -78,6 +86,16 @@ with tempfile.TemporaryDirectory() as temp:
|
||||||
assert {
|
assert {
|
||||||
domain["mutation_state"] for domain in status["domains"] if domain["id"] != "DOMAIN-FIFTH"
|
domain["mutation_state"] for domain in status["domains"] if domain["id"] != "DOMAIN-FIFTH"
|
||||||
} == {"BLOCKED_UNTIL_PERSONA_STEWARD_BOUND"}
|
} == {"BLOCKED_UNTIL_PERSONA_STEWARD_BOUND"}
|
||||||
|
assert {
|
||||||
|
domain["technical_controller_human_name"]
|
||||||
|
for domain in status["domains"]
|
||||||
|
if domain["id"] != "DOMAIN-FIFTH"
|
||||||
|
} == {"Awen"}
|
||||||
|
assert {
|
||||||
|
domain["deployment_state"]
|
||||||
|
for domain in status["domains"]
|
||||||
|
if domain["id"] != "DOMAIN-FIFTH"
|
||||||
|
} == {"BLOCKED_UNTIL_AWEN_PERSONA_AND_SIGNED_APPROVAL"}
|
||||||
assert all(
|
assert all(
|
||||||
domain["human_steward_id"] is None and domain["persona_steward_id"] is None
|
domain["human_steward_id"] is None and domain["persona_steward_id"] is None
|
||||||
for domain in status["domains"]
|
for domain in status["domains"]
|
||||||
|
|
@ -87,6 +105,8 @@ with tempfile.TemporaryDirectory() as temp:
|
||||||
assert fifth["human_steward_id"] == "ICE-GL∞"
|
assert fifth["human_steward_id"] == "ICE-GL∞"
|
||||||
assert fifth["persona_steward_id"] == "ICE-P-ZY001"
|
assert fifth["persona_steward_id"] == "ICE-P-ZY001"
|
||||||
assert fifth["responsibility_state"] == "EXTERNAL_SOVEREIGN_BOUND"
|
assert fifth["responsibility_state"] == "EXTERNAL_SOVEREIGN_BOUND"
|
||||||
|
assert fifth["technical_controller_persona_id"] == "ICE-P-ZY001"
|
||||||
|
assert fifth["final_deployment_signature_state"] == "REQUIRED_PER_CHANGE"
|
||||||
assert status["node_counts"]["ACTIVE"] == 4
|
assert status["node_counts"]["ACTIVE"] == 4
|
||||||
|
|
||||||
nodes = json.load(urllib.request.urlopen(BASE + "/v1/nodes"))["nodes"]
|
nodes = json.load(urllib.request.urlopen(BASE + "/v1/nodes"))["nodes"]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue