iop/agent-ops/skills/common/finalize-task-routing/SKILL.md

162 lines
9.2 KiB
Markdown

---
name: finalize-task-routing
description: PLAN/CODE_REVIEW 작성 직전 build는 local-first로 라우팅하고 review는 실제 G와 고정 공식 리뷰 target을 확정한다. capability-gap 기반 cloud 선택과 follow-up 재평가에 사용한다.
---
# Finalize Task Routing
## 목적
build의 lane/G와 review의 G를 평가해 canonical 파일명을 확정한다.
공식 review는 항상 cloud의 Codex `gpt-5.6-sol` xhigh다. 이 스킬은 task 파일을 수정하지 않는다.
## 호출 시점
- `plan`이 최초 또는 follow-up pair를 쓰기 직전
- scope, 증거, 소유권, 결정 조건이 달라져 기존 route가 무효가 된 때
- 사용자가 현재 pair의 lane/G 판정을 요청한 때
## 입력
- `evaluation_mode`: `first-pass | isolated-reassessment`
- `targets.build`, `targets.review`: 각 target의 요구, scope, 영향 경로, 불변조건, 검증 계획과 실제 증거
- target별 `context_snapshot`: 함께 유지해야 할 source/test/diff/log/contract와 분할 가능성
- target별 `ownership_snapshot`: 공유 상태, 병행 작업, sibling task, 외부 책임
- target별 `decision_snapshot`: 미해결 의미 판단, 사용자 권한, 외부 환경 의존성
- build의 `loop_risk_snapshot`:
- `ordered_transitions`: `state_count`, `adverse_paths`, `evidence`
- `concurrent_consistency`: `actor_count`, `constraints`, `evidence`
- `boundary_contract`: `component_count`, `consumer_count`, `constraints`, `evidence`
- `structured_interpretation`: `mechanisms`, `hazards`, `evidence`
- `variant_product`: `independent_axis_count`, `combination_verification_required`, `evidence`
- `invalidation_evidence`: 실패 로그, review finding, 변경된 범위 등 재평가 근거
이전 lane/G, 점수, 라우팅 사유와 filename은 입력에서 제외한다. 이전 로그와 finding은 원본에서 확인한 사실만 사용한다. 확인된 부재는 0/false/빈 목록, 미확인은 `unknown`이다.
## 절차
### 1. 평가 격리
각 target을 `unrouted`로 시작한다. `isolated-reassessment`는 route 정보가 제거된 현재 snapshot만 평가한다. 중립 snapshot을 만들 수 없으면 `blocked: isolated-routing-unavailable`을 반환한다.
실패·review 횟수, Required/finding 개수와 이전 grade는 승격 조건이나 점수가 아니다.
### 2. 증거 gate
build와 review에 다음 값을 독립적으로 `true | false | unknown`으로 판정하고 파일·diff·명령 출력 근거를 한 줄씩 기록한다.
- `scope_closed`: 정확성 조건과 영향 경로가 확정됐는가
- `context_closed`: 중요한 증거를 빠뜨리지 않고 함께 다룰 수 있는가
- `verification_closed`: 결정적 명령과 관찰로 성공을 판정할 수 있는가
- `evidence_trusted`: 검증이 실제 경로를 실행하며 재현 가능한가
- `ownership_closed`: 공유 상태와 외부 소유권이 명확한가
- `decision_closed`: 사용자 결정이나 외부 의미 판단 없이 완료할 수 있는가
파일 수, 긴 문서, 동시성, dirty worktree와 finding 수만으로 `false`를 주지 않는다.
- closure 또는 build loop-risk 필드가 하나라도 `unknown`이면 `needs_evidence`다. 이를 `false`로 낮추지 않는다.
- closure `false`가 권한, secret, 사용자 결정, 환경·의존성 또는 신뢰할 증거 부재라면 `blocked`다.
- closure `false`를 cloud capability가 해소할 수 있을 때만 `capability-gap` 후보로 둔다.
### 3. G 등급
각 target을 다음 다섯 차원에서 독립적으로 `0`~`2`로 채점한다.
- `scope_coupling`: 국소 / 여러 연결 지점 / 다중 모듈·계약
- `state_concurrency`: 무상태 / 상태 전이 / 공유 상태·순서·동시성
- `blast_irreversibility`: 내부 가역 / 다중 호출자·지속 상태 / 외부 계약·권한·비가역
- `evidence_diagnosis`: 직접 증거 / 복수 증거 조합 / 충돌·불신 증거 진단
- `verification_complexity`: 단일 명령 / 복수 단계·통합 / 외부·상호작용·장시간
`grade = max(1, 점수 합)`이다. lane과 반복 횟수는 점수에 더하지 않는다.
### 4. Route basis
build basis를 하나만 선택한다.
- `local-fit`: 모든 closure가 `true`이고 G01~G08
- `grade-boundary`: 모든 closure가 `true`이고 G09~G10
- `capability-gap`: 하나 이상의 closure `false`를 cloud가 실제로 해소함
`capability-gap`에는 관측된 gap, source/test/diff/log 증거, cloud가 해소하는 방법을 모두 기록한다. 이 세 근거 없는 G01~G08 build cloud route는 금지한다. G09~G10에 실제 gap도 있으면 basis는 `capability-gap`으로 두고 grade 점수도 함께 보존한다.
review basis는 항상 `official-review`다. review G는 실제 복잡도 점수를 유지하고 G floor를 적용하지 않는다. lane은 `cloud`, 실행 target은 Codex `gpt-5.6-sol` xhigh로 고정한다. local worker의 자가검증은 공식 review를 대체하지 않는다.
### 5. Loop-risk audit
build의 다음 signature를 현재 증거로 기록한다.
- `temporal_state`: 상태 3개 이상과 partial/retry/cancel/recovery/stale/duplicate 경로
- `concurrent_consistency`: actor 2개 이상과 atomic snapshot/lock order/exactly-once/race-free 제약
- `boundary_contract`: component 3개 이상 또는 consumer 2개 이상과 validation/immutability/compatibility 제약
- `structured_interpretation`: parser/lexer/protocol assembly/multi-source merge와 nesting/quoting/precedence/deduplication 위험
- `variant_product`: 독립 variant 축 2개 이상과 조합 검증
signature와 `triggered`는 audit 정보다. lane/G를 바꾸지 않는다.
WARN/FAIL 후에는 현재 scope를 다시 평가한다. local에서 닫히면 local을 유지하고, plan/split/fixture/test 문제면 local에서 재구성한다. 실제 capability gap만 해당 새 PLAN 세대를 cloud로 보낸다. 고정 시도 횟수나 finding 재발로 cloud를 확정하지 않는다.
### 6. Canonical filename
모든 gate를 통과한 뒤 `pair` mode를 정확히 한 번 실행한다. finalizer는 lane을 입력받지 않고 route basis와 grade에서 lane을 산출한다.
```bash
agent-ops/skills/common/finalize-task-routing/scripts/finalize-task-policy.sh pair \
<build-route-basis> <true|false> \
<build-scope> <build-state> <build-blast> <build-evidence> <build-verification> \
official-review \
<review-scope> <review-state> <review-blast> <review-evidence> <review-verification>
```
`loop_risk.triggered`는 두 번째 인자에 전달하지만 route에는 영향을 주지 않는다. `unknown` 상태에서는 finalizer를 호출하지 않는다. 호출자는 저수준 formatter를 직접 실행하거나 lane, grade, filename을 수작업으로 만들지 않는다.
## 검증
- [ ] 두 target의 closure, 근거와 점수가 독립적인가
- [ ] closure나 loop-risk의 `unknown`에서 finalizer를 호출하지 않았는가
- [ ] G01~G08 build cloud route가 `capability-gap`이고 세 근거가 있는가
- [ ] build의 `local-fit`은 G01~G08, `grade-boundary`는 G09~G10인가
- [ ] review가 `official-review`, cloud, Codex `gpt-5.6-sol` xhigh인가
- [ ] signature와 반복 횟수가 route에 영향을 주지 않았는가
- [ ] finalizer 출력과 active filename이 일치하는가
## 출력 형식
```yaml
status: routed | needs_evidence | blocked
evaluation_mode: first-pass | isolated-reassessment
finalizer: finalize-task-policy.sh
finalizer_mode: pair
targets:
build:
closures: {scope_closed: true, context_closed: true, verification_closed: true, evidence_trusted: true, ownership_closed: true, decision_closed: true}
closure_basis: {scope_closed: "<evidence>", context_closed: "<evidence>", verification_closed: "<evidence>", evidence_trusted: "<evidence>", ownership_closed: "<evidence>", decision_closed: "<evidence>"}
route_basis: local-fit
capability_gap: none
grade_scores: {scope_coupling: 2, state_concurrency: 1, blast_irreversibility: 1, evidence_diagnosis: 1, verification_complexity: 1}
loop_risk: {matched_signatures: [boundary_contract], triggered: true}
lane: local
grade: G06
filename: PLAN-local-G06.md
review:
closures: {scope_closed: true, context_closed: true, verification_closed: true, evidence_trusted: true, ownership_closed: true, decision_closed: true}
closure_basis: {scope_closed: "<evidence>", context_closed: "<evidence>", verification_closed: "<evidence>", evidence_trusted: "<evidence>", ownership_closed: "<evidence>", decision_closed: "<evidence>"}
route_basis: local-fit
capability_gap: none
grade_scores: {scope_coupling: 1, state_concurrency: 1, blast_irreversibility: 1, evidence_diagnosis: 1, verification_complexity: 1}
lane: local
grade: G05
filename: CODE_REVIEW-local-G05.md
missing_evidence: []
blocked_reason: null
```
`capability-gap`이면 `capability_gap``observed`, `evidence`, `cloud_resolution`을 기록한다. `needs_evidence`/`blocked`에서는 finalizer와 route 결과를 `null`로 둔다.
## 금지 사항
- 이전 route나 반복 횟수로 자동 승격하지 않는다.
- signature로 cloud lane 또는 G floor를 강제하지 않는다.
- cloud가 해소할 수 없는 문제를 cloud route로 바꾸지 않는다.
- review에 universal cloud/G floor를 적용하지 않는다.
- PLAN, CODE_REVIEW, archive와 complete.log를 직접 수정하지 않는다.