ECC Pro:托管式多仓库 Agent 安全态势仪表盘¶
状态:待评审的设计草案。由架构 Agent 于 2026-06-21 基于现有 ecc-agentshield 原语生成。提出托管式 ECC Pro 界面;不实现它。配套 docs/ECC-PRO-SECURITY-ROADMAP.md(“下一步”旗舰项目)。
1. 标题、论点与切入点¶
ECC Pro 是一个托管式、已认证、多仓库的“面向 Agent 安全的 Sentry”界面,构建在现有 ecc-agentshield 本地 CLI 原语之上。AgentShield 目前已有约 30K npm 下载量/月,且几乎零变现。论点:使托管产品具有价值的持续性和集群原语,已经作为本地 CLI 构建块存在(具有 bundleDigest 完整性的证据包、operatorReadback/reviewItems 提升路由、fs.watch 漂移检测、NDJSON 运行时允许/阻止日志、基线差异比较,以及策略提升门控)。通往 MRR 的最快路径不是新科学;而是将这些原语托管为已认证的多仓库和多组织界面,并随时间统一配置扫描态势与运行时遥测。
切入点:Snyk 及类似 SCA 工具仅做扫描,没有 Agent 运行时语义的概念(没有 PreToolUse 拒绝决策,没有 MCP/hook/agent 注入模型,没有 Agent 配置随时间的漂移)。Sentry 有时间序列和告警,但安全语义为零;它不知道硬编码的 sk-ant- 密钥、Bash(*) 允许规则或 autoApprove MCP 服务器是什么。CodeRabbit 审查 PR 差异,但只是单点时刻,没有集群态势汇总或运行时阻止率趋势。ECC Pro 是唯一能够跨仓库集群绘制 score 趋势、drift 历史、blocked-command 率和 injection-attempt 率的界面,其锚定在一个安全专用规则引擎(跨 secrets/permissions/hooks/mcp/agents 的 102 条规则)上,这是其他任何产品都没有的。AgentShield 曾在 Cerebral Valley x Anthropic Claude Code Hackathon(2026 年 2 月)上展示;托管界面是该展示工具的商业化扩展。
2. 范围:免费本地优先 vs Pro 托管¶
免费本地优先扫描器保持为护城河。我们从不给扫描器本身设置付费墙;我们变现托管、历史和跨仓库聚合。本地优先能力也是生成托管产品所摄取的脱敏、完整性校验工件的来源,因此强大的免费层直接扩大漏斗。
免费、零账户、仅限本地(不变,MIT):
- agentshield scan 及全部 102 条规则,--format terminal|json|markdown|html|sarif。
- --fix、agentshield init、--opus 深度分析(用户提供自己的 ANTHROPIC_API_KEY)。
- --evidence-pack <dir>、evidence-pack verify|inspect|fleet(本地集群路由保持免费)。
- --baseline、--save-baseline、agentshield baseline write、--gate。
- agentshield runtime install|status|repair,本地 runtime.ndjson 日志。
- agentshield policy init|export|promote,全部 6 个策略包(oss、team、enterprise、regulated、high-risk-hooks-mcp、ci-enforcement)。
- 本地 agentshield watch(fs.watch 漂移、终端/webhook 告警)。
- GitHub Action affaan-m/agentshield@v1(CI 扫描、SARIF 上传、基线门控)。
- MiniClaw 本地服务器。
Pro、托管、需要账户(经常性收入界面):
- 持久化历史:所有扫描/基线/漂移/运行时事件均被保留并随时间绘制图表(免费 CLI 在本地机器上是单点、无状态的)。
- 多仓库与组织汇总:跨仓库态势、集群 operatorReadback 聚合、组织级分数趋势。
- 用于 CI 扫描结果、runtime.ndjson 流式传输以及监控/漂移事件的已认证摄取端点。
- 托管仪表盘前端(态势、漂移时间线、被阻止命令率、注入尝试率、密钥暴露事件)。
- 托管告警与路由:将 reviewItems 转换为可分配工单,并通过 ecc-tools GitHub App 投递到 Slack/Linear/GitHub。
- RBAC、审计日志、数据保留/合规、SSO(企业版)。
- 托管策略提升门控:在 policy promote reviewItems 之上的组织级提升审批工作流。
硬性边界:任何针对本地文件运行并生成脱敏工件的功能都保持免费。任何跨仓库/时间/人员存储、聚合、绘制图表或路由的功能都属于 Pro。我们从不要求账户来发现漏洞;我们要求账户来随时间跟踪一批漏洞。
3. 架构¶
托管后端是现有工件结构之上的一个轻量、无状态摄取与查询层。CLI/Action/App 仍然是生产者;后端从不重新实现扫描。它接收已脱敏的工件(CLI 默认在 createRedactor/buildReplacements 中脱敏路径/用户名/邮箱/令牌),并持久化摘要以及时间序列汇总。
组件图(ASCII):
PRODUCERS (free, local-first, already redacted)
+-----------------------+ +------------------------+ +-------------------------+
| GitHub Action | | agentshield watch | | runtime PreToolUse hook |
| (CI scan + evidence | | (fs.watch, diffBaseline,| | (evaluateToolCall -> |
| pack, SARIF, baseline)| | DriftResult, webhook) | | runtime.ndjson) |
+-----------+-----------+ +-----------+------------+ +-----------+-------------+
| | |
| POST evidence-pack | POST drift event | POST/stream ndjson batch
| summary + manifest digest | (DriftResult) | (RuntimeLogEntry[])
v v v
+-----------------------------------------------------------------------------------+
| INGESTION GATEWAY (stateless, authenticated) |
| - API token auth + org/repo identity resolution |
| - schema validation (Zod, reuse SecurityReport / DriftResult / RuntimeLogEntry) |
| - bundleDigest re-verification, idempotency on digest |
| - reject-if-not-redacted guard (manifest.redacted must be true for hosted) |
+-----------------------------------+-----------------------------------------------+
|
+--------------------+--------------------+
v v
+-----------------------------+ +-------------------------------+
| PRIMARY STORE (Postgres) | | TIME-SERIES ROLLUP STORE |
| org, repo, scan, baseline, | | score_trend, drift_history, |
| finding, runtime_event, | rollup job | blocked_cmd_rate, |
| drift_event, policy_eval, |------------->| injection_rate, secret_events |
| evidence_pack, review_item | | (Postgres time buckets or |
+--------------+--------------+ | ClickHouse for high-volume |
| | runtime ndjson) |
| +---------------+----------------+
| |
v v
+-----------------------------------------------------------------------------------+
| QUERY API (authenticated, RBAC-filtered, multi-tenant isolated by org_id) |
+-----------------------------------+-----------------------------------------------+
|
v
+-----------------------------+ +-------------------------------------------+
| DASHBOARD FRONTEND (Next.js) | | ROUTING/ALERTS (ecc-tools GitHub App, |
| posture, trends, drift, fleet| | Slack/Linear) from reviewItems + tickets |
+-----------------------------+ +-------------------------------------------+
摄取源及其现有生产者:
- CI 扫描结果:GitHub Action 已经会输出完整的 SecurityReport JSON、SARIF,以及一个包含 manifest.json(bundleDigest、每个工件的 sha256/bytes)的证据包,外加 ci-context.json(EvidencePackGitHubContext:repository、sha、runId、workflow、ref、actor)。该 Action 新增一个可选输入 ecc-pro-ingest-url + token;成功后,它会 POST 已检查的证据包摘要(EvidencePackInspectionResult)和 manifest 摘要。
- 运行时遥测:PreToolUse 钩子(evaluateToolCall -> logEvalResult)将 RuntimeLogEntry 行写入 .agentshield/runtime.ndjson。一个小型 agentshield runtime ship 命令(Pro)会跟踪并批量 POST 新的 NDJSON 行。
- 监控/漂移事件:startWatcher 已经会计算 DriftResult 并调用 dispatchAlert。我们新增一个 webhook 告警目标,指向托管摄取端点;现有的 formatWebhookPayload 会携带 newFindings、resolvedFindings、scoreDelta、isRegression、hasCritical。
存储选择:Postgres(Supabase)用于关系型实体和大多数汇总;仅当每个组织的运行时 NDJSON 数据量使得在 Postgres 中逐行保留不经济时,才使用 ClickHouse(运行时事件是只追加且高基数的,这正是 ClickHouse 的适用场景)。默认 MVP 仅使用 Postgres。
4. API 契约¶
所有端点均使用组织范围的 API token 进行身份验证(请求头 Authorization: Bearer eccp_...)。请求/响应结构复用 CLI 中的真实字段名,因此生产者无需翻译层。摄取以 bundleDigest(扫描)或 (repo_id, timestamp, tool, decision) 哈希(运行时)作为幂等键。
4.1 摄取扫描 / 证据包摘要¶
POST /v1/ingest/scan
请求体是现有的 EvidencePackInspectionResult 加上 ci-context 摘要。后端从不要求原始证据;它消费已经计算好的检查摘要,从而可以重新推导出与本地 evidence-pack inspect 生成的相同汇总。
请求:
{
"repository": "acme/agent-platform",
"bundleDigest": "sha256:9f2c...e1",
"expectedBundleDigest": "sha256:9f2c...e1",
"generatedAt": "2026-06-21T17:42:00.000Z",
"redacted": true,
"report": {
"score": { "grade": "C", "numericScore": 66 },
"findings": { "total": 29, "critical": 1, "high": 7, "medium": 8, "low": 10, "info": 3 },
"runtimeConfidence": { "active-runtime": 11, "template-example": 14, "project-local-optional": 4 }
},
"policy": { "status": "failed", "policyPack": "enterprise", "violations": 3 },
"baseline": { "status": "regressed", "newFindings": 4, "resolvedFindings": 1, "scoreDelta": -8 },
"supplyChain": { "totalPackages": 22, "riskyPackages": 2, "criticalCount": 0, "highCount": 1 },
"ciContext": {
"provider": "github-actions",
"repository": "acme/agent-platform",
"workflow": "security.yml",
"runId": "1182334455",
"sha": "4c1d9ab"
},
"remediation": { "totalFindings": 29, "autoFixable": 2, "manualReview": 7 }
}
响应:
{
"ok": true,
"scanId": "scan_01J...",
"repoId": "repo_01H...",
"ingestedAt": "2026-06-21T17:42:03.114Z",
"deduped": false,
"rollupsUpdated": ["score_trend", "drift_history", "secret_exposure_events"]
}
服务端保护:如果 redacted !== true,则以 422 拒绝(托管租户绝不能存储未脱敏的 bundle),如果该仓库已经摄取过 bundleDigest,则以 409 deduped 回显拒绝。如果存在 expectedBundleDigest 且与 bundleDigest 不同,则在存储的扫描上标记 integrity: "mismatch"。
4.2 摄取运行时遥测批次¶
POST /v1/ingest/runtime
请求体是 src/runtime/types.ts 中现有 RuntimeLogEntry 结构的数组。
请求:
{
"repository": "acme/agent-platform",
"sessionId": "sess_4f8a",
"entries": [
{ "timestamp": "2026-06-21T17:50:01.002Z", "tool": "Bash", "decision": "block", "reason": "Input matches denied pattern \"rm -rf\"", "durationMs": 2 },
{ "timestamp": "2026-06-21T17:50:02.114Z", "tool": "Read", "decision": "allow", "durationMs": 1 }
]
}
响应:
{ "ok": true, "accepted": 2, "blocked": 1, "allowed": 1, "rollupsUpdated": ["blocked_command_rate"] }
注意:RuntimeLogEntry 本身不携带原始输入负载(只有 tool、decision、reason、durationMs),因此运行时摄取在设计上是安全的。我们保持这一方式;托管 API 不得添加原始输入字段。
4.3 摄取漂移事件¶
POST /v1/ingest/drift
请求体是 src/watch/types.ts 中现有的 DriftResult(也就是 formatWebhookPayload 已经输出的内容)。
请求:
{
"repository": "acme/agent-platform",
"timestamp": "2026-06-21T18:01:10.000Z",
"newFindings": [ { "id": "secrets-hardcoded-anthropic", "severity": "critical", "category": "secrets", "title": "Hardcoded Anthropic API key", "file": "<target-path>/CLAUDE.md" } ],
"resolvedFindings": [],
"scoreDelta": -25,
"previousScore": 66,
"currentScore": 41,
"isRegression": true,
"hasCritical": true
}
响应:
4.4 查询:组织车队汇总¶
GET /v1/org/{orgId}/fleet
响应复用 EvidencePackFleetInspectionResult 的 operatorReadback 结构,以便仪表盘和现有的 evidence-pack fleet 消费者共享同一契约:
{
"ok": false,
"requiresAttention": true,
"summary": { "totalPacks": 12, "verifiedPacks": 11, "invalidPacks": 1, "critical": 2, "high": 9, "policyFailures": 3, "baselineRegressions": 2, "riskyPackages": 5 },
"operatorReadback": {
"status": "blocked",
"ready": false,
"requiresApproval": true,
"digest": "sha256:aa17...",
"reviewItemCount": 5,
"blockingItemCount": 2,
"ownerCount": 3,
"owners": ["acme/agent-platform security owner"],
"routesRequiringApproval": ["policy-review", "security-blocker"],
"approvalIds": ["agsr_2b1c8f0d9e7a4c11"],
"nextAction": "Route review items to listed owners and attach approval before promotion."
}
}
4.5 查询:仓库级安全态势与趋势¶
GET /v1/repo/{repoId}/posture?from=...&to=...&bucket=day
返回 score_trend、最新的 EvidencePackInspectionResult、最新的 DriftResult,以及该时间窗口内的运行时汇总。
4.6 查询:审查项(路由)¶
GET /v1/repo/{repoId}/review-items
返回现有的 EvidencePackFleetReviewItem[](route、severity、priority、approvalId、owner、evidencePaths、beforeState、afterState、reversibleAction、actions、recommendation,以及兼容 Linear 的 ticket.externalId)。这些项与可分配的托管工单一一对应;无需新增 schema。
5. 数据模型¶
持久化的关系型实体(Postgres)。所有实体均携带 org_id 以实现租户隔离;所有时间戳均为 ISO-8601 UTC。
org:id,name,github_org_login,plan(team|enterprise),created_at,sso_enabled.repo:id,org_id,full_name(例如acme/agent-platform),github_repo_id(来自EvidencePackGitHubContext.repositoryId),default_provider(github-actions|local),created_at.scan:id,repo_id,bundle_digest(每个仓库唯一,幂等键),generated_at,redacted,grade,numeric_score,score_breakdown(jsonb:secrets/permissions/hooks/mcp/agents),total_findings,critical/high/medium/low/info,provider,ci_sha,ci_run_id,ci_workflow,integrity(ok|mismatch).finding:id,scan_id,finding_key(即Finding.id,例如mcp-risky-filesystem),severity,category(FindingCategory),title,file(已脱敏为<target-path>形式),runtime_confidence(RuntimeConfidence),fingerprint(复用fingerprintFinding,使同一发现项跨扫描合并为一条时间线)。托管环境绝不存储原始evidence;只存储脱敏后的file和title。baseline:id,repo_id,baseline_timestamp,numeric_score,finding_count,source_scan_id. 对应SerializedBaseline(version、timestamp、score、带fingerprint的findings)。baseline_comparison:id,repo_id,scan_id,is_regression,new_findings_count,resolved_findings_count,unchanged_count,score_delta,new_critical_count,new_high_count(BaselineComparison结构)。runtime_event:id,repo_id,session_id,timestamp,tool,decision(allow|block),reason,duration_ms(RuntimeLogEntry结构;高吞吐,可考虑 ClickHouse)。drift_event:id,repo_id,timestamp,score_delta,previous_score,current_score,is_regression,has_critical,new_findings(jsonb 摘要),resolved_findings(jsonb 摘要)(DriftResult结构)。policy_eval:id,scan_id,policy_name,policy_pack(PolicyPack),passed,violation_count,score,min_score,exception_summary(jsonb:来自PolicyExceptionSummary的total/active/expiringSoon/expired)。对应PolicyEvaluation。evidence_pack:id,scan_id,bundle_digest,expected_bundle_digest,artifact_count,verified_artifact_count,redacted,generated_at. 对应EvidencePackInspectionResult。review_item:id,repo_id,approval_id(agsr_...id),route(EvidencePackFleetRoute),severity,priority,owner,recommendation,ticket_external_id,status(open|approved|dismissed),assignee. 对应EvidencePackFleetReviewItem。
用于图表展示的时间序列汇总(由上述实体物化生成,按小时/天/周分桶):
- score_trend: 按仓库以及组织聚合的 numeric_score 和 grade 随时间变化(来自 scan.numeric_score)。主图表。
- drift_history: drift_event 回归的数量和严重级别随时间变化,并带 score_delta 区间。回答“该仓库的 agent 安全态势是否在退化?”。
- blocked_command_rate: decision = block 的 runtime_event 占总数的比例,按工具、随时间变化。其他产品没有的“Sentry 风格”实时信号。
- injection_attempt_rate: reason 匹配注入拒绝模式的被阻止运行时事件数量,加上 category = injection 的扫描发现项,随时间变化。
- secret_exposure_events: category = secrets 且 severity = critical 的 finding 行时间线(例如 secrets-hardcoded-*),按 fingerprint 去重,因此反复提交的密钥在解决前显示为一个持续事件。
- cross_repo_org_rollup: 组织级汇总:score_trend、按 route 的未关闭 review_item 数量、policyFailures 和 baselineRegressions(EvidencePackFleetSummary 字段),用于组织范围的 operatorReadback.status 徽章。
6. 认证模型¶
身份与租户:
- Org 是顶层租户,锚定到 GitHub org login(ecc-tools GitHub App 安装范围是自然的入门边界)。repo 行恰好隶属于一个 org;来自 EvidencePackGitHubContext.repositoryId 的 github_repo_id 是稳定的外部键。
- 多租户隔离:每一行都携带 org_id。在 Supabase Postgres 上,强制启用 Row Level Security,使每个查询都按调用方的 org_id 过滤;查询 API 绝不接受不在调用方 token claims 中的客户端提供的 org_id。任何查询路径中都不存在跨组织连接。
API 令牌:
- 组织范围的摄取令牌(eccp_...)按组织签发,并可选按仓库签发。令牌静态存储时进行哈希(只存储令牌的 SHA-256,绝不存储令牌本身),创建时仅显示一次。CI 在 GitHub Actions secrets 中使用仓库范围令牌;runtime/watch 上报器使用相同令牌。
- 令牌具有 scope(ingest:scan、ingest:runtime、ingest:drift、read),因此 CI 令牌无法读取 dashboard API,只读令牌无法写入。
RBAC 层级(按组织):
- owner:计费、SSO 配置、令牌管理、成员管理、策略提升审批。
- admin:令牌管理、审查项分配、告警路由配置。
- member:查看所有安全态势、将审查项分配给自己、评论。
- viewer:只读安全态势和趋势(审计员 / 买方审查角色)。
禁止处理(硬性要求,服务端强制执行):
- 绝不存储原始密钥。CLI 默认已通过 createRedactor/buildReplacements 对路径、用户名、电子邮件和令牌形状字符串进行脱敏(覆盖 sk-、gh*_、github_pat_、glpat-、npm_、AKIA、JWT eyJ...、Slack 令牌、电子邮件等)。摄取网关必须拒绝任何 manifest.redacted / redacted 不为 true 的扫描负载。端到端保留脱敏;托管存储只保存 <redacted-token> / <target-path> / <home> / <user> 形式。
- runtime_event 摄取只接受 RuntimeLogEntry 字段(tool、decision、reason、durationMs);不得接受原始工具 input。本地 ToolCall.input 保留在本地。
- 修复计划和基线已省略原始 evidence 以及前后令牌形状字符串;在托管投影中保留这种省略。托管存储的发现项只携带脱敏的 file + title + fingerprint,绝不携带原始 evidence。
- 审计日志:每次令牌签发/吊销、审查项状态变更和策略提升审批都会追加到不可变的按组织审计轨迹(纵深防御、最小权限、默认安全)。
7. MVP 与 v2 与 v3(构建顺序)¶
MVP(最小可交付 Pro v1)——“CI 扫描的历史 + 多仓库态势”:
1. 组织/仓库模型,GitHub App(ecc-tools)安装 -> 组织/仓库开通,组织范围的摄取令牌,带 RLS 隔离。
2. POST /v1/ingest/scan 消费 EvidencePackInspectionResult + ci-context;持久化 scan、finding、evidence_pack、policy_eval、baseline_comparison;基于 bundleDigest 幂等;未脱敏即拒绝保护。
3. GitHub Action 获取 ecc-pro-ingest-url + 令牌输入;扫描时 POST 已检查摘要。
4. 仪表盘 v1:score_trend 图表,按仓库的 finding 表(severity + runtimeConfidence 过滤),组织车队表复用 operatorReadback.status。
5. Stripe 计费,Team 计划(按现有 ecc-tools Pro 列表为 $19/席位/月),每组织令牌配额。
这是可交付的,因为它只将现有工件拼接到存储 + 一个图表。没有新的扫描逻辑。
v2 ——“运行时遥测 + 随时间漂移 + 路由”:
6. POST /v1/ingest/runtime + agentshield runtime ship 发送器;runtime_event 存储;blocked_command_rate 和 injection_attempt_rate 图表。
7. POST /v1/ingest/drift + watch webhook 目标 -> 托管;drift_history 图表;secret_exposure_events 时间线。
8. review_item 摄取 + 可分配工单,通过 ecc-tools App 将告警路由到 Slack/Linear/GitHub,复用 approvalId 和 ticket.externalId 去重。
v3 ——“Enterprise 治理”:
9. 托管策略提升门:在 policy promote 的 reviewItems 之上建立组织审批工作流;在 operatorReadback.ready 之前需要必需审批。
10. SSO/SAML、自定义保留期、审计日志导出、每组织数据驻留;如果量级需要,则将运行时事件迁移到 ClickHouse。
8. 定价与套餐钩子¶
- Team($19/席位/月,与当前 ecc-tools Pro 列表一致):按席位计费;包含仓库上限(例如 25 个仓库);90 天历史保留;scan + drift 摄取;Slack/GitHub 路由;标准 RBAC(owner/admin/member/viewer)。
- Enterprise(按仓库或平台费,销售协助):按
repo数量而非席位计量,因为安全平台价值随车队规模而非人数扩展;无限席位;SSO/SAML;无限保留 + 审计日志导出;托管策略提升审批门;带必需审批强制执行的regulated/enterprise策略包;数据驻留。
门槛杠杆(使 Team -> Enterprise 切换的因素):运行时遥测保留窗口、受管仓库数量、SSO 要求、策略提升审批工作流、审计日志导出,以及 routesRequiringApproval 强制执行(Enterprise 可以要求 operatorReadback.requiresApproval 阻止提升;Team 仅展示它)。按席位覆盖小团队;按仓库覆盖平台团队买家,其价值在于车队广度。
9. 风险与开放问题¶
风险:
- 自我蚕食:过于宽松的托管免费层可能侵蚀本地护城河,或过于激进的付费墙可能卡住 30K/月漏斗。缓解:永不将检测付费墙化;仅将持久化/聚合/路由付费墙化。
- 脱敏信任边界:托管产品的整个安全叙事取决于 CLI 脱敏器完整。正则集合遗漏的新令牌格式会被未脱敏摄取。缓解:未脱敏即拒绝是必要但不充分;对入站 title/file/reason 字符串增加服务端二次脱敏作为纵深防御,并保持 buildReplacements 模式受测试覆盖。
- 运行时量级经济性:runtime.ndjson 对每个活跃 agent 可能高基数;Postgres 保留可能变得昂贵。缓解:在摄取时预聚合到 blocked_command_rate 汇总,并仅按计划窗口保留原始 runtime_event(Enterprise 使用 ClickHouse)。
- 幂等边界:bundleDigest 排除 manifest.json 和 README.md(BUNDLE_DIGEST_EXCLUDED_FILES),因此两次具有相同发现但不同 generatedAt 的扫描会产生相同摘要。这对去重是正确的,但意味着我们必须以 generatedAt/ci_run_id 作为时间序列键,而不是仅用摘要。
开放问题:
- 对于纯本地 watch/runtime(无 CI,provider: "local")的 drift/runtime 摄取,是否应允许 Pro 使用,鉴于没有 GitHub 可验证的仓库身份?建议:允许,但标记 provider: local,并要求仓库范围令牌在铸造时绑定到 full_name。
- 我们将运行时事件归属到 GitHub 身份(ci-context.actor)以计算每开发者阻止率,还是为隐私保持仓库匿名?倾向默认仓库匿名,并可选启用 actor 归属。
- 组织身份是否严格绑定 GitHub 组织,还是 v2 中需要为 GitLab/仅本地用户提供一个独立于 GitHub 的组织?MVP 通过 ecc-tools App 绑定 GitHub 组织。
- 对于 injection_attempt_rate 图表,我们信任运行时 reason 字符串匹配,还是需要从 EvalResult(其具有 matchedRule)而不是仅 RuntimeLogEntry(其丢弃它)发送结构化 matchedRule 字段?建议:扩展运行时发送器以包含 matchedRule,使注入归属结构化,而不是字符串解析。
相关依据文件(均为绝对路径):
- agentshield/src/evidence-pack/index.ts(EvidencePackInspectionResult、EvidencePackFleetOperatorReadback、EvidencePackFleetReviewItem、bundleDigest、BUNDLE_DIGEST_EXCLUDED_FILES、createRedactor、buildReplacements)
- agentshield/src/runtime/types.ts(RuntimeLogEntry、EvalResult、RuntimePolicy)和 agentshield/src/runtime/evaluator.ts(evaluateToolCall、logEvalResult)
- agentshield/src/watch/types.ts(DriftResult、WatchConfig)和 agentshield/src/watch/index.ts(formatWebhookPayload、dispatchAlert)
- agentshield/src/baseline/types.ts(SerializedBaseline、SerializedFinding、BaselineComparison)和 agentshield/src/baseline/index.ts(fingerprintFinding)
- agentshield/src/policy/types.ts(PolicyEvaluation、PolicyPack、PolicyExceptionSummary)
- agentshield/src/types.ts(Finding、RuntimeConfidence、FindingCategory、SecurityReport、SecurityScore)
- agentshield/README.md(GitHub Action 输入/输出、ecc-tools GitHub App、ecc-agentshield npm、ECC Tools Pro $19/席位/月)
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC