This commit is contained in:
@@ -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"):
|
||||
|
||||
Reference in New Issue
Block a user