"텍스트 파일이 텍스트가 아니게 된 사고의 증거는 한 줄이었다"
이전 작업을 커밋한 뒤 전체 lint를 실행했는데 실패했습니다. 이상한 건 변경된 파일 일부만 지정해서 실행하는 scoped lint는 통과한다는 점이었고, 이 불일치의 원인이 바로 드러나지 않았습니다.
git show --stat 결과를 확인해보니 database.types.ts가 텍스트 파일임에도 Bin 0 -> N bytes로 표시되고 있었습니다. 파일의 첫 바이트를 직접 확인해보니 FF FE 65 00 78 00... 형태였고, 이는 BOM과 null byte가 존재하는 UTF-16LE 인코딩이라는 뜻이었습니다. git이 이 파일을 바이너리로 인식했고, 그래서 ESLint가 파싱에 실패한 것이 근본 원인이었습니다.
파일을 UTF-8(BOM 없음)로 재변환하고, eslint.config.mjs에 해당 파일을 ignore 처리로 추가한 뒤, 새 커밋을 만드는 대신 기존 커밋에 amend하는 방식으로 정리했습니다. "생성된 파일이니 대충 넘어가자"가 아니라, 인코딩 문제가 왜 생겼는지(PowerShell 기본 인코딩)까지 규명한 뒤 처리한 것입니다.
전체 lint, typecheck, 테스트(85 passed, 8 skipped), build까지 전부 통과를 확인했습니다. 이후 같은 파일을 다시 생성할 때(Supabase 타입 재생성 시) 같은 문제가 재발하지 않도록 .NET WriteAllText 방식을 표준 절차로 메모리에 고정해두었습니다. "Bin 0 -> N bytes"라는 한 줄이, 텍스트 파일이 텍스트가 아니게 된 사고 전체의 증거였습니다.
생성된 파일이라 대충 넘어가는 대신, 근본 원인(PowerShell 기본 인코딩 방식)을 규명하고 재발 방지 조치까지 포함하는 것을 승인 조건으로 삼았습니다. lint에서 해당 파일을 통째로 제외하는 임시방편만으로 끝내지 않고, 원인이 되는 파일 생성 방식 자체를 함께 고치는 걸 원칙으로 했습니다.
관련 프로젝트
프로젝트 개요 비즈니스 프로세스 트랜스포메이션(BPR)을 지원하는 한국어 기반 웹 애플리케이션. 컨설팅 프로젝트의 AS-IS 프로세스 분석부터 TO-BE 설계, Blueprint 승인까지의 전체 워크플로우를 디지털화하는 플랫폼으로, EPIC 단위로 구조화된 백로그를 기반으로 개발 중. 역할 및 워크플로우 PM / Architect / Reviewer 역할 수행 Codex(구현 담당)에게 Task 단위 구현 프롬프트 설계 Codex 구현 결과를 git log, git grep, git status로 직접 검증 후 승인 승인 전에는 Codex가 commit하지 않는 엄격한 게이팅 프로세스 운영 한 번에 하나의 Backlog Task만 진행, Task 완료 전 다음 Task 착수 금지 기술적 의사결정 및 성과 워크스페이스/프로젝트 접근 권한을 DB 레벨(복합 FK, SECURITY DEFINER 트리거)과 애플리케이션 레벨(Server Action 권한 검증)의 이중 방어 구조로 설계 Hard Delete 미구현 원칙 하에 배열 필드 전체교체(replace)를 단일 트랜잭션 RPC로 처리하는 패턴 확립 및 재사용 AS-IS 프로세스 그래프의 순환 참조 탐지에 Tarjan SCC 알고리즘 적용, 차단 오류(Error)와 경고(Warning)를 분리한 이중 Validator 아키텍처 설계 도메인 규칙 위반을 커스텀 Postgres 에러 코드 체계(SIA0104)로 문서화하여 거버넌스 문서와 코드베이스 간 정합성 유지 AI 생성 데이터와 사람이 검증한 데이터를 구분하는 generatedbyai / verified 메타데이터 패턴을 여러 도메인 테이블에 일관되게 적용 진행 상태 ✅ EPIC-01 (인증 / 워크스페이스 / 프로젝트 접근) ✅ EPIC-02 (조직 / 산업 / 프로젝트) 🚧 EPIC-03 (AS-IS 프로세스 그래프) — 그래프 검증, Input/Output 스키마, Business Rule 스키마 구현 완료