Browse Source

方向写入:仅接受结构化目标和规则字段

save_direction_candidate 改为接收层级 Goal、constraints 与 preferences,统一清洗文本并构造 DirectionArtifact。

删除模型提交 legacy_markdown 的入口,旧版 Markdown 完全由 Host 从结构化数据生成。
SamLee 23 hours ago
parent
commit
d864ff0045
1 changed files with 28 additions and 18 deletions
  1. 28 18
      script_build_host/src/script_build_host/tools/gateway.py

+ 28 - 18
script_build_host/src/script_build_host/tools/gateway.py

@@ -32,10 +32,11 @@ from script_build_host.agents.validation import (
 )
 from script_build_host.domain.artifacts import (
     ArtifactKind,
-    Criterion,
+    DirectionArtifact,
+    DirectionConstraint,
     DirectionGoal,
+    DirectionPreference,
     EvidenceRecordV1,
-    ScriptDirectionArtifactV1,
 )
 from script_build_host.domain.canonical_json import canonical_sha256
 from script_build_host.domain.errors import ArtifactNotFound, ProtocolViolation
@@ -750,13 +751,12 @@ class LegacyScriptToolGateway:
         self,
         *,
         goals: Sequence[Mapping[str, Any]],
-        criteria: Sequence[Mapping[str, Any]],
-        domain_criteria: Sequence[Mapping[str, Any]],
+        constraints: Sequence[Mapping[str, Any]],
+        preferences: Sequence[Mapping[str, Any]],
         topic_refs: Sequence[str],
         persona_refs: Sequence[str],
         strategy_refs: Sequence[str],
         evidence_refs: Sequence[str],
-        legacy_markdown: str,
         context: Mapping[str, Any],
     ) -> dict[str, Any]:
         await self.ensure_dispatch_allowed(context)
@@ -767,34 +767,44 @@ class LegacyScriptToolGateway:
             raise ProtocolViolation(
                 "direction references evidence outside frozen child ACCEPT decisions"
             )
-        artifact = ScriptDirectionArtifactV1(
+        artifact = DirectionArtifact(
             goals=tuple(
                 DirectionGoal(
                     goal_id=redact_text(str(item["goal_id"])),
                     statement=redact_text(str(item["statement"])),
-                    rationale=redact_text(str(item.get("rationale", ""))),
+                    rationale=redact_text(str(item["rationale"])),
+                    parent_goal_id=(
+                        redact_text(str(item["parent_goal_id"]))
+                        if item.get("parent_goal_id") is not None
+                        else None
+                    ),
+                    success_criteria=tuple(
+                        redact_text(str(value)) for value in item["success_criteria"]
+                    ),
                 )
                 for item in goals
             ),
-            criteria=tuple(
-                Criterion(
-                    redact_text(str(item["criterion_id"])),
-                    redact_text(str(item["description"])),
+            constraints=tuple(
+                DirectionConstraint(
+                    constraint_id=redact_text(str(item["constraint_id"])),
+                    statement=redact_text(str(item["statement"])),
+                    rationale=redact_text(str(item.get("rationale", ""))),
                 )
-                for item in criteria
+                for item in constraints
             ),
-            domain_criteria=tuple(
-                Criterion(
-                    redact_text(str(item["criterion_id"])),
-                    redact_text(str(item["description"])),
+            preferences=tuple(
+                DirectionPreference(
+                    preference_id=redact_text(str(item["preference_id"])),
+                    statement=redact_text(str(item["statement"])),
+                    rationale=redact_text(str(item.get("rationale", ""))),
+                    priority=(int(item["priority"]) if item.get("priority") is not None else None),
                 )
-                for item in domain_criteria
+                for item in preferences
             ),
             topic_refs=_safe_text_tuple(topic_refs),
             persona_refs=_safe_text_tuple(persona_refs),
             strategy_refs=_safe_text_tuple(strategy_refs),
             evidence_refs=tuple(evidence_refs),
-            legacy_markdown=redact_text(legacy_markdown),
         )
         version, ref = await self.artifacts.freeze(
             script_build_id=binding.script_build_id,