문서와 심볼

aidlc-docs 를 그대로 읽는다 · 읽기 전용
/home/sunny/enode-fixup-workshop2-visualizer연결 중
inception/reverse-engineering/reverse-engineering-timestamp.md215 줄

enode — 리버스 엔지니어링 실행 기록

2026-09-04 2판 주석. 이 아홉 산출물은 AI-DLC v2 의 2.1 스테이지가
기준선 f46e187 에서 낸 것이고, 1판 저장소를 거쳐 파일 그대로 옮겨왔다.
v2 가 v1 의 산출물 어휘를 유지해 아홉 이름이 v1 요구와 정확히 일치한다.

신선도 — 알려진 델타가 있다. 이 저장소의 코드는 기준선 뒤 48개 커밋이
얹힌 1c290a6 이다. 다시 훑지 않는다. 대신 무엇이 달라졌는지를 여기 적는다.

   스캔 기준선                 f46e187
   이 저장소의 Go 코드          1c290a6.  비테스트 Go 36 파일 +1316 / -154
                               테스트 Go 38 파일 +12945 (커버리지 작업)
   스키마 (schema.sql)          변화 없음
   HTTP 라우트                  15 개.  변화 없음.  GET /v1/nodes · GET /v1/runs 는 여전히 없다
   패키지 경계                  변화 없음.  cmd 다섯 · internal 열

구조적으로 새로 생긴 것

   .coverage-contract.yml       패키지별 커버리지 하한.  CP0 게이트가 이것을 센다
   .golangci.yml                린트 설정
   .ci-allowed-skips            CI 가 건너뛰어도 되는 것의 목록
   scripts/glyphscan.go         Go 문자열 리터럴의 장식 문자 검사.  CI 에 있다
   cmd/runctl/shape.go          runctl shape — 계약 입력 모양 (ADR-066)
   internal/contract/example.go 계약 예시 셋 (examples/*.json)
   internal/enode/console*.go   콘솔 처리 (unix · windows)
   cmd/enodectl/caffeinate_*.go 노드가 잠들지 않게 (darwin · other)
   scripts/avprobe/             하네스 탐침.  별도 go.mod

그래서 낡은 것 — code-quality-assessment.md 의 커버리지 수치와
code-structure.md 의 파일 목록. 나머지 일곱(API · 아키텍처 · 비즈니스 개요 ·
컴포넌트 · 의존 · 기술 스택 · 이 문서)은 그대로 맞다.

절 이름이 한국어인 것은 의도다. v1 에는 절 이름을 검사하는 센서가 없고,
읽는 쪽이 사람과 모델이다.

실행 시점

항목 값
실행일 2026-08-28
대상 저장소 /home/sunny/enode-review/enode/
Go 모듈 github.com/taeels/enode
git rev-parse HEAD f46e1872d1546d7657a6d0b4857a9a64d9bf9ab3
HEAD 커밋 2026-08-25 23:07:17 +0000 — "어댑터가 409 와 422 를 가른다 — 바쁜 함대를 기다린다"
작업 트리 깨끗함 (git status --porcelain 무출력)
인텐트 260828-enode-completeness-revie
스테이지 2.1 reverse-engineering
이 저장소에 대한 첫 스캔인가 예. 사전 확인에서 NO_STORE — 덮어쓰는 기존 지식 없음

무엇을 위한 스캔인가

완결성 리뷰의 대조 기준선이다. 정본(enode-design/)과 구현을 세 축으로
비교하는 워크플로가 이 산출물 위에 선다 — 정본/구현 괴리 · 코드 품질 · 테스트
공백. 새 기능을 만들지 않는다. 스켈레톤 미구현 항목(S1~S7 중
ADR-016 하트비트-임대 등)은 사람이 범위 밖으로 정했고, 만들지 않고 미구현으로만
기록한다.

그래서 이 9개 산출물은 정본의 어휘로, 있는 것을 file:line 근거와 함께
기술한다. 적합성 판정을 내리지 않는다 — 그 판단은 다음 스테이지의 것이다.
개발자가 발견한 불일치는 양쪽을 다 적은 관측으로 기록했지 결함으로 적지 않았다.

계측 방법

무엇 어떻게
파일 · LOC find + wc -l, 저장소에서 직접
커버리지 scripts/testdb.sh 로 Postgres 17 을 띄우고 ENODE_TEST_DATABASE_URL 을 넣은 뒤 -coverpkg=./... 교차 측정
라우트 internal/api/api.go:55-69 전수 + grep 대조
ADR 인용 grep -rhoE 'ADR-[0-9]{3}' --include='*.go' . | sort -u
부채 신호 TODO/FIXME/XXX/HACK/WIP · panic( · _ = · //nolint · t.Skip 각각 grep
정적 검사 gofmt -l . · go vet ./... · go test ./... -count=1

커버리지 측정에 주의가 필요하다. ENODE_TEST_DATABASE_URL 없이 재면
internal/api 의 78개 통합 테스트가 조용히 t.Skip 되고 수치가 통째로
어긋난다. 이번 스캔이 정정한 것이 그것이며, 자세한 것은
code-quality-assessment.md 첫 절에 있다.

정본 문서 (코드에 없다)

구현과 함께 읽은 설계 정본. aidlc/spaces/default/knowledge/documents/enode-design/.

문서 줄 읽은 정도
INVARIANTS.md 319 전문
system.md 244 전문
mediator-api.md 695 §1~§2 · §6.3 · §7 · §8 + 엔드포인트 전수 grep
agent-runtime.md 1,300 R6 · R7 구간
ADR-INDEX.md 130 전수 grep
run-contract.md 1,172 미독
합계 3,860

ADR 원본 64건은 /home/sunny/enode-design/adr/ 에 있고 이번 스캔에서 개별
파일을 읽지 않았다.

생성된 산출물 (9)

전부 aidlc/spaces/default/codekb/enode/ 에 있다.

파일 내용
business-overview.md 도메인 · 목적 · 핵심 기능 · 슬라이스 합격 기준
architecture.md 아키텍처 · Mermaid 4종 · 정본 대조 지도
code-structure.md 배치 · 파일 분류 · 내부 의존 그래프 · 코드 패턴
api-documentation.md 15개 HTTP 라우트 · CLI 3종 · 웹훅 · 표면 개수 관측
component-inventory.md 15개 패키지의 책임 · 의존 · 계측
technology-stack.md 언어 · 라이브러리 · 의도적 부재
dependencies.md 외부 3+7 · 내부 교차 의존
code-quality-assessment.md 커버리지 정정 · 테스트 공백 우선순위 · CI · 부채
reverse-engineering-timestamp.md 이 문서

architecture.md 의 「정본 대조를 위한 관찰」 절이 다음 스테이지에 가장 값이
크다 — 정본 조항 각각을 확인하러 가야 할 file:line 을 문서별로 적어 두었다.

Scope of Analysis

scope_version: 1
kind: partial
intent: 260828-enode-completeness-revie
fingerprint: 2a53bf42e9d8102891a0c1db5f0a82a42d44ceaf
analyzed:
  paths:
    - go.mod
    - README.md
    - CLAUDE.md
    - .github/workflows/
    - scripts/testdb.sh
    - internal/api/api.go
    - internal/store/
    - internal/match/match.go
    - internal/record/record.go
    - internal/config/config.go
    - internal/build/build.go
    - internal/enode/advertise.go
    - internal/enode/claim.go
    - internal/enode/claude.go
    - internal/enode/detect.go
    - internal/enode/env.go
    - internal/enode/leases.go
    - internal/enode/runner.go
    - cmd/enode/
    - cmd/mediator/main.go
    - cmd/enodectl/main.go
    - cmd/enodectl/setup.go
    - cmd/runctl/main.go
    - cmd/iapadapter/main.go
  components:
    - cmd/mediator
    - cmd/enode
    - cmd/enodectl
    - cmd/runctl
    - cmd/iapadapter
    - internal/api
    - internal/store
    - internal/contract
    - internal/match
    - internal/record
    - internal/schema
    - internal/config
    - internal/enode
    - internal/runctl
    - internal/build
shallow:
  paths:
    - internal/contract/
    - internal/schema/
    - internal/runctl/
    - internal/enode/agent.go
    - internal/enode/argv.go
    - internal/enode/changed.go
    - internal/enode/collect.go
    - internal/enode/config.go
    - internal/enode/diff.go
    - internal/enode/disk_unix.go
    - internal/enode/disk_windows.go
    - internal/enode/harness.go
    - internal/enode/hook.go
    - internal/enode/identity.go
    - internal/enode/lock.go
    - internal/enode/lock_unix.go
    - internal/enode/lock_windows.go
    - internal/enode/paths.go
    - internal/enode/repoid.go
    - internal/enode/setup.go
    - internal/enode/workspace.go
    - cmd/enodectl/proc_unix.go
    - cmd/enodectl/proc_windows.go
    - cmd/mediator/setup.go
    - cmd/iapadapter/comment.go
    - cmd/iapadapter/config.go
    - cmd/iapadapter/contract.go
    - cmd/iapadapter/itsaplan.go
    - cmd/iapadapter/mediator.go
    - cmd/iapadapter/orchestrator.go
    - packaging/

이 블록을 읽는 법

  • kind: partial — 저장소 전체를 깊게 읽지 않았다. 특히 internal/contract/
    (3,565줄, Validate() 612줄 포함)와 internal/schema/ 는 시그니처 지도와
    선별 주석만 읽었고, 모든 *_test.go 는 테스트 이름 목록과 t.Skip 조건만
    보았다(본문 미독)
  • internal/store/ 는 디렉터리 단위로 깊게 읽었다 — 12개 비테스트 파일 중 8개
    전문, 4개(claim.go · reap.go · ask.go · verdict.go)는 주요 함수 전수
  • cmd/enode/ 는 3개 파일 전부 전문을 읽었으므로 디렉터리로 적었다
  • shallow.paths 는 헤더 주석과 시그니처, /v1/ 호출 지점만 본 곳이다
  • components 는 component-inventory.md 의 H3 제목과 글자 그대로 같다 —
    다음 스캔의 덮어쓰기 가드가 문자열로 비교한다