문제는 이것이었다. 1일차에 사람의 판단을 규칙과 관문으로 옮겨 심어 둔 하네스(harness, AI가 '다 했다'고 거짓말 못 하도록 증거를 강제하는 감시 장치)가, 사람이 붙어 있지 않아도 1년치 계획을 끝까지 실행해낼 수 있는가. 그 계획이 1일차가 짜 둔 1년치 작업 계획 D365이다. 이름은 'Day 365', 즉 1년치라는 뜻이고, 60단계(4분기 × 3개 마일스톤 × 5일. 마일스톤은 분기 안의 중간 목표다)로 되어 있다. 이 계획을 단계마다 자동으로 실행하는 프로그램이
d365-runner다. 결과부터 말한다. 이 프로그램이 16시간 13분 동안 62번 커밋(저장)하며 60단계 전부(60/60) 완주했다. 이 하루로 얻은 것은 여섯 가지다. AI 도우미가 제대로 동작하는지 찔러 보는 행동 테스트(probe)가 8→9종으로 늘었다. 사람 없이 스스로 끝내는 정도인 자율성(autonomy) 지표는 처음으로 측정 시작(0.38)했다. 스스로 규칙을 고치는 절차 self-improve에는 과거로 되돌아가는 오류를 막는 관문 신설이 붙었다. 쌓아 둔 규칙(rule)은 서로 얽힌 정도를 실제 측정했다. 바깥에 공개하는 창구 2개(지표판(Scoreboard) · 1년 결산 리포트)를 열었다. 그리고 다음 해 계획 15일치 확정까지 마쳤다. 각 단계는 '정말 끝났는지' 검사하는 관문(verify)을 통과해야만 완료로 인정된다. 실패하면 exit 2 신호(프로그램이 끝나며 남기는 숫자로, 2는 차단을 뜻한다)로 막힌다. 코드 반영은 매번 다른 AI 모델(Codex)의 트집 잡기 적대 리뷰(131회)를 통과해야 저장소에 올라간다. 단계마다 붙는 이름표는 D1~D60이고, 여기서 D는 순서대로 밟는 작업 단계라는 뜻이다(날짜라는 뜻은 아니다). 계획을 '어디까지 했는지 기억하는 상태 기계'로 만들었기에, 1년치를 한 번의 작업 세션(한 번 켜서 끝까지 이어간 작업) 안에 실행할 수 있었다.
이번 한 번의 작업(세션)이 이 하네스(harness, AI가 '다 했다'고 거짓말 못 하도록 증거를 강제하는 자동화 장치)에 남긴 변화를 전부 모았다. 왼쪽이 실행 전, 오른쪽이 실행 후다. 각 행의 근거는 docs/d365/폴더의 결과 리포트·증거 파일·스크립트로 되짚을 수 있다. '좋아졌다'는 느낌 대신
항목별 전 → 후 수치로 적었다. 측정하지 못한 값은 억지로 채우지 않고 N/A(값 없음)로 남긴다. 실패를 숨기지 않는다는 원칙(fail-loud)이다.
| 항목 | 실행 전 | 실행 후 | 근거 파일·스크립트 |
|---|---|---|---|
| 에이전트 행동 테스트(probe) 통과 수 | 8 PASS | 9종 통과 · 새 항목 10종 선정 + 정답 기준(gold label, 무엇을 통과로 볼지 미리 적어 둔 기준) 부여 | q3m2-agent-selection · fp-audit |
| 자율성(autonomy), 사람 없이 스스로 끝낸 정도 | N/A, 지표 자체가 없었음 | 0.38로 측정 시작 · 무인 완료율 집계 경로 구축 | q3m3-autonomy-schema · q4m1 |
| self-improve(스스로 규칙 보강)의 되돌이 오류 차단 | 없음 | 행동 테스트 관문 신설. 실제 1건을 exit 2로 막은 것 확인 | self-improve-probe-gate.sh |
| 비용 관리(거버넌스) | 추적 안 함 | 7일 토큰(AI가 글을 읽고 쓰는 단위이자 요금 단위) 비용 24.8k→28.4k로 경고선 도달 감지 · 모델 분산으로 아낀 건 아직 없음을 그대로 기록 | q4m3-cost-baseline |
| 예측타당성 ρ(지표가 실제 성과를 예측하는지) | 개념뿐 | 같은 입력이면 같은 값을 내는 계산기 마련 + 'ρ가 0.5 넘을 때만 지표를 판단 근거로 쓴다'는 원칙 · 이번엔 표본이 8개뿐(<12)이라 판정은 N/A | d365-rho.sh · q1m1-validity |
| 규칙(rule)의 물갈이 상태 | 감(느낌)뿐 | 관계 그래프로 실측: 규칙 94개 · 서로 참조하는 연결 70개 · 아무도 안 쓰는 고아 규칙 25개(26.6%) · 삭제 0개(한 번 근거로 지우지 않는 원칙) | d365-rule-graph.sh · q1m2 |
| 하네스를 바깥에 보여주는 창구 | 없음 | 지표판(Scoreboard) + 1년 결산 리포트 자동 발행(표 파일 tsv → HTML) | d365-dashboard · yearly-report |
| 다른 곳에 옮겨 심을 수 있나(이식성) | 가설 단계 | 이식 설치 도구 마련 + 조건부 통과(구조는 바로 이식 OK · 측정 부분은 마찰 여섯 항목 재설계 후) | substrate-install.sh · q2m1 |
| 다음 해 계획 | 없음 | v2(다음 해 계획) 15일치 확정: 겪은 마찰의 근거 파일 링크 · 파일만 있으면 통과되던 검사를 내용까지 보는 우회 불가 검사로 교체 · 적대리뷰 통과 | v2/plan.draft.json · q2m3 |
| 지표만 통과시키는 편법(game-vector) 차단 | 검사가 단순 문자열 대조라 눈속임 가능(자체 점검에서 발견) | 변화 검증 가드 신설. 일부러 만든 실패 사례를 exit 2로 막음 | d365-delta-guard.sh |
60단계는 4개 분기로 나뉜다. 각 분기의 할 일은 앞 분기에서 실제로 부딪힌 마찰(문제)이 결정했다. 분기와 분기 사이에는 관문(게이트, 조건을 못 채우면 다음으로 못 넘어가는 검문소)이 있어서, 왜 이렇게 다시 계획했는지 적은 기록 revision_log을 반드시 요구한다. 그 근거가 없으면 다음 분기의 '임시(provisional)' 계획이 확정으로 풀리지 않는다. 관문 4개를 전부 통과했다. 아래는 분기마다 실제로 한 일이다. 네 분기는 2026년 3분기부터 2027년 2분기까지다. 카드 이름표는 분기 번호와 연도이고, 분기 번호만 줄여 부르면 이렇다: Q3 · Q4 · Q1 · Q2
Q3-2026전환 흡수 — 측정의 기준점 만들기15/15 doneD3 단계(세 번째 단계) 검사가 단순 문자열 대조라 눈속임이 가능했다. 그래서 변화 검증 가드 d365-delta-guard.sh로 차단했다(일부러 만든 실패 사례를 exit 2로 막음)Q4-2026자동화 심화 — 사람 없이 어디까지 가능한가와 관문15/15 doneself-improve-probe-gate 신설 · 실제 1건을 exit 2로 막음 · 학습용/평가용 심판 분리 · '연결만 해둔 것 ≠ 실제로 돌아가는 것'이라는 점을 기록으로 남김Q1-2027측정 장치 — 지표가 믿을 만한지까지 검증15/15 doned365-rho.sh로 같은 입력=같은 값 계산 · 결과는 모든 지표 N/A(판정 불가)(표본이 8개로 12개에 못 미침). ρ가 0.5를 넘기 전에는 지표를 판단 근거로 삼지 않는다는 원칙 확정d365-rule-graph.sh로 실측: 규칙 94개 · 서로 참조하는 연결 70개 · 요약에서 파생된 연결 54개 · 아무도 참조하지 않는 고아 규칙은 orphan 25(26.6%) · 삭제 후보 0개(여러 번 반복 근거 없이 한 번 신호로는 지우지 않는 원칙)weekly-scoreboard.tsv 표를 → HTML로 자동 변환해 공개 · 7일 넘게 안 바뀌면 '낡음' 경고 · N/A는 그대로 보존 · 데이터가 줄어드는 갱신은 거부하는 안전장치Q2-2027확장 + 결산 — 옮겨 심고, 되돌아보고, 다음을 정한다15/15 doned365-substrate-install.sh(여러 번 돌려도 같은 결과 · 기존 파일 안 지움 · 심링크(다른 위치를 가리키는 바로가기 파일) 눈속임 차단) 설치 도구 구축 · 판정은 조건부 통과: 규칙·관문 같은 구조는 바로 옮겨도 OK, 평가·측정 부분은 개인 데이터와 얽혀 있어(마찰 여섯 항목) 재설계 후에F1~F6T4 하나만 보류하고 4개 채택 · 15일 확정 · 적대리뷰를 통과한 우회 불가 검사로 잠금1일차에 세운 작업 방식(판단 → 규칙으로 굳히기 → 다른 모델의 트집 검증 → 다시 측정)은 5일짜리 짧은 집중 작업(스프린트)이었다. 2일차는 같은 사이클을 60단계로 늘렸다. 핵심은 분량보다 상태가 계속 살아남는다는 점이다. 지금까지의 진행 상태를 파일(state.json)에 정본으로 저장해 두어, 실행기가 언제 다시 호출돼도 멈췄던 지점부터 이어간다. 계획이 '읽고 마는 문서'에 머물지 않고 '언제든 다시 시작할 수 있는 상태 기계'였기에, 1년치가 한 번의 세션 안에 들어갔다.
'60/60 완주'가 그냥 말뿐이 아닌 이유는 이렇다. 각 단계의 '완료'는 세 겹의 강제 검사를 통과해야만 인정된다. 별도로 띄운 독립 검증 AI(subagent, 검증만 맡기려고 따로 띄운 보조 AI)가 프로그램 종료 신호(exit code, 프로그램이 끝나며 남기는 숫자로 0은 성공·2는 차단)로 재현까지 확인했다. ① 순서를 건너뛰면 실패한다(exit 2). ② 검사(verify)가 실패하면 완료를 차단한다(exit 2). ③ 검사 명령은 계획 파일이 저장소의 최신 커밋과 일치할 때만 실행된다. 즉 검사를 몰래 바꾸려면 커밋을 해야 하고, 그 커밋은 적대리뷰를 거쳐야 반영된다. 여기서 계획 파일의 이름과, 저장소가 최신 커밋을 가리키는 git 용어는 차례로 plan.json · git HEAD
모든 코드 반영(push)은 다른 AI 모델 Codex가 독립적으로 트집 잡는 적대리뷰(일부러 깨뜨리려는 관점으로 보는 검토)를 통과해야 저장소에 올라간다. 이번 세션에서 이 리뷰는 131회 돌았다. 초반에는 실제 결함(저장소 밖 파일을 건드리는 경로 탈출·프로그램 멈춤·git 색인(커밋 대상 목록) 오염 같은 위험)을 잡아냈다. 후반에는 단순 문자열 검색(grep)만으로는 '뜻'까지 검증할 수 없는 한계에 다다랐다. '좋아진 것 같다'는 느낌 대신 재현 → 근본 원인 수정 → 다시 재현해 확인의 순서로만 통과시킨 기록이다.
| 스크립트 | 잡힌 결함 (치명·중대) | 근본 수정 |
|---|---|---|
rule-archive | 경로 파고들기(traversal, 경로에 상위 폴더 이동을 섞어 정해진 폴더 밖으로 나가는 수법): ../victim 로 저장소 밖 파일까지 옮김 | 파일 이름만 쓰도록 강제 + 재현 사례 차단 |
scoreboard-render | --publish 옵션이 색인 전체를 커밋해 무관한 파일까지 오염 | git 기능 제거 → 그리기만 하는 도구로 (발행은 별도 흐름이 담당) |
substrate-install | 심링크로 위장한 하위 경로(.claude)를 타고 폴더 밖에 쓰기 | 심링크를 따라가지 않는 안전한 파일 열기로 교체(동시 접근 차단) |
substrate-install | 값 분해 오류로 멈춤 · 미리보기(dry-run, 실제로 바꾸지 않고 무엇을 할지만 보여 주는 모드) 시 대상 없으면 멈춤 | 안전한 값 접근·존재 확인으로 수정 (종료 신호로 재검증) |
v2 plan.json | 검사가 전부 test -s 방식(파일만 있으면 통과 = 편법 소지) | 15일치 전부 내용·형식까지 우회 불가 검사로 교체 |
v1 plan.json | 33일치가 test -s 뿐이었다. 빈 파일만 만들어도 통과되는 허점 | 핵심 문구 2개 확인 grep -qF 방식으로 + 33일치 재검사 통과 |
D365 Scoreboard2027년 1분기의 세 번째 마일스톤이 만든 D365 Scoreboard은 주간 지표를 쌓아 둔 표 파일
weekly-scoreboard.tsv(8개 시점, 덧붙이기만 함)을 바탕으로 자동으로 그려지는 공개 지표판이다. 데이터가 7일 넘게 갱신 안 되면 지표판에 STALE(낡음) 경고를 스스로 띄우고(실패를 숨기지 않음), 측정 못 한 값은 가짜로 채우지 않고 N/A로 둔다. 아래는 가장 최근 스냅샷(2026-07-03T03:34:19Z) 기준이다. v2가 실행되면 그 진행도 이 지표판이 똑같이 측정한다. 표 첫 열의 영문은 지표판 파일의 열 이름 그대로이고, 한글로 적은 '강제 관문 수'의 열 이름은 conf_enf
| 지표 | 현재값 | 의미 |
|---|---|---|
| 재현 일치(replay) | 100.0 % | 같은 입력을 다시 넣으면 같은 결과(결정론) |
| 강제 관문 수 | 5 | 실제로 exit 2를 내며 막는 관문의 수 |
probe_pass | 9 | 에이전트 행동 테스트 통과 수 |
dead hook | 0.0 % | 한 번도 안 걸리는(죽은) 검사(hook, 특정 시점에 자동으로 끼어드는 검사 스크립트) 비율 |
rules_n | 93 | 살아 있는 규칙 수(관리 대상이지 늘릴 목표가 아니다) |
commits_7d | 235 | 최근 7일간 저장(커밋) 횟수 |
cost_7d | 28440 | 최근 7일 토큰 비용(경고선 도달) |
autonomy | 0.38 | 자율성. 초기 설정을 벗어나 실제 측정 시작 |
2027년 2분기의 두 번째 마일스톤이 만든 1년 결산 리포트는 1년 계획 실행 구간 전체를 같은 지표판 도구로 다시 측정한 변화량이다. '좋아진 것 같다'는 느낌 대신 숫자로 보여준다. 게다가 그 숫자가 무엇을 못 말하는지('숫자가 말해주지 못하는 것')까지 같은 페이지에 정직하게 남겼다.
| 항목 | 시작 | 최신 | Δ |
|---|---|---|---|
| 재현 일치 % | 100.0 | 100.0 | 0.0 |
friction | 22 | 23 | +1 |
| 강제 관문 수 | 5 | 5 | 0 |
probe_pass | 8 | 9 | +1 |
rules_n | 91 | 93 | +2 |
cost_7d | 24809 | 28440 | +3631 |
autonomy | NA | 0.38 | 측정 시작 |
'되먹임 고리(폐루프, 결과가 다음 계획의 입력이 되어 한 바퀴 도는 구조)'가 진짜 돌았다는 증거는 말이 아니라 링크가 실제 파일로 연결되는가다. v2 계획의 각 주제는 v1이 실제로 부딪힌 마찰과, 그 마찰이 적힌 파일을 가리킨다. 독립 검증이 그 링크가 진짜 증거 파일로 이어짐을 확인했다. 직감만으로 넣은 주제는 0건이다. 근거가 한 번뿐인 항목 하나는 정식 채택하지 않고 보류로 남겼다(나중에 같은 논쟁을 다시 벌이지 않도록).
채택한 주제 4개는 v2의 마일스톤 3개(15일)로 묶었다. 초안은 이미 적대리뷰를 통과해, 파일만 있으면 통과되던 test -s 방식 대신 내용까지 확인하는 우회 불가 검사로 잠갔다. 실행되면 그 진행은 위 D365 Scoreboard가 자동으로 측정한다. 이런 우회 불가 검사를 하네스 안에서 부르는 이름은 HARD verify
M1T2+T5M2T1M3T3지금까지 v1은 60단계 전부 완주(60/60), v2는 초안 완성 · 적대리뷰 통과까지 왔다. v2는 아직 실행 전이다. 되먹임 고리의 다음 한 바퀴가 곧 v2 실행이다. 도달한 것과 남은 것을 부풀리지 않고 정직하게 나눈다.