Merge origin/master before analysis handoff push
This commit is contained in:
@@ -118,7 +118,7 @@ def _atomic_promote_pair(curated_id: Path, curated_pep: Path, final_id: Path, fi
|
||||
tmp_pep.write_text(curated_pep.read_text(encoding="utf-8", errors="ignore"), encoding="utf-8")
|
||||
tmp_ids = _read_id_list(tmp_id)
|
||||
tmp_fasta_ids = _read_fasta_ids(tmp_pep)
|
||||
if tmp_ids != tmp_fasta_ids:
|
||||
if sorted(tmp_ids) != sorted(tmp_fasta_ids):
|
||||
tmp_id.unlink(missing_ok=True)
|
||||
tmp_pep.unlink(missing_ok=True)
|
||||
raise RuntimeError(f"Temporary final member validation failed for {final_id.stem}")
|
||||
@@ -160,7 +160,7 @@ def _promote_curated_members_to_final(final_dir: Path, prefixes: Iterable[str],
|
||||
if not curated_ids:
|
||||
raise ValueError(f"Curated member ID file is empty: {curated_id}")
|
||||
fasta_ids = _read_fasta_ids(curated_pep)
|
||||
if curated_ids != fasta_ids:
|
||||
if sorted(curated_ids) != sorted(fasta_ids):
|
||||
raise ValueError(
|
||||
f"Curated member ID/FASTA mismatch for {member_prefix}: "
|
||||
f"{len(curated_ids)} IDs vs {len(fasta_ids)} FASTA records"
|
||||
@@ -179,7 +179,7 @@ def _promote_curated_members_to_final(final_dir: Path, prefixes: Iterable[str],
|
||||
|
||||
promoted_ids = _read_id_list(final_id)
|
||||
promoted_fasta_ids = _read_fasta_ids(final_pep)
|
||||
if promoted_ids != curated_ids or promoted_fasta_ids != curated_ids:
|
||||
if sorted(promoted_ids) != sorted(curated_ids) or sorted(promoted_fasta_ids) != sorted(curated_ids):
|
||||
raise RuntimeError(f"Post-promotion final member validation failed for {member_prefix}")
|
||||
promotions.append({
|
||||
"prefix": member_prefix,
|
||||
|
||||
+19
-11
@@ -777,18 +777,12 @@ def _reconcile_confirmed_gene_family_species(
|
||||
job_id,
|
||||
_param_list(routed_params.get("comparativeSpecies") or routed_intent.get("comparative_species")),
|
||||
)
|
||||
explicit_reference_set = set(explicit["referenceSpecies"])
|
||||
explicit_assigned_set = set(
|
||||
explicit["targetSpecies"]
|
||||
+ explicit["referenceSpecies"]
|
||||
+ explicit["comparativeSpecies"]
|
||||
)
|
||||
explicit_unassigned_set = set(explicit["unassigned"])
|
||||
for species in structured_targets:
|
||||
config_role = config_role_by_species.get(species)
|
||||
if (
|
||||
config_role in {None, "reference"}
|
||||
and species not in explicit_reference_set
|
||||
and species not in explicit_assigned_set
|
||||
and species in explicit_unassigned_set
|
||||
):
|
||||
conflicts.append({
|
||||
"code": "analysis_target_config_role_conflict",
|
||||
@@ -865,10 +859,24 @@ def _species_role_conflict_message(conflicts: list[Dict[str, str]]) -> str:
|
||||
config_role = role_labels.get(conflict.get("config_role") or "", conflict.get("config_role") or "未知")
|
||||
requested_role = role_labels.get(conflict.get("requested_role") or "", conflict.get("requested_role") or "配置内部重复角色")
|
||||
details.append(f"{species}:config.xlsx 为{config_role},本轮为{requested_role}")
|
||||
conflict_codes = {str(conflict.get("code") or "") for conflict in conflicts}
|
||||
detail_text = ";".join(details)
|
||||
if "config_species_role_conflict" in conflict_codes:
|
||||
return (
|
||||
"检测到 config.xlsx 内部物种角色冲突:"
|
||||
+ detail_text
|
||||
+ "。请发送“打开 config.xlsx”,修正并重新确认物种角色后再继续。"
|
||||
)
|
||||
if "analysis_target_config_role_conflict" in conflict_codes:
|
||||
return (
|
||||
"检测到系统意图解析发生角色漂移:"
|
||||
+ detail_text
|
||||
+ "。config.xlsx 未被修改,系统已阻止按错误范围执行,请重新提交当前分析请求。"
|
||||
)
|
||||
return (
|
||||
"检测到物种角色不一致:"
|
||||
+ ";".join(details)
|
||||
+ "。为避免按错误范围执行,请发送“打开 config.xlsx”,核对并重新确认物种角色后再继续。"
|
||||
"检测到本轮请求与项目物种角色不一致:"
|
||||
+ detail_text
|
||||
+ "。系统已阻止执行,请按 config.xlsx 中已确认的角色重新描述分析范围。"
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user