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 제목과 글자 그대로 같다 —
다음 스캔의 덮어쓰기 가드가 문자열로 비교한다