180 lines
11 KiB
Markdown
180 lines
11 KiB
Markdown
---
|
|
name: finalize-task-routing
|
|
description: PLAN/CODE_REVIEW 작성 직전 현재 작업 증거만으로 cloud/local lane과 G01-G10 등급을 독립 평가하고 canonical 파일명을 확정한다. 최초 plan, review 실패 후 follow-up plan, 라우팅 재평가, lane/G 판단, routed filename 결정에 사용한다.
|
|
---
|
|
|
|
# Finalize Task Routing
|
|
|
|
## 목적
|
|
|
|
계획 분석이 끝난 뒤 구현과 리뷰 target의 lane과 G 등급을 처음부터 평가하고 canonical 파일명을 반환한다.
|
|
이 스킬은 라우팅 판단의 단일 원본이며 plan/review 내용을 작성하거나 task 파일을 직접 생성하지 않는다.
|
|
|
|
## 언제 호출할지
|
|
|
|
- `plan`이 최초 PLAN/CODE_REVIEW pair를 쓰기 직전
|
|
- `code-review`의 WARN/FAIL 후 `plan`이 follow-up PLAN/CODE_REVIEW pair를 다시 쓰기 직전
|
|
- 기존 lane/G 판정이 검증 실패, 증거 충돌, 범위 변화, 소유권 변화로 무효화된 뒤 재평가할 때
|
|
- 사용자가 현재 작업의 cloud/local, G 등급, canonical task 파일명만 요청할 때
|
|
|
|
## 입력
|
|
|
|
- `targets`: `build`, `review`, 또는 둘 다. `plan`은 항상 둘 다 전달한다 (필수)
|
|
- `evaluation_mode`: 이전 라우팅이 없는 최초 평가는 `first-pass`, 무효화된 기존 라우팅이 있는 평가는 `isolated-reassessment` (필수)
|
|
- `task_snapshot`: 사용자 요구, 현재 scope, 수정/영향 경로, 불변조건, 상태 전이, 검증 계획과 실제 증거 (필수)
|
|
- `context_snapshot`: 함께 유지해야 하는 source/test/diff/log/contract 범위와 분할 가능성 (필수)
|
|
- `ownership_snapshot`: 공유 상태, 병행 작업, sibling task, 외부 책임 경계 (필수)
|
|
- `decision_snapshot`: 미해결 의미 판단, 사용자 권한이 필요한 결정, 외부 환경 의존성 (필수)
|
|
- `invalidation_evidence`: 검증 실패, 실제 로그, review finding, 변경된 범위 등 현재 판정을 바꾸는 원시 증거 (선택)
|
|
|
|
이전 `lane`, `grade`, 점수, 라우팅 사유, routed filename은 입력에서 제외한다.
|
|
이전 PLAN/CODE_REVIEW 문서의 코드 경로, 실제 로그, finding은 원본에서 재확인한 뒤 원시 증거로만 사용할 수 있다.
|
|
|
|
## 먼저 확인할 것
|
|
|
|
- [ ] `agent-ops/skills/common/finalize-task-routing/scripts/finalize-task-route.sh`가 실행 가능한가
|
|
- [ ] 호출자가 plan 분석, scope, split, 검증 계획을 모두 확정했는가
|
|
- [ ] `targets`마다 필요한 구현 또는 리뷰 작업이 구분되어 있는가
|
|
- [ ] 이전 lane/G와 그 평가 문구가 입력에서 격리되었는가
|
|
- [ ] `isolated-reassessment`이면 이전 평가를 보지 않은 새 평가 context/sub-invocation에 중립 snapshot만 전달했는가
|
|
- [ ] 주장이나 요약이 아니라 현재 파일, diff, 명령 출력, 확정된 제약을 우선 증거로 사용했는가
|
|
|
|
## 실행 절차
|
|
|
|
1. **평가 상태 초기화**
|
|
- 호출할 때마다 각 target을 `unrouted`로 시작한다.
|
|
- `isolated-reassessment`는 이전 평가가 없는 새 context/sub-invocation에서 실행하고, 현재 원시 증거로 재구성한 중립 snapshot만 노출한다.
|
|
- 호출자가 격리 실행을 제공할 수 없으면 독립 재평가를 완료했다고 주장하지 말고 `status: blocked`, `blocked_reason: isolated-routing-unavailable`을 반환한다.
|
|
- 이전 lane/G를 승계하거나 하한으로 사용하지 않는다.
|
|
- 실패 횟수, Required 개수, 이전 G 등급만으로 cloud 또는 상위 G를 선택하지 않는다.
|
|
- 실패는 자동 승격 조건이 아니라 현재 증거에 추가되는 판정 무효화 사건으로만 취급한다.
|
|
- 새 결과가 확정되기 전에는 이전 평가와 비교하지 않는다. 필요하면 호출자가 routed 출력 이후에만 감사용 delta를 기록한다.
|
|
|
|
2. **폐쇄성 평가**
|
|
- 각 target을 bounded local execution으로 완료·판정할 수 있는지를 기준으로 아래 값을 `true`, `false`, `unknown` 중 하나로 독립 판정하고 근거를 한 줄로 기록한다.
|
|
- `scope_closed`: 정확성 조건과 영향 경로가 확정된 범위 안에서 설명되는가
|
|
- `context_closed`: 중요한 증거를 생략하지 않고 필요한 컨텍스트를 함께 다룰 수 있는가
|
|
- `verification_closed`: 결정적인 명령과 관찰로 성공 여부를 증명할 수 있는가
|
|
- `evidence_trusted`: 검증이 의도한 실제 경로를 실행하며 출력이 재현 가능하고 현재 상태와 일치하는가
|
|
- `ownership_closed`: 공유 상태, 병행 작업, 외부 소유권이 판단을 모호하게 만들지 않는가
|
|
- `decision_closed`: 사용자 권한이나 미해결 외부 의미 결정 없이 작업을 완료할 수 있는가
|
|
- 동시성, dirty worktree, 외부 명령, 많은 finding은 그 자체로 lane을 결정하지 않는다. 위 폐쇄성에 미치는 영향만 평가한다.
|
|
|
|
3. **판정 가능성 확인**
|
|
- 하나라도 `unknown`이면 `status: needs_evidence`와 필요한 증거를 반환한다. lane, grade, filename은 반환하지 않는다.
|
|
- 하나 이상의 값이 `false`이고 cloud의 더 넓은 컨텍스트나 진단도 그 폐쇄 실패를 해소할 수 없으면 `status: blocked`, 폐쇄 실패별 `blocked_reason`, 해제 조건을 반환한다. 사용자 권한, secret, 접근 권한, 제품 결정은 대표적인 예일 뿐이며 이에 한정하지 않는다.
|
|
- 호출자는 `needs_evidence`를 cloud로 해석하지 말고 증거를 보강한 뒤 이 스킬을 처음부터 다시 실행한다.
|
|
|
|
4. **Lane 결정**
|
|
- 모든 폐쇄성이 `true`인 target만 `local`로 정한다.
|
|
- `unknown`이 없고 하나 이상의 폐쇄성이 `false`이며 cloud의 더 넓은 컨텍스트나 진단이 그 실패를 실제로 해소할 수 있을 때 `cloud`로 정한다.
|
|
- `false`를 cloud가 해소할 수 있는지 근거를 기록한다. 해소 가능성을 설명할 수 없으면 추측으로 cloud를 선택하지 않고 Step 3의 `blocked`를 반환한다.
|
|
- 실패 후에도 현재 폐쇄성이 모두 `true`이면 다시 `local`을 선택할 수 있다.
|
|
- lane은 capability fit이며 작업량이나 모델 사용량 균형을 위한 값이 아니다.
|
|
|
|
5. **G 등급 재산정**
|
|
- lane을 정한 뒤에만 각 target을 아래 다섯 차원에서 `0`, `1`, `2`로 처음부터 채점한다.
|
|
- `scope_coupling`: `0` 단일 국소 변경 / `1` 여러 연결 지점 / `2` 다중 모듈·계약
|
|
- `state_concurrency`: `0` 무상태 / `1` 상태 전이 / `2` 공유 상태·순서·동시성
|
|
- `blast_irreversibility`: `0` 내부 가역 / `1` 다중 호출자·설정·지속 상태 / `2` 외부 계약·권한·비가역 영향
|
|
- `evidence_diagnosis`: `0` 직접 증거 / `1` 복수 증거 조합 / `2` 충돌·불신 증거 진단
|
|
- `verification_complexity`: `0` 단일 결정 명령 / `1` 복수 단계·통합 검증 / `2` 외부·상호작용·장시간 검증
|
|
- grade는 `max(1, 다섯 점수의 합)`이며 유효 범위는 `G01`부터 `G10`이다.
|
|
- 이전 grade, 실패 횟수, lane 변경은 점수에 더하지 않는다.
|
|
|
|
6. **파일명 확정**
|
|
- 각 target에 대해 다음 명령을 실행하고 stdout의 grade와 filename을 그대로 사용한다.
|
|
|
|
```bash
|
|
agent-ops/skills/common/finalize-task-routing/scripts/finalize-task-route.sh \
|
|
<build|review> <local|cloud> \
|
|
<scope_coupling> <state_concurrency> <blast_irreversibility> \
|
|
<evidence_diagnosis> <verification_complexity>
|
|
```
|
|
|
|
- 모델이 점수 합산, zero-padding, prefix 조합을 직접 계산하지 않는다.
|
|
- 두 target은 같은 lane/G를 복사하지 말고 각자의 실행 범위로 독립 평가한다.
|
|
- 모든 요청 target이 `routed`일 때만 filename을 반환한다.
|
|
- 결과 확정 뒤 scope, 검증, 증거, 소유권, 결정 조건이 달라지면 결과를 무효화하고 Step 1부터 다시 실행한다.
|
|
|
|
## 실행 결과 검증
|
|
|
|
- [ ] 모든 요청 target에 여섯 폐쇄성 값과 현재 증거 근거가 있는가
|
|
- [ ] 재평가가 `isolated-reassessment`로 실행되었고 새 결과 전까지 이전 평가가 노출·비교되지 않았는가
|
|
- [ ] `unknown` 또는 `blocked` 상태에서 lane/G/filename을 만들지 않았는가
|
|
- [ ] 이전 lane/G, 실패 횟수, finding 개수를 승계하거나 자동 승격 근거로 사용하지 않았는가
|
|
- [ ] lane을 먼저 정하고 G 등급을 별도 차원 점수로 산정했는가
|
|
- [ ] 각 target에 formatter script를 실행했고 grade와 filename을 stdout 그대로 사용했는가
|
|
- [ ] build/review filename이 target별 formatter 결과와 정확히 일치하는가
|
|
- 검증 실패 시: 결과를 `unrouted`로 폐기하고 누락된 현재 증거부터 보강한 뒤 전체 평가를 다시 수행한다.
|
|
|
|
## 출력 형식
|
|
|
|
```yaml
|
|
status: routed | needs_evidence | blocked
|
|
evaluation_mode: first-pass | isolated-reassessment
|
|
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: "<current evidence>"
|
|
context_closed: "<current evidence>"
|
|
verification_closed: "<current evidence>"
|
|
evidence_trusted: "<current evidence>"
|
|
ownership_closed: "<current evidence>"
|
|
decision_closed: "<current evidence>"
|
|
lane: local
|
|
grade_scores:
|
|
scope_coupling: 1
|
|
state_concurrency: 1
|
|
blast_irreversibility: 1
|
|
evidence_diagnosis: 0
|
|
verification_complexity: 1
|
|
grade: G04
|
|
filename: PLAN-local-G04.md
|
|
review:
|
|
closures:
|
|
scope_closed: true
|
|
context_closed: false
|
|
verification_closed: true
|
|
evidence_trusted: false
|
|
ownership_closed: true
|
|
decision_closed: true
|
|
closure_basis:
|
|
scope_closed: "<current evidence>"
|
|
context_closed: "<current evidence>"
|
|
verification_closed: "<current evidence>"
|
|
evidence_trusted: "<current evidence>"
|
|
ownership_closed: "<current evidence>"
|
|
decision_closed: "<current evidence>"
|
|
lane: cloud
|
|
grade_scores:
|
|
scope_coupling: 1
|
|
state_concurrency: 1
|
|
blast_irreversibility: 1
|
|
evidence_diagnosis: 2
|
|
verification_complexity: 1
|
|
grade: G06
|
|
filename: CODE_REVIEW-cloud-G06.md
|
|
missing_evidence: []
|
|
blocked_reason: null
|
|
```
|
|
|
|
`needs_evidence` 또는 `blocked`에서는 해당 target의 `lane`, `grade_scores`, `grade`, `filename`을 `null`로 둔다.
|
|
|
|
## 금지 사항
|
|
|
|
- 이전 lane/G를 기본값, 최소값, 비교 기준으로 사용하지 않는다.
|
|
- 기존 평가가 있는 재평가를 같은 평가 context에서 수행하지 않는다.
|
|
- local 실패를 이유로 cloud로 자동 승격하지 않는다.
|
|
- 높은 local G로 cloud에 필요한 컨텍스트나 판단을 보상하지 않는다.
|
|
- 파일 수, 동시성, dirty 상태, Required 개수 같은 단일 휴리스틱으로 lane을 정하지 않는다.
|
|
- grade나 filename을 formatter script 출력과 다르게 수작업으로 만들지 않는다.
|
|
- `needs_evidence`를 `cloud`로 치환하거나 미완성 상태에서 routed filename을 만들지 않는다.
|
|
- PLAN, CODE_REVIEW, archive, complete.log 파일을 직접 생성·수정·이동하지 않는다.
|