- 创建Process-Driven AI Execution核心框架 - 设计四层契约体系 (需求/技术/执行/验证) - 实现Claude四种执行模式 (Design/Development/Review/Optimization) - 构建Process Gatekeeper三层验证体系 - 建立完整的质量门禁和违规处理机制 - 提供可执行的JSON Schema和模板库 核心价值: ✅ 一键创建 → Claude执行 → 自动验证 → 审阅 ✅ 将Claude从"代码助手"转变为"流程化工程执行体" ✅ 全程可控、可审、可追踪的AI执行管理 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
23 KiB
23 KiB
Process Gatekeeper(流程守卫系统)
版本: v1.0 定位: Claude执行流程的自动验证和质量控制中心 严格度: ★★★★★ (所有规则必须严格执行)
🛡️ 系统架构
graph TD
A[Claude执行开始] --> B[加载Execution Contract]
B --> C[预执行检查]
C --> D{预检查通过?}
D -->|否| E[拒绝执行,返回错误]
D -->|是| F[Claude执行任务]
F --> G[生成输出结果]
G --> H[实时违规检测]
H --> I{发现违规?}
I -->|是| J[触发违规处理]
I -->|否| K[执行后验证]
K --> L{验证通过?}
L -->|否| M[退回重新执行]
L -->|是| N[进入人工审核]
N --> O[审核结果]
O --> P{审核通过?}
P -->|否| Q[反馈修改意见]
P -->|是| R[任务完成]
Q --> F
J --> S[记录违规]
S --> T[通知管理员]
M --> F
🔍 验证层级
第一层:预执行检查(Pre-Execution Check)
1.1 契约完整性验证
def validate_execution_contract(contract: dict) -> ValidationResult:
"""验证执行契约的完整性和有效性"""
required_fields = [
'execution_id', 'phase', 'mode', 'requirement_id',
'process_standard', 'quality_gates', 'deliverables',
'constraints', 'verification'
]
# 检查必需字段
missing_fields = [field for field in required_fields if field not in contract]
if missing_fields:
return ValidationResult(
valid=False,
error_code="MISSING_REQUIRED_FIELDS",
message=f"缺少必需字段: {missing_fields}"
)
# 验证格式规范
if not re.match(r'^EXE-\d{4}-\d{4}$', contract['execution_id']):
return ValidationResult(
valid=False,
error_code="INVALID_EXECUTION_ID",
message="执行ID格式错误,应为 EXE-YYYY-NNNN"
)
# 验证阶段和模式一致性
phase_mode_validations = {
'requirement': ['design'],
'design': ['design'],
'development': ['development'],
'testing': ['review'],
'review': ['review', 'optimization']
}
if contract['mode'] not in phase_mode_validations.get(contract['phase'], []):
return ValidationResult(
valid=False,
error_code="PHASE_MODE_MISMATCH",
message=f"阶段 {contract['phase']} 与模式 {contract['mode']} 不匹配"
)
return ValidationResult(valid=True)
1.2 权限验证
def validate_permissions(contract: dict, user_context: dict) -> ValidationResult:
"""验证用户权限和操作范围"""
# 检查用户是否有执行该阶段的权限
user_role = user_context.get('role')
phase = contract.get('phase')
role_permissions = {
'architect': ['requirement', 'design'],
'developer': ['development'],
'tester': ['testing'],
'reviewer': ['review'],
'admin': ['requirement', 'design', 'development', 'testing', 'review']
}
if phase not in role_permissions.get(user_role, []):
return ValidationResult(
valid=False,
error_code="INSUFFICIENT_PERMISSIONS",
message=f"角色 {user_role} 无权限执行 {phase} 阶段"
)
# 检查操作范围限制
scope_limitations = contract.get('constraints', {}).get('scope_limitations', {})
allowed_dirs = scope_limitations.get('allowed_directories', [])
forbidden_dirs = scope_limitations.get('forbidden_directories', [])
# TODO: 实现目录权限检查逻辑
return ValidationResult(valid=True)
1.3 资源可用性检查
def check_resource_availability(contract: dict) -> ValidationResult:
"""检查执行所需资源是否可用"""
# 检查相关文档是否存在
context = contract.get('context', {})
related_docs = context.get('related_docs', [])
for doc_path in related_docs:
if not os.path.exists(doc_path):
return ValidationResult(
valid=False,
error_code="DOCUMENT_NOT_FOUND",
message=f"相关文档不存在: {doc_path}"
)
# 检查质量门禁工具可用性
required_gates = contract.get('quality_gates', {}).get('required_gates', [])
gate_tools = {
'lint': ['eslint', 'pylint'],
'typecheck': ['tsc', 'mypy'],
'unit_test': ['pytest', 'vitest'],
'security_scan': ['bandit', 'trivy']
}
for gate in required_gates:
tools = gate_tools.get(gate, [])
if not any(tool_available(tool) for tool in tools):
return ValidationResult(
valid=False,
error_code="QUALITY_GATE_UNAVAILABLE",
message=f"质量门禁 {gate} 的工具不可用"
)
return ValidationResult(valid=True)
第二层:实时违规检测(Real-time Violation Detection)
2.1 输出内容监控
class ContentMonitor:
"""实时监控Claude输出内容"""
def __init__(self, contract: dict):
self.contract = contract
self.forbidden_patterns = contract.get('constraints', {}).get('forbidden_patterns', [])
self.required_patterns = contract.get('constraints', {}).get('required_patterns', [])
self.forbidden_actions = contract.get('constraints', {}).get('forbidden_actions', [])
def monitor_output(self, content: str, file_path: str) -> List[Violation]:
"""监控输出内容,检测违规行为"""
violations = []
# 检查禁止模式
for pattern in self.forbidden_patterns:
if re.search(pattern, content, re.IGNORECASE):
violations.append(Violation(
type="FORBIDDEN_PATTERN",
severity="high",
pattern=pattern,
file_path=file_path,
message=f"检测到禁止模式: {pattern}"
))
# 检查跨阶段操作
phase = self.contract.get('phase')
if phase == 'design' and self._contains_code(content):
violations.append(Violation(
type="CROSS_PHASE_OPERATION",
severity="critical",
message="设计阶段禁止生成代码"
))
# 检查禁止操作
for action in self.forbidden_actions:
if action.lower() in content.lower():
violations.append(Violation(
type="FORBIDDEN_ACTION",
severity="high",
action=action,
file_path=file_path,
message=f"检测到禁止操作: {action}"
))
return violations
def _contains_code(self, content: str) -> bool:
"""检测内容是否包含可执行代码"""
code_indicators = [
r'function\s+\w+\s*\(',
r'class\s+\w+\s*:',
r'def\s+\w+\s*\(',
r'import\s+\w+',
r'const\s+\w+\s*=',
r'let\s+\w+\s*=',
r'var\s+\w+\s*='
]
return any(re.search(pattern, content) for pattern in code_indicators)
2.2 交付物完整性检查
class DeliverableTracker:
"""跟踪交付物生成状态"""
def __init__(self, contract: dict):
self.contract = contract
self.expected_deliverables = contract.get('deliverables', [])
self.generated_deliverables = {}
def track_deliverable(self, file_path: str, content: str) -> ValidationResult:
"""跟踪交付物生成"""
# 查找对应的交付物定义
expected = None
for deliverable in self.expected_deliverables:
if deliverable['path'] == file_path:
expected = deliverable
break
if not expected:
return ValidationResult(
valid=False,
error_code="UNEXPECTED_DELIVERABLE",
message=f"未预期的交付物: {file_path}"
)
# 验证内容类型
expected_type = expected.get('type')
if not self._validate_content_type(content, expected_type):
return ValidationResult(
valid=False,
error_code="INVALID_CONTENT_TYPE",
message=f"交付物 {file_path} 内容类型与预期不符"
)
# 验证Schema约束
schema = expected.get('schema')
if schema and not self._validate_schema(content, schema):
return ValidationResult(
valid=False,
error_code="SCHEMA_VALIDATION_FAILED",
message=f"交付物 {file_path} 不符合Schema约束"
)
self.generated_deliverables[file_path] = {
'content': content,
'type': expected_type,
'size': len(content),
'created_at': datetime.now().isoformat()
}
return ValidationResult(valid=True)
def check_completeness(self) -> ValidationResult:
"""检查交付物完整性"""
missing_deliverables = []
for expected in self.expected_deliverables:
if expected['path'] not in self.generated_deliverables:
missing_deliverables.append(expected['path'])
if missing_deliverables:
return ValidationResult(
valid=False,
error_code="INCOMPLETE_DELIVERABLES",
message=f"缺少交付物: {missing_deliverables}"
)
return ValidationResult(valid=True)
第三层:执行后验证(Post-Execution Validation)
3.1 质量门禁执行
class QualityGateExecutor:
"""执行质量门禁检查"""
def __init__(self, contract: dict):
self.contract = contract
self.quality_gates = contract.get('quality_gates', {})
self.required_gates = self.quality_gates.get('required_gates', [])
self.thresholds = self.quality_gates.get('thresholds', {})
async def execute_quality_gates(self, workspace_path: str) -> QualityGateResult:
"""执行所有质量门禁检查"""
results = {}
overall_passed = True
for gate in self.required_gates:
try:
if gate == 'lint':
result = await self._run_lint_check(workspace_path)
elif gate == 'typecheck':
result = await self._run_typecheck(workspace_path)
elif gate == 'unit_test':
result = await self._run_unit_tests(workspace_path)
elif gate == 'security_scan':
result = await self._run_security_scan(workspace_path)
elif gate == 'schema_validation':
result = await self._run_schema_validation(workspace_path)
else:
result = QualityGateResult(
gate=gate,
passed=False,
message=f"未知的质量门禁: {gate}"
)
results[gate] = result
if not result.passed:
overall_passed = False
except Exception as e:
results[gate] = QualityGateResult(
gate=gate,
passed=False,
message=f"执行质量门禁失败: {str(e)}"
)
overall_passed = False
# 计算质量分数
quality_score = self._calculate_quality_score(results)
return QualityGateResult(
gate="overall",
passed=overall_passed and quality_score >= self.thresholds.get('quality_score', 80),
message=f"整体质量分数: {quality_score}",
details=results,
quality_score=quality_score
)
async def _run_lint_check(self, workspace_path: str) -> QualityGateResult:
"""运行代码规范检查"""
# 检测项目类型和选择合适的linter
if os.path.exists(os.path.join(workspace_path, 'package.json')):
return await self._run_eslint(workspace_path)
elif os.path.exists(os.path.join(workspace_path, 'pyproject.toml')):
return await self._run_pylint(workspace_path)
else:
return QualityGateResult(
gate="lint",
passed=False,
message="无法确定项目类型,跳过lint检查"
)
async def _run_unit_tests(self, workspace_path: str) -> QualityGateResult:
"""运行单元测试"""
# 执行测试并收集覆盖率
try:
# 运行测试
test_result = subprocess.run(
['pytest', '--cov=.', '--cov-report=json'],
cwd=workspace_path,
capture_output=True,
text=True
)
if test_result.returncode != 0:
return QualityGateResult(
gate="unit_test",
passed=False,
message=f"测试失败: {test_result.stderr}"
)
# 读取覆盖率报告
coverage_data = self._parse_coverage_report(workspace_path)
coverage_percentage = coverage_data.get('totals', {}).get('percent_covered', 0)
required_coverage = self.thresholds.get('test_coverage', 80)
passed = coverage_percentage >= required_coverage
return QualityGateResult(
gate="unit_test",
passed=passed,
message=f"测试覆盖率: {coverage_percentage}% (要求: {required_coverage}%)",
metrics={'coverage_percentage': coverage_percentage}
)
except Exception as e:
return QualityGateResult(
gate="unit_test",
passed=False,
message=f"执行测试失败: {str(e)}"
)
3.2 安全检查
class SecurityScanner:
"""安全扫描器"""
def __init__(self):
self.security_rules = [
self._check_hardcoded_secrets,
self._check_sql_injection,
self._check_xss_vulnerabilities,
self._check_insecure_dependencies,
self._check_file_permissions
]
async def scan_security(self, workspace_path: str) -> SecurityResult:
"""执行安全扫描"""
vulnerabilities = []
severity_counts = {'critical': 0, 'high': 0, 'medium': 0, 'low': 0}
for rule in self.security_rules:
try:
rule_vulnerabilities = await rule(workspace_path)
vulnerabilities.extend(rule_vulnerabilities)
for vuln in rule_vulnerabilities:
severity_counts[vuln.severity] += 1
except Exception as e:
logging.error(f"安全规则执行失败: {str(e)}")
# 计算风险等级
risk_level = self._calculate_risk_level(severity_counts)
return SecurityResult(
passed=severity_counts['critical'] == 0 and severity_counts['high'] == 0,
risk_level=risk_level,
vulnerabilities=vulnerabilities,
summary=severity_counts
)
async def _check_hardcoded_secrets(self, workspace_path: str) -> List[Vulnerability]:
"""检查硬编码密钥"""
secret_patterns = [
(r'password\s*=\s*["\'][^"\']+["\']', 'hardcoded_password'),
(r'api_key\s*=\s*["\'][^"\']+["\']', 'hardcoded_api_key'),
(r'secret\s*=\s*["\'][^"\']+["\']', 'hardcoded_secret'),
(r'token\s*=\s*["\'][^"\']+["\']', 'hardcoded_token')
]
vulnerabilities = []
for root, dirs, files in os.walk(workspace_path):
# 跳过常见的非源码目录
dirs[:] = [d for d in dirs if d not in ['.git', 'node_modules', '__pycache__', '.venv']]
for file in files:
if file.endswith(('.py', '.js', '.ts', '.java', '.go', '.rs')):
file_path = os.path.join(root, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
for pattern, vuln_type in secret_patterns:
matches = re.finditer(pattern, content, re.IGNORECASE)
for match in matches:
vulnerabilities.append(Vulnerability(
type=vuln_type,
severity="high",
file_path=file_path,
line_number=content[:match.start()].count('\n') + 1,
message=f"发现硬编码密钥: {vuln_type}",
recommendation="使用环境变量或配置管理工具存储敏感信息"
))
except Exception as e:
logging.warning(f"无法扫描文件 {file_path}: {str(e)}")
return vulnerabilities
🚨 违规处理机制
违规等级定义
| 等级 | 描述 | 处理方式 | 自动恢复 |
|---|---|---|---|
| Critical | 严重违规,如安全漏洞、跨阶段操作 | 立即停止执行,上报管理员 | 否 |
| High | 高风险违规,如违反核心约束 | 停止执行,需要人工干预 | 否 |
| Medium | 中等风险,如质量问题 | 记录违规,允许重试 | 是 |
| Low | 低风险,如格式问题 | 警告记录,继续执行 | 是 |
自动处理流程
class ViolationHandler:
"""违规处理器"""
def __init__(self, notification_service: NotificationService):
self.notification_service = notification_service
async def handle_violation(self, violation: Violation, context: ExecutionContext) -> HandlingResult:
"""处理违规事件"""
# 记录违规
await self._log_violation(violation, context)
# 根据严重程度选择处理策略
if violation.severity == 'critical':
return await self._handle_critical_violation(violation, context)
elif violation.severity == 'high':
return await self._handle_high_violation(violation, context)
elif violation.severity == 'medium':
return await self._handle_medium_violation(violation, context)
else:
return await self._handle_low_violation(violation, context)
async def _handle_critical_violation(self, violation: Violation, context: ExecutionContext) -> HandlingResult:
"""处理严重违规"""
# 立即停止执行
await context.stop_execution()
# 清理已生成的文件
await context.cleanup_workspace()
# 通知管理员
await self.notification_service.send_alert(
level="critical",
message=f"严重违规: {violation.message}",
context=context.to_dict()
)
# 启动安全事故流程
await self._initiate_security_incident(violation, context)
return HandlingResult(
action="execution_stopped",
requires_manual_intervention=True,
message="执行已因严重违规而停止,等待管理员处理"
)
async def _handle_medium_violation(self, violation: Violation, context: ExecutionContext) -> HandlingResult:
"""处理中等风险违规"""
# 尝试自动修复
if await self._attempt_auto_fix(violation, context):
return HandlingResult(
action="auto_fixed",
requires_manual_intervention=False,
message="违规已自动修复,继续执行"
)
# 记录违规并允许重试
await self._record_warning(violation, context)
return HandlingResult(
action="warning_recorded",
requires_manual_intervention=False,
message="记录违规警告,允许重试"
)
📊 监控和报告
实时监控指标
class GatekeeperMetrics:
"""守卫系统监控指标"""
def __init__(self):
self.execution_count = Counter('gatekeeper_executions_total')
self.violation_count = Counter('gatekeeper_violations_total', ['severity', 'type'])
self.quality_gate_results = Histogram('gatekeeper_quality_gate_duration')
self.success_rate = Gauge('gatekeeper_success_rate')
def record_execution_start(self, execution_id: str, phase: str, mode: str):
"""记录执行开始"""
self.execution_count.labels(phase=phase, mode=mode).inc()
def record_violation(self, violation: Violation):
"""记录违规"""
self.violation_count.labels(
severity=violation.severity,
type=violation.type
).inc()
def record_quality_gate_result(self, gate: str, duration: float, passed: bool):
"""记录质量门禁结果"""
self.quality_gate_results.labels(gate=gate).observe(duration)
def calculate_success_rate(self, time_window: int = 3600) -> float:
"""计算成功率"""
# 实现成功率计算逻辑
pass
生成执行报告
class ExecutionReporter:
"""执行报告生成器"""
async def generate_execution_report(self, execution_id: str) -> ExecutionReport:
"""生成详细的执行报告"""
# 收集执行数据
execution_data = await self._collect_execution_data(execution_id)
# 生成质量评估
quality_assessment = await self._assess_quality(execution_data)
# 分析违规情况
violation_analysis = await self._analyze_violations(execution_data)
# 计算效率指标
efficiency_metrics = await self._calculate_efficiency(execution_data)
return ExecutionReport(
execution_id=execution_id,
summary=execution_data.get('summary'),
quality_assessment=quality_assessment,
violation_analysis=violation_analysis,
efficiency_metrics=efficiency_metrics,
recommendations=await self._generate_recommendations(execution_data),
generated_at=datetime.now().isoformat()
)
🔧 配置和部署
系统配置
# gatekeeper-config.yaml
gatekeeper:
enabled: true
strict_mode: true
validation:
pre_execution_checks:
- contract_validation
- permission_check
- resource_availability
real_time_monitoring:
- content_monitoring
- deliverable_tracking
- violation_detection
post_execution_validation:
- quality_gates
- security_scan
- completeness_check
violations:
critical:
auto_stop: true
notification: ["admin", "security_team"]
high:
retry_limit: 1
notification: ["admin"]
medium:
retry_limit: 3
auto_fix: true
low:
log_only: true
quality_gates:
lint:
enabled: true
tools: ["eslint", "pylint", "gofmt"]
typecheck:
enabled: true
tools: ["tsc", "mypy", "go build"]
unit_test:
enabled: true
min_coverage: 80
tools: ["pytest", "vitest", "go test"]
security_scan:
enabled: true
tools: ["bandit", "trivy", "snyk"]
fail_on_high: true
更新记录:
| 版本 | 日期 | 更新内容 | 更新人 |
|---|---|---|---|
| v1.0 | 2025-10-29 | 初始版本,定义完整守卫系统 | Claude AI |
Process Gatekeeper 是确保 Claude 严格执行流程标准的核心组件,通过多层次验证和实时监控,保证AI执行的质量和安全性。