From f3bfbc9dadbfb910c2f729b89143d0f8ca5a4c70 Mon Sep 17 00:00:00 2001 From: claude_dev Date: Fri, 9 Oct 2026 19:52:35 +0800 Subject: [PATCH] =?UTF-8?q?feat(factor):=20upsert=5Ffactor=20=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E7=BA=A7=20description=E2=80=94=E2=80=94=E4=BB=85?= =?UTF-8?q?=E5=BB=BA=E6=9D=A1=E8=90=BD=E7=9B=98=E5=B9=82=E7=AD=89=E4=B8=8D?= =?UTF-8?q?=E8=A6=86=E7=9B=96=20[vps]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanguo_factor/version_registry.py | 7 ++++++- tests/factor/test_version_registry.py | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/sanguo_factor/version_registry.py b/sanguo_factor/version_registry.py index d3fc6567..c690f572 100644 --- a/sanguo_factor/version_registry.py +++ b/sanguo_factor/version_registry.py @@ -69,11 +69,14 @@ def save_registry(path: str, registry: dict[str, Any]) -> None: def upsert_factor(registry: dict[str, Any], name: str, hypothesis: str, status: str = "incubating", - origin: str | None = None) -> dict[str, Any]: + origin: str | None = None, + description: str | None = None) -> dict[str, Any]: """新建因子条目;同名同假设幂等,同名异假设拒绝(换假设=开新因子,决议 D). origin=条目级身份戳(#91①): 仅建条时落盘,幂等返回不覆盖;合法值见 VALID_ORIGINS. 消费方=monthly_batch.decomposer_new_names(条目级优先). + description=条目级一句话自述(2026-10-09 补丁): 同仅建条落盘纪律, + 改描述走升版本. """ factors = registry["factors"] if name in factors: @@ -89,6 +92,8 @@ def upsert_factor(registry: dict[str, Any], name: str, hypothesis: str, "versions": []} if origin is not None: entry["origin"] = origin + if description is not None: + entry["description"] = description factors[name] = entry return entry diff --git a/tests/factor/test_version_registry.py b/tests/factor/test_version_registry.py index 5d194836..029be44b 100644 --- a/tests/factor/test_version_registry.py +++ b/tests/factor/test_version_registry.py @@ -318,3 +318,17 @@ def test_upsert_idempotent_return_does_not_overwrite_origin(reg): again = upsert_factor(reg, "fa_x", "hyp-4", origin="decomposer") assert again is first assert "origin" not in reg["factors"]["fa_x"] # 幂等返回不补写 + + +def test_upsert_factor_description_built_once_not_overwritten(reg): + """2026-10-09 补丁:description 条目级自述,仅建条落盘,幂等不覆盖.""" + e1 = upsert_factor(reg, "f1", "H-1", + description="20日均值动量,股价延续性的量度") + assert e1["description"] == "20日均值动量,股价延续性的量度" + # 同名同假设幂等返回:换 description 入参也不覆盖(改描述走升版本) + e2 = upsert_factor(reg, "f1", "H-1", description="新描述不应生效") + assert e2 is e1 + assert reg["factors"]["f1"]["description"] == "20日均值动量,股价延续性的量度" + # 不传 description=条目无该键(存量因子形态) + upsert_factor(reg, "f2", "H-2") + assert "description" not in reg["factors"]["f2"]