글을 막는 자리를 하나 더 뒀다. 한참 뒤에야 막은 날이 아무 데도 안 남는다는 걸 알았다.
규칙이 못 잡는 것만 본다
게이트는 규칙으로 정할 수 있는 것만 본다. 스키마가 맞는지, 인용할 출처가 있는지, 금지한 표현이 섞였는지까지는 코드가 판정한다.
그런데 규칙으로 못 적는 결함이 있다. 근거보다 크게 말한 문장, 애초에 쓸 거리가 아니었던 소식, 지난주 글과 똑같은 구성, 구체적인 게 하나도 없는 단락, 규칙으로는 옮기지 못한 어투가 그렇다. 이 다섯을 보는 읽기를 발행 앞에 뒀다.
이 읽기는 글을 쓴 쪽이 하면 안 된다. 처음엔 쓰는 호출 안에서 같이 시켰다. 채점이 죄다 7.4로 몰렸던 Part 1과 같은 자리였다. 지금은 문맥 없이 글만 받는 두 번째 호출이 읽는다.
판정에는 통과 여부를 적는 칸을 두지 않았다. 지적 목록만 받는다. 통과 여부와 지적 목록을 같이 받으면 둘이 어긋날 수 있고, 그러면 어느 쪽을 믿을지 또 정해야 한다.
결정 기록을 열어봤다
넣고 나서 한동안 발행이 뜸했다. 결정 기록 다섯 건을 열어보니 실제로 발행된 건 하나였다. 나흘은 읽기가 막은 날이었다.
왜 막혔는지는 한 건도 남아 있지 않았다. 결정을 기록하는 함수가 발행 경로에서만 돌고 있었다. 거절한 날은 러너가 꺼지면서 판정까지 같이 사라졌다.
이 읽기에 발행을 맡겨도 되는지 정하려면 차단율을 알아야 한다. 멀쩡한 날을 얼마나 자주 막는지가 기준인데, 막은 날의 판정을 버리면 그 값은 영영 못 잰다.
그래서 거절한 날도 발행한 날과 똑같이 적는다. 내보냈는지, 어떤 상태로 끝났는지, 한 번 있는 수정 기회를 썼는지가 다 들어간다.
{
"num": 61,
"critique": { "ran": true, "violations": [] },
"publication": { "emitted": true, "disposition": "clean", "revised": false }
}
막은 이유도 갈라 적는다. 읽기가 지적을 냈는지, 아예 안 돌았는지, 돌다 멈췄는지를 구분한다. 셋 다 그날 발행을 막지만 뜻이 전혀 다르고, 차단율은 그중 첫째에서만 나온다.
고쳐도 같은 지적이 다시 나왔다
처음엔 이 읽기가 판정을 적기만 하고 발행을 막지는 못하게 해뒀다. 멀쩡한 날을 얼마나 막는지 모르는 채로 거절을 맡길 수는 없었다. 막게 하면서는 바로 거절하는 대신 한 번 고쳐 다시 읽도록 했다. 지적은 대개 문장 하나를 가리키고, 문장은 고쳐서 다시 읽힐 수 있다. 고친 글은 두 번째 읽기가 본다. 앞의 지적은 넘겨주지 않는다.
기록이 쌓이자 거절 넷 중 셋이 어투였다. 그중 둘은 같은 결함, 마지막 문장이 교훈으로 끝난다는 지적이었다.
그런데 고쳐도 같은 자리가 또 걸렸다. 원인은 교정 지침에 있었다. 게이트를 통과하려고 주장을 들어내지는 말라고 적어둔 규칙이다. 그래서 교정하는 쪽이 결론투 문장을 지우는 대신 다른 결론투 문장으로 바꿔놓고 있었다.
그 규칙이 지키려던 건 주장이었다. 근거를 대고 한 말을 검사에 걸린다는 이유로 들어내면 안 된다는 뜻이지, 아무 사실도 담기지 않은 논평까지 지키라는 말이 아니었다. 교정 지침을 그렇게 고치고, 같은 말을 글 쓰는 쪽 지침에도 적었다.
차단율은 이제 막 재기 시작했다. 그전까지는 이 읽기가 얼마나 자주 틀리는지 말할 방법이 없었다.