Skip to content

【架构优化】从 KnowledgeArtifacts 中拆出 run ID 收集 distinctArtifactRunIDs、run 元数据查询 knowledgeRunMetas 与候选组装 latestKnowledgeCandidates #753

Open

Description

@fx-kurumi

现状问题

internal/repo/run_knowledge.go 中的 RunsRepo.KnowledgeArtifacts(约 65 行)在一个函数里串行做了四件事:

  1. 归一化 limit 并按 knowledge.md 名称/路径查询 run_artifacts;
  2. 对查询结果去重收集所属 run ID;
  3. 查询 runs 并把 execution_context 解码成函数内局部类型 runMeta;
  4. 按项目过滤、按 run/node/path 只保留最新一次重试的产物,组装 KnowledgeCandidate 并截断到 limit。

后两步是纯内存逻辑,但混在 DB 查询中间,无法单独测试;目前 internal/repo 下也没有任何针对 KnowledgeArtifacts 的测试。

重构方案

只改 internal/repo/run_knowledge.go:

  • 局部类型 runMeta 提升为包内私有类型 knowledgeRunMeta;
  • 拆出 distinctArtifactRunIDs(rows):按出现顺序去重收集 run ID;
  • 拆出 (r *RunsRepo) knowledgeRunMetas(runIDs):查询 runs 并解码执行上下文;
  • 拆出纯函数 latestKnowledgeCandidates(rows, meta, projectID, limit):项目过滤、重试去重、组装与截断;
  • KnowledgeArtifacts 只保留 limit 归一化、产物查询和上述三步编排。

查询列、过滤条件、排序、over-fetch 倍数、去重 key、错误时返回空列表等行为全部保持不变。

影响范围

  • 仅 internal/repo/run_knowledge.go,新增 internal/repo/run_knowledge_test.go;
  • 对外方法签名 KnowledgeArtifacts(projectID string, limit int) []domain.KnowledgeCandidate 不变,调用方(internal/knowledge)无需改动。

验证方式

  • 新增单测覆盖 distinctArtifactRunIDs 的去重/保序、latestKnowledgeCandidates 的项目过滤、重试去重、缺失 run 跳过、limit 截断;
  • 新增基于 repo.OpenTest() 的 KnowledgeArtifacts 端到端测试(名称/路径匹配、项目过滤、重试只取最新);
  • go vet ./internal/repo/ 与 go test ./internal/repo/ ./internal/knowledge/ 通过。

Activity

  1. Robert0622 commented on Nov 14, 2026

    @Robert0622
    Collaborator

    已对照当前 main 代码核实:internal/repo/run_knowledge.go 第 13 行起的 RunsRepo.KnowledgeArtifacts 确实在一个函数里串行完成查询、去重收集 run ID、查询 run 元数据、过滤组装四件事;distinctArtifactRunIDs、knowledgeRunMetas、latestKnowledgeCandidates 当前均不存在(grep 无命中),与描述匹配,非重复。重构方案(拆出三个包内函数/类型,对外签名 KnowledgeArtifacts(projectID string, limit int) []domain.KnowledgeCandidate 不变)合理可行,已记入待排期清单;当前 backlog 容量已满(5/5),本条暂不能立即建单,待有空位后补建。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions