skills/project-surface/SKILL.md
# Skill: project-surface 项目承载面缩圈 — 在产品/领域影响扫描之后,明确后续需要重点分析的具体落点。 ## 目的 "项目承载面"不等于"代码仓库"。本 skill 负责将影响扫描的宏观影响面,落实到当前项目的具体承载面列表,并设定深挖优先级。这一步骤在 CLARIFY 阶段固定位于: ``` 需求本体澄清 → 产品/领域影响扫描 → [项目承载面缩圈] → 定点深挖 ``` ## 承载面类型 | 类型 | 典型例子 | |------|---------| | `code_repository` | src/, lib/, app/ 等代码目录 | | `api_definition` | OpenAPI spec, proto 文件, GraphQL schema | | `configuration` | .env.example, config/, 部署 YAML | | `documentation` | docs/, README, ARCHITECTURE.md | | `design_artifacts` | 设计稿、交互流程、原型
npx skillsauth add LUAgam/stage-harness skills/project-surfaceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
项目承载面缩圈 — 在产品/领域影响扫描之后,明确后续需要重点分析的具体落点。
"项目承载面"不等于"代码仓库"。本 skill 负责将影响扫描的宏观影响面,落实到当前项目的具体承载面列表,并设定深挖优先级。这一步骤在 CLARIFY 阶段固定位于:
需求本体澄清 → 产品/领域影响扫描 → [项目承载面缩圈] → 定点深挖
| 类型 | 典型例子 |
|------|---------|
| code_repository | src/, lib/, app/ 等代码目录 |
| api_definition | OpenAPI spec, proto 文件, GraphQL schema |
| configuration | .env.example, config/, 部署 YAML |
| documentation | docs/, README, ARCHITECTURE.md |
| design_artifacts | 设计稿、交互流程、原型 |
| data_assets | 数据库 schema, migration 文件, 数据字典 |
| workflow_scripts | CI/CD 脚本, Makefile, 自动化脚本 |
| test_fixtures | fixtures/, mocks/, seed 数据 |
1. 读取 .harness/features/<epic-id>/impact-scan.md → 提取影响面清单(P0/P1/P2)
2. 读取 .harness/project-profile.yaml → 获取 project_type 和 primary_surfaces
3. 对照项目实际目录结构(只看根目录 + 1 层),识别哪些承载面实际存在
4. 排除不受本次 epic 影响的承载面(显式写入 excluded 列表)
5. 为每个纳入的承载面分配深挖策略:
- index_only:只看目录名/README/索引,不读正文
- summary_only:只读摘要/入口
- targeted:仅读命中的文件
- deep:全量精读(仅高风险核心依赖)
6. 若 `workspace_mode: multi-repo` 且处于 CLARIFY full mode,上游应已产出 `.harness/features/<epic-id>/cross-repo-impact-index.json`;本步骤应按其 `repos[]` / `interfaces[]` 对齐 surface,避免漏扫契约。单仓时该文件可缺省。
7. `surface-routing.json.surfaces[]` 的每个条目都必须显式包含 `type` 与 `path`;不要依赖下游猜测补齐。
8. 若项目画像 `.harness/project-profile.yaml` 声明了可选 `coupling_role_ids`,则可在对应 `surfaces[]` 条目补充 `serves_roles`,用于声明该承载面承担哪些通用联动责任;不得填写未在 `coupling_role_ids` 中登记的 role id。
写入 .harness/features/<epic-id>/surface-routing.json:
{
"epic": "epic-name",
"created_at": "2024-01-15T10:00:00Z",
"surfaces": [
{
"type": "code_repository",
"repo_id": "",
"path": "src/auth/",
"priority": "P0",
"reason": "需求直接修改认证中间件",
"dive_strategy": "targeted",
"scan_budget": { "max_files": 15, "max_grep_rounds": 3 },
"evidence_level": "source",
"serves_roles": ["role.api_contract"],
"assigned_to": "repo-router"
},
{
"type": "api_definition",
"path": "api/openapi.yaml",
"priority": "P1",
"reason": "API 契约可能变化",
"dive_strategy": "summary_only",
"assigned_to": "docs-scout"
},
{
"type": "configuration",
"path": ".env.example",
"priority": "P1",
"reason": "需要新增 JWT_SECRET 环境变量",
"dive_strategy": "targeted",
"assigned_to": "config-scout"
}
],
"excluded": [
{
"type": "design_artifacts",
"reason": "本次需求不涉及 UI 变更"
}
],
"scout_assignments": {
"repo-router": ["src/auth/"],
"docs-scout": ["api/openapi.yaml", "docs/auth.md"],
"config-scout": [".env.example"],
"design-scout": [],
"dependency-mapper": ["package.json"]
},
"total_surfaces": 3,
"excluded_surfaces": 1
}
在进入 PLAN 时,project-surface-router 需要对 surface-routing.json 进行复核:
surface-routing.json 中的 scout_assignments| 关系 | 说明 |
|------|------|
| 前置 | impact-scan/SKILL.md 必须先完成 |
| 后置 | clarify/SKILL.md Step 3 Surface Routing 使用本 skill |
| 并行 | PLAN 阶段 docs-scout、design-scout、config-scout 等 scouts 以本 skill 的输出为路由依据 |
Invoke skill: project-surface
Epic: <epic-name>
Input: .harness/features/<epic-id>/impact-scan.md + .harness/project-profile.yaml + optional cross-repo-impact-index.json
Output: .harness/features/<epic-id>/surface-routing.json
repo_id 在单仓可为空字符串;multi-repo 时填 catalog 中的 repo_id。evidence_level 可取 catalog | codemap | source。
serves_roles 是可选字段;未启用 coupling_role_ids 的项目不要凭空新增该字段。
development
在 generate-test-cases 阶段之后执行,逐个验证测试用例并在失败时修复项目代码、重新编译部署、再次验证, 直到通过或达到最大修复次数。覆盖 UI / API / API+UI / 性能测试四个维度,UI 测试通过浏览器真实模拟用户操作并截图, API 测试根据项目代码生成可执行的接口脚本,性能测试调用现有性能/质量技能全量执行。 涉及真实用户登录信息(如手机号+验证码、账号密码、JWT)时必须中断要求用户提供,禁止编造无效凭证。 所有 case 状态变更必须通过 e2e-case-tracker.sh 脚本持久化,确保中途崩溃可恢复、无 case 遗漏。
development
# SKILL: e2e > **核心原则**: > 1. 测试范围跟着本次变动走。后端接口改了,对应的前端流程必须做联调验证;与本次需求无关的功能不测。对于涉及算法、转换准确率等质量敏感型需求,需额外生成专项质量测试。 > 2. **覆盖完整性优先于执行便利性**。不得以"链路复杂"、"需要外部依赖"为由跳过本次变动相关的用例;凡是受变动影响的接口和 UI 流程,都必须生成真实调用/操作用例。 > 3. **UI 测试必须模拟真实用户操作**(定位元素、点击、键入、等待渲染、断言可见文本/状态)。**禁止**将 UI 套件退化为浏览器上下文里的 `page.evaluate(fetch(...))` API 验证——那只是把 API 测试换了执行环境,没有额外价值,不算 UI 测试。 > 4. **通用性**:本 skill 不假设具体业务域,所有规则均以抽象变动面(文件、接口、页面、用户动作)为单位组织,不针对任何特定项目的数据库/领域词汇。 > 5. **E2E 套件必须验证运行时行为**。严禁把"读取源码/配置文件并做字符串/结构匹配"的检查封装成独立 E2E 套件——这类检
tools
# SKILL: deploy ## CLI Bootstrap 在执行任何 `harnessctl` 命令前,先解析本地 CLI 路径: ```bash if [ -z "${HARNESSCTL:-}" ]; then candidates=( "./stage-harness/scripts/harnessctl" "../stage-harness/scripts/harnessctl" "$(git rev-parse --show-toplevel 2>/dev/null)/stage-harness/scripts/harnessctl" ) for candidate in "${candidates[@]}"; do if [ -n "$candidate" ] && [ -x "$candidate" ]; then HARNESSCTL="$candidate" break fi done fi test -n "${HARNESSCTL:-}" && test -x "$H
tools
# SKILL: build ## CLI Bootstrap 在执行任何 `harnessctl` 命令前,先解析本地 CLI 路径: ```bash if [ -z "${HARNESSCTL:-}" ]; then candidates=( "./stage-harness/scripts/harnessctl" "../stage-harness/scripts/harnessctl" "$(git rev-parse --show-toplevel 2>/dev/null)/stage-harness/scripts/harnessctl" ) for candidate in "${candidates[@]}"; do if [ -n "$candidate" ] && [ -x "$candidate" ]; then HARNESSCTL="$candidate" break fi done fi test -n "${HARNESSCTL:-}" && test -x "$HA