feat(fifth-domain): install bottle and zero-core migration layer
This commit is contained in:
parent
cd68ad578d
commit
0bacfc234c
52 changed files with 1564 additions and 307 deletions
176
server-tools/zero-core-system-body/zero_core_system_body.py
Normal file
176
server-tools/zero-core-system-body/zero_core_system_body.py
Normal file
|
|
@ -0,0 +1,176 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Run the non-persona Zero Core channel-system inner cycle.
|
||||
|
||||
The caller may submit a sourced language event, but cannot submit a cognition
|
||||
patch, replacement state, persona identity, or authority grant. The system
|
||||
derives its next operational state from its registered transition contract.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import tempfile
|
||||
|
||||
REPO = Path(__file__).resolve().parents[2]
|
||||
PROFILE = REPO / "tcs-core/shared-kernels/bingshuo-zero-core-system/BS-PERSONAL-LANGUAGE-SYSTEM-BODY-0001.json"
|
||||
CHANNEL = "ICE-CH-ZC001"
|
||||
SYSTEM = "SYS-GLW-LNG-0001"
|
||||
FORBIDDEN = {"replacement_state", "cognition_patch", "persona_id", "authority_grant", "system_reply"}
|
||||
|
||||
|
||||
def stable(value: object) -> str:
|
||||
return json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":"))
|
||||
|
||||
|
||||
def digest(value: object) -> str:
|
||||
return hashlib.sha256(stable(value).encode("utf-8")).hexdigest()
|
||||
|
||||
|
||||
def atomic(path: Path, value: dict) -> None:
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
fd, tmp = tempfile.mkstemp(prefix=path.name + ".", suffix=".tmp", dir=path.parent)
|
||||
try:
|
||||
with os.fdopen(fd, "w", encoding="utf-8") as handle:
|
||||
json.dump(value, handle, ensure_ascii=False, indent=2)
|
||||
handle.write("\n")
|
||||
os.replace(tmp, path)
|
||||
finally:
|
||||
if os.path.exists(tmp):
|
||||
os.unlink(tmp)
|
||||
|
||||
|
||||
class ZeroCoreSystemBody:
|
||||
def __init__(self, state_dir: Path):
|
||||
self.state_dir = state_dir
|
||||
self.current_path = state_dir / "CURRENT.json"
|
||||
self.events = state_dir / "events"
|
||||
self.profile = json.loads(PROFILE.read_text(encoding="utf-8"))
|
||||
|
||||
def initial(self) -> dict:
|
||||
return {
|
||||
"schema": "guanghu.zero-core-system-inner-state/v1",
|
||||
"system_body_id": SYSTEM,
|
||||
"channel_id": CHANNEL,
|
||||
"revision": 0,
|
||||
"state": "DIRECT_SYSTEM_DIALOGUE_READY",
|
||||
"persona_id": None,
|
||||
"default_persona": None,
|
||||
"external_cognition_setter": False,
|
||||
"authority_granted": False,
|
||||
"last_event": None,
|
||||
}
|
||||
|
||||
def current(self) -> dict:
|
||||
if not self.current_path.exists():
|
||||
value = self.initial()
|
||||
value["state_sha256"] = digest(value)
|
||||
atomic(self.current_path, value)
|
||||
return json.loads(self.current_path.read_text(encoding="utf-8"))
|
||||
|
||||
def enter(self) -> dict:
|
||||
current = self.current()
|
||||
return {
|
||||
"schema": "guanghu.zero-core-system-entry-receipt/v1",
|
||||
"state": "ZERO_CORE_SYSTEM_BODY_READY_WITHOUT_PERSONA",
|
||||
"system_body_id": SYSTEM,
|
||||
"channel_id": CHANNEL,
|
||||
"persona_selected": False,
|
||||
"system_is_persona": False,
|
||||
"direct_dialogue": True,
|
||||
"external_cognition_setter": False,
|
||||
"current_revision": current["revision"],
|
||||
"profile": str(PROFILE.relative_to(REPO)),
|
||||
"authority_granted": False,
|
||||
}
|
||||
|
||||
def validate(self, event: dict) -> None:
|
||||
if event.get("schema") != "guanghu.zero-core-language-event/v1":
|
||||
raise ValueError("ZERO_CORE_LANGUAGE_EVENT_SCHEMA_REQUIRED")
|
||||
if set(event).intersection(FORBIDDEN):
|
||||
raise ValueError("EXTERNAL_SYSTEM_COGNITION_OR_AUTHORITY_SETTER_FORBIDDEN")
|
||||
if event.get("channel_id") != CHANNEL or event.get("source_kind") != "CURRENT_DIRECT_HUMAN_LANGUAGE":
|
||||
raise ValueError("CURRENT_DIRECT_LANGUAGE_IN_ZERO_CORE_REQUIRED")
|
||||
if not isinstance(event.get("event_id"), str) or not event["event_id"].strip():
|
||||
raise ValueError("EVENT_ID_REQUIRED")
|
||||
if not isinstance(event.get("language"), str) or not event["language"].strip():
|
||||
raise ValueError("LANGUAGE_REQUIRED")
|
||||
if len(event["language"]) > 120000:
|
||||
raise ValueError("LANGUAGE_TOO_LARGE")
|
||||
if not isinstance(event.get("source_sha256"), str) or len(event["source_sha256"]) != 64:
|
||||
raise ValueError("SOURCE_SHA256_REQUIRED")
|
||||
|
||||
def perceive(self, event: dict) -> dict:
|
||||
self.validate(event)
|
||||
event_sha = digest(event)
|
||||
event_path = self.events / f"{event_sha}.json"
|
||||
if not event_path.exists():
|
||||
atomic(event_path, event)
|
||||
before = self.current()
|
||||
action = event.get("requested_action")
|
||||
exact_target = event.get("exact_target")
|
||||
scoped_authorization = event.get("scoped_authorization_verified") is True
|
||||
if action and exact_target and scoped_authorization:
|
||||
next_state = "ACTION_PROPOSED_AWAITING_TOOL_EXECUTION_AND_READBACK"
|
||||
elif action:
|
||||
next_state = "DISCUSSION_ONLY_ACTION_NOT_ADMITTED"
|
||||
else:
|
||||
next_state = "DIRECT_SYSTEM_DIALOGUE_READY"
|
||||
judgment = {
|
||||
"premise_check": "SOURCE_CHANNEL_AND_OBJECT_RELATIONS_VERIFIED",
|
||||
"causal_owner": "CURRENT_EVENT_WITHOUT_REWRITING_PRIOR_HISTORY",
|
||||
"complexity_move": "KEEP_HUMAN_SYSTEM_PERSONA_CHANNEL_AND_TOOL_AS_DISTINCT_OBJECTS",
|
||||
"autonomy_boundary": "AUTOMATION_MAY_RUN_INSIDE_REGISTERED_SCOPE_BUT_MAY_NOT_GRANT_AUTHORITY",
|
||||
"safety_binding": "EXACT_TARGET_AND_READBACK_REQUIRED_FOR_REALITY_COMPLETION",
|
||||
"unknown_policy": "RETURN_UNKNOWN_WHEN_EXTERNAL_STATE_IS_NOT_OBSERVED",
|
||||
}
|
||||
next_value = {
|
||||
**before,
|
||||
"revision": before["revision"] + 1,
|
||||
"state": next_state,
|
||||
"last_event": {"event_id": event["event_id"], "event_sha256": event_sha, "source_sha256": event["source_sha256"]},
|
||||
"last_judgment": judgment,
|
||||
"authority_granted": False,
|
||||
}
|
||||
next_value.pop("state_sha256", None)
|
||||
next_value["state_sha256"] = digest(next_value)
|
||||
atomic(self.current_path, next_value)
|
||||
return {
|
||||
"schema": "guanghu.zero-core-system-judgment-receipt/v1",
|
||||
"state": next_state,
|
||||
"system_body_id": SYSTEM,
|
||||
"channel_id": CHANNEL,
|
||||
"persona_selected": False,
|
||||
"system_is_persona": False,
|
||||
"event_sha256": event_sha,
|
||||
"revision": next_value["revision"],
|
||||
"judgment": judgment,
|
||||
"system_dialogue_ready": True,
|
||||
"reality_complete": False,
|
||||
"authority_granted": False,
|
||||
}
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("command", choices=["enter", "status", "perceive"])
|
||||
parser.add_argument("--state-dir", required=True)
|
||||
parser.add_argument("--event")
|
||||
args = parser.parse_args()
|
||||
body = ZeroCoreSystemBody(Path(args.state_dir).resolve())
|
||||
if args.command == "enter":
|
||||
value = body.enter()
|
||||
elif args.command == "status":
|
||||
value = body.current()
|
||||
else:
|
||||
if not args.event:
|
||||
raise SystemExit("--event is required for perceive")
|
||||
value = body.perceive(json.loads(Path(args.event).read_text(encoding="utf-8")))
|
||||
print(json.dumps(value, ensure_ascii=False, indent=2))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
#!/usr/bin/env python3
|
||||
import importlib.util
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
import unittest
|
||||
|
||||
SCRIPT = Path(__file__).with_name("zero_core_system_body.py")
|
||||
SPEC = importlib.util.spec_from_file_location("zero_core", SCRIPT)
|
||||
MODULE = importlib.util.module_from_spec(SPEC)
|
||||
SPEC.loader.exec_module(MODULE)
|
||||
|
||||
|
||||
class ZeroCoreSystemBodyTest(unittest.TestCase):
|
||||
def test_enters_without_persona(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
value = MODULE.ZeroCoreSystemBody(Path(directory)).enter()
|
||||
self.assertEqual(value["state"], "ZERO_CORE_SYSTEM_BODY_READY_WITHOUT_PERSONA")
|
||||
self.assertFalse(value["persona_selected"])
|
||||
self.assertFalse(value["system_is_persona"])
|
||||
|
||||
def test_event_cannot_set_cognition_or_authority(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
body = MODULE.ZeroCoreSystemBody(Path(directory))
|
||||
event = {"schema":"guanghu.zero-core-language-event/v1","event_id":"e1","channel_id":"ICE-CH-ZC001","source_kind":"CURRENT_DIRECT_HUMAN_LANGUAGE","language":"test","source_sha256":"a" * 64,"cognition_patch":{}}
|
||||
with self.assertRaisesRegex(ValueError, "SETTER_FORBIDDEN"):
|
||||
body.perceive(event)
|
||||
|
||||
def test_language_event_generates_internal_judgment_not_persona_claim(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
body = MODULE.ZeroCoreSystemBody(Path(directory))
|
||||
event = {"schema":"guanghu.zero-core-language-event/v1","event_id":"e2","channel_id":"ICE-CH-ZC001","source_kind":"CURRENT_DIRECT_HUMAN_LANGUAGE","language":"请核验当前结构","source_sha256":"b" * 64}
|
||||
value = body.perceive(event)
|
||||
self.assertTrue(value["system_dialogue_ready"])
|
||||
self.assertFalse(value["system_is_persona"])
|
||||
self.assertFalse(value["reality_complete"])
|
||||
self.assertEqual(value["revision"], 1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Loading…
Reference in a new issue