Skip to content

fix(gate,sync,wiki): 게이트 구멍 폐쇄 + 단방향 sync 소실 차단 + LLM위키 4종 통합 - #182

Merged
chrono-meta merged 7 commits into
mainfrom
claude/fh-selfdev-0726
Jul 26, 2026
Merged

fix(gate,sync,wiki): 게이트 구멍 폐쇄 + 단방향 sync 소실 차단 + LLM위키 4종 통합#182
chrono-meta merged 7 commits into
mainfrom
claude/fh-selfdev-0726

Conversation

@chrono-meta

Copy link
Copy Markdown
Owner

요약

07-26 FH self-dev 세션. 8커밋. 셋 다 측정된 사고에서 출발했고, 셋 다 회귀 앵커를 동반한다.

1. SKILL_detail.md 4축 게이트 전면 미커버 (gate-locality 4번째 재발)

게이트가 리터럴 SKILL\.md 를 찾는데 SKILL_detail.md 엔 그 문자열이 없다(밑줄이 끊음).
실측 17파일 / 208,710B = 스킬 명세 표면의 27.7%, 16/17 이 펜스 코드블록 보유.
실제 누출 2건(371c04f·e661931 — 둘 다 단일파일 phantom-quench/SKILL_detail.md,
그라운딩 감사 스킬 자신의 행동명세가 4축 0회로 수정됨).

구조적으로 더 나쁜 점: salience-splitter 가 상주층을 줄일수록 이 구멍이 넓어졌다.

  • 적대 패스가 "이름 열거로는 이 클래스를 원리적으로 못 닫는다"를 지적 → 열거 스윕 신설
  • 그 스윕이 첫 실행에서 실물 미커버 1건 검출(dialogue-harvest/calibration_pair.md)
    → 게이트를 이름목록 → 디렉토리 스코프로 승격
  • 앵커 scripts/gate_pathspec_check.sh 9쌍, 양방향 캘리브레이션, pre-commit 배선

2. 단방향 sync 무음 덮어쓰기 (세션카드 2회 소실)

카드 v9(7,567B)→v8(5,299B), v10 도 동일 경로. 두 세션 연속 = 유도된 오류(세션시작 규약이
"미러를 먼저 읽어라"라서 미러가 쓰기 지점이 된다). 마감 체커는 못 잡았다 — "card-last violated"는
타임스탬프 순서 지적이지 덮어쓰기 지적이 아니다.

  • 목적지 최신이면 ABORT(sync_dir·sync_file 양쪽) + SYNC_OVERWRITE_OK=1 명시승인·로깅
  • 미러 md 라인1 MIRROR COPY 배너 자동주입 (디렉터리 README 는 약하다 — 에이전트는 파일을 연다)
  • 앵커 scripts/sync_guard_check.sh 7쌍
  • 라이브 캘리브레이션이 자기결함 3건 검출: 과차단(logs/ 미제외) · 반쪽픽스(sync_file 미커버) ·
    배너 churn(265파일 무의미 재전송 → 로그가 계기로서 파괴됨, 265→1 감축)
  • 두 모드 명문화: sync-to-be(개인 보관) / sync-to-org(조직 공유), 가드는 공통 floor

3. LLM위키 4종 + 부수 수리

  • dialogue-harvest 실코퍼스 1호 + Step 4-b 교차문서 provenance 신설
    (single-author 경로에서 provenance 가 공짜로 붙던 한계를 극복). 부산물: 06-27 입고 코퍼스가
    29일간 인용 0회였고 그 안에 "FH 부재"로 확정했던 kill switch 가 들어 있었다
  • frontier-digest arxiv relevance drift(cat:cs.SE + relevance 트리거, known-pair 기록) ·
    The Batch 308 은 엔드포인트 사망이 아니라 trailing slash 오진이었음
  • templates/CLAUDE.md 개인 절대경로 8건 → {FH_ROOT} (org 체크아웃에 개인 레이아웃이
    들어가던 것 — 공개면 보호의 거울상)
  • 공개면 유출 4건 정리 · loop_engineering quarterly 백로그 행의 발화 불가 트리거 교체

검증

전 커밋 4축 게이트 통과. cross-family 적대 패스(gemini-3.6-flash-high · qwen3.6:27b · gpt-5.6-sol)

  • Sonnet floor sim(실제로 UNCALIBRATED 도달, 라벨 0건 emit).

정직한 잔여

계기 실패 5종을 한 세션에 실측했다(BRE-in-ERE · zsh word-split · stale cwd ·
install/stall 부분문자열 · 404 JSON 길이통과). 전부 "자신만만한 잘못된 값"이었고 전부
실물 확인으로만 갈렸다 — 그래서 두 앵커 모두 컨트롤을 mandatory-pass 로 박았다.

🤖 Generated with Claude Code

chrono-meta and others added 7 commits July 26, 2026 13:12
… known-pair 2군

07-25 3~4차 close 이월분 2건(codex 사이드카 pull_anchor 감사, 갈래3 9런 프로브플릿) +
07-26 매트릭스 v2 툴링 known-pair 대조군/처치군 2건.

카드 §구조잔여 "미커밋 로그 다음 FH PR 탑승" 해소.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
## 무엇이 뚫려 있었나

pre-commit HEAVY 항과 regression_guard pathspec 이 리터럴 `SKILL\.md` 를 찾는데,
`SKILL_detail.md` 라는 문자열엔 `SKILL.md` 가 들어있지 않다(밑줄이 끊는다).
→ detail 파일 17개 / 208,710B = 스킬 명세 표면의 27.7%, 16/17 이 펜스 코드블록 보유,
  전부 **양쪽 게이트 미커버**.

실제 누출 2건: 371c04f · e661931 — 둘 다 단일파일 phantom-quench/SKILL_detail.md.
그라운딩 감사 스킬 자신의 행동 명세가 4축 0회로 두 번 수정됐다.

구조적으로 더 나쁜 점: salience-splitter 가 상주층을 줄이려 SKILL.md → SKILL_detail.md 로
컨텐츠를 옮길 때마다 이 구멍이 **넓어졌다**. 다이어트가 성공할수록 커버리지가 줄었다.

## 수리

- pre-commit HEAVY / doc-coupling 항 확대. count-consistency 항은 **의도적으로 SKILL.md 한정**
  (detail 은 스킬이 아니라 동반파일) — 주석으로 명시
- regression_guard GUARD_PATHSPEC 을 `plugins/*/skills/*/*.md` 디렉토리 스코프로
- 형제참조 **대칭화** — detail→SKILL.md 역방향 통합 리팩터의 content-loss 오탐 차단
- F1 frontmatter 제외를 우연 → 명시로 (detail 은 라우팅 안 되니 name/description 계약 없음)
- 4축 정본 §48 + CLAUDE.md 요약 전파 (가드 주석이 "두 목록이 갈리면 조용한 무검사 구간"이라 경고)

## 회귀 앵커 (scripts/gate_pathspec_check.sh, pre-commit 배선)

known-pair 9쌍. 정규식을 **구현에서 추출**(복제하면 검증 대상과 드리프트하는 게 이 결함 클래스라).
양방향 캘리브레이션 완료 — 구멍 되돌리면 해당 쌍만 FAIL, 복원하면 PASS.

★ 이름 열거로는 이 클래스를 원리적으로 못 닫는다(Axis-2 적대 지적, 수용) → **열거 스윕** 신설:
plugins/*/skills/ 밑 실제 .md 를 전수 대조. **첫 실행에서 실물 미커버 1건 검출** —
dialogue-harvest/calibration_pair.md (known-pair 캘리브레이션 코퍼스, 07-25 출하).
이름 목록엔 영영 안 올랐을 파일. 그래서 게이트를 이름목록 → 디렉토리 스코프로 승격.

## 4축

- Axis 1 PASS (M 0 · S 0) — 검사 대상에 SKILL_detail.md 포함 = 수리 자기증명
- Axis 2 cross-family(agy gemini-3.6-flash-high) NOT-CONVERGED → 4건 수리 후 9/9 PASS
- Axis 3 기계 백트레이스 전건 — 경로 6/6 · 커밋해시 6/6 · 수치 재실측 일치
- Axis 4 edit_manifest 기록 (예측 4항 · 잔여 4항)

부작용 실측 선행: 최근 60커밋 중 28건이 detail 터치, 26건은 이미 동반 heavy → 신규 heavy 는 ~7%.

잔여: 열거 스윕은 .md 한정(비-.md 동반파일 무커버, 캘리브레이션으로 확인·은폐 아님) ·
codex 레그 미착지 · 앵커의 regex 추출이 구현 포맷 변경에 취약 · 다른 훅(session_close/pre-push)
동일 리터럴 미확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
⚠️ 이 커밋에 실제로 담긴 건 `subagent_invocations_log.yaml` 한 파일이다.
같은 작업에서 만든 감사문서·신호·매니페스트·4축 마커는 `tracks/**` 라 **gitignore 대상**이며
(공개 레포는 `tracks/_contrib/` 만 트래킹) companion store 로 동기화된다 — 설계상 정상.
공개 레포에 없다고 산출물이 없는 게 아니다.

## 로그 내용

codex(gpt-5.6-sol) Axis-2 레그 outcome=partial:
- hang **아님** — mtime 69초 전 + 내용 진행형(detail 17개 frontmatter 순차 열람) 확인 후 판정
- 실제 문제는 **과탐색**: ~7분간 형식 findings 0. 소스 접근을 준 것이 이번엔 역효과
  (레포를 읽을 수 있으니 계속 읽음). 운영자 판단으로 kill
- 유효 증분 1건: `dialogue-harvest/calibration_pair.md` **독립 발견** — 거버너의 열거 스윕이
  잡은 동일 파일이며, 수리 방향(이름목록→디렉토리 스코프)의 독립 확증

**교훈**: 사이드카에 소스 접근을 줄 때는 **탐색 예산**도 같이 줘야 한다. 접근권만 주면
수렴 압력이 없다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
## 실코퍼스 1호 (CARRY 해소)

calibration_pair EN 7/7 · KO 5/5 PASS 후, 06-27 입고 트랜스크립트(44KB, 단일화자)에서 12명제 추출.

**한계 발견**: single-author 경로에서 provenance 12/12 가 전부 공짜 `independent` 로 붙어
스킬 차별점이 전혀 발화하지 않았다. 기록만 하지 않고 극복 — single-author 코퍼스의 의미 있는
provenance 축은 문서 *내부*가 아니라 **코퍼스 ↔ 그걸 소비했어야 할 자산** 사이다.

## Step 4-b 신설 + 같은 자리에서 적용

소비 자산 = loop_engineering.md. absorbed 5 / held-unused 5 / declined 2.

★ **인용 갭: 입고 06-27 → 오늘까지 인용 0회.** 그 코퍼스 안에, 오늘 오전 agentsmith 대조에서
"FH 부재"로 확정한 kill switch 와 점진적 자율성이 **둘 다 들어 있었다.** 재료를 집에 두고
07-10 에 루프 자산을 지었고, 07-16 자 외부 자산에서 같은 갭을 발견했다 — 적재↔발굴 갭의 실증.

`declined` 티어가 첫 런에서 즉시 발화: 정체-트리거는 부재가 아니라 기각된 안건이다
(hub_maturity_roadmap §(c)). 이 구분이 없으면 내린 결정을 오버사이트로 착각해 재개봉한다.

## 착지 (투기빌드 금지)

kill switch 한 행만 하드닝 백로그 등재(n=2). held-unused 7건 미등재 — 발화조건 미충족.

## 4축

- Axis 1 PASS (M 0 · S 0)
- Axis 2 이중 패스 둘 다 NOT-CONVERGED → High 3건 수리: ①라벨을 grep 이 매기던 것 →
  absorbed 는 인용 span 의무·held-unused 는 어휘변형 2회 선행·자동화 금지 (※같은 세션이 몇 시간 전
  gate_pathspec_check.sh 에서 고친 결함을 새 산문에 재생산) ②컨트롤 vacuous 만족 → 별도 검색 의무
  ③skip vs UNCALIBRATED 모순으로 싼 출구가 이김 → 5행 기계 경계표
- **Sonnet floor sim 이 실제로 UNCALIBRATED 도달**(라벨 0건 emit) — 퇴화 경로가 장식 아님 실증.
  sim 자백("서두르면 조용히 진행이 더 흔한 실패모드")을 덮지 않고 명시 약점으로 기재
- Axis 3 계기교정 후 측정 · 오탐 2건 손검증 제거 · declined 근거 원문 인용
- Axis 4 edit_manifest

## 게이트가 잡은 내 유출

기밀 스캔이 loop_engineering.md 에 companion store 실명이 들어간 걸 차단. override 아니라
일반화로 수리("a private companion store"). 게이트가 저자를 잡은 사례.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…화불가 트리거 교체

## 공개면 유출 (기존 커밋분)

기밀 스캔이 오늘 내 신규 유출 1건을 차단한 뒤, git grep 으로 재보니 **이미 공개 커밋된**
companion store 실명이 4건 더 있었다 — invocation log 3 · multi-persona-review 1.
스캔이 **스테이징 추가라인만** 보기 때문에 과거분은 구조적으로 안 걸린다(문서화된 잔여).
전부 일반화 치환, 잔존 0(컨트롤 "companion store" 27히트로 계기 확인).
⚠️ 이미 공개된 건 되돌아가지 않는다 — 이 정리는 추가 전파 차단과 위생이지 무효화가 아니다.

## quarterly 백로그 행 — 미구현이 아니라 **트리거가 발화 불가**였다

운영자 진단이 `quarterly_maturity_check.sh` 부재를 지목. 백로그 표는 미구현 항목을 적는
자리라 부재 자체는 형식상 정상(오늘 추가한 kill-switch 행과 같은 성격). 그런데 더 파보니
그 행의 조건 *"quarterly 재진단이 90일 초과 누락"* 은 **잴 기준일이 없어서 영원히 발화할 수 없었다**:

- `hub_maturity_roadmap.md` 는 여전히 **템플릿**(자기 헤더가 "운영 사본을 쓰라"고 명시)
- 운영 사본 **부재** · §5 6지표는 카운터가 아니라 템플릿 설명문 그대로
- quarterly 진단 산출물 **0건** (양 스토어 전수)

발화할 수 없는 백로그 행은 **연기된 게 아니라 죽은 것**이고, 읽기로는 연기된 것과 구별되지 않는다.
→ 관측 가능한 트리거로 교체: **"첫 quarterly 재진단이 실제로 실행되고 날짜가 찍힐 때"**.
instance-zero 가 없는데 체커부터 짓는 건 *돈 적 없는 루프를 위한 체커*다.

## 규약 침범 자기수정

첫 편집에서 그 행에 취소선을 쳤다 — 그 표에서 취소선은 **BUILT** 를 뜻하는데(다른 두 행의 용법)
"정정됨" 의미로 쓴 것이라, 다음 독자에게 **"지어졌다"로 읽힐 뻔했다.** 운영자 진단의
"quarterly 는 취소선 표시가 있는지 확인 안 했다"는 문장이 이걸 잡았다. 취소선 제거 +
표 안에 규약을 명시했다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
병렬 qasp 세션 핸드오프 인계. 카드 v9(7,567B)→v8(5,299B), v10 도 동일 경로로 소실.
두 세션 연속 = 개인 부주의가 아니라 **유도된 오류**: 세션시작 규약이 "미러를 먼저 읽어라"라서
미러가 자연스러운 쓰기 지점이 되고, 단방향 rsync 는 목적지가 더 새로운지 보지 않는다.
마감 체커는 못 잡았다 — "card-last violated"는 타임스탬프 **순서** 지적이지 덮어쓰기 지적이 아니다.

① 기계 floor: 목적지가 원본보다 새로우면 ABORT. SYNC_OVERWRITE_OK=1 명시승인+로그.
   **sync_dir·sync_file 양쪽** — 첫 컷은 sync_dir 만 막아 CLAUDE.local.md 경로가 열려 있었다.
② 살리언스: 미러 md 라인1에 MIRROR COPY 배너 자동주입(272개). 디렉터리 README 는 약하다 —
   에이전트는 파일을 연다.
③ 앵커 scripts/sync_guard_check.sh 7항 — 제외집합 파리티 · known-negative · known-positive(사고 재현)
   · override 존재+로깅 · 전 호출자 커버리지 · 배너/가드 비간섭.

라이브 캘리브레이션이 잡은 자기결함 3건:
1. 과차단 — logs/ 미제외로 정상 sync 차단. 핸드오프가 경고한 실패모드가 첫 시험에서 실제 발생
2. 반쪽픽스 — sync_file 미커버
3. 배너 churn — 첫 런이 265파일 무의미 재전송. 소실은 아니나 로그가 계기로서 파괴된다.
   strip-before-compare + mtime 보존 → 265 → 1

자기 관여 확인: 덮은 건 12:40 커밋(6166f0d)이고 내 14:00 커밋(5ccb8a1)엔 카드가 없었다.
관여 없음 — 단 안 당한 건 정본에 쓰고 sync 했기 때문이지 운이 아니다.

PUBLIC_SURFACE_OK 사유: 스캔이 'sync-to-be'를 사유 토큰으로 표시했으나 그 이름은 이미 공개다
(scripts/sync-to-be.sh 가 트래킹돼 있고 .gitignore·pre-commit 도 공개 참조). 회피 불가능한
공개 파일명에 대한 오탐이며, 패턴 완화는 이 커밋을 통과시키려는 조치가 되므로 하지 않고 별건 제기.

잔여: knowledge-hub 위키 sync 무가드 · 동기화 경계 미문서화 · 배너 .md 한정 · tar 폴백 strip 미배선.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
운영자 제시(2026-07-26): sync-to-be 는 **개인 연구용 위키를 별도 보관**하려는 사람에게,
sync-to-org 는 **조직 공유 위키를 동기화**하려는 사람에게 활성화된다. 둘은 메커니즘이 아니라
**독자**로 갈린다 — 이름이 그걸 말하게 하는 게 요점이고, 읽는 사람이 한 줄로 자기 것인지
판별할 수 있어야 한다.

핵심: **두 모드가 오늘 만든 목적지-최신 가드를 공통 상속한다.** 그 가드는 개인 모드의
살림살이가 아니라 단방향 미러링 자체의 floor 이며, 조직 모드가 **더** 필요로 한다 —
개인 모드의 무음 덮어쓰기는 자기 노트를 잃지만 조직 모드는 **남의 것을 잃는다**.
새 미러 모드는 이 가드를 다시 결정하는 게 아니라 상속하는 데서 시작한다.

조직 모드는 추가로 residency 패스를 진다: 형식은 건너가도 되고, 개인 노트와 개인 디렉터리
레이아웃은 안 된다. (오늘 llmwiki-qa 형식 공급에서 실제로 걸린 축 — 상류 판본의
`~/projects/…` 절대경로 전량을 `{FH_ROOT}` 로 일반화했고, 전수 검사에서 session.md 에
2건이 더 나왔다.)

PUBLIC_SURFACE_OK: 앞선 커밋과 동일 사유 — 'sync-to-be' 는 이미 공개 트래킹된 파일명이다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@chrono-meta
chrono-meta merged commit 129af72 into main Jul 26, 2026
2 checks passed
@chrono-meta
chrono-meta deleted the claude/fh-selfdev-0726 branch July 26, 2026 06:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant