판정은 어떻게 이루어지는가
Polydeukes는 연결된 표면이 공급하는 증거를 바탕으로 선언된 관행을 확인합니다. 에이전트가 관행을 지켰다고 말하는 것만으로 이행을 인정하지 않습니다. 정상 판정이 설명하는 범위도 실제로 관측한 파일, 호출, 대화 기록에 한정됩니다.
관계와 추출 연산의 전체 문법은 선언 언어 참조에서 확인할 수 있습니다.
약속, 규율, 표면
섹션 제목: “약속, 규율, 표면”**약속(covenant)**은 작업에 관해 함께 지키기로 한 약속입니다. **규율(discipline)**은 프로젝트 설정에 등록한 개별 관행입니다. **판정기(judge)**가 증거를 평가하고, **판정 결과(verdict)**가 그 결과를 나타냅니다.
**표면(surface)**은 언제 증거를 수집하는지 결정합니다.
- 세션 표면은 지원하는 호스트의 도구 호출을 실행 전에 관측합니다.
- 변경 집합 표면은 스테이징한 변경, 작업 트리의 변경 또는 두 리비전 사이의 변경을 관측합니다.
패키지를 설치하는 것과 표면을 연결하는 것은 다릅니다. 에이전트가 지침을 읽었다고 해서 도구 호출에 자동으로 판정이 적용되지는 않습니다. 지원하는 연동을 설정하고 실제 호출로 확인하세요. 표면 연결하기를 참고하세요.
선언과 관측 한계
섹션 제목: “선언과 관측 한계”판정할 규율에는 id와 declare 블록이 있습니다. 적용 범위로 관측 대상을 고르고,
소스에서 증거를 얻고, 추출 단계로 증거를 변환한 뒤, 관계로 약속을 어긴 원소를 찾습니다.
why는 관행의 이유를 설명할 뿐 실행할 논리가 아닙니다.
고정 소스는 target.path, pre, post, state, changes, command, actor입니다.
추가 바인딩으로 특정 파일, 보조 채널 또는 세션의 대화 기록을 읽을 수 있습니다.
선언은 표면이 공급하는 소스만 사용할 수 있습니다. 따라서 같은 선언도 한 표면에서는
판정할 수 있지만 다른 표면에서는 미판정으로 기록되거나 적용 범위와 맞지 않을 수 있습니다.
state는 파일 수정의 변경 전후 값을 한 쌍으로 제공합니다. 실행 사이에 저장되는 상태도,
작업 단계가 진행됐다는 주장도, 명령이 성공했다는 증거도 아닙니다. unchanged 관계는
쌍으로 된 추출 결과를 사용하고, 나머지 관계는 단일 추출 결과를 사용합니다. 파일 추가와
삭제에는 수정의 전후 쌍이 없습니다. 증거가 없을 때는 선언의 supply 정책을 따릅니다.
빈 파일이 있었다고 가정하지 않습니다.
draft: true인 항목은 아직 선언으로 전환하지 않은 관행을 기록합니다. 판정하지 않고
텔레메트리 행도 남기지 않습니다. 유효한 선언에 검사가 더 필요하다는 이유만으로 초안으로
남기지는 마세요. 반대로 현재 문법에 필요한 증거나 비교가 없다면 단계나 메커니즘을
지어내지 마세요. 규율 작성하기에서는 실행 가능한
번역 키 비교와 현재 지원하지 않는 약속을 각각 보여 줍니다.
일곱 관계
섹션 제목: “일곱 관계”관계는 비교 조건을 만족하지 않는 원소의 목록을 반환합니다. 그 목록이 비어 있으면 관계가
성립합니다. 이는 empty 관계가 추출 결과에 요구하는 조건과 구별해야 합니다.
| 관계 | 요구하는 조건 |
|---|---|
empty |
추출 결과에 항목이 없어야 합니다. |
nonEmpty |
추출 결과에 항목이 하나 이상 있어야 합니다. |
equal |
양쪽에서 추출한 집합이 같아야 합니다. |
subset |
왼쪽의 모든 항목이 오른쪽에도 있어야 합니다. |
implies |
왼쪽이 요구하는 키에 대응하는 키가 오른쪽에 있어야 합니다. |
ordered |
추출한 순서가 선언한 정렬 조건을 만족해야 합니다. |
unchanged |
파일 수정 전후에 공통으로 있는 키의 값이 같아야 합니다. |
키와 값은 역할이 다릅니다. 키를 기준으로 비교하거나 결합할 때는 키로 항목을 식별합니다. 값끼리는 구조가 같은지 비교합니다. 번역 키를 비교하는 선언은 번역 문구를 비교하지 않습니다. 관계가 무엇을 구별할 수 있는지는 추출 과정에 달려 있습니다.
열여덟 메커니즘 이름
섹션 제목: “열여덟 메커니즘 이름”메커니즘은 선언의 목적과 허용하는 구성을 나타냅니다. 새로운 비교 연산자가 아닙니다. 컴파일러는 문법에서 증거의 축과 관계를 도출하고, 선택한 메커니즘에 맞는지 확인합니다.
이름은 pairing, companion, monotonic-order, fingerprint-sync, producer-owned,
self-absolution-ban, actor-scope, precedent, phase-order, turn-locality, stated-ground,
controlled-vocabulary, naming, added-only, one-way-marker, delegated-scope,
scoped-valve, forbidden-command로 한정됩니다.
delegated-scope는 예약된 이름이며 이번 버전에서 사용할 수 있는 선언이 아닙니다.
scoped-valve에는 자체 증인 블록이 필요합니다. naming은 target.path를,
forbidden-command는 command를 적용 범위의 소스로 사용합니다. 구문과 추출 단계는
설정 참조에 있습니다.
종료 코드만 보지 말고 결과를 읽기
섹션 제목: “종료 코드만 보지 말고 결과를 읽기”| 기록 | 의미 |
|---|---|
passed |
관측한 입력을 판정했으며 약속을 지켰습니다. |
blocked |
관측한 입력이 약속을 어겨 작업을 거부했습니다. |
witnessed |
차단 판정 뒤 증인 밸브가 작업을 허용했습니다. |
advised |
위반을 기록하되 작업을 멈추지는 않았습니다. |
skipped |
판정하지 못했음을 기록했습니다. 정상 판정이 아닙니다. |
unattributed |
기준 상태와 비교했을 때 판정으로 설명되지 않는 보호 대상의 변경이 있었습니다. |
마지막 항목은 판정기의 판정 결과가 아니라 비교에서 발견한 사실입니다. 텔레메트리는 이를
같은 이벤트 열에 기록합니다. advised나 skipped가 있어도 exit 0일 수 있습니다.
그렇다고 관행을 지켰다는 뜻은 아닙니다. 관측한 변경이 없다는 결과도 다른 파일의 상태를
설명하지 않습니다.
강제 수준과 증인
섹션 제목: “강제 수준과 증인”규율 항목의 기본 강제 수준은 advise입니다. 위반과 정상 사례를 모두 확인한 뒤
enforce: block으로 승격하세요. 변경 집합 표면의 수준과 항목의 수준을 함께 적용할 때는
더 관대한 쪽을 따릅니다. 표면만 block으로 설정해도 모든 항목이 차단 수준으로
바뀌지는 않습니다. 판정 체계 자체의 보호는 일반 규율 항목과 별개입니다.
증인(witness) 밸브는 차단 판정 뒤에 확인하며, 판정을 대신하지 않습니다. 세션과 커밋의 증인은 전달 방식과 사용하는 증거가 다릅니다. 커밋 프롬프트로 대기 중인 세션 호출을 허용할 수는 없습니다. 증인과 회복과 문제 해결을 참고하세요.