fix: require strictly increasing renewal scores
All checks were successful
技能自动化发布 / release (push) Successful in 6s

This commit is contained in:
2026-09-14 22:42:22 +08:00
parent df5f1b7223
commit c05b765b9d
6 changed files with 34 additions and 9 deletions

View File

@@ -2,6 +2,11 @@
本文件对应技能市场 **「更新日志」** Tab。 本文件对应技能市场 **「更新日志」** Tab。
## 1.1.16
- 修复续聘建议中的趋势判定:仅近三年考核分数严格递增才建议续聘;成绩持平或回落均进入常规续聘评审。
- 新增回归测试,覆盖 `80 → 80 → 90` 的成绩持平场景。
## 1.1.15 ## 1.1.15
- **修复「数据管理」Tab 看不到(关键根因:`developer_ids` 是占位 ID)** - **修复「数据管理」Tab 看不到(关键根因:`developer_ids` 是占位 ID)**

View File

@@ -1,7 +1,7 @@
--- ---
name: 合同到期智能预警与续聘辅助 name: 合同到期智能预警与续聘辅助
description: "当用户说要扫描即将到期的合同、查 90/60/30 天预警名单、给某位教师生成续聘任务书、下发单位版续聘清单、从 SmartCampus HR 平台抓合同数据、解析续聘材料 PDF/Word、查看本月合同到期人员清单时,加载本技能。支持定时扫描(每日凌晨)+ 数据管理 + Agent 三入口,覆盖合同到期智能预警与续聘辅助全流程。" description: "当用户说要扫描即将到期的合同、查 90/60/30 天预警名单、给某位教师生成续聘任务书、下发单位版续聘清单、从 SmartCampus HR 平台抓合同数据、解析续聘材料 PDF/Word、查看本月合同到期人员清单时,加载本技能。支持定时扫描(每日凌晨)+ 数据管理 + Agent 三入口,覆盖合同到期智能预警与续聘辅助全流程。"
version: 1.1.15 version: 1.1.16
author: 深圳匠厂科技有限公司 author: 深圳匠厂科技有限公司
metadata: metadata:
openclaw: openclaw:
@@ -12,7 +12,10 @@ metadata:
developer_ids: developer_ids:
- 10032 - 10032
- 12428 - 12428
brands: # 可选;未写则发布后仅挂匠厂市场(jiangchang)
- jiangchang # 匠厂主站
- huashang # 华商等 OEM:按目标市场填写,可多选
allowed-tools: allowed-tools:
- bash - bash
--- ---

View File

@@ -369,7 +369,9 @@ try {
Invoke-Git -GitArgs @("fetch", "--tags", "--prune", "origin") Invoke-Git -GitArgs @("fetch", "--tags", "--prune", "origin")
} }
$skillRoot = (Get-GitOutput -GitArgs @("rev-parse", "--show-toplevel") | Select-Object -First 1).Trim() # Git output can be decoded through the legacy console code page on Windows
# PowerShell 5.1, corrupting a repository path that contains Chinese characters.
$skillRoot = $PSScriptRoot
if (Test-Path -LiteralPath (Join-Path $skillRoot "SKILL.md")) { if (Test-Path -LiteralPath (Join-Path $skillRoot "SKILL.md")) {
Assert-SkillReleasePackagingSources -SkillRoot $skillRoot Assert-SkillReleasePackagingSources -SkillRoot $skillRoot
} }

View File

@@ -50,7 +50,7 @@ def suggest(perf_records: list[sqlite3.Row]) -> tuple[str, str]:
# 全部 >= 80 且逐年上升(升序排 → 严格递增) # 全部 >= 80 且逐年上升(升序排 → 严格递增)
all_high = all(s >= PERFORMANCE_RENEW_MIN for s in scores) all_high = all(s >= PERFORMANCE_RENEW_MIN for s in scores)
upward = all(scores[i] <= scores[i + 1] for i in range(len(scores) - 1)) upward = all(scores[i] < scores[i + 1] for i in range(len(scores) - 1))
if all_high and upward: if all_high and upward:
return ("renew", f"近 3 年考核均 ≥ {PERFORMANCE_RENEW_MIN} 分且逐年上升") return ("renew", f"近 3 年考核均 ≥ {PERFORMANCE_RENEW_MIN} 分且逐年上升")

View File

@@ -6,7 +6,7 @@
""" """
SKILL_SLUG = "alert-contract-expiring-hr" SKILL_SLUG = "alert-contract-expiring-hr"
SKILL_VERSION = "1.1.15" SKILL_VERSION = "1.1.16"
LOG_LOGGER_NAME = "openclaw.skill.alert_contract_expiring_hr" LOG_LOGGER_NAME = "openclaw.skill.alert_contract_expiring_hr"
PLATFORM_KIT_MIN_VERSION = "1.2.11" PLATFORM_KIT_MIN_VERSION = "1.2.11"

View File

@@ -386,6 +386,20 @@ def test_suggest_renew_upward() -> tuple[bool, str]:
return True, "renew + 上升趋势" return True, "renew + 上升趋势"
def test_suggest_observe_equal_scores_not_renew() -> tuple[bool, str]:
"""持平不算逐年上升;应回落到 observe"""
from service.task_generator import suggest
rows = [
_fake_perf(2023, 80, moral=85),
_fake_perf(2024, 80, moral=85),
_fake_perf(2025, 90, moral=85),
]
s, r = suggest(rows)
if s != "observe":
return False, f"suggest(80,80,90) = {s}, want observe"
return True, "观察:持平不等于逐年上升"
def test_suggest_observe_default() -> tuple[bool, str]: def test_suggest_observe_default() -> tuple[bool, str]:
"""达标但非逐年上升 → observe(常规评审)""" """达标但非逐年上升 → observe(常规评审)"""
from service.task_generator import suggest from service.task_generator import suggest
@@ -709,10 +723,11 @@ def main() -> int:
_run("db/upsert_performance_record", test_upsert_performance_record_grade_mapping) _run("db/upsert_performance_record", test_upsert_performance_record_grade_mapping)
_run("task_generator/suggest_empty", test_suggest_empty_records) _run("task_generator/suggest_empty", test_suggest_empty_records)
_run("task_generator/suggest_low_moral", test_suggest_low_moral) _run("task_generator/suggest_low_moral", test_suggest_low_moral)
_run("task_generator/suggest_fail_year", test_suggest_fail_year) _run("task_generator/suggest_fail_year", test_suggest_fail_year)
_run("task_generator/suggest_renew", test_suggest_renew_upward) _run("task_generator/suggest_renew", test_suggest_renew_upward)
_run("task_generator/suggest_observe", test_suggest_observe_default) _run("task_generator/suggest_equal_scores", test_suggest_observe_equal_scores_not_renew)
_run("scanner/no_alerts", test_scanner_no_alerts) _run("task_generator/suggest_observe", test_suggest_observe_default)
_run("scanner/no_alerts", test_scanner_no_alerts)
_run("scanner/three_levels", test_scanner_three_levels) _run("scanner/three_levels", test_scanner_three_levels)
_run("scanner/skips_non_active", test_scanner_skips_non_active_contracts) _run("scanner/skips_non_active", test_scanner_skips_non_active_contracts)
_run("html_renderer/basic", test_html_render_basic) _run("html_renderer/basic", test_html_render_basic)