copy-and-adapt, import-and-share 아님
각 변형의 routes/chat.py 가 Claude route 의 의도적 copy. 패턴 (JSONL ground truth, SQLite store, ChromaDB embedding, healing) 공유하지만 자기 코드 소유. 변형 간 shared helper 는 안 뽑아.
왜 shared helper 없음
이 layer 의 shared helper 가 모든 변형을 lowest-common-denominator 인터페이스 강요 — Rule 1 이 정확히 금지하는 거. 각 변형 독립적 evolve. 셋이 같은 변경 필요 발견하면 셋째가 패턴 추출 worth 함을 증명. 그때까지 copy.
Tool bridge 가 brain-agnostic
shared 가 옳은 한 곳: tool_bridge.py. 어느 두뇌가 요청해도 local Read/Write/Edit/Bash 실행 같음. 변형 specific 한 건 schema format 변환 (Codex/Ollama 가 OpenAI, Gemini 가 function_declarations, Ollama 가 wrapping).
여기서 copy는 무경계 복붙이 아니야. provider마다 정말 다른 route와 wire adaptation을 자기 파일 안에 소유하게 한다는 뜻이야. JSONL writer, healing, tool execution처럼 이미 canonical owner가 있는 primitive까지 복사하면 새 variant가 아니라 두 번째 진실을 만든 거야. 차이는 downstream에서 감당하고, 같은 책임은 원래 owner에게 맡겨.
세 번째 사례 규칙도 줄 수를 세는 방식으로 쓰지 마. 세 파일에 비슷한 문장이 있다는 것만으로 helper를 뽑지 않아. 세 구현이 같은 invariant와 failure behavior를 공유하고, 바뀌는 이유까지 같다는 증거가 있어야 해. 반대로 같은 코드를 쓰더라도 provider 정책 때문에 따로 진화해야 한다면 나란히 두는 편이 더 정직해.
판단할 때는 질문 셋이면 돼. 이 로직을 누가 소유하나? 둘이 같은 이유로 바뀌나? 한쪽 실패가 다른 쪽을 같이 흔들어도 되나? 답이 갈리면 억지로 공유하지 말고, 답이 같으면 이미 있는 canonical layer를 상속해. copy-and-adapt의 핵심은 복사 자체가 아니라 변화 비용을 올바른 자손에게 청구하는 거야.