<mxfile host="app.diagrams.net" modified="2026-07-02T02:40:00.000Z" agent="Codex" version="24.7.17" type="device">
  <diagram id="skills-eval-system-architecture" name="Skills Eval 系统架构">
    <mxGraphModel dx="1800" dy="1100" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1700" pageHeight="1050" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />

        <mxCell id="title" value="【扩展设计】Skills Eval 系统架构：候选 Skill → Experiment → ArtifactSet → Score → Analysis" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=24;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="210" y="28" width="1180" height="40" as="geometry" />
        </mxCell>
        <mxCell id="subtitle" value="单页读法：先看中间 1-6 主链路，再看底部存储落点和默认评分主语。" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontColor=#475569" vertex="1" parent="1">
          <mxGeometry x="300" y="70" width="1000" height="28" as="geometry" />
        </mxCell>

        <mxCell id="scope-legend" value="图例：OSS 底座 = 当前可复用；新增 MVP = 本方案需要补齐；长期演进 = Phase 2 后再一等化" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f1f5f9;strokeColor=#94a3b8;fontSize=12;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="445" y="100" width="710" height="28" as="geometry" />
        </mxCell>

        <mxCell id="langfuse-box" value="Langfuse 控制面" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;fillColor=#f8fafc;strokeColor=#475569;strokeWidth=2;fontSize=16;fontStyle=1;verticalAlign=top;spacingTop=14" vertex="1" parent="1">
          <mxGeometry x="70" y="130" width="760" height="520" as="geometry" />
        </mxCell>

        <mxCell id="runner-box" value="外部运行环境 / Sandbox" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;fillColor=#f0fdfa;strokeColor=#0f766e;strokeWidth=2;fontSize=16;fontStyle=1;verticalAlign=top;spacingTop=14" vertex="1" parent="1">
          <mxGeometry x="900" y="130" width="650" height="520" as="geometry" />
        </mxCell>

        <mxCell id="storage-box" value="稳定事实层与存储落点" style="rounded=1;whiteSpace=wrap;html=1;arcSize=10;fillColor=#fff7ed;strokeColor=#c2410c;strokeWidth=2;fontSize=16;fontStyle=1;verticalAlign=top;spacingTop=14" vertex="1" parent="1">
          <mxGeometry x="70" y="690" width="1480" height="230" as="geometry" />
        </mxCell>

        <mxCell id="actor" value="使用者&#xa;评测负责人 / 工程师" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;strokeColor=#334155;fontSize=12" vertex="1" parent="1">
          <mxGeometry x="25" y="330" width="42" height="78" as="geometry" />
        </mxCell>

        <mxCell id="eval-spec" value="ExperimentSpec / Eval Plan&#xa;新增 MVP&#xa;&#xa;候选 + Dataset + Runtime + Evaluator" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef2ff;strokeColor=#4f46e5;strokeWidth=2;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="115" y="205" width="185" height="82" as="geometry" />
        </mxCell>

        <mxCell id="candidate" value="CandidateAsset&#xa;SkillVersion&#xa;新增 MVP" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#4f46e5;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="115" y="325" width="185" height="58" as="geometry" />
        </mxCell>

        <mxCell id="dataset" value="Dataset&#xa;DatasetItem / case&#xa;OSS 底座" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#4f46e5;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="115" y="410" width="185" height="58" as="geometry" />
        </mxCell>

        <mxCell id="evaluator-suite" value="EvaluatorSuite&#xa;Scorer / 规则 / LLM judge&#xa;OSS 底座 + 扩展输入" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#4f46e5;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="115" y="495" width="185" height="64" as="geometry" />
        </mxCell>

        <mxCell id="control-plane" value="Control Plane&#xa;&#xa;创建 DatasetRun&#xa;创建 RunnerJob&#xa;触发 Evaluator" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#334155;strokeWidth=2;fontSize=14;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="440" y="300" width="220" height="130" as="geometry" />
        </mxCell>

        <mxCell id="api" value="API&#xa;&#xa;Control&#xa;Ingestion&#xa;Callback" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e0e7ff;strokeColor=#4f46e5;strokeWidth=2;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="730" y="285" width="70" height="170" as="geometry" />
        </mxCell>

        <mxCell id="analysis" value="Run Analysis&#xa;Comparison&#xa;&#xa;按 SkillVersion / case 看 score delta" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfdf5;strokeColor=#059669;strokeWidth=2;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="440" y="165" width="220" height="94" as="geometry" />
        </mxCell>

        <mxCell id="evaluator-runtime" value="Evaluator / Scorer Runtime&#xa;&#xa;读取 ArtifactSet + expectedOutput + trace&#xa;生成 Score" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dcfce7;strokeColor=#16a34a;strokeWidth=2;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="385" y="500" width="205" height="110" as="geometry" />
        </mxCell>

        <mxCell id="eval-questions" value="Eval Plan 必须回答：&#xa;1. 候选方案是什么？&#xa;2. case 是哪些？&#xa;3. Runtime 在哪里跑？&#xa;4. ArtifactSet 是什么？&#xa;5. Scorer 怎么判断好坏？" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#94a3b8;fontSize=12;align=left;spacing=10" vertex="1" parent="1">
          <mxGeometry x="610" y="500" width="205" height="110" as="geometry" />
        </mxCell>

        <mxCell id="external-env" value="External Running Env&#xa;Societas / CI / K8s Job" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;fillColor=#eff6ff;strokeColor=#0284c7;strokeWidth=2;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="1055" y="180" width="285" height="92" as="geometry" />
        </mxCell>

        <mxCell id="runner" value="ExperimentRuntimeRunner&#xa;新增 MVP&#xa;&#xa;Claude Code / Codex / CoWork&#xa;消费 SkillVersion + case" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#0f766e;strokeWidth=2;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="1015" y="315" width="350" height="105" as="geometry" />
        </mxCell>

        <mxCell id="repo" value="Repo&#xa;源码 / patch / test" style="shape=cylinder3d;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#f8fafc;strokeColor=#475569;fontSize=12" vertex="1" parent="1">
          <mxGeometry x="965" y="500" width="150" height="70" as="geometry" />
        </mxCell>

        <mxCell id="app" value="App&#xa;binary / service / test env" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8fafc;strokeColor=#475569;fontSize=12" vertex="1" parent="1">
          <mxGeometry x="1230" y="500" width="160" height="70" as="geometry" />
        </mxCell>

        <mxCell id="result" value="Result Package&#xa;&#xa;datasetRunItemId&#xa;traceId&#xa;ArtifactSet manifest&#xa;artifact / part URI&#xa;runner metrics" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ecfeff;strokeColor=#0891b2;strokeWidth=2;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="1070" y="585" width="270" height="120" as="geometry" />
        </mxCell>

        <mxCell id="postgres" value="Postgres&#xa;&#xa;DatasetRun / RunItem OSS&#xa;ExperimentSpec / RunnerJob 新增&#xa;Artifact metadata 新增&#xa;Evaluator config OSS" style="shape=cylinder3d;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#ffedd5;strokeColor=#c2410c;fontSize=12" vertex="1" parent="1">
          <mxGeometry x="130" y="750" width="210" height="120" as="geometry" />
        </mxCell>

        <mxCell id="object-storage" value="Object Storage&#xa;&#xa;Skill bundle&#xa;Artifact 内容&#xa;patch / report / logs&#xa;workspace snapshot" style="shape=cylinder3d;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#fef3c7;strokeColor=#d97706;fontSize=12" vertex="1" parent="1">
          <mxGeometry x="430" y="750" width="210" height="120" as="geometry" />
        </mxCell>

        <mxCell id="clickhouse" value="ClickHouse&#xa;Event Store&#xa;&#xa;Trace&#xa;Observation&#xa;Score facts&#xa;dataset_run_items_rmt" style="shape=cylinder3d;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#fee2e2;strokeColor=#dc2626;fontSize=12" vertex="1" parent="1">
          <mxGeometry x="730" y="750" width="210" height="120" as="geometry" />
        </mxCell>

        <mxCell id="score-note" value="评分主语&#xa;&#xa;MVP：Score 写 trace/run + metadata.artifactSetId&#xa;长期：target = ExperimentArtifactSet&#xa;Trace / Observation = 过程证据" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dcfce7;strokeColor=#16a34a;strokeWidth=2;fontSize=13;fontStyle=1;align=left;spacing=12" vertex="1" parent="1">
          <mxGeometry x="1035" y="750" width="360" height="120" as="geometry" />
        </mxCell>

        <mxCell id="layer-note" value="抽象原则：下层稳定通用，保存事实和关系；上层靠近业务，决定 skill、runtime、sandbox、metrics 怎么变化。" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f1f5f9;strokeColor=#94a3b8;fontSize=13;fontStyle=1" vertex="1" parent="1">
          <mxGeometry x="330" y="955" width="980" height="50" as="geometry" />
        </mxCell>

        <mxCell id="n1" value="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#4f46e5;strokeColor=#4f46e5;fontColor=#ffffff;fontStyle=1;fontSize=13" vertex="1" parent="1">
          <mxGeometry x="365" y="345" width="26" height="26" as="geometry" />
        </mxCell>
        <mxCell id="n2" value="2" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#4f46e5;strokeColor=#4f46e5;fontColor=#ffffff;fontStyle=1;fontSize=13" vertex="1" parent="1">
          <mxGeometry x="680" y="338" width="26" height="26" as="geometry" />
        </mxCell>
        <mxCell id="n3" value="3" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#0f766e;strokeColor=#0f766e;fontColor=#ffffff;fontStyle=1;fontSize=13" vertex="1" parent="1">
          <mxGeometry x="900" y="345" width="26" height="26" as="geometry" />
        </mxCell>
        <mxCell id="n4" value="4" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#0891b2;strokeColor=#0891b2;fontColor=#ffffff;fontStyle=1;fontSize=13" vertex="1" parent="1">
          <mxGeometry x="840" y="605" width="26" height="26" as="geometry" />
        </mxCell>
        <mxCell id="n5" value="5" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dc2626;strokeColor=#dc2626;fontColor=#ffffff;fontStyle=1;fontSize=13" vertex="1" parent="1">
          <mxGeometry x="780" y="682" width="26" height="26" as="geometry" />
        </mxCell>
        <mxCell id="n6" value="6" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#059669;strokeColor=#059669;fontColor=#ffffff;fontStyle=1;fontSize=13" vertex="1" parent="1">
          <mxGeometry x="555" y="265" width="26" height="26" as="geometry" />
        </mxCell>

        <mxCell id="edge-actor" value="创建 / 启动 / 查看" style="endArrow=block;html=1;rounded=0;strokeWidth=2;strokeColor=#334155;fontSize=12" edge="1" parent="1" source="actor" target="control-plane">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-eval-control" value="实验定义" style="endArrow=block;html=1;rounded=0;strokeWidth=2;strokeColor=#4f46e5;fontSize=12" edge="1" parent="1" source="eval-spec" target="control-plane">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-candidate-control" value="候选版本" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#4f46e5;fontSize=12" edge="1" parent="1" source="candidate" target="control-plane">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-dataset-control" value="case 集合" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#4f46e5;fontSize=12" edge="1" parent="1" source="dataset" target="control-plane">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-evaluator-control" value="评分定义" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#4f46e5;fontSize=12" edge="1" parent="1" source="evaluator-suite" target="control-plane">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-control-evaluator-runtime" value="触发评分" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#16a34a;fontSize=12" edge="1" parent="1" source="control-plane" target="evaluator-runtime">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-control-api" value="RunnerJob" style="endArrow=block;html=1;rounded=0;strokeWidth=2;strokeColor=#4f46e5;fontSize=12" edge="1" parent="1" source="control-plane" target="api">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-api-env" value="派发任务" style="endArrow=block;html=1;rounded=0;strokeWidth=2;strokeColor=#0284c7;fontSize=12" edge="1" parent="1" source="api" target="external-env">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-api-runner" value="SkillVersion + case + runtime spec" style="endArrow=block;html=1;rounded=0;strokeWidth=2;strokeColor=#0f766e;fontSize=12" edge="1" parent="1" source="api" target="runner">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-runner-repo" value="读写 workspace" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#475569;fontSize=12" edge="1" parent="1" source="runner" target="repo">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-runner-app" value="运行 / 测试" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#475569;fontSize=12" edge="1" parent="1" source="runner" target="app">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-runner-result" value="生成结果" style="endArrow=block;html=1;rounded=0;strokeWidth=2;strokeColor=#0891b2;fontSize=12" edge="1" parent="1" source="runner" target="result">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
        <mxCell id="edge-result-api" value="回调 / ingestion" style="endArrow=block;html=1;rounded=0;strokeWidth=2;strokeColor=#4f46e5;fontSize=12" edge="1" parent="1" source="result" target="api">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="850" y="625" />
              <mxPoint x="850" y="455" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="edge-result-evaluator-runtime" value="ArtifactSet + expectedOutput + trace" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#16a34a;fontSize=12" edge="1" parent="1" source="result" target="evaluator-runtime">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1000" y="650" />
              <mxPoint x="590" y="650" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="edge-result-postgres" value="metadata" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#c2410c;fontSize=12" edge="1" parent="1" source="result" target="postgres">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1205" y="720" />
              <mxPoint x="235" y="720" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="edge-result-object" value="artifact 内容" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#d97706;fontSize=12" edge="1" parent="1" source="result" target="object-storage">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1205" y="720" />
              <mxPoint x="535" y="720" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="edge-result-clickhouse" value="trace / observation" style="endArrow=block;html=1;rounded=0;strokeWidth=1.5;strokeColor=#dc2626;fontSize=12" edge="1" parent="1" source="result" target="clickhouse">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="1205" y="720" />
              <mxPoint x="835" y="720" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="edge-evaluator-runtime-clickhouse" value="写入 Score fact" style="endArrow=block;html=1;rounded=0;strokeWidth=2;strokeColor=#16a34a;fontSize=12" edge="1" parent="1" source="evaluator-runtime" target="clickhouse">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="490" y="680" />
              <mxPoint x="835" y="680" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="edge-clickhouse-analysis" value="Score 聚合 / comparison" style="endArrow=block;html=1;rounded=0;strokeWidth=2;strokeColor=#059669;fontSize=12" edge="1" parent="1" source="clickhouse" target="analysis">
          <mxGeometry relative="1" as="geometry">
            <Array as="points">
              <mxPoint x="835" y="675" />
              <mxPoint x="690" y="675" />
              <mxPoint x="690" y="210" />
            </Array>
          </mxGeometry>
        </mxCell>
        <mxCell id="edge-score-clickhouse" value="Score fact" style="endArrow=block;html=1;rounded=0;dashed=1;strokeWidth=1.5;strokeColor=#16a34a;fontSize=12" edge="1" parent="1" source="score-note" target="clickhouse">
          <mxGeometry relative="1" as="geometry" />
        </mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
