Imported from MegasKomnenos/do-dag (
plugins/do-dag/skills/setup-do-dag/skills/verify-rounds/SKILL.md). Install upstream withnpx skills add MegasKomnenos/do-dag --skill verify-rounds. Copyright stays with the author.
verify-rounds
완성된 artifact의 defect을 찾고 고치는 round procedure다. session이 이 문서를 읽고 procedure를 operation한다. subagent는 자기 contract과 dispatch 지급물만 읽는다.
round 하나는 네 stage다:
- repair — repairer 여럿이 병행으로 defect을 찾는다. defect마다 findings(location·criterion·impact)과 완성된 repair(hunk)를 함께 담은 item 하나를 쓴다.
- merge — script가 편집 spans이 겹치거나 coupling으로 이어진 repair_items을 bundle으로 모은다. bundle마다 merger 하나가 item 하나로 recompression한다. 어느 bundle에도 들지 않은 item은 그대로 review로 간다.
- review — reviewer 여럿이 item마다 independence으로 approval·rejection을 round_verdict한다. quorum을 채운 item만 approval이 confirmed된다.
- apply — script가 approval item의 hunk을 artifact에 반영한다.
run은 0stage freeze(purpose·invariants·parameters fixed)로 start해 round를 반복하고 finish report로 end난다. apply 0이 이어지거나 round cap에 닿으면 finish한다. 각 round는 settlement 뒤 commit한다. 마지막 round는 finish report와 commit을 마친 뒤 parameters에 따라 run의 task file을 정리한다.
1. 용어
용어의 canonical은 이 스킬의 GLOSSARY.md다. 이 문서, common role contract 셋, contract/hunk.md, outputs contract, references의 문서 entire, brief은 procedure 개념을 그 용어로만 부른다. 새 개념은 GLOSSARY에 먼저 등재한다. exception는 둘이다: description은 invocation 라우팅 문구이고, references/rationale.md의 연혁 서술은 폐지된 용어를 그대로 쓴다.
subagent에게는 「common 용어」 절만 지급한다 — brief 템플릿의 용어 줄이 싣는다. 새 오독 measurement은 finish report에 GLOSSARY caution 승격 후보로 적는다.
design rationale: references/rationale.md §1.
1.1 문서 role
instruction층은 SKILL.md의 execution procedure, contract/ entire, references/brief.md, references/ledger.md다. instruction층은 수행할 행위·조건·입출력·failure processing를 직접 정한다.
설명층은 이 문서의 개요와 references/rationale.md다. 설명층은 structure·판단 rationale·하류 impact을 기술한다. 설명층의 문장은 instruction층이 가리키지 않으면 새 duty를 만들지 않는다.
2. discretion의 한계와 이탈 등급
2.1 discretion의 한계
session discretion은 둘이다: official script가 덮지 않는 task에서의 _ prefix auxiliary script 사용(§5.7) / area·perspective의 content 선정. discretion을 행사하면 ledger 운영 기록에 적는다.
예상 밖 판단이 §8 signal 4에 해당하면 그 signal로 다룬다. 해당하지 않으면 references/rationale.md에 비추어 정하고 ledger 운영 기록에 적는다.
2.2 이탈 등급
이탈 조항은 첫 position에 등급을 두고 result를 함께 적는다. 등급은 셋이며 format은 .claude/skills/write-for-reader/references/절차문.md S27이 정한다:
- forbidden — 어기면 일어나는 result를 그 조항이 함께 적는다. result를 따로 적지 않은 dispatch outputs의 violation은 §5.3 check procedure 7항이 defaultvalue이다
- escalate — session이 그 position에서 정하지 않고 §8로 보낸다. 올릴지 self processing할지는 §8이 정한다
- discretion — session이 정하되 ledger 운영 기록에 적는다.
design rationale: references/rationale.md §2.
3. 지향
지향은 둘이다. apply되는 변경은 하나하나가 improvement임을 approval받은 것이어야 한다. round를 아무리 반복해도 artifact이 purpose에서 멀어지지 않아야 한다.
방법은 값싼 round의 반복이다. 품질은 round 하나의 완벽함이 아니라 반복 수에서 얻는다. 한 round가 놓치거나 미룬 것 — rejection 오판, 반쪽 repair, 이웃이 지워진 position의 self_contained insertion 잔존 — 은 다음 round의 repair가 같은 procedure로 recovery한다.
design rationale: references/rationale.md §3.
4. parameters
4.1 list
| entry_name | defaultvalue | 센다 | 정하는 것 |
|---|---|---|---|
repair_seat_count |
4 | seat · repair stage마다 | 병행 repairer 수 |
repair_perspective_seat_count |
1 | seat · repair stage마다 | repairer 중 perspective을 맡는 seat의 수. 나머지는 area을 맡는다 |
review_seat_count |
3 | seat · review stage마다 | 병행 reviewer 수 |
review_quorum |
review_seat_count |
approval round_verdict · item마다 | item approval에 필요한 수 |
batch_item_cap |
48 | item · batch마다 | review batch 하나가 담는 item 수의 cap |
batch_input_cap |
500,000 | 바이트 · review dispatch마다 | review payload list(GLOSSARY)의 size 합에 대한 cap. 십진 바이트 |
round_floor |
2 | round · run마다 | finish signal를 apply하지 않고 반드시 도는 수 |
round_cap |
6 | round · run마다 | 이 수에 이르면 §7 round round_verdict order clause 3으로 finish한다 |
closing_zero_streak |
1 | round · run마다 | apply 0이 몇 회 연속되면 finish하는가 |
model_preset |
- | preset · run마다 | §5.1의 role별 model 계열 |
escalation_self_judgment |
on | on·off · run마다 | §8 signal의 processing actor. on이면 session이 self 판단으로 escalate 여부를 정하고, off이면 감지한 signal 전부를 올린다 |
temp_file_cleanup |
on | on·off · run마다 | finish report 뒤에 anchor와 round directory를 제거하는가 |
다른 parameters entry_name인 defaultvalue은 그 confirmed value을 물려받는다.
4.2 제약
1~6항은 0stage confirmed 뒤 한 번 inspection하고, violation하면 round 1 ledger_before에 §8 signal 6으로 올린다. 7항은 round마다 inspection한다:
review_quorum은review_seat_count를 넘지 못하고, 그 절반을 넘어야 한다.review_seat_count는 2 이상이다.repair_perspective_seat_count는 1 이상repair_seat_count미만이어야 한다.round_floor≤round_cap.round_floor0은 첫 round finish를 허용한다.- 두 cap의 0은 그 cap을 apply하지 않는다는 뜻이다(무제한). 둘 다 0이면 split이 발동하지 않는다.
- 0을 받을 수 있는 parameters는 4항의
round_floor과 5항의 두 cap뿐이고, 나머지 수 parameters는 1 이상이다.escalation_self_judgment과temp_file_cleanup는 수가 아니라 on·off을 받는다.model_preset은claude-full·mixed·codex-full중 하나다. batch_input_cap이 0이 아닐 때, fixed payload의 size 합이 standalone으로 cap 이상이면 §8 signal 5다 — 합이 cap과 같으면 variable payload을 실을 position가 0바이트다. fixed payload은 review dispatch이 batch와 무관하게 싣는 다섯이다:contract/review.md,contract/hunk.md,contract/output.md,GLOSSARY.md, freeze file. variable payload은 그 batch의reviewtarget.md하나이고, split된 round에서는reviewtarget_batch<K>.md하나다. inspection position는 ledger round header의 measuringvalue 대조다.
4.3 profile
| parameters | lightweight | standard | full |
|---|---|---|---|
repair_seat_count |
3 | 4 | 6 |
repair_perspective_seat_count |
1 | 1 | 2 |
review_seat_count |
2 | 3 | 3 |
review_quorum |
2 | 3 | 3 |
round_floor |
1 | 2 | 3 |
round_cap |
2 | 6 | 8 |
closing_zero_streak |
1 | 1 | 2 |
profile table에 없는 parameters는 어느 profile에서든 defaultvalue을 쓴다.
4.4 층위
뒤가 앞을 덮는다: defaultvalue → profile → freeze file. invocation value은 0stage에서 freeze file에 적고 freeze file을 canonical으로 쓴다.
value의 도중 변경은 round를 멈추고 freeze file을 고치게 하며, 멈춘 round는 repair stage부터 다시 돈다. 다시 도는 round는 같은 number를 쓴다. session이 ledger의 그 round 절 전부와 roundN/의 file 전부를 지우고 새로 만든다. 변경 사실과 point_in_time을 ledger round header의 「parameters·assignment의 도중 변경」 절에 적는다. 이 층위는 parameters entire에 exception 없이 걸린다 — cap value self의 변경도 도중 변경 procedure를 탄다.
forbidden — freeze file의 산문 instruction(「여기서 멈춘다」류)로 round 수를 제한하는 것. 그 instruction는 §4.1 entry_name에 대응하지 않으므로 무효다. session은 round 1을 start하기 ledger_before에 그 요구를 round_cap value으로 고쳐 freeze file에 적는다.
design rationale: references/rationale.md §4.
5. model assignment과 dispatch common 규칙
5.1 assignment
Claude와 Codex의 같은 row은 같은 context budget과 role profile을 뜻한다.
| Claude | Codex |
|---|---|
| fable | gpt-5.6-sol |
| opus | gpt-5.6-terra |
| sonnet | gpt-5.6-luna |
effort 대비는 low 대 low, medium 대 medium, high 대 high다.
| stage | claude-full |
mixed |
codex-full |
|---|---|---|---|
| repair | opus high | opus high | gpt-5.6-terra high |
| merge | opus low | opus low | gpt-5.6-terra low |
| review | opus medium | gpt-5.6-terra medium | gpt-5.6-terra medium |
verify-rounds session self의 런타임은 이 parameters가 바꾸지 않는다. assignment에 강등 exception는 없다. 사용자가 다르게 instruction하면 따르고, 바꾼 assignment과 point_in_time을 ledger의 그 round header에 적는다. role별 dispatch 수단은 model 계열이 정한다. Claude model은 Agent 도구, Codex model은 codex CLI로 dispatch한다. reviewer 운용과 두 execution procedure는 §5.6이 각각 정한다.
5.2 number와 병행
병행 dispatch은 한 메시지로 동시에 보낸다. Claude Agent invocation은 run_in_background: false를 explicitness한다. codex execution의 start과 waiting는 §5.6의 codex 일반 execution procedure가 정한다.
- repairer는 1부터
repair_seat_count까지 seat number를 받고, area·perspective 배분이 seat에 붙는다. vacancy도 area·perspective entry_name으로 적는다. - merger는 seat number 대신 bundle ID로 가른다.
- reviewer는 1부터
review_seat_count까지 seat number를 받고, file명이 batch를 가른다.
5.3 check procedure (ledger_before stage common)
§7의 어느 position든 check은 이 procedure 하나다. dispatch outputs을 읽는 check은 그 dispatch의 completion signal 뒤에 start한다 — completion signal는 synchronous Agent invocation의 return이고, codex execution은 §5.6 codex 일반 execution procedure의 waiting invocation이 내린 completion round_verdict이다. forbidden — completion signal ledger_before에 outputs file을 읽어 completion로 round_verdict하거나 재dispatch하는 것. 어기면 낡은 outputs과 같은 frozen_path를 쓰는 두 dispatch을 가리지 못한다.
- official script를 execution한다(§5.7).
- exit 0이면 다음 걸음으로 간다. exit 2면 session이 commands을 고쳐 1로 돌아간다.
- exit 1이면 session이 그 script가 읽은 file을 열어 읽고, 어긋남의 거처를 가른다 — file인가 script인가. forbidden — 이 걸음을 건너뛰고 shortfall을 round_verdict하는 것. 어기면 rationale 없는 재dispatch이 나가고 그 재dispatch이 정상 outputs을 덮는다.
- 어긋남이 script에 있으면(contract이 연 format을 script가 못 읽는다) session이 script와 시험을 고치고, 시험 entire 초록을 확인하고, 고친 사실을 ledger 운영 기록에 적은 뒤 1로 돌아간다.
- 어긋남이 file에 있으면 script가 낸 어긋남대로 processing한다. processing는 6과 7 둘이다.
- review outputs의 coverage 미달 —
review_tally가 seat마다 coverage를 재고, 미달이면 remaining item ID를 낸다. session은 §5.6의 reviewer 운용 procedure에 따라 그 repair_items을 resume로 채우고 1로 돌아간다. - 그 밖 — 어긋난 file을 만든 쪽이 고친다. 둘로 갈린다:
- session이 만든 file(payload file·area spec·ledger material)이면 session이 고치고 1로 돌아간다.
- dispatch outputs이면 shortfall이다(GLOSSARY). 같은 brief으로 1회 재dispatch하고 1로 돌아간다. 재차 shortfall이면 stage마다 갈린다:
- repair — 그 seat를 vacancy으로 둔다. 나머지 seat의 outputs은 유지한다. vacancy seat가 맡은 area·perspective의 기재는 §7 repair stage의 「repair vacancy」이 정한다.
- merge — 그 bundle을 vacancy으로 두고 composition item entire을 이번 round에서 뺀다 — recovery는 다음 round의 repair다. 빼는 걸음은 셋이다:
merge_check과review_payload에--vacancy <bundleID>를 싣고, ledger main table의 composition item row status를 「vacancy」으로 session이 직접 적고, reason 절에 vacancy reason를 적는다. - review — vacancy을 두지 않는다. 그 seat·batch를 다시 dispatch해 quorum을 채운다. 같은 seat·batch가 세 번 shortfall이면 §8 signal 7이다.
§7이 그 position의 processing를 따로 정한 check은 그 조항이 7항을 대신한다 — area check·reanchor·apply의 verbatim 대조 셋이다. area check과 reanchor의 어긋남은 §8 signal 6이다. apply의 verbatim 대조는 session이 clause 3으로 어긋남의 거처를 가르고, run 밖 편집이 cause일 때 §8 signal 6이다.
forbidden — dispatch outputs을 요약 return문으로 갈음하는 것. return문만 있고 outputs file이 없으면 session이 shortfall으로 processing한다. 모든 dispatch은 contract/output.md에 따라 outputs file을 직접 쓴다.
5.4 brief
brief의 골격은 references/brief.md의 템플릿 셋이 정한다. 모든 dispatch은 contract/output.md를 쓴다. session은 slot만 채우고 다른 문장을 더하지 않는다. 임무·format은 common role contract에 있고, file processing·outputs 전달·자기 check은 outputs contract에 있다. 채운 brief은 §9의 entry_name으로 preservation한다.
- 템플릿의 「읽지 않는 것」 절은 닫힌 coordinate를 요구한다. 해당하는 file이 없는 coordinate는 「none」으로 적는다. run 중간물의 coordinate는
<run>과<run>/roundN/의 직속으로 한정한다 — artifact이_prefix file을 담아도 그 copy이 subagent의 reading_access scope에 남아야 한다. - freeze file에 length cap이 있으면 세 brief 모두에 file별 cap과 현재 row 수 table를 slot대로 싣는다.
- brief과 contract에 parameters value을 싣지 않는다. freeze file을 통한 exposure은 수용하되 review criterion으로 쓰지 않는다.
- 사안 구체 content을 brief에 더 싣고 싶으면 brief이 아니라 freeze file을 고친다 — §4.4의 도중 변경 procedure를 탄다.
5.5 dispatch input과 outputs의 기계 processing
session은 dispatch input과 outputs을 기계로 다룬다. 이 절의 두 check이 어긋나면 §5.3 check procedure로 processing한다. 아래 두 format은 item별 절을 두는 input file에 걸린다.
- input file의 item_title 위계 — item 절의 item_title을
## <item ID>한 줄로 두고, 그 item에 딸린 content 전부를 그 절 안에###이하로 둔다. item을 묶는 item_title은#로 두고 그 아래에 body을 두지 않는다. forbidden — item 아닌 절을##로 두거나 item의 body을 item 절 밖에 두는 것. 어기면 batch split이 그 절을 item으로 세거나 그 body을 떼어내고, item의 body이 잘린 채 dispatch에 실린다. - verbatim의 울타리 — input file이 나르는 verbatim(hunk의 original·replacement wording, criterion 인용)는 코드 울타리 안에 담는다. forbidden — 울타리 없이 body에 두는 것. 어기면
##로 start하는 verbatim 줄이 item 절 item_title과 같은 층에 서서 batch split이 인용 한가운데를 item boundary로 읽는다. - payload ledger_before check — review payload file을 만드는 subcommand이 그 file frontmatter에
item: <N>으로 그 file이 담은 item 수를 적는다. review payload file은review_payload이 만드는reviewtarget.md와split이 만드는reviewtarget_batch<K>.md다. session은 dispatch 직전에payload_check으로 file의 item 절 수를 그 batch가 요구한 item 수와 대조한다. 어긋난 채로 dispatch하지 않는다. - outputs reading의 대조 — session이 dispatch outputs을 official script로 읽는다. 읽은 item 수와 그 file frontmatter가 적은 수의 대조는 item file을 읽는 subcommand entire이 내장한다(§5.7). common role contract 셋이 그 수를 싣는다:
contract/repair.md의item,contract/merge.md의hunk,contract/review.md의approval과rejection의 합.
5.6 reviewer 운용과 dispatch 수단별 execution
reviewer 운용 procedure와 dispatch 수단별 execution procedure는 서로 independence이다. reviewer 운용 procedure는 dispatch 수단과 무관하게 쓴다. codex 일반 execution procedure와 Claude Agent execution procedure는 role과 무관하게 쓴다. 어느 procedure든 §5.2·§5.3·§5.5를 그대로 apply한다.
reviewer 운용 procedure
-
dispatch 단위 — reviewer 한 seat와 batch 하나의 조합이 새 컨텍스트의 dispatch 하나다. seat·batch마다
dispatch_review_<seatnumber>[_batch<K>].md를 쓰고, outputs은review_<seatnumber>[_batch<K>].md에 받는다. brief file은 preservation본이자 dispatch 수단에 주는 input이다. -
execution과 check — §5.1이 정한 dispatch 수단으로 brief을 execution하고 outputs을 저장한다.
contract/output.md를 지급한다. 저장 뒤 §7의review_check을 execution한다. exit 1·2는 §5.3 check procedure로 processing한다. -
resume —
review_tally가 seat의 coverage 미달과 remaining item ID를 내면(§5.3), 그 seat·batch의 dispatch 컨텍스트를 이어 remaining item만 round_verdict시킨다. remaining item이 한 seat의 batch 둘에 걸치면 batch마다 resume 하나를 낸다.references/brief.md「review resume」의 slot을 채워dispatch_review_<seatnumber>[_batch<K>]_resume<R>.md로 쓰고, outputs은review_<seatnumber>[_batch<K>]_resume<R>.md에 받는다. 같은 seat·batch의 resume는 처음 dispatch의 컨텍스트 식별자를 계속 쓰며,<R>이 둘 이상이어도 식별자를 새로 얻지 않는다. dispatch 수단별 식별자 획득과 resume commands은 그 수단의 execution procedure가 정한다. resume가 그 seat의 coverage를 늘리지 못하면 §8 signal 5다. -
resume check — resume outputs 저장 뒤 아래 commands을 execution한다.
<remaining item ID>마다--item을 하나씩 반복한다. exit 1·2는 §5.3 check procedure로 processing한다:python .claude/skills/verify-rounds/scripts/vr.py review_check --review <resume outputs file> --seat <seatnumber> --item <remaining item ID> [--item <remaining item ID> ...]
codex 일반 execution procedure
codex exec execution 하나가 role과 무관한 새 컨텍스트의 dispatch 하나이고, codex exec resume execution은 그 dispatch의 컨텍스트를 잇는다. 이 procedure는 brief의 content·file entry_name·outputs check을 정하지 않는다. 그것들은 해당 role의 procedure가 정한다.
모든 codex exec dispatch에 contract/output.md를 지급한다.
dispatch 가능 단위는 gpt-5.6-sol·gpt-5.6-terra·gpt-5.6-luna 셋이다. §5.1 또는 사용자가 정한 단위와 effort을 <model>·<effort>에 넣는다.
-
새 dispatch — repository 루트에서 execution한다.
<return file>은 해당 role의 outputs file entry_name 앞에_return_을 붙이고 확장자를.txt로 바꾼 entry_name이다.<로그 file>은 같은 방식으로_로그_를 붙인다. 프롬프트 argument-가 standard input에서 brief을 읽게 한다:codex -a never exec -C <repository 루트> -s danger-full-access -m <model> -c model_reasoning_effort=<effort> -c mcp_servers={} - < <brief file> > <return file> 2> <로그 file> -
resume — session ID는 처음 dispatch의 로그 file
session id:줄에서 읽는다. 같은 컨텍스트를 여러 번 resume해도 처음 얻은 ID와 처음 dispatch의 model·effort을 그대로 쓴다:codex -a never exec resume <session ID> -m <model> -c model_reasoning_effort=<effort> -c sandbox_mode="danger-full-access" -c mcp_servers={} - < <resume 지시문 file> > <resume return file> 2> <resume 로그 file>codex exec resume는-C·-s를 받지 않는다 — task directory는 execution coordinate(repository 루트)가 정하고, 샌드박스는-c sandbox_mode="danger-full-access"가 정한다. -
PATH 정비 — execution ledger_before에 같은 셸의 PATH에서
WindowsApps를 뺀다. 예:export PATH="$(echo "$PATH" | tr ':' '\n' | grep -vi windowsapps | paste -sd:)". 남겨서 하위 프로세스 generation이 failure하면 vacancy으로 processing하지 않고 PATH를 고쳐 다시 execution한다. -
forbidden —
-c model_reasoning_effort=<effort>의 생략. 사용자 config.toml의 default effort이 high라서, 생략하면 high로 돈다. -
forbidden —
danger-full-access와-a never의 생략·변경. 새 dispatch과 resume에 같은 value을 쓴다. 비대화식 dispatch이 권한 요청이나 샌드박스 boundary에서 멈추면 completion round_verdict이 설 수 없다. -
outputs의 거처 — dispatch된 에이전트가
contract/output.md에 따라 role procedure가 정한 outputs file을 직접 쓴다. 마지막 메시지는 outputs file frozen_path와 counts만 담고 return file에 저장된다. -
병행과 completion — start ledger_before에 이번 execution의 outputs·return·로그 frozen_path entire이 부재함을 확인한다. outputs file이 있으면 열어 읽고, terminal outputs이면 execution 없이 쓴다. 불완전한 outputs과 remaining return·로그 file은 entry_name을 바꿔 치운 뒤 start한다. execution마다 commands 하나를 백그라운드 Bash로 start하고, 병행 execution entire을 한 메시지에 담는다. start 직후부터 아래 waiting invocation을 포그라운드 Bash로 반복한다. completion 통지를 기다리며 턴을 마치지 않는다.
python .claude/skills/verify-rounds/scripts/wait_outputs.py <return file ...>invocation 하나가 30초 간격 inspection 스무 번(약 570초)이므로 Bash 도구 argument에
timeout: 600000을 준다. default timeout 120초로 부르면 waiting가 매번 중도에 끊긴다.exit 0(argument frozen_path entire이 size 0보다 큰 file)이 completion round_verdict이다. directory는 item 유무와 관계없이 completion로 보지 않는다. exit 3이면 같은 invocation을 다시 내는 반복 루프를 돈다. waiting 총합이 60분을 넘긴 execution은 §5.3의 shortfall으로 processing하고, 그 로그 file을 열어 cause을 ledger 운영 기록에 적는다. completion 뒤 shortfall은 §5.3을 따른다.
-
MCP 차단 —
-c mcp_servers={}로 MCP 서버를 끈다.
Claude Agent execution procedure
- 새 dispatch — Agent 도구에 채운 brief을 주고
run_in_background: false로 execution한다.subagent_type에는.claude/agents/gp-matrix/의 에이전트 entry_namegp-<model>-<effort>을 적는다.<model>과<effort>은 §5.1이 그 stage에 정한 value이다.contract/output.md를 지급한다. - resume — 처음 dispatch의 에이전트 식별자로 resume brief을 보낸다. 새 에이전트를 만들지 않는다.
- outputs — Claude Agent가
contract/output.md에 따라 brief이 지정한 outputs file을 직접 쓴다. - completion — Agent invocation의 return을 completion signal로 쓴다. completion signal 뒤 outputs file의 existence를 확인하고 §5.3 check procedure를 execution한다.
5.7 official script
session의 기계 task은 official script scripts/vr.py로 execution한다. execution coordinate는 repository 루트다:
python .claude/skills/verify-rounds/scripts/vr.py <subcommand> [argument]
§7이 subcommand마다 그 position의 invocation 형태를 적는다. argument의 상세와 입output format의 canonical은 vr.py <subcommand> --help이고, 둘이 어긋나면 --help가 이긴다. 판단은 session이 하고 script는 argument로 지정을 받는다.
common contract은 넷이다:
- finish 코드 — 0은 success, 1은 어긋남(format violation·verbatim 불일치·check 불일치 — stderr에 file·row·expected·measurement coordinate), 2는 사용·environment error(argument shortfall·file 부재·reading 불가)다. 세 value의 processing는 §5.3 check procedure다.
- 수치 output — success은 explicitness 수치를 standard output으로 낸다. 0건도 수치로 낸다. 빈 output이 success을 겸하지 않는다.
- frontmatter check 내장 — item file을 읽는 subcommand entire이 frontmatter
item:(또는 common role contract 셋의 counts key) 대 measurement 절 수 대조를 스스로 한다(§5.5). - intermediate outputs — subcommand의 기계 intermediate outputs은
_prefix file로 input file의 directory에 선다 — 정상 흐름에서 round directory다. §9의_rule(canonical 아님, payload forbidden)이 그대로 걸린다.
subcommand 19개와 맡는 task:
| position | subcommand | 맡는 task |
|---|---|---|
| 0stage | anchor |
첫 round ledger_before artifact copy |
| round 준비 | copy |
round copy |
| repair | area_check |
area 합집합·비중첩 check |
| repair | reanchor |
row scope area의 round reanchor |
| repair | repair_parse |
repair outputs reading·ID 부여·hunk coordinate와 verbatim validation·item.md assembly |
| repair | repair_check |
repairer 한 seat의 outputs을 읽기 전용으로 check |
| merge | bundle |
intersection·coupling edge의 이행 폐쇄, hunk normalization, merge payload file generation |
| merge | merge_check |
merge outputs의 hunk key 대조와 reading |
| merge | merger_check |
merger 하나의 outputs을 읽기 전용으로 check |
| review | review_payload |
review target entire의 reviewtarget.md assembly |
| review | payload_check |
§5.5 payload ledger_before check |
| review | cap |
cap measuring·batch 수 산정 |
| review | split |
review input file의 batch split |
| review | review_tally |
quorum·disposition 보수 merge·seat마다 check |
| review | review_check |
저장된 review outputs 한 file의 format·coverage를 읽기 전용으로 check |
| apply | apply |
approval hunk의 서로소 inspection·verbatim 대조·reverse_order 반영 |
| ledger | ledger_head |
ledger round header 기재 |
| ledger | ledger_update |
main table·bundle compositiontable·reason 절·status ledger_write |
| round round_verdict | final_tally |
apply counts·round round_verdict·settlement 절 기재 |
official script가 덮지 않는 task은 여섯이다: §8의 succession inspection와 signal processing / brief slot 채우기 / dispatch 수단의 병행 execution / finish report 작성 / round commit / finish 뒤 정리. finish report 수치는 final_tally를 쓴다. invariants 재measurement은 §7 apply stage를 따른다.
래칫 조항은 셋이다:
- forbidden — official script가 덮는 task을 temporary script로 하는 것. 어기면 temporary outputs을 버리고 official script로 다시 execution한 뒤 ledger에 적는다.
- official script가 덮지 않는 task에는 §2.1 discretion대로
_prefix auxiliary script를 써도 된다. ledger 운영 기록에 셋을 적는다: script entry_name / 맡은 task / official script가 그 task을 덮지 않는다는 판단의 rationale. - finish report가 그 run의
_auxiliary script entire을 official script 승격 후보로 적는다 — §7 finish report의 여덟째 항이다.
design rationale: references/rationale.md §5.
6. hunk
hunk의 notation·intersection·normalization·apply 규약의 canonical은 contract/hunk.md다. subagent 셋이 그 file을 지급받고, official script가 같은 규약을 구현한다. session은 hunk을 authoring하지도 round_verdict하지도 않는다 — hunk을 다루는 session task은 전부 official script invocation이다(§5.7).
design rationale: references/rationale.md §6.
7. procedure
이 절의 commands은 전부 official script invocation이고 repository 루트에서 execution한다. common contract과 finish 코드 processing는 §5.7이다. commands에서 <run>은 task directory frozen_path, <N>은 round number다.
0stage — freeze
round ledger_before에 한 번 한다. task directory defaultvalue은 temporary/<artifact entry_name>_validation_<날짜>/다:
-
사용자 instruction와 parent 문서로 purpose 진술과 invariants list을 쓴다. rationale 없이 더한 item은 round 1 ledger_before에 사용자 확인을 받는다. 결론·required 논거·required facts·length cap이 없으면 각각 「none」으로 적는다. 「criterion source_text」 절에는 apply rule·parent 문서의 source_text frozen_path entire을 적는다. 「artifact」 절은 artifact list의 canonical이므로 format이 닫혀 있다 — repository 상대 frozen_path 하나를
- <frozen_path>한 줄로 적고, 절대 frozen_path와 중복 frozen_path를 두지 않는다. official script가 이 절을 읽어 artifact·copy frozen_path를 파생하므로, session이 같은 list을 commands argument로 다시 적지 않는다. -
parameters entire을 §4.4 order로 confirmed해 적는다.
-
freeze.md는 artifact / purpose 진술 / invariants list / parameters / area 배분 / model assignment / anchor / criterion source_text 여덟 절만 둔다. model assignment은 §5.1과 다를 때만 차이를 적는다. -
forbidden — length cap을 배수로 적는 것. round 1 ledger_before에 row 수나 바이트의 절대 수치로 고친다.
-
anchor를 뜬다. artifact이 file 하나면
anchor.<확장자>로, 여럿이면anchor/아래 같은 directory structure로 선다:python .claude/skills/verify-rounds/scripts/vr.py anchor --run <run> --freeze <run>/freeze.md -
ledger.md를 만든다. format은references/ledger.md다. -
git diff --cached --quiet로 Git 색인이 비었는지 확인한다. 비어 있지 않으면 round 1을 start하지 않는다. 사용자가 기존 스테이징을 processing한 뒤 다시 확인한다. -
freeze file 「artifact」 절의 frozen_path마다
git status --short -- <frozen_path>를 execution한다. 변경이 있으면 round 1을 start하지 않는다. 사용자가 완성된 baseline을 commit한 뒤 다시 확인한다.
freeze file과 anchor는 이후 읽기 전용이다. freeze file 변경은 §8 signal 6으로 올린다.
round 준비 — 매 round
round N start 때 copy을 뜬다. roundN/이 서고, artifact이 file 하나면 copy.<확장자>, 여럿이면 copy/이 선다:
python .claude/skills/verify-rounds/scripts/vr.py copy --run <run> --round <N> --freeze <run>/freeze.md
ledger round header는 두 걸음이다. session이 material file roundN/_roundheader.md를 쓴다 — 절 entry_name과 담을 content은 references/ledger.md 1절이 정한다. 이 point_in_time에 아직 재지 않은 required 절은 body을 「unmeasured」으로 둔다. 그리고 기재를 execution한다. round active 중 기재가 늘면 material를 고쳐 같은 commands을 다시 execution한다:
python .claude/skills/verify-rounds/scripts/vr.py ledger_head --ledger <run>/ledger.md --round <N> --material <run>/roundN/_roundheader.md
1stage — repair
repairer를 repair_seat_count만큼 병행 dispatch한다. repair dispatch은 split하지 않는다 — 두 cap을 apply하지 않는다. order는 여섯이다:
-
area spec — session이 freeze file area 배분대로 spec file
roundN/_areaspec.md를 쓴다. format은area_check --help가 정한다. -
reanchor — row scope로 가른 area이 있을 때만 한다. freeze file이 적은 start·end row verbatim를 이 round copy에서 찾아 이 round의 row number를
roundN/_reanchor.json으로 outputs한다. spec file과 freeze file은 바꾸지 않는다. 이후 check과 brief의 coordinate는 outputs된 row number를 쓰고, 그 row number를 ledger round header에 적는다. verbatim가 그 file에 없거나 두 번 이상 나오거나 freeze file이 그 verbatim를 적지 않았으면(exit 1) §8 signal 6으로 올린다:python .claude/skills/verify-rounds/scripts/vr.py reanchor --run <run> --round <N> --freeze <run>/freeze.md --spec <run>/roundN/_areaspec.md -
area check — area들의 합집합이 artifact entire이고 서로 겹치지 않음을 inspection하고, result를 ledger round header에 적는다. 어긋나면 배분을 고치지 않고 §8 signal 6으로 올린다:
python .claude/skills/verify-rounds/scripts/vr.py area_check --run <run> --round <N> --freeze <run>/freeze.md --spec <run>/roundN/_areaspec.mdspec spans의 frozen_path는 artifact original_source frozen_path이고, copy 대응은 reanchor·repair_parse과 같은 규칙이다.
-
dispatch —
references/brief.md「repair」의 slot을 채워 seat마다roundN/dispatch_repair_<seatnumber>.md를 만들고,repair_seat_countentire을 한 메시지로 병행 dispatch한다(assignment은 §5.1, number는 §5.2). 주지 않는다: 이전 round의 item·ledger, defect의 expected, 의심 location, 심각도 사전 지정. 주지 않았다는 사실도 적지 않는다. -
reading — repair outputs entire을 읽는다. script가 item마다
R<round>-<sequence>ID를 붙이고, hunk coordinate·original verbatim를 copy과 대조하고, coupling 고지의 절 item_title을 item ID로 풀어item.md·_item.json을 만든다. verbatim 불일치·coordinate shortfall·format violation(exit 1)은 §5.3 check procedure로 processing한다. 같은 defect을 여러 repairer가 냈어도 session이 합치지 않는다 — 겹침은 merge이 흡수한다.--repair에는 outputs entire을 dispatch order대로 싣는다:python .claude/skills/verify-rounds/scripts/vr.py repair_parse --run <run> --round <N> --freeze <run>/freeze.md --repair <run>/roundN/repair_1.md [--repair ...]artifact list은 script가 freeze file 「artifact」 절에서 읽는다 — hunk frozen_path가 그 list 밖이면(사본 frozen_path를 적은 경우 포함) 어긋남이다.
-
ledger — item entire을 main table에 「raised」로 세운다. item이 0건이면 merge·review·apply을 건너뛰고 round round_verdict으로 간다:
python .claude/skills/verify-rounds/scripts/vr.py ledger_update --ledger <run>/ledger.md --round <N> --mode raised --input <run>/roundN/_item.json
배분의 규칙과 exception frozen_path는 둘이다:
- 배분 —
repair_perspective_seat_count는 perspective, 나머지는 area을 맡는다. area은 절·장·file의 자연 boundary로 나눈다. 필요한 area이 자연 boundary보다 많으면 바이트가 큰 boundary부터 세분하고, 적으면 작은 인접 boundary를 합친다. 더 나눌 자연 boundary가 없으면 바이트가 큰 boundary부터 row scope로 가른다. row scope는 file, start·end row, 양 end verbatim로 적는다. freeze file의 같은 배분을 모든 round에 쓴다. area·perspective 선정은 discretion이다. - repair vacancy — 재dispatch 뒤에도 vacancy인 seat가 맡은 area 또는 perspective을 session이 ledger round header의 area check result에 「검토되지 않음」으로 적는다.
2stage — merge
order는 넷이다:
-
bundle 형성 — script가 hunk intersection edge과 coupling 고지 edge을 합쳐 이행 폐쇄하고, size 2 이상의 connection 성분마다
R<round>-M<sequence>ID를 붙이며, bundle마다 hunk 합집합을 normalization해mergepayload_<bundleID>.md를 만든다. edge이 없는 item은 merge 없이 review로 간다. session이 edge을 더하거나 빼지 않는다. bundle이 0건이면 2~4항을 건너뛰고 review로 간다:python .claude/skills/verify-rounds/scripts/vr.py bundle --run <run> --round <N> --freeze <run>/freeze.md -
ledger — bundle compositiontable를 적고 composition item의 status를 「merge」으로 바꾼다:
python .claude/skills/verify-rounds/scripts/vr.py ledger_update --ledger <run>/ledger.md --round <N> --mode bundle --input <run>/roundN/_bundle.json -
dispatch —
references/brief.md「merge」의 slot을 채워 bundle마다roundN/dispatch_merge_<bundleID>.md를 만들고, bundle마다 merger 하나를 한 메시지로 병행 dispatch한다. outputs은merge_<bundleID>.md이고 임무의 boundary는contract/merge.md다. -
check — merge outputs을 payload key와 대조해 reading한다. hunk key가 payload과 다르거나(excess·omission) format이 어긋나면(exit 1) §5.3 check procedure로 processing한다. 재차 shortfall이면 그 procedure 7항의 merge vacancy frozen_path다 — vacancy bundle을
--vacancy으로 빼고 다시 execution한다:python .claude/skills/verify-rounds/scripts/vr.py merge_check --run <run> --round <N> [--vacancy <bundleID> ...]
3stage — review
reviewer를 review_seat_count만큼 병행 dispatch한다. reviewer 운용은 §5.6의 reviewer 운용 procedure를 따르고, dispatch 수단은 §5.1의 model 계열이 정한다. order는 일곱이다:
-
payload assembly — review target entire(merge 없이 온 item + merge item)을
reviewtarget.md로 모은다. item의 출처 seat number는 실리지 않는다. merge vacancy(§5.3)이 있으면--vacancy으로 그 bundle과 composition item을 뺀다:python .claude/skills/verify-rounds/scripts/vr.py review_payload --run <run> --round <N> [--vacancy <bundleID> ...] -
split — item 수나 input 바이트가 cap을 넘는지 재고, 넘으면 batch file(
reviewtarget_batch<K>.md)을 만든다. cap 0은 무제한이다. batch 수는 두 cap이 각각 요구하는 split 수 중 큰 쪽이다. item을 균등에 가깝게 가르되 item 절을 가르지 않는다. batch 하나라도 그 바이트와 fixed payload 바이트의 합이batch_input_cap을 넘으면 batch 수를 하나 늘려 다시 가른다. item 하나가 된 batch가 여전히 넘으면 §8 signal 5다. batch boundary는 모든 seat가 같이 쓴다. batch outputs을 한 file로 합치지 않는다 — batch outputs file들이 canonical이다. forbidden — 같은 seat의 다른 batch outputs을 dispatch에 싣는 것. 어기면 round_verdict independence성이 깨진다. fixed payload list은 argument가 아니다. script가 §4.2-7이 닫은 다섯을 스킬 루트와<run>에서 파생한다:python .claude/skills/verify-rounds/scripts/vr.py cap --run <run> --item_count <item 수> [--payload <batch payload file> ...] --item_cap <batch_item_cap> --input_cap <batch_input_cap> python .claude/skills/verify-rounds/scripts/vr.py split --file <run>/roundN/reviewtarget.md --batch_count <batch 수> -
payload ledger_before check — dispatch 직전에 payload file마다 §5.5의 payload ledger_before check을 한다:
python .claude/skills/verify-rounds/scripts/vr.py payload_check --file <payload file> --expected <그 batch의 item 수> -
dispatch —
references/brief.md「review」의 slot을 채워 seat·batch마다roundN/dispatch_review_<seatnumber>[_batch<K>].md를 만들고, §5.6의 reviewer 운용 procedure에 따라 병행 execution한다. §5.1의 model 계열에 맞는 새 dispatch procedure를 쓴다. 주지 않는다: 다른 reviewer의 round_verdict, 이전 round의 review reason. outputs 저장 뒤 seat·batch마다 아래 commands을 execution한다. exit 1·2는 §5.3 check procedure로 processing한다:python .claude/skills/verify-rounds/scripts/vr.py review_check --review <run>/roundN/review_<seatnumber>[_batch<K>].md --target <run>/roundN/reviewtarget[_batch<K>].md --seat <seatnumber> -
tally — item마다 approval round_verdict 수를 세어
review_quorum이상이면 approval confirmed한다. script가 seat마다 coverage를 잰다. disposition이 갈리면 보수적인 value이 선다. 보수 order: 사용자에게 올린다 > approval하되 고치지 않는다 > repair it.--review에는 그 round의 review outputs entire을 싣는다 — resume outputs도 함께 싣는다:python .claude/skills/verify-rounds/scripts/vr.py review_tally --run <run> --round <N> --target <run>/roundN/reviewtarget.md --review <run>/roundN/review_1.md [--review ...] --quorum <review_quorum> --seat_count <review_seat_count>coverage가 미달인 seat가 있으면 exit 1이고 그 seat의 remaining item ID가 어긋남에 선다. session은 §5.6의 reviewer resume procedure로 그 repair_items을 채우고, resume outputs을
--review에 더해 이 commands을 다시 execution한다. -
confirmed 뒤 processing — 「repair it」는 apply으로 간다. 「사용자에게 올린다」는 §8 signal 1이다 — succession inspection·self 판단·회신 processing는 §8이 정한다. 「approval하되 고치지 않는다」는 ledger에 「no_fix」으로 서고 apply에 싣지 않는다. quorum 미달은 rejection confirmed이고 reviewer의 rejection reason가 ledger에 남는다(다음 round의 재발 signal). confirmed disposition이 「repair it」이고 approval reviewer 기록에 「succession:」 줄이 있으면 session이 ledger signal processing 절에 succession를 적는다.
-
ledger — main table를 ledger_write한다. bundle의 confirmed은 composition item row에 propagation된다:
python .claude/skills/verify-rounds/scripts/vr.py ledger_update --ledger <run>/ledger.md --round <N> --mode review --input <run>/roundN/_review_tally.json
4stage — apply
script가 confirmed 「repair it」 item의 hunk entire을 모아 서로소를 inspection하고, hunk entire의 verbatim를 artifact original_source과 대조하고, entire이 일치할 때만 file마다 start이 큰 hunk부터 reverse_order으로 반영한다:
python .claude/skills/verify-rounds/scripts/vr.py apply --run <run> --round <N> [--add <item ID> ...] [--exclude <item ID> ...]
-
§8 processing로 disposition이 바뀐 item은
--add·--exclude로 반영 집합에 넣고 뺀다. -
중단 복구: verbatim 대조가 어긋나면(finish 1) script는 아무 file도 바꾸지 않는다. 어긋남은 전제 violation(run 밖 편집, script defect)이므로 session이 §5.3 check procedure clause 3으로 어긋남의 거처를 가른다. run 밖 편집이 cause이면 §8 signal 6으로 올린다. write 도중 중단이 나면 session이 artifact을 round copy으로 되돌린 뒤 다시 execution한다.
-
invariants 재measurement: freeze file invariants에 execution 가능한 inspection(시험·검사기)가 있으면 session이 apply을 마친 뒤 그 inspection를 재고, measurement commands과 result를 ledger 운영 기록에 적는다. 붉으면 §8 signal 6으로 올린다.
-
ledger: 반영 item의 status를 「apply」으로 적는다. bundle은 composition item row에 propagation된다:
python .claude/skills/verify-rounds/scripts/vr.py ledger_update --ledger <run>/ledger.md --round <N> --mode apply --input <run>/roundN/_apply.json
round round_verdict
session이 apply 건수를 세어 round_verdict을 내고, §8 signal 2·3을 직전 round와 대조한다. 성립하면 §8 signal 2·3으로 올린다. final_tally가 round_verdict outputs과 함께 이 round의 「round — settlement」 절을 ledger에 기재한다:
python .claude/skills/verify-rounds/scripts/vr.py final_tally --ledger <run>/ledger.md --round <N> --floor <round_floor> --cap <round_cap> --zero_streak <closing_zero_streak>
round_verdict order:
- round 수 <
round_floor이면 다음 round. - apply 0이
closing_zero_streak회 연속이면 finish. - round 수가
round_cap이상이면 finish. - 그 밖에는 다음 round.
apply 건수의 낱개는 main table에서 status가 「apply」인 row이다 — bundle 하나가 item 여럿을 닫아도 그 item row을 각각 센다.
-
finish report: round_verdict 2·clause 3이나 §8 signal 2·3 processing로 finish하면
finish_report.md를 쓴다. 0건은 「none」으로 적는다. 담는 것은 아홉이다:final_tally수치와 finish 항(clause 2 | clause 3 | §8 회신 | §8 self processing — §8 finish는 signal number도 적는다)- round별 raised·apply
- escalate·no_fix remainder
- self processing·succession entire
- 마지막 round settlement
- anchor 대조 변경 position
- GLOSSARY caution 승격 후보(오독이 measurement된 용어)
_auxiliary script 승격 후보- 운영 기록 gist
-
round commit: round round_verdict과 signal processing를 마치면 아래 Git procedure를 execution한다. finish하는 round는
finish_report.md까지 쓴 뒤 execution한다.- repository의 loading된 instruction가 commit inspection나 commit 형식을 정하면 해당 procedure를 먼저 execution한다. 필요한 file이나 commands이 없으면 commit하지 않고 shortfall을 report한다.
git diff --cached --quiet로 Git 색인이 비었는지 확인한다. 비어 있지 않으면 commit하지 않고 기존 스테이징을 report한다.- 스테이징 scope를 artifact entire,
<run>/freeze.md,<run>/ledger.md로 정한다. finish하는 round에는<run>/finish_report.md를 더한다. git add -- <스테이징 scope>로 scope entire을 함께 스테이징한다. 워킹트리의 다른 변경은 스테이징하지 않는다.git diff --cached --name-only의 frozen_path entire이 스테이징 scope 안인지 확인한다. scope 밖 frozen_path가 있으면git restore --staged -- <스테이징 scope>로 이 round의 스테이징을 되돌리고 shortfall을 report한다.git diff --cached --quiet가 변경 있음으로 end나는지 확인한다. 변경이 없으면 ledger의 round round_verdict과 measurement이 저장되지 않은 cause을 고친다.- 현재
HEAD를 기록한다. invocation 언어로 round number와 apply purpose을 적은 메시지를 사용해git commit을 execution한다. git rev-parse HEAD가 기록한HEAD와 다른지 확인한다. 같거나 commit이 failure하면 cause을 고치고 1항부터 다시 execution한다.
forbidden — round commit이 success하기 ledger_before에 다음 round를 start하거나 finish 뒤 정리를 하는 것. 어기면 round 적용분이 commit 밖에 남는다. round마다 push하지 않는다.
-
finish 뒤 정리: 마지막 round의 commit이 success한 뒤
temp_file_cleanup가 on이면 아래 order로 정리한다:<run>/freeze.md,<run>/ledger.md,<run>/finish_report.md와 freeze file 「artifact」 절의 artifact entire이 존재하는지 확인한다. 하나라도 없으면 정리하지 않고 사용자에게 remaining file과 shortfall을 report한다.<run>/anchor.<확장자>또는<run>/anchor/를 제거한다.<run>의 직속 directory 중 entry_name이roundN인 directory를 전부 제거한다.N은 1 이상의 integer다.- 제거 target이 남지 않았는지 확인한다.
<run>/freeze.md,<run>/ledger.md,<run>/finish_report.md와 그 밖의 file은 제거하지 않는다.
run이 중단되었거나 escalate 회신을 기다리면 정리하지 않는다.
temp_file_cleanup가 off이면 run의 file을 모두 preservation한다.
run 도중의 사용자 instruction
run 도중 사용자가 artifact 변경을 instruction하면 session은 round 사이에 통상 편집으로 반영한다. round 사이는 apply 뒤부터 다음 copy ledger_before까지다. session은 사용자 instruction와 반영 point_in_time을 ledger 운영 기록에 적는다. 이 frozen_path로 반영한 사용자 instruction는 사용자 confirmed 기록이다. 다음 round의 repair와 review는 사용자 confirmed 기록을 succession inspection에서 reference한다.
design rationale: references/rationale.md §7.
8. escalate
signal, succession inspection, self 판단, 상신문, 회신 processing는 이 절만 정한다. 다른 절의 「올린다」와 「escalate이다」는 signal 감지를 뜻한다.
| # | signal | point_in_time |
|---|---|---|
| 1 | 「사용자에게 올린다」로 disposition된 item — escalate proposal item의 approval confirmed을 포함한다 | 즉시 |
| 2 | apply 건수가 「repair it」 confirmed item 수의 절반에 못 미치는 round 2회 연속 | round round_verdict과 함께 |
| 3 | review에 올린 item 수가 직전 round보다 줄지 않는 round 2회 연속 | round round_verdict과 함께 |
| 4 | 예상 밖 판단이 하류 payload list·outputs format·quorum·counts의 의미·file batch 중 하나를 바꾼다 | 즉시 |
| 5 | 규모 procedure가 processing하지 못하는 규모 excess — item 하나가 된 batch가 batch_input_cap을 넘거나, fixed payload의 size 합이 standalone으로 batch_input_cap 이상이거나, review resume가 그 seat의 coverage를 늘리지 못한다 |
즉시 |
| 6 | freeze file·invariants과의 충돌, apply verbatim 대조의 전제 violation | 즉시 |
| 7 | 같은 seat·batch의 review dispatch이 세 번 shortfall이다 | 즉시 |
succession inspection — signal 1
session은 escalation_self_judgment value과 무관하게 signal 1을 올리기 ledger_before에 succession를 inspection한다. hunk 없는 escalate proposal item은 이 inspection의 밖이다 — apply할 wording이 없다.
- 그 item의 repair 방향을 담은 사용자 confirmed 기록을 찾는다. review outputs의 「succession:」 줄이 인용한 기록이 있으면 그 기록을 먼저 확인한다.
- 기록이 있고 그 repair가 새 의미 decision 없이 그 confirmed을 remaining position에 apply하는 것이면 succession conversion한다: disposition을 「repair it」로 바꾸어 같은 round apply에 넣는다(
--add). ledger main table의 disposition table_cell을 「repair it」로, status table_cell을 「repair-confirmed」으로 ledger_write하고, signal processing 절에 succession를 적는다 — format은references/ledger.md다. - 인용할 기록이 없으면 succession는 서지 않는다 — 기억과 추정은 인용이 아니다.
- freeze file invariants이 그 repair를 「사용자에게 올린다」로 지정한 item은 이 inspection의 밖이다 — 그 지정 self가 사용자 confirmed 기록이다.
reviewer position의 succession는 contract/review.md의 disposition 조항이 정한다 — reviewer가 succession를 세워 「repair it」로 disposition한 item은 signal 1을 내지 않는다.
self 판단 — escalation_self_judgment on
escalation_self_judgment이 on이면 session은 감지한 signal마다 물음 셋으로 escalate 여부를 정한다. signal 1은 succession inspection를 지나 remaining 것만 이 판단을 받는다.
- 오판의 비용 — 이 판단을 잘못 내리면 무엇이 망가지는가. 손상이 round 안의 validation(review·verbatim 대조·invariants 재measurement·다음 round의 repair)에 잡히는가, run 밖까지 나가는가.
- 되돌리기 비용 — 잘못으로 드러났을 때 원상 복구에 드는 편집·재execution의 size.
- 판단 가능성 — freeze file·
references/rationale.md·ledger·사용자 confirmed 기록·artifact measurement으로 rationale가 서는가, 아니면 사용자만 가진 정보(의도·선호·external 사정)가 필요한가.
오판 비용이 크고 되돌리기 비싸며 rationale가 서지 않을 때 올린다. 그 밖에는 session이 정한다. confirmed 번복, 새 의미 decision, run 밖 비가역 파급은 무겁게 잰다.
self processing의 execution은 아래 회신 processing의 wording을 그대로 쓴다. session의 판단이 「사용자의 답」 position에 서고, 회신을 기다리는 조항은 apply하지 않는다. signal 1에서 session이 정할 수 있는 value은 회신이 정하는 value과 같고, hunk 없는 escalate proposal item은 「approval하되 고치지 않는다」로만 바꿀 수 있다. round 수가 round_floor 미만이면 signal 2·3의 self processing는 finish를 내지 못한다.
self processing의 판단은 사용자 confirmed 기록이 되지 않으며 succession의 rationale가 될 수 없다.
self processing마다 ledger signal processing 절에 signal number·상황·판단·물음 셋의 답을 적는다. 사용자 confirmed 기록을 뒤집었으면 그 기록의 coordinate와 뒤집는 rationale를 함께 적는다. §7 finish report가 self processing entire과 succession entire을 list으로 담는다.
escalation_self_judgment이 off이면 감지한 signal 전부를 올린다.
상신문 format: 상황 / selection지(각각의 하류 impact) / 추천 하나. escalation_self_judgment이 켬인 run의 상신문은 상황에 물음 셋의 답을 함께 적는다.
회신 ledger_before에는 signal 1의 apply stage, signal 2·3의 다음 round, signal 4·5·6·7 뒤의 dispatch과 session task을 start하지 않는다. round 1 ledger_before signal 6도 같다.
회신 processing는 일곱이다. signal마다 답과 그에 따른 session의 processing를 ledger에 적고, 답이 freeze file을 바꾸면 §4.4의 도중 변경 procedure를 탄다. 사용자가 아래 갈래 밖의 processing를 instruction하면 그 instruction대로 한다.
- signal 1에 고치라고 답하면 disposition을 「repair it」로 바꾸어 같은 round apply에 넣고, ledger main table의 disposition table_cell을 「repair it」로 status table_cell을 「repair-confirmed」으로 ledger_write한다. 고치지 않는다고 답하면 「approval하되 고치지 않는다」로 바꾼다. hunk 없는 escalate proposal item에 사용자가 repair 방향을 답하면 그 답은 사용자 confirmed 기록이다 — 반영은 run 도중의 사용자 instruction frozen_path(§7)나 다음 round의 repair가 맡는다.
- signal 2·3에 finish하라고 답하면 그 round를 finish로 round_verdict하고 §7의 finish report를 쓴다. 그 report의 「finish 항」에는 「§8 회신」과 그 signal number를 적는다.
- signal 2·3에 계속하라고 답하면 §7의 round_verdict order를 그대로 apply한다.
- signal 4에 그 판단을 approval하면 판단을 execution하고 그 round를 이어 간다.
- signal 5에 item을 빼라고 답하면 그 item을 그 round에서 빼고 disposition 「approval하되 고치지 않는다」로 적는다.
- signal 6에 freeze file을 고치라고 답하면 freeze file을 고친다. round 1을 start하기 ledger_before에 올린 signal 6은 §4.4의 도중 변경 procedure를 타지 않는다 — 멈출 round가 없으므로 freeze file을 고친 뒤 §4.2 제약 inspection를 다시 하고 round 1을 start한다. round 도중에 올린 signal 6은 그 procedure를 탄다.
- signal 7에 더 dispatch하라고 답하면 그 seat·batch를 다시 dispatch한다. seat_count를 줄이라고 답하면 그 답은 parameters 변경이므로 §4.4의 도중 변경 procedure를 탄다 — freeze file의
review_seat_count·review_quorum을 고치고 그 round를 repair부터 다시 돈다.
design rationale: references/rationale.md §8.
9. file batch
<task directory>/
freeze.md 절 여덟: artifact·purpose 진술·invariants list·parameters·area 배분·모델 assignment·앵커·기준 source_text
anchor.<확장자> 또는 anchor/ 첫 round ledger_before copy. 읽기 전용. temp_file_cleanup가 on이면 finish 뒤 제거
ledger.md status의 canonical. format은 references/ledger.md
finish_report.md §7 finish report
roundN/ temp_file_cleanup가 on이면 finish 뒤 directory째 제거
copy.<확장자> 또는 copy/ repair 직전 artifact copy. 그 round의 coordinate·verbatim criterion
dispatch_repair_<seatnumber>.md
dispatch_merge_<bundleID>.md
dispatch_review_<seatnumber>[_batch<K>].md review dispatch의 preservation본이자 input(§5.6)
dispatch_review_<seatnumber>[_batch<K>]_resume<R>.md review resume의 지시문
repair_<seatnumber>.md repair outputs
item.md repair_parse outputs. item entire의 canonical
mergepayload_<bundleID>.md bundle composition item entire과 normalization hunk(merge dispatch payload)
merge_<bundleID>.md merge outputs
reviewtarget.md review payload entire (split되면 reviewtarget_batch<K>.md)
review_<seatnumber>[_batch<K>].md review outputs
review_<seatnumber>[_batch<K>]_resume<R>.md resume outputs
_areaspec.md / _roundheader.md / _return_*.txt / _로그_*.txt / _*.json session·script 중간물. canonical 아님, payload forbidden
batch 색인 <K>와 resume 색인 <R>은 각각 1부터 센다. _return_*.txt와 _로그_*.txt는 codex execution의 standard output과 standard error다. entry_name은 그 role의 outputs file에서 파생한다(§5.6).
10. 동반 자산
| file | 담는 것 | 읽는 actor |
|---|---|---|
GLOSSARY.md |
용어 canonical — common 용어와 operation 용어 | 모든 읽는 이. subagent에게는 common 용어 절을 지급한다 |
contract/repair.md |
repairer의 임무와 item format | repairer |
contract/merge.md |
merger의 임무와 merge item format | merger |
contract/review.md |
review의 checkpoint과 round_verdict format | reviewer |
contract/hunk.md |
hunk의 notation·intersection·normalization·apply 규약 | repairer·merger·reviewer·script를 고치는 session |
contract/output.md |
file processing·outputs 전달·자기 check contract | repairer·merger·reviewer |
references/brief.md |
brief 템플릿 셋과 slot의 value 원천 | procedure를 operation하는 session |
references/ledger.md |
ledger format | procedure를 operation하는 session |
references/rationale.md |
규칙과 value의 design rationale | 스킬을 고치는 session. §2.1의 예상 밖 판단 때는 operation session |
scripts/vr.py |
official script 진입점 — subcommand 19개와 subcommand별 contract(--help) |
procedure를 operation하는 session·repairer(repair_check만)·merger(merger_check만) |
scripts/vrlib.py |
subcommand이 공유하는 파서·finish 규약 | vr.py. script를 고치는 session |
scripts/hunk.py |
hunk의 spans 연산·reading·apply 엔진 | vr.py. script를 고치는 session |
scripts/wait_outputs.py |
codex 병행 execution의 completion waiting | procedure를 operation하는 session |
scripts/tests/ |
subcommand·파서의 시험 | script를 고치는 session |