๋ฐ๋ง๋ค ๋ค๋ฅธ ํฌ๋ฆฌ๋ด์ ์ ๊ธด ์๋ช ํ๋ก์ธ์ค์ **์ค์ ์ธต**์ผ๋ก ์ฃผ์ ํ๋ฉด, ๊ทธ ์ธต์ ๋ฐ๋ณด๋ค **๊ฑฐ์น ํค**(๋๋ ํฐ๋ฆฌยทํ๋ก์ ํธยท์ํฌ์คํ์ด์ค)๋ก ์บ์๋ผ์ **์ฒ์ ๋ณธ ํ ํฐ์ ๊ณ์ ์ด๋ค** โ ๊ทธ๋ฐ๋ฐ ๊ธฐ๋ฅ์ ์บ์๋ก ๋ฉ์ฉกํ ๋์๊ฐ๋ฏ๋ก ํ๋ฉด์์๋ ์ ๋ ์ ๋ณด์ธ๋ค. ์ ์ผํ ์ผ์๋ **๋ฐ๋ ์ชฝ**์ด๋ค: ํ ํฐ์ ๋ฐ๊พผ ๋ค ์๋ฒ์ ์์ฒญ์ด **์๋ก ์ค๋๊ฐ**๋ฅผ ๋ด๋ผ. ํธ๋ฆฌ๊ฑฐ - per-run ํ ํฐ์ ์ค์ ํ์ผ/์ค์ API ๋ก ์ฃผ์ , ๊ธด ์๋ช ๋ฐ๋ชฌ(serveยทLSPยทlanguageโฆ
ํ ์คํธ๊ฐ ์๋ ๊ฒ์ฌ โ ๋ถ์ฌ ๊ฐ๋ ยท ์๋ฃ ๊ฐ์ง๊ธฐ ยท ๋ฌธ์ ์ ์ฒด๋ฅผ ํ๋ ๋จ์ธ โ ์ RED ๋ฅผ ๋จผ์ ๋ณด๋ ์ต๊ด์ด ์์ด์, **๊ตฌ์กฐ์ ํ์ชฝ ํ์ ๋ง ๋ผ ์ ์๋ ์ฑ๋ก** ๋ฐฐํฌ๋๋ค. ์ด๋ก์ด๋ฉด "๊ฒฐํจ ์์"์ด ์๋๋ผ "๋นจ๊ฐ์ง ์ ์์"์ด๊ณ , ํ์์์์ด๋ฉด "์ ํ ์ ๋จ"์ด ์๋๋ผ "์ฑ๊ณต์ ๊ฐ์งํ ์ ์์"์ด๋ค. ๊ฒ์ฌ๋ง๋ค **๋ฐ๋ ํ์ ์ ํ ๋ฒ ๊ฐ์ ๋ก ๋ณด๋ผ.** ํธ๋ฆฌ๊ฑฐ - `until`/ํด๋ง ๋๊ธฐ ๋ฃจํ, ์ญ์ PR ์ ๋ถ์ฌ ๊ฐ๋, dict/์๋ต์ ๋ฌธ์์ด๋ก ํฉ์ณ ๋งค์นญํ๋โฆ
์ธก์ ํด์ ๊ธฐ๊ฐํ ์ ๊ทผ์ ๋ฌธ์์ **ํ๊ฒฐ**๋ก ๋จ๋๋ค("๋ชป ํ๋ค") โ ๊ทธ๋ฐ๋ฐ ์ค์ ๋ก ์ ํต๊ธฐํ์ด ์๋ ๊ฑด ํ๊ฒฐ์ด ์๋๋ผ **๊ทธ๋์ ์กฐ๊ฑด**์ด๋ค. ์กฐ๊ฑด์ด ๋ฐ๋๋ฉด ํ๊ฒฐ์ ์กฐ์ฉํ ๊ฑฐ์ง์ด ๋๊ณ , ์๋ฌด๋ ๋ค์ ์ฌ์ง ์๋๋ค. ๊ธฐ๊ฐ์ ์ ์ ๋ *๋ฌด์์ด ๋ฌ๋ผ์ง๋ฉด ์ด๊ฒ ๋ค์งํ๋๊ฐ*๋ฅผ ๊ฐ์ด ์ ๊ณ , ์ ํ์กฐ๊ฑด์ด ๋ซํ๋ฉด **๊ธฐ๊ฐ๋ ๋ ๋ฒ๋ถํฐ ๋ค์ ์ฌ๋ผ.** ํธ๋ฆฌ๊ฑฐ - ์ธ์์ธ๊ณ/์ด์์ "์ธก์ ๋, ๋ชป ํ๋ค"๊ฐ ์ ํ ์์ ๋, ์ฐจ๋จ ์กฐ๊ฑด์ด ๋ฐฉ๊ธ ํด์๋์ ๋, ํธ๋ ์ฐ์ ์์๋ฅผ ์ ํ ๋,โฆ
๊ณต์ ํจ์์ ํ ์คํธ๋ฅผ ๋ถ์ด๋ฉด ๊ทธ ํจ์์ *๊ณ์ฐ*์ ์ง์ผ์ง์ง๋ง, ๊ทธ๊ฑธ **๋ถ๋ฅด๋ ์ชฝ์ ๋ฐฐ์ **์ ๋ฌด๋ฐฉ๋น๋ก ๋จ๋๋ค. ์ธ์๋ฅผ ํ๋ฆฌ๊ฒ ๋๊ธฐ๊ฑฐ๋ ์์ ์ ๋๊ฒจ๋ ์ค์ํธ๊ฐ ์ ๋ถ ์ด๋ก์ด๋ค. ๊ฐ์ง๊ธฐ๋ ์ด๋ก/๋นจ๊ฐ์ด ์๋๋ผ **ํธ์ถ ์ง์ ์์ ์ ์ ์ ๋์์ ๋๋ ๋นจ๊ฐ์ง๋๊ฐ**๋ค. ํธ์ถ์๊ฐ N ๊ฐ๋ฉด ํ ์คํธ๋ N ๊ฐ โ ํ์ชฝ์ ๋ถ์ธ ๊ฐ๋๋ ๋ค๋ฅธ ์ชฝ์ ๋ํด ์๋ฌด ๋ง๋ ์ ํ๋ค. ํธ๋ฆฌ๊ฑฐ - ๊ณต์ ํจ์์ ์ ํ๋ผ๋ฏธํฐ/์ฝ๋ฐฑ ์ถ๊ฐ, ๋ ๊ณณ ์ด์์์ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ ๋ฐฐ์ , "๊ณ์ฐ์โฆ
SQLite-only unit tests cannot catch PostgreSQL-only migration bugs. Add a fresh-PG smoke test that runs `alembic upgrade head` against an empty container so DROP DEFAULT, enum DDL listener collisions, and dependent-object errors fail at PR time instead of onโฆ
์ฌ์๋ยท์ฌ์ ๋ฌยท์ฌ๊ฐ ๋ฉ์ปค๋์ฆ์ ์ค๊ณํ ๋ ์ฒซ ์ง๋ฌธ์ "์ธ์ ๋ค์ ๋ณด๋ผ๊น"๊ฐ ์๋๋ผ **"๊ทธ๋ ์ ๋ ฅ์ ์์ง ๋๊ฐ ๋ค๊ณ ์๋"**๋ค. ์์ฒญ์ ์ผ๋ถ๋ *์ผ๋ถ๋ฌ* ์ ์ฅ๋์ง ์๋๋ค โ ์ํฌ๋ฆฟยท์๋ช ์ด ์งง์ ํ ํฐยท์์ฒญ ์ค์ฝํ ์๊ฒฉ. ๊ทธ๊ฑธ ์ ์ธ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค์ํผ๋ฅผ ๊ณ ๋ฅด๋ฉด, ์ค๊ณ๊ฐ ์กฐ์ฉํ "์ ์ ์ฅํ๊ธฐ๋ก ํ ๊ฒ์ ์ ์ฅํ๋ผ"๋ฅผ ์๊ตฌํ๊ฒ ๋๊ณ ์ ๋ขฐ์ฑ ์์ ์ด ๋ณด์ ํ๊ท๋ก ๊ฒฐ์ ๋๋ค. ํธ๋ฆฌ๊ฑฐ - ์ฌ์ ๋ฌ/์ฌ์๋/์ฌ๊ฐ/๋ฆฌํ๋ ์ด ์ค๊ณ, "์ค์ํผ๊ฐ ํ์ด์ ๋ค์ ๋ณด๋ธ๋ค",โฆ
๊ฒฉ๋ฆฌ ํ๋๊ทธ๋ ๋ชฉํ๊ฐ ์๋๋ผ **๋ฉ์ปค๋์ฆ ํ๋**๋ฅผ ๋๋ค โ `--setting-sources ""` ๋ ์ค์ ํ์ผ์ ๋์ง๋ง cwd ๋ก ํค์๋ auto-memory ๋ ๋ชป ๋๋ค. ๊ทธ๋์ "ํธ์คํธ๋ก๋ถํฐ ๊ฒฉ๋ฆฌ๋จ" ์ฃผ์์ ์ ๋ฐ๋ง ์ฐธ์ธ ์ฑ๋ก ๋ช ๋ฌ์ ์ฐ๋ค. ๊ฒ์ฆ์ ํ๋๊ทธ๋ฅผ ์ธ๋ ๊ฒ ์๋๋ผ **๋ณด๋ฉด ์ ๋๋ ๊ฒ์ ๊ทธ๋๋ก ์ธ์ฉํด ๋ณด๋ผ๊ณ ์ํค๋ ๊ฒ**์ด๋ค. ํธ๋ฆฌ๊ฑฐ - ์๋ธํ๋ก์ธ์ค/์๋๋ฐ์ค/์์ด์ ํธ ๊ฒฉ๋ฆฌ ์ฃผ์ฅ, "--no-X ๋ฅผ ์คฌ์ผ๋ ์ ๋ค์ด์จ๋ค", ๋ฒค๋ CLI ๋ฅผโฆ
ํ์คํฌ๋ง๋ค ๋ง๋ค๋ ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ "์๋ฌด๋ ์ ์ฐ๋๊น" ํ๋๋ก ํฉ์น๋ฉด, **๊ทธ ๊ฒฝ๋ก๋ก ํค์๋ ๋จ์ ์ํ**๊ฐ ์ ๋ถ ํ๋๋ก ํฉ์ณ์ง๋ค โ ์ฐ์ฐํ ์๋ ๊ฒฉ๋ฆฌ๊ฐ ์ฌ๋ผ์ง๋๋ฐ ๋ฐํ์ ๋์ ๋ณํ๋ 0์ผ๋ก ๋ณด์ธ๋ค. "์ ์ฐ์ธ๋ค"๋ฅผ ๋ด ์ฝ๋์์๋ง grep ํ๊ธฐ ๋๋ฌธ์ด๋ค. ํธ๋ฆฌ๊ฑฐ - per-task/per-run ๋๋ ํฐ๋ฆฌ ์ ๊ฑฐ, "๊ณ ์ cwd ํ๋๋ก", ์์ ๋๋ ํฐ๋ฆฌ ์ ๋ฆฌ PR, ๋ฒค๋ CLI/ํด์ subprocess ๋ก ๋์ฐ๋ ์ฝ๋, ๋ฉํฐํ ๋ํธ ์์ปค, "์ด ๋๋ ํฐ๋ฆฌ๋ ์๋ฌด๋โฆ