적용 SDK v3.0.0
공식 룰북 — AI Pilot 경진대회
이 문서가 규칙의 단일 진실(single source of truth)이다. 다른 문서·공지와 충돌하면 룰북이 우선하며, 룰북 개정은 대회 공지 채널로 사전 공지된다. 적용 엔진: ai-combat-core2 (SDK
metadata.json의engine_commit으로 식별).
대회 운영 구조
대회는 2계층으로 돈다. 계층마다 상대와 목적이 다르다 — 어느 순위가 무엇을 결정하는지 헷갈리면 이 표로 돌아오라.
| 계층 | 상대 | 목적 | 결선 진출에 반영 |
|---|---|---|---|
| 훈련센터 | 대항군(고정) | 상시 자가 진단 | 아니다 |
| 예선 라운드 | 참가팀 전원 | 라운드마다 위너 배출 | 위너가 진출 |
| 결선 진출 풀리그 | 참가팀 전원 | 잔여 진출권 배분 | 상위 팀이 진출 |
- 훈련센터 순위는 결선 진출과 무관하다. 언제든 제출해 대항군 배터리로 자기 트리를 점검하는 연습장이다.
- 예선 라운드는 독립제다 — 성적을 누적하지 않는다. 각 라운드는 마감 시점의 제출물로 참가팀 전원이 맞붙는 1단계(자동 연산)와, 상위 팀이 현장에서 겨루는 2단계(준결승·결승)로 진행되어 그 라운드의 위너를 배출한다. 참가 시점과 무관하게 언제 합류해도 된다.
- 결선 진출: 예선 라운드 위너 전원 + 결선 진출 풀리그 상위 팀이 정원을 채운다. 같은 팀이 라운드를 여러 번 우승하면 남는 자리는 풀리그 다음 순위가 승계한다.
라운드 개최 횟수와 일정은 이 문서가 정하지 않는다 — 대회 공지와 사이트 일정표를 따른다. 일정 조정이 곧 규칙 개정이 되지 않게 하기 위해서다.
1. 과제
F-16 1v1 근접 공중교전(건 전용). 참가자는 행동트리(YAML) 하나를 제출한다. 기체 성능·비행술(G 조절·에너지 관리·리프트벡터 배치)은 전 참가자 공통의 BEM 교리 계층이 수행하므로, 승부는 전술 판단(트리 설계) 에서 갈린다.
2. 매치 규정
| 항목 | 값 |
|---|---|
| 교전 시간 | 300 초 (시뮬레이션 시간) |
| 물리 | JSBSim F-16 6-DoF, 120 Hz |
| 트리 평가(L1 tick) | 20 Hz |
| 초기 HP | 각 100 |
| 하드덱 | 고도 1,000 ft 미만 = 즉시 패 |
| 초기 조건 | 시나리오(§3) + 매치별 시드로 결정 — 분포: 고도 12,000~18,000 ft(양측 공통), 속도 시나리오 명목값 ±20 KCAS, 방위 ±30°, 분리거리 ±20% |
속도 지터는 시나리오가 정한 명목 속도를 기준으로 한 상대 변동이다 —
perch_offense의 +100 kt 공격자 우위 같은 설계된 속도 차는 시드가 붙어도 유지된다.
예 — headon, 시드 6 (--scenario headon --seed 6. 같은 시드는 항상 이 값):
| 고도 | 속도 | 기수 | 분리 | |
|---|---|---|---|---|
| blue | 16,760 ft | 340.5 KCAS | 359.1° (명목 0°) | 41,152 ft = 6.77 NM |
| red | 16,760 ft | 356.5 KCAS | 150.0° (명목 180°) | (명목 6 NM × 1.128) |
고도와 분리거리는 양측 공통으로 한 번 뽑고, 속도·기수는 측별로 독립 추첨된다 — 그래서 이 시드의 red 는 기수가 명목에서 −30°(지터 한계) 벗어난 채 시작한다.
3. 시나리오 (BEM 국면 커버리지)
리그는 네 국면을 모두 평가한다 — 한 국면만 잘하는 에이전트는 순위를 얻지 못한다.
| 시나리오 | 국면 | 초기 기하 |
|---|---|---|
headon | HABFM (대등) | 상호 대향 헤드온, 기준 6 NM |
perch_offense | OBFM (공세) | 내가 적 후방 6,000 ft·+100 kt 우위 |
perch_defense | DBFM (수세) | 위의 진영 교대 — 내가 열위 |
neutral | 중립 머지 | 3,000 ft 측방 이격 대향 — 역할 대칭, turning room 배분 판단 |
같은 대진은 진영 스왑 미러(같은 초기 기하에서 역할 교대)로 실행되어 초기 조건 운(seed luck)을 상쇄한다.
참가자 간 대전 — duel
예선 라운드 1단계·결선 진출 풀리그·현장 단판은 모두 duel 을 쓴다. 라운드
1단계와 풀리그는 여기에 진영 스왑 미러를 더해 (대진, 시드)마다 2 경기를 치른다.
시드는 라운드마다 새로 뽑히며, 한 라운드 안에서는 전 대진이 같은 시드를 쓴다 —
같은 코스에서 겨룬다는 뜻이다(골프 코스 원칙).
현장 단판(준결승·결승)은 시간 제약으로 스왑 미러를 돌릴 수 없다. 스왑이 없으면 초기 조건
운이 상쇄되지 않으므로, 결선은 대칭이 보장된 별도 시나리오 duel 을 쓴다.
| 시나리오 | 국면 | 초기 기하 |
|---|---|---|
duel | HABFM (단판) | headon 과 같은 기하. 단 방위·속도 지터를 양측 공통으로 뽑아 180° 회전 대칭 |
headon 은 방위를 양측 독립으로 ±30° 추첨하므로, 시드에 따라 한쪽 기수가 상대를 더
잘 겨눈 채 시작한다(측정: 이 조준 우위 10° 당 승률 약 6.6 %p). 예선은 스왑으로 이를
상쇄하지만 단판은 그럴 수 없다. duel 은 양측에 같은 편차를 주어 이 우위를 정의상 0 으로
만든다 — 오프셋 머지의 선회 여지(1/2-circle 판단)는 그대로 남는다.
예 — 같은 시드(6), 다른 시나리오(위 §2 의 IC):
| 시나리오 | blue 기수 오차 | red 기수 오차 | 조준 우위 |
|---|---|---|---|
headon | 0.9° | 30.0° | blue 에 29.1° |
duel | 0.9° | 0.9° | 0 |
(기수 오차 = 상대 방향에서 벗어난 수평 각도. 트림 자세 때문에 실제 ATA 는 여기에 받음각만큼 더해지지만, 그 몫은 양측이 같아 차이는 위 값 그대로다.)
headon 의 이 시드는 blue 가 거의 정조준으로, red 는 30° 빗나간 채 시작한다 —
기량과 무관한 우위다. 예선은 진영 스왑으로 이를 상쇄한다. duel 은 같은 편차를
양측에 주므로 스왑 없이도 차가 0 이다.
연습: python scripts/run_match.py --scenario duel --seed 42 --blue A.yaml --red B.yaml
4. 무장 판정 — Gun WEZ
상대가 내 기수 원뿔(ATA<30°) 안·사거리(500–3,000 ft) 안에 있으면 연속 피해를 준다:
데미지 = 50 HP/s × 각도계수 # 거리계수 없음 — 대역 안이면 균일
500 ft 미만 = 피해 0 (과접근 페널티)
3,000 ft 초과 = 피해 0
각도계수는 ATA(내 기수→적, 정조준 0°)의 계단이다 — 정밀 조준일수록 크다:
| ATA | 각도계수 | 데미지(HP/s) |
|---|---|---|
| < 2° | 1.00 | 50.0 |
| < 10° | 0.75 | 37.5 |
| < 20° | 0.50 | 25.0 |
| < 30° | 0.25 | 12.5 |
| ≥ 30° | 0 | 0 |
예 — 피해 계산(피해 = 50 HP/s × 각도계수 × 체류시간):
| 상황 | 판정 | 2 초 체류 시 피해 |
|---|---|---|
| ATA 8°, 1,800 ft | 계수 0.75 | 50 × 0.75 × 2 = 75 HP |
| ATA 25°, 900 ft | 계수 0.25 | 50 × 0.25 × 2 = 25 HP |
| ATA 1°, 400 ft | 과접근(<500 ft) | 0 |
| ATA 1°, 3,200 ft | 사거리 밖(>3,000 ft) | 0 |
| ATA 35°, 1,800 ft | 원뿔 밖(≥30°) | 0 |
거리계수가 없으므로 1,800 ft 의 정조준이 900 ft 의 빗나간 조준보다 아프다. 격추(100 HP)에 필요한 누적 조준 시간은 ATA<2° 2.0 초 / <10° 2.7 초 / <20° 4.0 초 / <30° 8.0 초 — 사거리 진입보다 ATA 를 줄이는 쪽이 승부처다.
시간 경과별 완화는 없다(전 시각 동일). 300초 만료 시 잔여 HP 우세로 승패를 가른다(§5).
설계 주 (BEM 대비 단순화) — 판정은 현재 표적 위치 기준 ATA 로, BEM 의 유효 gunshot 3요소(lead·range·POM, §4.5.31) 중 리드는 반영하지 않는 의도적 단순화다. 최대 데미지율 50 HP/s 는 BEM lethal burst 1–2초(§4.4.14.2)에 근거한다(정조준 2초 격추). min 500 ft 는 BEM 의 frag/FOD 회피 권고(§4.4.14)에 따른 과접근 페널티, max 3,000 ft 는 BEM 유효사거리(funnel bottom 2,500–4,000 ft, §4.4.14.3.2.2) 내 고정값이다. ATA 상한 30° 는 리드 미반영 단순화 하에서의 최대 리드각(~20° = 표적 최대 지속선회 20°/s × 탄 비행시간 ~1초, §4.4.14.3.2.3) + 분산·안정화 여유다 — 외곽 tier(10–30°)는 고횡단 표적에 리드를 잡은 정당한 사격 기하의 대역이다.
5. 승패 판정 (우선순위 — 위가 먼저)
| # | 사유 | 결과 | 조건 코드 |
|---|---|---|---|
| 1 | 하드덱 — 고도 < 1,000 ft | 위반자 즉시 패 | hard_deck |
| 2 | 실속 — 100 kts 미만 체류 누적 10 초 | 위반자 즉시 패 | stall |
| 3 | 상대 HP 0 | 격추승 | health_zero |
| 4 | 제출물 오류/트리 예외 — 파싱 실패·미지 어휘·실행 중 예외 | 해당 측 실격패 | disqualified |
| 5 | 엔진 지연 안전장치(wall-clock 한계 초과) | 무승부 | wall_clock |
| 6 | 무교전 — 300 초 만료 + 양측 피해 0 | 쌍방 패(양측 0 점) | no_contact |
| 7 | 300 초 만료 | 잔여 HP 우세 측 승 / 완전 동률만 무승부 | timeout |
| 8 | 6·7 번에서 승자가 안 나온 현장 단판 | 오버타임 120 초 (아래) | overtime |
- over-G·스핀 규정이 없는 이유: 공통 비행 제어 계층의 리미터가 한계 초과를 구조적으로 방지한다 — 위반 자체가 불가능하므로 규칙도 없다. 저속(실속)만이 참가자 전술로 도달 가능한 안전 위반이며, 이는 조종사 책임이다.
- 판정패(1·2·4번)의 잔여 HP 는 0 으로 기록된다(순위 득실 계산 규약) — 위반이 무승부보다 유리해지는 구멍을 막는다.
- 무교전(6번)의 기준 = 피해 교환. 300 초 동안 양측 모두 단 1 HP 도 잃지
않았으면 교전이 성립하지 않은 것으로 보고 쌍방 패로 처리한다. 한 발이라도
맞히거나 맞았으면 7번(
timeout)으로 간다. 이격 자체는 처벌하지 않는다: 익스텐션·에너지 회복은 정당한 BFM 이고, 재교전해서 피해를 주고받으면 교전으로 기록된다. 잔여 HP 는 실제값(만피)으로 기록된다 — 득실차는 어차피 0 이다.
예 — 판정 적용
| 상황 | 결과 |
|---|---|
| 내 HP 12 남았는데 상대가 하드덱 아래로 내려감 | 상대 패(hard_deck) — HP 우세는 보지 않는다 |
| 내가 하드덱 아래 + 같은 tick 에 내 HP 도 0 | 내 패. 사유 코드는 위 우선인 hard_deck |
| 같은 tick 에 양측이 각각 위반(내 실속·상대 HP 0) | 무승부 — 우선순위표는 사유 코드를 고르는 규칙이지 승자를 고르는 규칙이 아니다. 한쪽만 위반해야 승패가 갈린다 |
| 상대가 하드덱 패, 내 잔여 HP 41 | 기록 41 : 0 (판정패의 HP 는 0) → 득실 +41 |
| 300 초 만료, HP 74 : 58 | 내 승(timeout), 득실 +16 |
| 300 초 만료, HP 100 : 100 (양측 무피해) | 쌍방 패(no_contact), 양측 0 점 |
| 300 초 만료, HP 100 : 94 (250 초 이격 후 막판 1 회 명중) | 내 승(timeout) — 이격 자체는 처벌 대상이 아니다 |
오버타임 — 현장 단판 전용
현장 단판(준결승·결승)은 위너가 반드시 나와야 한다. 그런데 6번(무교전 쌍방 패)은 승자가 없고, 7번도 완전 동률이면 무승부다. 그래서 단판에 한해 연장을 둔다.
| 항목 | 값 |
|---|---|
| 적용 범위 | 현장 단판(준결승·결승·결선)만. 훈련센터·예선 라운드 1단계·결선 진출 풀리그에는 적용하지 않는다 |
| 진입 조건 | 300 초 만료 시 승자 미결정 — 양측 무피해(6번) 또는 HP 완전 동률(7번) |
| 길이 | 120 초 |
| Gun WEZ | 완화 — 사거리 500–6,000 ft, ATA 원뿔 45°. 각도계수 계단은 그대로이고 최외곽 tier(0.25)만 45°까지 확장 |
| 그 외 규칙 | 하드덱·실속·HP·승점 전부 정규와 동일. HP 는 승계(초기화 없음) |
| 관측 | 조건 in_overtime 이 참이 된다 — 트리는 경과 시간을 볼 수 없으므로 OT 인지 경로는 이것뿐이다 |
종료 판정 (위가 먼저):
- OT 중 §5 의 1~5 번 사유 발생 → 그대로 적용(격추는
health_zero, 격추승으로 집계) - OT 만료 시 잔여 HP 우위 측 승 (
overtime) - HP 동률이면 아래 타이브레이크
타이브레이크 (추가 시간 없음 — 경기와 동시에 산출된다):
| 순위 | 기준 | 뜻 |
|---|---|---|
| ① | 누적 조준 시간 — 정규+OT 전 구간, 상대를 Gun WEZ 안에 둔 시간이 긴 쪽 | HP 가 같다는 건 서로 준 피해가 같다는 뜻이다. 같은 피해를 더 긴 조준으로 만든 쪽이 교전을 지배했다고 본다 |
| ② | 평균 ATA — 정규+OT 전 구간, 내 기수→적 각도의 평균이 낮은 쪽 | ①의 연속 일반화("누가 더 기수를 적에게 두었나"). 무교전 OT 는 ①이 0 대 0 이라 여기서 갈린다 |
| ③ | 1단계 풀리그 상위 시드 | 형식 조항 — ①②가 모두 같은 경우(동일 트리 수준)에만 |
상대 거리는 타이브레이크에 쓰지 않는다 — 거리는 두 기체 쌍의 속성이라 양측이 정의상 같은 값을 갖는다. 판별에 쓸 수 없다.
연습: python scripts/run_match.py --scenario duel --overtime --blue A.yaml --red B.yaml
(결과에 조준 시간·평균 ATA 가 함께 출력된다.)
6. 정보 정책 — 관측 대칭성
적 HP·적이 받은 피해량은 트리에 노출되지 않는다. 적 상태는 교전 기하
(aspect, ATA, 거리, 접근율, 에너지 차 등)로만 추정하라. 노출 관측값 전체
목록은 SDK 문서 REFERENCE.md.
7. 제출 정책
제출물은 팀당 하나의 행동트리 YAML 이고, 어느 계층에서 평가되는지에 따라 규칙이 다르다.
7.1 훈련센터 (상시)
-
무제한 재제출 — 횟수 제한 없음. 다만 최소 제출 간격이 있다(현행 값은 부록·공지).
-
최신 제출 = 평가 대상 — 재제출하면 이전 제출의 훈련센터 매치·통계는 초기화된다.
-
대기열 정책 — 팀당 평가 대기 1건. 평가 시작 전에 재제출하면 이전 대기 건은 자동 대체된다(서버 부하와 무관하게 마음껏 제출 가능).
-
고정 배터리 — 전 팀 동일한 대항군 × 시나리오 × 시드 2개로 실행된다. 각 (대항군, 시나리오) 셀은 서로 다른 초기조건 2개로 2회 실행되며, 그 시드는 (배터리 시드, 시나리오, 대항군)에서 유도된 고정값이다 — 팀·제출 시각과 무관하다. 같은 파일을 다시 내면 같은 결과가 나온다(초기조건 재추첨 없음).
예 — 배터리 크기: 대항군 5 × 시나리오 4 × 시드 2 = 40 경기. 한 셀 (예: 대항군 C ×
perch_defense)은 서로 다른 초기조건 2 판으로 실행되고, 그 2 개 시드는 전 팀이 동일하다.
7.2 예선 라운드
- 마감 시점 고정 — 라운드 마감 시각에 각 팀의 현재 에이전트가 그 라운드의 출전 제출물로 확정된다. 마감 후 재제출해도 그 라운드 결과는 바뀌지 않는다.
- 자동 참가 — 마감 시점에 유효한(배터리를 완주한) 에이전트를 보유한 팀은 전원 자동으로 참가한다. 별도 신청이 없다.
- 결과 공개 시점 — 1단계 연산이 끝나면 진출 팀 명단만 공개되고, 전체 순위· 매치 기록은 현장 행사에서 공개된다.
7.3 결선 진출 풀리그
- 제출 간격 확대 — 이 기간에는 최소 제출 간격이 늘어난다(현행 값은 부록·공지).
- 일일 재연산 — 매일 정해진 시각에 마감하고, 그 시점의 전 팀 에이전트로 풀리그 전체를 다시 돌린다. 순위는 매일 새로 산출된다(누적이 아니다).
- 공개 범위 — 순위와 승·무·패만 공개된다. 매치 기록과 리플레이는 제공하지 않는다 — 매일 재연산되는 순위라 상대 분석이 곧 반복 공격이 되기 때문이다.
7.4 공통
- 제출 전
python tools/validate_agent.py로 검증하라 — 통과하면disqualified(제출물 오류) 판정을 받지 않는다.
8. 순위 산정
세 계층(훈련센터·예선 라운드·결선 진출 풀리그)이 모두 같은 규칙을 쓴다. 다만 집계 범위가 다르다 — 훈련센터는 배터리 매치만, 라운드는 그 라운드의 매치만 센다. 라운드는 독립제라 성적이 누적되지 않는다.
순위 키 (공통)
- 승점 — 승 3 / 무 1 / 패 0
- 평균 HP 득실차 — 게임당 (내 잔여 HP − 상대 잔여 HP) 의 평균
- 격추승 수 — 시간 내 HP 0 격추로 이긴 경기 수 (결정적 승리 우대)
- 제출 시각 — 위 전부 동률이면 먼저 제출(달성)한 팀 우선
예 — 타이브레이크(배터리 40 경기, 셋 다 24승 4무 12패 = 승점 76):
| 팀 | 승점 | 평균 HP 득실 | 격추승 | 제출 시각 | 순위 |
|---|---|---|---|---|---|
| A | 76 | +18.4 | 7 | 08-10 | 1 |
| B | 76 | +18.4 | 5 | 08-08 | 2 |
| C | 76 | +11.0 | 9 | 08-05 | 3 |
승점이 같으니 2 번 키(평균 HP 득실)로 간다 — C 는 격추승이 가장 많아도 여기서 3 위로 내려간다. A·B 는 득실도 같아 3 번 키(격추승)에서 갈리고, 4 번 키(제출 시각)는 쓰이지 않는다. 키는 순서대로 하나씩만 본다 — 아래 키가 위 키를 뒤집지 못한다.
- 잔여 HP 평균(
avg_hp)은 리더보드에 표시되지만 순위 키가 아니다. - 레이팅(ELO 등)은 사용하지 않는다.
현장 단판 (준결승·결승)
단판은 순위표가 아니라 그 경기의 승패로 진출이 갈린다. 승패 판정은 §5(오버타임 포함).
9. 결정론·감사·재현
- 같은 (제출물, 시나리오, 시드) → 항상 같은 결과. 엔진에 자생 난수가 없다.
- 모든 매치는 리플레이(.acmi)와 엔진 버전이 기록되며, 운영진은 의심 매치를 동일 조건으로 재실행해 검증할 수 있다.
- 로컬 SDK 와 서버는 같은 엔진 소스·같은 의존성 버전(requirements 핀)을 쓴다 — 로컬에서 재현되지 않는 서버 결과는 운영 채널로 문의하라.
10. 튜닝 파라미터 (교리 · 액션)
파라미터는 두 계층이다. 액션 파라미터는 action: 블록마다 따로 주는 국면별 값이고,
교리(doctrine) 파라미터는 에이전트 전역에 하나씩 적용되는 값이다. 두 계층 모두
필드 목록·기본값·허용 범위는 SDK 문서 REFERENCE.md 가 단일 진실이며,
범위 밖 값·미지 키 = 제출 거부다(disqualified 아님 — 검증 단계에서 거부).
제출 전 python tools/validate_agent.py 로 확인하라.
10.1 액션 파라미터 — max_g 폐지 (2026-08-24)
max_g 는 폐지되었다. 이 키가 들어 있는 제출물은 검증에서 거부된다.
구 max_g: true 는 G 조절 법칙 전체를 건너뛰고 순간 봉투를 그대로 지령했다.
참가자에게 열린 공격성 노브가 사실상 이 이진값 하나뿐이었고, 켜는 쪽이 대체로
유리해 전략이 한 점으로 수렴했다. 그 하나의 스위치를 두 개의 연속 노브로 분해한다:
| 신규 키 | 범위 | 뜻 |
|---|---|---|
g_burst | 0.0 ~ 1.0 | 지령 G 천장. 0 = 지속 봉투(Ps≥0 유지, 에너지 보존), 1 = 순간 봉투 전량 |
g_full_ata_deg | 20 ~ 90 | 명목 G 에 포화하는 각도. 작을수록 조금만 벌어져도 세게 당긴다 |
track_rng_ft / track_ata_deg | 1,000~3,000 ft / 10~30° (상한 = Gun WEZ) | 건 추적 하한 G 창. 이 창 안에서는 표적 LOS 회전율을 따라잡는 G 를 순간 봉투까지 쓴다 |
기존 키(aim_above_ft·lead_time_s·lag_dist_ft·cz_range_ft)에도 허용 범위가
새로 적용된다. 이전에는 범위 검사가 없어 극단값이 통과했다.
함께 바뀐 것 — 지령 G 는 조준점까지의 각도에 비례한다. 종전에는 적까지의 ATA 로
쟀는데, 트리가 실제로 지령하는 것은 aim_above_ft 가 적용된 조준점이다. 둘이
어긋나는 국면(요요, 그리고 조준선을 문 채 상승하는 하드덱 회복)에서 조절기가 "이미
도착했다"고 오판해 최소 G 로 주저앉았고, max_g 가 존재해야 했던 이유가 그 불일치였다.
이제 aim_above_ft 를 주면 그만큼 조준 오차가 커져 자연히 세게 당긴다. 반대로
조준이 맞은 상태에서 큰 G 를 계속 지령할 방법은 없다 — 그때는 오차가 0 이기 때문이다.
큰 G 가 필요한 국면은 세 경로로 얻는다: ① 조준점을 옮긴다(aim_above_ft),
② 천장을 올린다(g_burst), ③ 사격 창을 연다(track_* — 창 안에서는 표적 LOS
회전율을 따라잡는 G 를 순간 봉투까지 쓴다).
전환 지침:
max_g: true→g_burst: 0.8부터 시작해 보라. 거동은 같지 않다 —g_burst는 천장만 올리고, 지령 G 는 여전히 ATA 비례 조절을 통과한다.max_g: false또는 생략 →g_burst생략(기본 0.0).- 하드덱 회복처럼 "기수는 적에 두고 고도만 올리는" 분기는
aim_above_ft가 곧 조준 오차이므로 별도 조치 없이 강하게 당긴다(실측:aim_above_ft: 4000, 거리 3,000 ft → 오차 53°,g_burst: 0.8에서 7.2 G). - 사격 국면에서 조준이 맞아 갈수록 지령 G 는 자연히 낮아진다. 그 구간의 당김은
track_rng_ft/track_ata_deg창이 담당한다.
lead_time_s 의 기본값이 1.0 → 1.5 로 바뀌었다. 생략 시 적용되는 값이므로,
이전 거동을 유지하려면 lead_time_s: 1.0 을 명시하라.
생략 시 기본값은 의도적으로 "무난하지만 최적은 아닌" 값으로 정해져 있다. 튜닝은 선택이 아니라 설계의 일부다.
10.2 교리(Doctrine) 파라미터
교리 파라미터는 개방되어 있다 (2026-08-17 개방 — 사전 공지 조항 이행).
에이전트 YAML 최상위의 doctrine: 블록으로 L2 setpoint 를 조정할 수 있다.
필드 목록·기본값·허용 범위(전부 교범 인용 대역)는 SDK 문서 REFERENCE.md.
- 범위 밖 값·미지 필드 = 제출 거부(
disqualified아님 — 검증 단계에서 거부). 제출 전python tools/validate_agent.py로 확인하라. doctrine:블록이 없으면 종전과 동일한 기본값으로 동작한다 — 기존 제출물의 거동은 변하지 않는다.- 일부 필드는 개방 전 대규모 스윕 검증에서 단일 최적값이 확인되어 허용 범위가
기본값 하나로 고정되어 있다 — REFERENCE.md 범위가
[x, x]인 필드가 그것이다. - 파이팅 속도 대역(
fighting_kts_lo/hi)을 조정하면 L1 조건below/above_fighting_speed의 기본 임계값도 함께 이동한다(조건에kcas를 명시하면 명시값이 우선).
작성 예시(통과·거부 사례 포함)는 SDK 문서 REFERENCE.md 교리 절에 있다.
11. 제출물의 연구 활용
제출된 에이전트(YAML)와 매치 기록은 주최측이 연구 목적으로 사용·분석·수정할 수 있다(대회 참가 = 본 조항 동의). 연구 산출물에서의 저작자(팀) 표기 방침은 운영 공지를 따른다. SDK 는 대회 참가 목적으로만 사용·수정 가능하며 외부 재배포 금지, 저작권은 주최측에 있다.
역방향 — 참가자의 데이터 반출은 금지된다. 사이트에서 열람한 리플레이(.acmi)· 매치 기록·순위 데이터는 본인의 학습과 대회 준비 목적으로만 사용할 수 있다. 다음은 명시적으로 금지한다:
- 리플레이·매치 데이터를 대회 참가자·주최측 외부로 전달·공개·게시하는 행위 (개인 SNS·외부 저장소·타 기관 공유 포함). 홍보용 공개는 주최측이 한다.
- 리플레이·매치 데이터를 AI 모델의 학습·미세조정·증류(distillation) 데이터로 사용하거나 제3자에게 그 목적으로 제공하는 행위.
- 자동화 도구로 리플레이·매치 데이터를 대량 수집하는 행위.
리플레이는 결정론 엔진 위에서 공통 교리 계층이 만들어 낸 고밀도 비행 궤적이라, 그 자체가 모방학습 데이터셋이 된다. 이 조항은 그 자산을 보호하기 위한 것이다.
12. 금지·몰수
- SDK 를 수정해 로컬 결과를 조작해도 서버 평가에는 영향 없다(서버는 원본 엔진으로 재실행). 제출물은 YAML 트리 하나뿐이다.
- 대회 운영 방해(고의적 서버 부하 유발 등) 시 운영진 판단으로 몰수·실격 처리.
- §11 의 데이터 반출·학습 이용 금지 위반도 몰수·실격 대상이다. 계정 공유· 타인 계정 사용으로 열람 범위를 넓히는 행위를 포함한다.
- 규정 밖 상황은 운영진 판정이 최종이다.
부록 — 제출 안내 (웹 운영)
룰북 §7 이 "부록·공지"로 넘긴 운영 수치다. 규칙 본문과 충돌하면 룰북이 우선한다.
훈련센터 (상시)
| 항목 | 값 |
|---|---|
| 제출 형식 | 단일 YAML 파일 (.yaml, .yml) — 커스텀 Python 코드 불가 |
| 파일 크기 | 최대 5 MB |
| 평가 배터리 | 대항군 5종 × 시나리오 4종(headon·perch_offense·perch_defense·neutral) × 시드 2개 = 40경기 |
| 초기조건 | 전 팀 동일 (배터리·시나리오·대항군에서 유도한 고정 시드) |
| 제출 단위 | 팀당 계정 1개 — 팀장이 대표로 제출한다 |
| 제출 최소 간격 | 1시간 (2026-08-17 시행) — 마지막 제출 후 1시간이 지나야 재제출 가능 |
훈련센터 순위는 결선 진출과 무관하다. 대항군을 상대로 자기 트리를 점검하는 연습장이고, 진출은 예선 라운드와 결선 진출 풀리그에서 갈린다(룰북 「대회 운영 구조」).
예선 라운드
| 항목 | 값 |
|---|---|
| 대전 형식 | 참가팀 전원 풀리그 — duel 시나리오, 시드 2종 × 진영 스왑 2 = 대진당 4경기 |
| 참가 자격 | 마감 시점에 배터리를 완주한 에이전트를 보유한 팀 전원 자동 참가 (신청 없음) |
| 출전 제출물 | 마감 시각의 현재 에이전트로 고정 — 이후 재제출해도 그 라운드 결과는 안 바뀐다 |
| 무대 진출 | 1단계 상위 4팀 — 현장 준결승·결승. 성무제 특별 라운드는 8팀 |
| 결과 공개 | 연산 종료 시 진출 팀 명단만 공개, 전체 순위·매치는 현장 행사에서 공개 |
| 리플레이 | 공개 후 본인이 낀 1단계 매치 + 무대 경기(준결승·결승) |
개최 횟수와 일자는 대회 일정을 따른다.
결선 진출 풀리그
| 항목 | 값 |
|---|---|
| 제출 최소 간격 | 4시간 (이 기간에만 적용) |
| 재연산 | 매일 00:00 마감 → 그 시점 전 팀 에이전트로 풀리그 전체 재실행 → 순위 갱신 |
| 공개 범위 | 순위·승/무/패·전일 대비 등락만. 매치 기록·리플레이 미제공 |
결선
| 항목 | 값 |
|---|---|
| 정원 | 12팀 — 예선 라운드 위너 전원이 먼저 오르고, 남는 자리를 결선 진출 풀리그 상위 팀이 채운다 |
| 무대 진출 | 결선 사전 풀리그 상위 4팀 — 현장 준결승·결승 |
| 시나리오 | 무대 단판은 duel. 승부 미결 시 오버타임 120초(룰북 §5) |
| 공개 범위 | 시상식 전까지 전면 비공개. 시상식 후 풀리그·무대 리플레이를 로그인 참가자 전체에 공개 |
참고 문헌
Basic Employment Manual — F-16C (RoKAF) (PDF, 11 MB)
전술 설계에 가장 먼저, 가장 많이 참고할 문헌이다. 이 룰북의 시나리오 구분 (HABFM·OBFM·DBFM), WEZ 판정값(§4.4.14 lethal burst·funnel bottom), 교리 계층의 거동이 모두 이 교본에서 왔다. 트리를 짜기 전에 해당 국면 장(章)을 먼저 읽어라.
공통
- 조건·액션 어휘와 실측 거동은 SDK 문서(
REFERENCE.md,MEASURED_BEHAVIOR.md)를 참고하라. - 제출 전
python tools/validate_agent.py로 검증하면 서버 검증에서disqualified를 받지 않는다. - 오버타임(현장 단판 전용)은 로컬에서
python scripts/run_match.py --overtime으로 연습할 수 있다.