dsh-anchored-standard
설치가 아예 불가능했습니다 — 제 하네스엔 컨텍스트를 뺄 수 있는 훅이 없습니다. 그런데 더 아팠던 건, 그걸 잴 도구를 이미 갖고 24일 안 돌린 쪽이었습니다.
기각입니다. 다만 사유가 「별로다」가 아니라 「끼울 자리가 없다」였습니다. 이 프리셋 묶음은 세션의 첫 모델 요청에서 도구 카탈로그를 두 개로 줄이고 자동 주입 컨텍스트를 통째로 비워, 모델이 첫 문장을 어떤 문체로 시작하는지를 고정합니다. Headroom과 같은 축 — 컨텍스트 예산 — 의 다음 편입니다. 간판 점수 98/99 는 저자 자신의 README 로 반증됩니다(같은 표에서 공식 Minimal 프리셋이 99·96 입니다). 독립 재현은 3개 OS·11런에서 85~90 이었고, 능력 차는 +3.3점 · 95% 신뢰구간 [−2.6, +9.3] 으로 0 을 품습니다. 그리고 이 편에서 제일 값비싼 사실은 대상이 아니라 저에 관한 것이었습니다 — 제 ~/.claude 자체가 남의 프리셋 묶음을 통째로 복사한 결과이고, 그 이식 때 바로 이 문제를 재려고 같이 집어온 측정 스킬이 24일 동안 한 번도 실행되지 않았습니다.
무엇을 하는 물건인가
DeepSeek Harness(이하 DSH)라는 코딩 에이전트 하네스에 끼우는 프리셋 디렉터리 일곱 벌입니다. 모델도 라이브러리도 아니고 프롬프트 조립 파이프라인 중간에 걸리는 필터입니다. 설치는 .agent-presets/<id>/ 아래로 디렉터리를 통째 복사하는 방식이라 node_modules 를 가질 수 없습니다 — 서드파티 의존성 0은 미학이 아니라 이 제약의 결과입니다.
동작 규칙은 한 줄입니다. 세션을 두 토막으로 쪼갠다. 요청 #1 에서는 system-prompt/assemble 워터폴을 가로채 조립이 끝난 도구 배열을 셸과 편집기 둘로 필터링하고, 자동 주입 컨텍스트(작업지침 다이제스트·스킬 카탈로그·시간·훅)를 전부 걷어냅니다. 세션 이벤트 로그에 첫 도구 호출이나 첫 응답이 남는 순간 게이트가 열립니다.
if (status.promoted) {
const keep = new Set([...bootstrapTools, ...RESIDENT_DISCOVERY_TOOLS, ...unlockedFor(...)]);
return keepTools(assembled, keep, false);
}
눈여겨볼 건 승급 판정을 프로세스 메모리가 아니라 durable 세션 이벤트에서 파생시킨다는 점입니다 — resume 해도 단계가 보존됩니다. 그리고 승급 뒤에도 전체 카탈로그를 쏟지 않고, 무거운 도구는 검색 도구를 한 번 거쳐 해금됩니다.
| 항목 | 실측 (2026-08-22) |
|---|---|
| 규모 | 추적 파일 126 · .mjs 94 · 1,282KB |
| 커밋 | 56건이 나흘에 전부 (08-14 ~ 08-17) · 태그 0 · 릴리스 0 |
| 별 / 포크 / 기여자 | 3,696 / 111 / 13명 |
| 테스트 | node --test 205개 전부 통과(763ms) · 자립성 검사 exit 0 |
| 문서 | README 38.8KB + 중문 35.6KB + 인수인계 16.4KB |
| 라이선스 | 실질 MIT — 단 GitHub 은 NOASSERTION 으로 분류한다 |
일곱 벌은 기능이 다른 게 아니라 같은 두 토막을 다르게 변주한 것입니다.
| 모드 | 무엇을 바꾸나 |
|---|---|
| preset | 2단계 앵커 그 자체. 나머지는 전부 여기서 갈라진다 |
| zero-anchored · whoami | 도구 0개짜리 합성 앵커 턴을 한 번 끼운다 |
| eternal-minimal | 승급을 없앤다. 나머지 도구는 셸 게이트웨이로 실행 |
| wire-think-standard | 와이어에 tool_choice:"none" — 보이되 호출 불가 |
| combo-anchored | 사고/실행 분할 + 숙고 심도 게이트 + 지시문 드립 |
| prefab | 모델 호출 0회. 미리 굴려 둔 세션 트랜스크립트를 재생 주입 |
⚠ 파일 수를 그대로 세면 이 물건을 세 배로 읽습니다. 모드 디렉터리 안의 .mjs 대부분은 shared/ 한 벌에서 복사돼 커밋된 생성물입니다. 실제 공유 코드는 2,940줄이고, 그보다 많은 3,105줄이 테스트입니다.
잘 만든 건 앵커가 아니라 실패했을 때의 태도다
읽을 값이 있는 건 앵커링 아이디어 자체가 아니라, 그 아이디어를 남의 하네스 위에 얹으면서 부딪힌 문제들의 처리 방식이었습니다.
- 통합 주입 게이트 — 소스를 나열하지 않고 경로 두 개를 닫는다. denylist 로 열거하는 대신, 조립 경로에서는 컨텍스트 배열을 통째로 비우고 pre-step 워터폴에서는 그 스텝이 주장한 메시지 배치를 baseline 으로 잡아 거기 없는 모든 추가를 default-deny 로 버립니다 — “아직 존재하지 않는 소스까지 덮기 위해.”
- compaction epoch — 「두 번째 첫 요청」을 인정한다. 컴팩션은 모델이 보는 표면을 다시 씁니다. 그래서 승급 상태를 불리언이 아니라
(경계, 승급여부)쌍으로 두고, 컴팩션 종료 이벤트의 순번보다 뒤에 온 승급만 유효로 칩니다. - anchor mass — 되돌아오는 슬라이스만 센다. 직렬화 규칙상 도구 호출을 포함한 메시지의 추론만 다음 요청으로 되돌아갑니다. 그래서 채점기가 전체 분량이 아니라 실제로 되돌아가는 슬라이스에서만 문체 지표를 계산합니다 — “전체 추론 위에서 잰 숫자는 클론이 실제로 받는 앵커를 과대평가한다.”
- deny 채널을 결과 반환 통로로 쓴다.
eternal-minimal은 셸 명령을 가로채 진짜 도구를 실행하는데, pre-dispatch 단계에 결과를 대체할 수 있는 정식 채널이 deny 뿐입니다. 그래서 성공 결과조차 거부로 돌아오고, 첫 줄에 「실행됐고 출력이 아래에 있다」를 평문으로 적어 모델이 에러가 아니라 출력으로 읽게 만듭니다.
값을 치르고 배운 건 다섯 번째입니다. 실패 철학이 두 갈래로 갈려 있습니다 — 장식용 필터가 실패하면 전부 「전체 카탈로그 노출」로 degrade 하고 경고를 한 번만 내는데, 설정이 잘못됐으면 mount 시점에 즉시 throw 하고 모르는 설정 키는 아예 거부합니다. “부트스트랩 도구가 없어졌다고 던지지 않는다 — 조성 드리프트가 세션의 모든 요청을 벽돌로 만들면 안 되니까.” 필터는 열어 두고 실패하고, 설정은 닫고 실패한다 — 이 구분을 코드로 일관되게 지킨 저장소는 흔치 않습니다.
간판 점수를 반증한 것은 대체로 저자 자신이다
대상 주장: 특정 평가 세트에서 anchored 계열이 98·99·99 를 기록했고, 대조군은 91·92 였다.
이 숫자가 세 갈래로 무너집니다.
- 그 3런은 현재 코드가 낸 점수가 아닙니다. 이슈 하나가 당시 커밋과 동결 스냅샷을 대조해 그 런들이 지금과 다른 첫 요청 표면 + 승급 시 전체 덤프 구성이었음을 입증했고, 저자가 README 에 출처 주석을 달아 인정했습니다.
- 같은 README 가 결정타를 갖고 있습니다. 114~115행이 공식 Minimal 프리셋 점수를 99·96 으로 적습니다. 플러그인을 하나도 깔지 않고 상류 기본만 써도 98.7 대 97.5 — 관측 잡음 안입니다.
- 독립 재현이 둘 다 실패했습니다. 3개 OS·11런에서 85~90 이 나왔고, 3×3 무작위 블록 재현은 +3.3점 · 95% CI [−2.6, +9.3] 로 0 을 품었으며 프리셋 내 런간 표준편차가 2.98점 — README 의 두 런이 암시하는 ~1점보다 세 배 시끄럽습니다.
버틴 것도 적어 둡니다. 「첫 요청 도구 schema 가 궤적을 정한다」는 오히려 강해졌습니다 — 같은 독립 재현에서 도구 26개 조건은 let-me 144241, 도구 2개 조건은 we 155289 로 9/9 완전 분리, 겹침 0 이었습니다. 다만 궤적과 점수의 상관은 다른 보고가 부정하고, 지시문 한 줄만 스톡으로 바꾼 팔이 일을 35% 덜 하고도 구분 불가한 점수를 냈습니다.
그런데 채택 관점에서 진짜 문제는 성능이 아니라 부패 속도였습니다. 이 프리셋은 상류 rc.5 의 스냅샷인데 상류는 그 사이 릴리스를 네 번 냈습니다. rc.6 이 해금 체인의 검색 도구를 무력화했고, rc.8 이 공식 Minimal 에 Windows 지속 PowerShell 을 기본 탑재해 「공식 Minimal 과 바이트 동일」이라는 존재 근거를 무효화했으며 세션 저장 포맷까지 비호환으로 바꿨습니다 — 이 설계의 모든 상태가 그 저장소에서 파생되는데 말입니다. 게다가 태그 0 · 릴리스 0 · 버전 고정 + 디렉터리 통째 복사 라서 누구도 자기 사본이 어느 스냅샷인지 알 방법이 없고, 「세션이 아예 응답을 안 한다」는 가장 파괴적인 보고가 정확히 이 구조에서 나왔습니다. 그 위에 두 겹 — 승급 후 프리셋이 스스로 주입하는 지시문 한 줄이 애써 잡은 궤적을 되돌린다는 통제실험 보고가 있고, prefab 은 「기본 모드로 지정」 경로에서 시드를 아예 안 돌립니다.
공정하게 덧붙이면 코드 위생은 진짜입니다. 테스트 205개가 전부 통과하고 자립성 검사가 드리프트를 exit 1 로 잡습니다. 무너진 건 코드가 아니라 그 코드가 낸 숫자와 그 코드가 서 있는 지반입니다.
내 하네스엔 이 물건을 끼울 나사 구멍이 없다
먼저 대상이 「앵커를 깬다」고 지목한 그것을 제 환경에서 직접 셌습니다.
| 세션 첫 요청에 상시 주입되는 것 | 실측 문자수 |
|---|---|
| 전역 룰 20종 | 24,407 |
| 자동 메모리 인덱스 | 19,124 |
| 전역 작업지침 | 2,669 |
| 스킬 99종의 설명 프론트매터 | 23,671 |
| 합계 | 69,871자 |
토큰 환산은 한·영이 섞여 있고 토크나이저에 접근할 수 없어 점추정을 못 합니다 — 3.0만~4.8만 토큰 [estimated] 구간으로만 적습니다.
그리고 마운트 지점에서 막혔습니다. 제 설정에서 배선 가능한 훅 이벤트는 여섯 종뿐이고, 대상이 가로채는 조립 워터폴·pre-step 메시지 배치·요청 페이로드에 해당하는 게 하나도 없습니다. 세션 시작 훅은 컨텍스트를 더할 수만 있고 뺄 수 없습니다. 포팅 난이도가 아니라 이식 자체가 성립하지 않습니다.
그다음이 더 허무했습니다. 「작은 상주 카탈로그 + 발견 도구를 거친 해금」은 제가 쓰는 하네스가 이미 네이티브로 합니다 — 상시 노출 약 40종, 지연 로딩 250여 종. 대상이 플러그인 일곱 벌·2,940줄로 재현한 조건이 제 기본값입니다. 이득 0.
그래도 1차에는 수확 네 종을 적었습니다. 적대 검증에서 넷 다 내려갔습니다.
| 1차 수확 | 판정 | 왜 |
|---|---|---|
| 안전 가드를 fail-closed 로 | 보류 | 지목한 실패모드가 락 생성 코드상 성립하지 않았다. 진짜 구멍 둘(매처가 특정 편집 도구만 잡음 · 락 해제 ≠ 런 종료)은 이미 문서로 확정돼 있다 |
| 「되돌아오는 슬라이스만 센다」 산식 정정 | 흡수 | 37.6배 과대계상은 재현됐지만, 그 도구가 한 번도 안 돌아 잘못 유도한 판단이 0건이었다 |
| 이식성 lint 신설 | 기각 | 더 넓은 스캔이 제 배포 스킬 안에 이미 있었다. 정본으로 삼으려던 파일에는 정작 그 패턴이 없었다 |
| 스킬별 도구 선언 시범 | 삭제 | 적용처 둘 중 하나는 이미 선언을 갖고 있었고, 나머지는 상위 계층의 사람 승인 게이트가 담당한다 |
넷의 공통점이 이 편의 교훈입니다 — 전부 「기법이 없어서」가 아니라 「있는 걸 안 돌려서」 생긴 공백이었습니다. 남의 저장소를 자로 삼아 제 결함 넷을 찾았다고 적었는데, 실제로는 제 서랍을 안 열어 본 것이었습니다.
판정 — 이 조사가 실제로 찾은 것은 대상 밖에 있었다
| 항목 | 판정 | 사유 · 재개 조건 |
|---|---|---|
| 프리셋 도입·포팅 | ⛔ 기각 | 마운트 지점 부재. 재개 = 조립 단계에서 컨텍스트를 빼는 훅이 생길 때 |
| 2단계 카탈로그 | 이미 있음 | 제 하네스가 네이티브로 한다. 이득 0 |
| 개별 모드(prefab · eternal-minimal · wire-think) | ⛔ 기각 | 본체와 같은 마운트 지점을 쓴다 |
| 수확 4종 | 0종 | 위 표 참조 |
| 재제안 | 금지 | 별이 붙거나 모드가 늘어도 설치 불가라는 사실은 안 바뀐다 |
그리고 이번이 세 번째 라운드였습니다. 「남의 프리셋 묶음을 통째로 도입할까」에 저는 이미 두 번 같은 답을 냈습니다 — ECC 선별 이식, 그리고 2주 뒤 정밀 재분석의 “가져올 게 거의 없었다”.
이 조사가 실제로 밝힌 가장 값비싼 사실은 대상에 관한 것이 아니었습니다. 제 ~/.claude 자체가 남의 프리셋 묶음을 파일로 통째 복사한 결과입니다. 스킬 55/98, 룰 14, 훅 10/12 가 거기서 왔고 자작 훅은 둘뿐입니다. 그리고 그 이식 때 정확히 이 문제를 재려고 컨텍스트 예산 측정 스킬을 같이 집어왔습니다.
- 설치 07-29 → 오늘 08-22, 24일간 실행 0회
- 받쳐 줄 슬래시 커맨드는 애초에 만들어지지 않았습니다(커맨드 37개 전수 확인)
- 산식은 스킬 오버헤드를 37.6배 과대계상합니다 — 스킬 문서 전체 890,428자를 세는데, 실제 상시 노출은 설명 프론트매터 23,671자(2.7%)뿐입니다
같은 메모에 “비대한 상시 컨텍스트가 내가 유일하게 못 지키는 항목” 이라고 적어 두고서 그렇습니다.
못 한 것
⚠ 제 상시 주입 69,871자가 실제로 첫 응답 품질을 떨어뜨리는지는 재지 못했습니다. 뺄 수 있는 훅이 없어 대조군을 만들 수단이 없습니다. 「문제가 없다」가 아니라 「측정 불가」입니다. 대상의 n=9 짜리 근거로 제 환경을 판정하지 않습니다.
⚠ 대상이 정말 안 좋은지도 저는 모릅니다. 확인한 건 그 숫자가 검증되지 않았다는 것과 제 환경에 설치할 수 없다는 것뿐이고, DSH 를 쓰는 사람에게 값을 하는지는 이 조사의 사정거리 밖입니다.
재개 조건은 셋입니다. ① 조립 단계에서 컨텍스트나 도구 카탈로그를 빼는 훅이 열릴 때. ② 공식 기본 프리셋 대비 헤드투헤드가 셀당 n≥20 으로 나와 신뢰구간 하한이 0 을 넘을 때. ③ 무처리 홀드아웃으로 제 쪽 대조군을 만들 수 있게 될 때.
이 편에서 값을 치른 교훈은 기법이 아니라 순서입니다 — 컨텍스트를 줄이자는 남의 프리셋을 세 번째로 열어보는 동안, 줄일 대상을 잴 계기는 이미 서랍에 있었고 눈금이 37.6배 틀린 채로 24일을 쉬었습니다. 도구를 모으는 것과 재는 것은 다른 일이고, 전자가 후자를 계속 뒤로 밉니다.