๋ถ์ฌ ๊ฐ๋๋ฅผ "๋ด๊ฐ ๋ณธ ์ ์๋ ์ฒ ์ ๋ชฉ๋ก"์ผ๋ก ์ฐ๋ฉด ์์ ๋ฐ์ ์ฒ ์๋ก ์ด์๋จ์ ์ธ์คํด์ค๋ฅผ ํต๊ณผ์ํจ๋ค โ ๊ฐ๋๋ green, ๊ฒฐํจ์ ์์กด. ํจํด ๋ชฉ๋ก ๋์ **๊ฒฐ๊ณผ ์งํฉ(ํ์ผ/ํธ์ถ์/์ฌ๋ณผ)์ ํ์ผ๋ก ๋ฐ์๋ผ**: ์ด๋ค ์ด๋ฆ์ผ๋ก๋ ์ ์ธ์คํด์ค๊ฐ ์๊ธฐ๋ฉด ๋ชฉ๋ก์ ์์ด์ ์คํจํ๋ค. ํ์ด ์ฉ๋ ๊ฒ๋ ๊ฐ์ด ๋ง์๋ผ. ํธ๋ฆฌ๊ฑฐ - ๋ถ์ฌ/๊ธ์ง๋ฅผ grep ์ผ๋ก ์ฃผ์ฅํ๋ ํ ์คํธ, ์ญ์ PR ์ ๊ฐ๋, "์ด์ ์๋ฌด๋ X ๋ฅผ ์ ์ฝ๋๋ค" ์ฃผ์ฅ, ๊ฐ์ฌ ํ์ ์ ๋ฆฌ.
ํ ์คํธ๊ฐ ์๋ ๊ฒ์ฌ โ ๋ถ์ฌ ๊ฐ๋ ยท ์๋ฃ ๊ฐ์ง๊ธฐ ยท ๋ฌธ์ ์ ์ฒด๋ฅผ ํ๋ ๋จ์ธ โ ์ RED ๋ฅผ ๋จผ์ ๋ณด๋ ์ต๊ด์ด ์์ด์, **๊ตฌ์กฐ์ ํ์ชฝ ํ์ ๋ง ๋ผ ์ ์๋ ์ฑ๋ก** ๋ฐฐํฌ๋๋ค. ์ด๋ก์ด๋ฉด "๊ฒฐํจ ์์"์ด ์๋๋ผ "๋นจ๊ฐ์ง ์ ์์"์ด๊ณ , ํ์์์์ด๋ฉด "์ ํ ์ ๋จ"์ด ์๋๋ผ "์ฑ๊ณต์ ๊ฐ์งํ ์ ์์"์ด๋ค. ๊ฒ์ฌ๋ง๋ค **๋ฐ๋ ํ์ ์ ํ ๋ฒ ๊ฐ์ ๋ก ๋ณด๋ผ.** ํธ๋ฆฌ๊ฑฐ - `until`/ํด๋ง ๋๊ธฐ ๋ฃจํ, ์ญ์ PR ์ ๋ถ์ฌ ๊ฐ๋, dict/์๋ต์ ๋ฌธ์์ด๋ก ํฉ์ณ ๋งค์นญํ๋โฆ
producer ์๋ ํ ์ด๋ธยท0ํ ์ปฌ๋ผยท์ ๋ถ๋ฆฌ๋ ์ค์ ์ ๋ฐ๊ฒฌํ๋ฉด "์ฒญ์ ํญ๋ชฉ"์ผ๋ก ๋ถ๋ฅ๋์ง๋ง, ๊ทธ ์ด๋ฆ์ ๋๊ฐ **์ด๋๊ฐ์์ ์ฌ์ฉ์์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ์ฃผ์ฅํ๋ ๋ฌธ์ฅ์ ์ฃผ์ด**๋ก ์ด์ ์๋ค โ ๊ณต์ยท๋ณด์กด ์ ์ฑ ยท๋์๋ณด๋ยทํ๋กฌํํธยท๋ฌธ์. ์ฃฝ์ ๊ฒ์ ๋ฌดํดํ์ง ์๊ณ **๊ฑฐ์ง ์ฃผ์ฅ์ ์์ฐํ๋ค.** ์ง์ฐ๊ธฐ ์ ์ "๋ฌด์์ด ์ด๊ฒ์ ๋ํด ๋งํ๋๊ฐ"๋ฅผ ๋ฐ๋ก ์ธ๋ผ. ํธ๋ฆฌ๊ฑฐ - "0ํ์ด๋ ์ฃฝ์ ๋ฏ", ๊ฐ์ฌ/์ธ์์ธ๊ณ์ ๋ฏธํ์ธ ์์ฌ ๋ชฉ๋ก, DROP ๋ง์ด๊ทธ๋ ์ด์ ์ฐฉ์, "์ ์ฐ์ด๋ ์ง์ฐ์",โฆ
"์์ด์ ํธ๋ผ์ ๋ชป ํ๋ค / OS ๊ฒฝ๊ณ๋ค / ๊ถํ์ด ์๋ค" ๋ ๋ฅ๋ ฅ์ ํต์งธ๋ก ๋ถ์ ํ๋ ์ง๋จ์ด๊ณ , ๊ฑฐ์ ํญ์ ๋๋ฌด ๋๋ค. ๋ฐ์ฆ์ ์ธ๋ค โ ๊ฐ์ ์ข ๋ฅ์ ์์์ **๋ด๊ฐ ๋ง๋ค๊ณ ๋ด๊ฐ ํต์ ํ๋ ์ธ์คํด์ค**๋ก ํ๋ ์ธ์ ๋๊ฐ์ ์ฐ์ฐ์ ํด๋ด๋ผ. ์ฑ๊ณตํ๋ฉด ์ง๋จ์ ์ฆ์ '๊ทธ ๊ฐ์ฒด๊ฐ, ๊ทธ ์ํ์์' ๋ก ์ข์์ง๋ค. ํธ๋ฆฌ๊ฑฐ - "๊ถํ์ด ์์ด์ ๋ชป ํฉ๋๋ค", "๋น๋ํํ์ด๋ผ ์ ๋ฉ๋๋ค", "OS/์๋๋ฐ์ค ์ ์ฝ์ ๋๋ค", ์ธ์์ธ๊ณ๊ฐ ์ฌ๋ฌ ์ธ์ ์ด์ํ '์ฌ๋ ์์ด ํ์ํ ๊ฒ', ์ฌ๋์ด ์ง์ โฆ
์ฝ๊ธฐ ์คํจ๋ฅผ `[]`/`false`/`0` ์ผ๋ก degrade ํ๋ฉด, ๊ทธ ๋น์ด ์์ ์์ฒด๋ก UIยท๊ท์น์ด ์ฃผ์ฅ์ ๋ง๋๋ ์๊ฐ blip ํ ๋ฒ์ด "์ ์ฐ ๊ฒ"์ ๋จ์ธํ๋ค. ํธ๋ฆฌ๊ฑฐ - `.catch(() => [])`, `?? false`, `except: return None`, "never blanks the surface" ์ฃผ์, "blip ๋ ์กฐ์ฉํ ์๋ชป๋ ์๋ด๊ฐ ๋ฌ๋ค", ์ธ์์ธ๊ณ๊ฐ ๋๊ธด ๋ฏธํ์ธ ๊ฒฐํจ ํ๋ณด.
๊ฐ๋๋ฅผ ์ค์ฆํ๋ ค๊ณ ์ฝ๋๋ฅผ ๋๋๋ ธ๋๋ฐ ๊ทธ ์นํ์ด ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ๋ง๋ค๋ฉด, ๋นจ๊ฐ์ ๋์ค์ง๋ง ์๋ฌด๊ฒ๋ ์ฆ๋ช ๋์ง ์๋๋ค โ ๊ทธ๋ฆฌ๊ณ ๋นจ๊ฐ์ด ๋์์ผ๋ฏ๋ก ์ฑ๊ณต์ฒ๋ผ ์ฝํ๋ค. ์ด๊ฑธ ์ก๋ ์ ํธ๋ ์ด๋ก/๋นจ๊ฐ์ด ์๋๋ผ **๋์๊ฐ ํ ์คํธ ๊ฐ์**๋ค. ํธ๋ฆฌ๊ฑฐ - ์ ์ ์ ๋จ/mutation ์ค์ฆ, sedยทpython ๋ก ์์ค ๋๋๋ฆฌ๊ธฐ, "๊ฐ๋๊ฐ ์ง์ง ์ก๋์ง ํ์ธ", ์ ๋จ ํ ์คํจ ์๊ฐ ์์๊ณผ ๋ค๋ฅผ ๋.
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โฆ
An endpoint that refused for exactly one reason gets a client that keys its message off the HTTP status. Add a second refusal reason and that mapping shows the WRONG actionable hint โ plausible, silent, and reported by nobody. Before adding a refusal, openโฆ