docs: 沉淀AI+RPA合规与工业级风控规范
All checks were successful
技能自动化发布 / release (push) Successful in 7s

This commit is contained in:
2026-07-24 15:55:47 +08:00
parent 20e89774ca
commit 0ea924958f
18 changed files with 474 additions and 47 deletions

View File

@@ -36,6 +36,7 @@ POLICY_IDS = (
"POLICY-RPA-002",
"POLICY-RPA-003",
"POLICY-RPA-004",
"POLICY-RPA-005",
"POLICY-PACKAGING-001",
"POLICY-PACKAGING-002",
"POLICY-DOCS-001",
@@ -155,6 +156,25 @@ RPA_004_LAUNCH_MARKERS = (
)
RPA_004_PICK_MARKER = "pick_web_account"
RPA_005_SOURCE = (
"development/AI_RPA.md §4–§6; development/RPA.md §0.0/§0.3; "
"development/POLICY_MATRIX.md"
)
RPA_005_REQUIRED_DOC_MARKERS = (
"AI Agent 是用户入口与业务编排者",
"RPA 是确定性执行器",
"破解",
"逆向",
"私有协议",
"验证码",
"人工处理",
"1~3 秒",
"状态等待",
)
RPA_005_STEP_DELAY_KEY_RE = re.compile(
r"(?m)^\s*(STEP_DELAY_MIN|STEP_DELAY_MAX)\s*=\s*([^\s#]+)"
)
LOGGING_001_SOURCE = "development/LOGGING.md; development/RUNTIME.md"
LOGGING_002_SOURCE = "development/LOGGING.md; development/DEVELOPMENT.md"
LOGGING_003_SOURCE = "development/LOGGING.md"
@@ -669,6 +689,53 @@ class TestPolicyRpa004(unittest.TestCase):
)
class TestPolicyRpa005(unittest.TestCase):
def test_ai_rpa_governance_doc_has_required_boundaries(self) -> None:
skill_root = get_skill_root()
path = os.path.join(skill_root, "development", "AI_RPA.md")
self.assertTrue(
os.path.isfile(path),
msg=_policy_msg("POLICY-RPA-005", RPA_005_SOURCE, "development/AI_RPA.md missing"),
)
text = _read_text(path)
missing = [marker for marker in RPA_005_REQUIRED_DOC_MARKERS if marker not in text]
self.assertEqual(
missing,
[],
msg=_policy_msg(
"POLICY-RPA-005",
RPA_005_SOURCE,
"AI_RPA.md missing markers: " + ", ".join(missing),
),
)
def test_real_rpa_default_step_delay_is_one_to_three_seconds(self) -> None:
skill_root = get_skill_root()
env_path = os.path.join(skill_root, ".env.example")
values = {
key: value.strip().strip("\"'")
for key, value in RPA_005_STEP_DELAY_KEY_RE.findall(_read_text(env_path))
}
self.assertEqual(
values.get("STEP_DELAY_MIN"),
"1.0",
msg=_policy_msg(
"POLICY-RPA-005",
RPA_005_SOURCE,
f"STEP_DELAY_MIN must default to 1.0, got {values.get('STEP_DELAY_MIN')!r}",
),
)
self.assertEqual(
values.get("STEP_DELAY_MAX"),
"3.0",
msg=_policy_msg(
"POLICY-RPA-005",
RPA_005_SOURCE,
f"STEP_DELAY_MAX must default to 3.0, got {values.get('STEP_DELAY_MAX')!r}",
),
)
def _scan_sensitive_logging_assignments(skill_root: str) -> list[str]:
offenders: list[str] = []
for path in _walk_files(skill_root, "scripts", suffix=".py"):