with one click
looping-skills
looping-skills contains 40 collected skills from NewTurn2017, with repository-level occupation coverage and site-owned skill detail pages.
Skills in this repository
๋ณ๊ฒฝ๋ ๋ผ์ฐํธ/ํ์ด์ง์ axeยทpa11yยทeslint-plugin-jsx-a11y ๊ฐ์ ์ ๊ทผ์ฑ(a11y) ์๋ ๊ฒ์ฌ๋ฅผ ๋๋ ค์ ๋ผ๋ฒจยท์ ๋๋นยทํฌ์ปค์ค ์์ยทARIA ์ญํ ๊ฐ์ ์๋ฐ์ ๊ณ ์น๊ณ , ๊ฐ์ฌ๊ฐ ๊นจ๋ํด์ง ๋(์๋ฐ 0, ์ข ๋ฃ ์ฝ๋ 0)๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ ๊ทผ์ฑ ๊ฒ์ฌ ํต๊ณผํ ๋๊น์ง ๋๋ ค์ค", "a11y ์๋ฐ ๋ค ๊ณ ์ณ์ค", "์ ๊ทผ์ฑ ๊ฐ์ฌ ๊นจ๋ํด์ง ๋๊น์ง", "axe/pa11y ์๋ฐ ์ก์์ค", "์คํฌ๋ฆฐ๋ฆฌ๋ยทํค๋ณด๋ ์ ๊ทผ์ฑ ๊ณ ์ณ์ค", "run a11y audit until clean", "fix accessibility violations", "A11y Audit Until Clean"์ฒ๋ผ ์์ฒญํ๊ฑฐ๋, ๋ณ๊ฒฝํ UI์ ์ ๊ทผ์ฑ ์๋ฐ์ ๋ฐ๋ณต์ ์ผ๋ก ์ก์ ์์ ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์๊ฐ์ ํฝ์ ํ๊ท๋ looping:visual-regression-until-match, lintยทํ์ ์๋ฌ ์ ๋ฆฌ๋ looping:lint-typecheck-fix, E2E UI ํตํฉ ํ ์คํธ๋ looping:e2e-until-green)
OpenAPI๋ JSON Schema ๊ฐ์ API ๊ณ์ฝ(contract)์ ๋ง์ถฐ ๊ณ์ฝ ํ ์คํธ๋ฅผ ๋๋ฆฌ๊ณ , ์๋ต์ด ์คํ๊ณผ ์ด๊ธ๋๋ฉด(๋๋ฆฌํํธ) ํธ๋ค๋ฌ ๊ตฌํ์ด๋ ์คํ์ ๊ฐ์ฅ ์์ ๋จ์๋ก ๊ณ ์ณ์ ๊ณ์ฝ ํ ์คํธ๊ฐ ์ ๋ถ ํต๊ณผ(์ข ๋ฃ ์ฝ๋ 0)ํ ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "API๊ฐ ์คํ๋๋ก ์๋ตํ๋์ง ๊ณ์ฝ ํ ์คํธ ๋๋ ค์ค", "OpenAPI ๊ณ์ฝ์ด๋ ๊ตฌํ ์ ๋ง๋ ๊ฑฐ ๋ง์ถฐ์ค", "API ์๋ต์ด ์คํค๋ง๋ ์ผ์นํ ๋๊น์ง ๊ณ ์ณ์ค", "๋ฌธ์๋ ๊ตฌํ ๋๋ฆฌํํธ ์ก์์ค", "contract test until match", "make the API match the OpenAPI/JSON Schema contract", "API Contract Until Match"์ฒ๋ผ ์์ฒญํ๊ฑฐ๋, ๋ฌธ์์ ์ค์ ๊ตฌํ ์ฌ์ด์ ๊ณ์ฝ ๋ถ์ผ์น๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ง์ถ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: openapi.yaml ์์ฒด๋ฅผ lintํ๊ณ ๋ผ์ฐํธ ํธ๋ค๋ฌ์ ๋๊ธฐํํ๋ ๊ฑด looping:openapi-sync-until-valid, READMEยทAPI ๋ ํผ๋ฐ์ค ๋ฑ ๋ฌธ์๋ฅผ ์ฝ๋์ ๋ง์ถ๋ ๊ฑด looping:docs-sync-after-edits, spec.md ์ฒดํฌ๋ฆฌ์คํธ๋๋ก ์ ๊ท ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฑด looping:spec-first-ship, ์ ์ฒด ํ ์คํธ ์ค์ํธ๋ฅผ green๊น์ง ๋๋ฆฌ๋ ๊ฑด looping:test-until-green)
์คํจํ๋ ํ ์คํธ๋ฅผ ๋จผ์ ์ฐ๊ณ โ ํต๊ณผ์ํฌ ์ต์ํ์ ์ฝ๋๋ฅผ ๊ตฌํํ๊ณ โ ๋ฆฌํฉํฐํ๋ red-green-refactor TDD ์ฌ์ดํด์, ๋์ ๋์์ด ํ ์คํธ๋ก ์์ ํ ๋ฎ์ด๊ณ ์ ์ฒด ์ค์ํธ๊ฐ ํต๊ณผํ ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "TDD๋ก ๋ง๋ค์ด์ค", "ํ ์คํธ ๋จผ์ ์ฐ๊ณ ๊ตฌํํด์ค", "red-green-refactor๋ก ๋๋ ค์ค", "์คํจ ํ ์คํธ๋ถํฐ ์์ฑํด์ ๊ธฐ๋ฅ ์ถ๊ฐํด์ค", "ํ ์คํธ ์ฃผ๋๋ก ์ด ๊ธฐ๋ฅ ๊ตฌํํด์ค", "Autoloop TDD", "test-first loop", "write a failing test then implement", "TDD this feature"์ฒ๋ผ ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํด ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ด๋ฏธ ๊นจ์ง ๊ธฐ์กด ํ ์คํธ๋ฅผ ํต๊ณผ์ํค๋ ๊ฑด looping:test-until-green, ์ปค๋ฒ๋ฆฌ์ง %๋ฅผ ์ฑ์ฐ๋ ค๊ณ ํ ์คํธ๋ง ์ถ๊ฐํ๋ ๊ฑด looping:coverage-until-threshold, spec.md ์ฒดํฌ๋ฆฌ์คํธ๋ก ์๊ตฌ์ฌํญ์ ํ๋์ฉ ๊ตฌํํ๋ ๊ฑด looping:spec-first-ship, E2E ์ค์ํธ๋ฅผ green์ผ๋ก ๋ง๋๋ ๊ฑด looping:e2e-until-green)
ํ๋ก๋์ ๋น๋๋ฅผ ์ค์ ๋ก ๋๋ ค ์ปดํ์ผยทํ์ ยท๋ฒ๋ค๋ง ์๋ฌ๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ๊ณ ์น๊ณ , ๋น๋๊ฐ ์ข ๋ฃ ์ฝ๋ 0์ผ๋ก ์ฑ๊ณตํ ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "๋น๋ ํต๊ณผํ ๋๊น์ง ๋๋ ค์ค", "๋น๋ ์๋ฌ ๋ค ๊ณ ์ณ์ค", "๋น๋ ๊นจ์ง ๊ฑฐ green ๋ ๋๊น์ง", "ํ๋ก๋์ ๋น๋ ์ฑ๊ณต์์ผ์ค", "npm run build ํต๊ณผํ๊ฒ", "build until green", "fix build errors until it compiles", "make the production build pass"์ฒ๋ผ ์์ฒญํ๊ฑฐ๋, ๋น๋๊ฐ ๊นจ์ง ๊ฑธ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ ์ณ ์ฑ๊ณต์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ํ ์คํธ ์ค์ํธ ์คํจ๋ฅผ ๊ณ ์น๋ ๊ฑด looping:test-until-green, lintยทํ์ ์ฒดํฌ ์๋ฌ ์ ๋ฆฌ๋ looping:lint-typecheck-fix, ์๊ฒฉ CI ๋น๋ ์คํจ ๊ฐ์๋ looping:ci-failure-watcher, ๋ฒ๋ค ์ฌ์ด์ฆ ์์ฐ ์ด๊ณผ๋ looping:bundle-size-budget)
ํ๋ก๋์ ๋น๋๋ฅผ ๋๋ ค ํด๋ผ์ด์ธํธ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ธก์ ํ๊ณ , ์ค์ ํ size-limit ์์ฐ์ ๋์ผ๋ฉด ๋ฌด๊ฑฐ์ด ๋ชจ๋ dynamic importยท๋ฏธ์ฌ์ฉ ์์กด์ฑ ์ ๊ฑฐยท๋ผ์ฐํธ ๋ถํ ๋ก ๋ค์ด์ดํธํ ๋ค size-limit์ด ์ข ๋ฃ ์ฝ๋ 0์ผ๋ก ํต๊ณผํ ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "๋ฒ๋ค ํฌ๊ธฐ ์ค์ฌ์ค", "๋ฒ๋ค ์์ฐ ์ ๋๊ฒ ํด์ค", "size-limit ํต๊ณผ์์ผ์ค", "๋ฒ๋ค ๋ค์ด์ดํธํด์ค", "client bundle ๊ฐ๋ณ๊ฒ ์ ์งํด์ค", "bundle size budget", "keep the client bundle under budget", "loop until size-limit passes"์ฒ๋ผ ํด๋ผ์ด์ธํธ ๋ฒ๋ค์ ์์ฐ ์ดํ๋ก ๋์ด๋ด๋ฆฌ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋น๋ ์์ฒด๋ฅผ ์ฑ๊ณต์ํค๋ ๊ฑด looping:build-until-green, ์ฃฝ์ exportยท๋ฏธ์ฌ์ฉ ํ์ผยท๊ณ ์ ์์กด์ฑ ์ ๋ฆฌ๋ looping:knip-until-clean, ์์กด์ฑ์ ํ๋์ฉ ์์ ํ๊ฒ ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฑด looping:dependency-upgrade-one-by-one)
๊ธฐ๋ฅ์ ์ถ์(ship)ํ ์งํ, ๋ง์ง๋ง ํ๊ทธ ์ดํ์ ์ปค๋ฐ์ ํ์ด CHANGELOG.md์ [Unreleased] ์น์ ์ ์ฌ์ฉ์ ๊ด์ ํญ๋ชฉ์ ์ฑ์ฐ๊ณ conventional commits๋ฅผ ๋ฐ์ํ ๋๊น์ง ๋ฐ๋ณตํ๋ ์๋ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ฒด์ธ์ง๋ก๊ทธ ์ ๋ฐ์ดํธํด์ค", "๋ฐฉ๊ธ ์ถ์ํ ๊ฑฐ CHANGELOG์ ๋ฐ์ํด์ค", "๋ฆด๋ฆฌ์ค ๋ ธํธ ์ ๋ฆฌํด์ค", "CHANGELOG ๋๊ธฐํ", "changelog sync after ship", "update the changelog for this release", "sync CHANGELOG after shipping"์ฒ๋ผ ์ถ์ยท๋จธ์ง ์งํ ๋ณ๊ฒฝ ์ด๋ ฅ์ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ์ ๋ฆฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: READMEยทAPI ๋ ํผ๋ฐ์คยท์ฃผ์ ๋ฑ ์ผ๋ฐ ๋ฌธ์ ๋๊ธฐํ๋ looping:docs-sync-after-edits, openapi.yaml ์คํ ๋๊ธฐํ๋ looping:openapi-sync-until-valid, API ์๋ต์ด ๊ณ์ฝ๊ณผ ๋ง๋์ง ๊ฒ์ฆ์ looping:api-contract-until-match, ์์ฑํ spec.md ์ฒดํฌ๋ฆฌ์คํธ๋๋ก ๊ตฌํ์ looping:spec-first-ship)
์๊ฒฉ CI๋ฅผ ์ผ์ ๊ฐ๊ฒฉ(๊ธฐ๋ณธ 5๋ถ)๋ง๋ค ํด๋งํด์, ์ฒดํฌ๊ฐ ๋นจ๊ฐ์ง๋ฉด(red) ์คํจ๋ฅผ ์กฐ์ฌํ๊ณ , green์ด ๋ ๋๊น์ง ์์ ์ push ํ๋ ์ธํฐ๋ฒ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "CI ๋นจ๊ฐ๋ถ ๋จ๋ฉด ์๋์ผ๋ก ๊ณ ์ณ์ค", "CI 5๋ถ๋ง๋ค ๊ฐ์ํ๋ค ๊นจ์ง๋ฉด ์์ ", "CI ์ด๋ก ๋ ๋๊น์ง ์ง์ผ๋ด", "gh run ํด๋งํด์ ์คํจ ์ถ์ ยท์์ ", "watch CI", "CI failure watcher", "poll CI until green", "investigate CI failures and push fixes"์ฒ๋ผ ์๊ฒฉ CI ์ํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐ์ํ๋ค๊ฐ ์คํจ๋ฅผ ์๋์ผ๋ก ์ถ์ ยท์์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ฌ๋์ด ์ง์ ํ ๋ฒ ๋๋ฆฌ๋ CI ์์ ์ looping:fix-ci-until-green, ์ฌ๋ฌ PR์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ณด๋ ๊ฑด looping:pr-babysitter, ๋ฐฐํฌ ํ ํฌ์คยท์ค๋ชจํฌ ์๋ํฌ์ธํธ ๊ฐ์๋ looping:deploy-verification-loop, ๋ก์ปฌ ํ๋ก๋์ ๋น๋ ํต๊ณผ๋ looping:build-until-green)
ํ ์คํธ๋ฅผ ์ถ๊ฐํด ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง(coverage)๋ฅผ ๋ชฉํ ์๊ณ์น(์: 80%)๊น์ง ๋์ด์ฌ๋ฆฌ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ํ๋ก๋์ ๋์์ ๋ถํ์ํ๊ฒ ๋ฐ๊พธ์ง ์๊ณ , ์ปค๋ฒ๋์ง ์์ ๋ถ๊ธฐ์๋ง ์ง์ค ํ ์คํธ๋ฅผ ๋ํด "์๊ณ์น ์ถฉ์กฑ + ์ ์ฒด ํ ์คํธ ํต๊ณผ(์ข ๋ฃ ์ฝ๋ 0)"์ ์๋ ด์ํต๋๋ค. ์ฌ์ฉ์๊ฐ "์ปค๋ฒ๋ฆฌ์ง 80%๊น์ง ์ฌ๋ ค์ค", "ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋์ด์ฌ๋ ค์ค", "์ปค๋ฒ๋ฆฌ์ง ์๊ณ์น ์ฑ์์ค", "์ ๋ฎ์ธ ์ฝ๋์ ํ ์คํธ ์ถ๊ฐํด์ค", "coverage until threshold", "raise test coverage to 80%", "add tests until coverage passes"์ฒ๋ผ ์ปค๋ฒ๋ฆฌ์ง ๋ชฉํ๋ฅผ ์ฑ์ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๊ทธ๋ฅ ๊นจ์ง ํ ์คํธ๋ฅผ ํต๊ณผ์ํค๋ ๊ฑด looping:test-until-green, ์คํจ ํ ์คํธ๋ฅผ ๋จผ์ ์ฐ๋ TDD ์ฌ์ดํด์ looping:autoloop-tdd, ๋ถ์์ ยท๊ฐํ ์คํจ ๋ถ๋ฅ๋ looping:flaky-test-triage, e2e ์ค์ํธ ํต๊ณผ๋ looping:e2e-until-green)
๊ตฌํ์ด ๋๋ ์งํ "์ ๋ฆฌ ํจ์ค"๋ฅผ ํ ๋ฒ ๋๋ ค, ๋๋ฒ๊ทธ ๋ก๊ทธยท์ฃฝ์ ๋ถ๊ธฐยท์ฃผ์ ์ฒ๋ฆฌ๋ ์ฝ๋ยทTODO ๋์งยท๋ค์ญ๋ ์ญํ ๋ค์ด๋ฐ์ ๊ฑท์ด๋ด๊ณ ํ๋ก์ ํธ ์ปจ๋ฒค์ ์ ๋ง์ถฐ ๋ค๋ฌ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ๋งค ํ์ฐจ lint์ ํ ์คํธ๋ก ๋์์ด ๊นจ์ง์ง ์์๋์ง ํ์ธํฉ๋๋ค. ์ฌ์ฉ์๊ฐ "๊ตฌํ ๋๋ฌ์ผ๋ ์ ๋ฆฌ ํ ๋ฒ ๋๋ ค์ค", "๋ฐฉ๊ธ ์ง ์ฝ๋ ์ฌ๋กญ ์ ๋ฆฌํด์ค", "๋๋ฒ๊ทธ ์ฝ๋๋ ์ฃฝ์ ์ฝ๋ ์น ์น์์ค", "๋ค์ด๋ฐ ๋ค๋ฌ๊ณ ์ปจ๋ฒค์ ๋ง์ถฐ์ค", "AI๊ฐ ์ง ์ง์ ๋ถํ ์ฝ๋ ์ ๋ฆฌ", "de-sloppify", "de-sloppify pass", "cleanup pass after implementation", "remove debug code", "tighten naming", "delete dead branches", "align with project conventions"์ฒ๋ผ ์์ฒญํ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์๋์ด ๊ด์ ์ผ๋ก ์๊ธฐ diff๋ฅผ ๊ฒํ ํ๋ ์๊ธฐ ๋ฆฌ๋ทฐ๋ looping:pr-self-review, ์ฌ์ฉ๋์ง ์๋ exportยทํ์ผยท๊ณ ์ ์์กด์ฑ ์ ๊ฑฐ๋ looping:knip-until-clean, ํฌ๋งคํฐ๋ก ์คํ์ผ๋ง ๋ง์ถ๋ ๊ฑด looping:format-until-clean, lintยทtypecheck ์ค๋ฅ๋ง ์ก๋ ๊ฑด looping:lint-typecheck-fix)
๋งค์ฃผ ํ ๋ฒ ์ค๋๋(outdated) ์์กด์ฑ์ ํ์ด ํจ์นยท๋ง์ด๋ยท๋ฉ์ด์ ๋ก ๋ถ๋ฅํ๊ณ , ๊นจ์ง ์ํ์ด ๋ฎ์ ๊ฒ๋ถํฐ ์์ ํ ์ ๊ทธ๋ ์ด๋ ๊ณํ์ ์์ฝ์ผ๋ก ๋ด๋๋ ์ธํฐ๋ฒ ๋ฃจํ์ ๋๋ค. ์ฝ๋๋ฅผ ๋ฐ๊พธ์ง ์๊ณ "์ด๋ฒ ์ฃผ์ ๋ญ ์ฌ๋ฆด์ง"๋ง ์ ์ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ "์ฃผ๊ฐ ์์กด์ฑ ์ ๊ฒ", "๋งค์ฃผ outdated ํจํค์ง ํ์ธํ๊ณ ์ ๊ทธ๋ ์ด๋ ์ ์ํด์ค", "์์กด์ฑ ์ ๋ฐ์ดํธ ์์ฝ ์ฃผ๊ฐ์ผ๋ก ๋๋ ค์ค", "dependency audit weekly", "weekly dependency audit", "check outdated deps and propose safe upgrades"์ฒ๋ผ ์ ๊ธฐ์ ์ผ๋ก ์์กด์ฑ ํํฉ์ ์ ๊ฒํ๊ณ ์์ ํ ์ ๊ทธ๋ ์ด๋์์ ๋ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ค์ ๋ก ํ ๋ฒ์ ํ๋์ฉ ์ฌ๋ฆฌ๊ณ ๊นจ์ง ๊ฑธ ๊ณ ์น๋ ๊ฑด looping:dependency-upgrade-one-by-one, ๋ณด์ ์ทจ์ฝ์ ์ ์ฃผ๊ฐ ์ค์บํ๋ ๊ฑด looping:security-audit-weekly, npm audit ๊ณ ยท์ฌ๊ฐ ์ทจ์ฝ์ ์ ํ๋์ฉ ๊ณ ์น๋ ๊ฑด looping:npm-audit-fix-loop, ๋ฏธ์ฌ์ฉ ์์กด์ฑ ์ ๊ฑฐ๋ looping:knip-until-clean)
์ค๋๋(outdated) ์์กด์ฑ์ ํ ๋ฒ์ ํ๋์ฉ๋ง ์ ๊ทธ๋ ์ด๋ํ๊ณ , ๊ทธ ํจํค์ง๊ฐ ์ผ์ผํจ ํ์ ์๋ฌยทAPI ๋ณ๊ฒฝยทํ ์คํธ ์คํจ๋ฅผ ๊ณ ์น ๋ค ์ปค๋ฐํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. bulk `npm update`๋ก ํ๊บผ๋ฒ์ ์ฌ๋ฆฌ๋ ๊ฒ๋ณด๋ค ์์ ํ๊ฒ, ํจํค์ง๋ง๋ค ๋ฐ๋ก ๊ฒ์ฆํ๋ฉฐ ์์กด์ฑ์ ์ต์ ํํฉ๋๋ค. ์ฌ์ฉ์๊ฐ "์์กด์ฑ ํ๋์ฉ ์ ๊ทธ๋ ์ด๋ํด์ค", "ํจํค์ง ํ๋์ฉ ์ฌ๋ฆฌ๊ณ ๊นจ์ง ๊ฑฐ ๊ณ ์ณ์ค", "์ค๋๋ dependency ์์ ํ๊ฒ ์ ๋ฐ์ดํธ", "npm outdated ํ๋์ฉ ์ ๋ฆฌํด์ค", "dependency upgrade one by one", "upgrade dependencies one at a time", "bump packages one by one and fix breakages"์ฒ๋ผ ์์กด์ฑ์ ์ ์ง์ ์ผ๋กยท์์ ํ๊ฒ ์ฌ๋ฆฌ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ฃผ๊ฐ ์์กด์ฑ ์ ๊ฒยท์์ฝ๋ง ํ๋ ๊ฑด looping:dependency-audit-weekly, npm audit ๋ณด์ ์ทจ์ฝ์ ์ ํ๋์ฉ ๊ณ ์น๋ ๊ฑด looping:npm-audit-fix-loop, ์ฃผ๊ฐ ๋ณด์ ์ค์บ์ looping:security-audit-weekly, ์ ์ฐ๋ ์์กด์ฑยท์ฃฝ์ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฑด looping:knip-until-clean)
๋ฐฐํฌ ์งํ ์ผ์ ๊ฐ๊ฒฉ(์ 15๋ถ)๋ง๋ค healthยทsmoke ์๋ํฌ์ธํธ๋ฅผ curl๋ก ์ฐ๋ฌ๋ณด๊ณ , ์คํจํ๋ฉด ๋ฐฐํฌ ๋ก๊ทธยทํ๊ฒฝ๋ณ์ยท๋ง์ด๊ทธ๋ ์ด์ ์ ์ ๊ฒํด ๊ฐ์ฅ ์์ ์์ ์ ์ ์ฉํ ๋ค, ์ค์ ํ ๋ชจ๋ ์๋ํฌ์ธํธ๊ฐ ์ฑ๊ณต ์๋ต์ ์ค ๋๊น์ง ๋ฐ๋ณตํ๋ ์ธํฐ๋ฒ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "๋ฐฐํฌ ํ ํฌ์ค์ฒดํฌ ๋๋ ค์ค", "๋ฐฐํฌ ๊ฒ์ฆ ๋ฃจํ", "deploy ๋๋๊ณ health/smoke ์๋ํฌ์ธํธ ๋ค ํต๊ณผํ ๋๊น์ง 15๋ถ๋ง๋ค ์ฒดํฌ", "๋ฐฐํฌํ๊ณ ๋์ ํฌ์ค ์๋ํฌ์ธํธ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฐ๋ฌ์ค", "๋ฐฐํฌ ์ ๋ด๋์ง ํ์ธ ๋ฃจํ", "deploy verification loop", "hit health and smoke endpoints after a deploy", "verify deploy until healthy", "post-deploy health check loop"์ฒ๋ผ ๋ฐฐํฌ๊ฐ ์ ์์ธ์ง ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฒ์ฆํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋ฐฐํฌ ํ ํ ๋ฒ ์๋์ผ๋ก ๊ณ ์ ์ค๋ชจํฌ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๋๋ ๊ฑด looping:staging-smoke-test, ์๊ฒฉ CI ์คํ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐ์ํ๋ ๊ฑด looping:ci-failure-watcher, DB ๋ง์ด๊ทธ๋ ์ด์ ์ ๊นจ๋์ด ์ ์ฉ์ํค๋ ๊ฑด looping:migration-until-applied, ์ด๋ฆฐ PR์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ณด๋ ๊ฑด looping:pr-babysitter)
์ฝ๋๋ฅผ ๋ฐ๊พผ ๋ค ๊ทธ ๋ณ๊ฒฝ์ ์ํฅ๋ฐ์ ๋ฌธ์๋ฅผ ์ฐพ์ READMEยทAPI ๋ ํผ๋ฐ์คยท์ธ๋ผ์ธ ์ฃผ์์ ์ฝ๋์ ์ผ์นํ๊ฒ ๋ง์ถ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ฝ๋ ๋ฐ๊ฟจ์ผ๋ ๋ฌธ์๋ ๋ง์ถฐ์ค", "README๋ ์ฃผ์ ์ฝ๋์ ๋ง๊ฒ ์ ๋ฐ์ดํธ", "๋ณ๊ฒฝ๋ ๋ถ๋ถ ๋ฌธ์ ๋๊ธฐํ", "์ด๋ฒ diff์ ๋ง์ถฐ docs ๊ฐฑ์ ", "API ๋ ํผ๋ฐ์ค ์ต์ ํ", "sync docs after edits", "update README to match the code", "docs sync after edits"์ฒ๋ผ ์ฝ๋ ๋ณ๊ฒฝ ์ดํ ๋ค์ฒ์ง ๋ฌธ์๋ฅผ ์ฝ๋์ ๋ค์ ๋ง์ถ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ถ์ ํ CHANGELOG ํญ๋ชฉ ์ฑ์ฐ๊ธฐ๋ looping:changelog-sync-after-ship, API ์๋ต์ด OpenAPI/JSON Schema ๊ณ์ฝ๊ณผ ๋ง๋์ง ๊ฒ์ฆ์ looping:api-contract-until-match, openapi.yaml ์คํ ์์ฒด๋ฅผ ๋ผ์ฐํธ์ ๋๊ธฐํ๋ looping:openapi-sync-until-valid, ๊ตฌํ ํ ์ฝ๋ ์ ๋ฆฌ ํจ์ค๋ looping:de-sloppify-pass)
E2E(์๋ํฌ์๋) ํ ์คํธ ์ค์ํธ๋ฅผ ์คํํด UIยทํตํฉ ๋จ๊ณ ์คํจ๋ฅผ ๊ณ ์น๊ณ , ๋ชจ๋ spec์ด ํต๊ณผ(์ข ๋ฃ ์ฝ๋ 0)ํ ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "E2E ํต๊ณผํ ๋๊น์ง ๋๋ ค์ค", "์๋ํฌ์๋ ํ ์คํธ green ๋ง๋ค์ด์ค", "E2E ๊นจ์ง ๊ฑฐ ๋ค ๊ณ ์ณ์ค", "Playwright/Cypress E2E ํต๊ณผ์์ผ์ค", "UI๋ ํตํฉ ํ ์คํธ ์คํจ ๊ณ ์ณ์ค", "e2e until green", "run end-to-end tests until they pass", "fix e2e failures and loop until the suite passes"์ฒ๋ผ ์์ฒญํ๊ฑฐ๋, ๊นจ์ง E2E ์๋๋ฆฌ์ค๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ ์ณ ์ ๋ถ ํต๊ณผ์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ ๋ยท์ ์ฒด ํ ์คํธ ์ค์ํธ๋ looping:test-until-green, Playwright/Percy ์คํฌ๋ฆฐ์ท ํฝ์ ๋น๊ต๋ looping:visual-regression-until-match, ํ๋ก๋์ ๋น๋ ์ปดํ์ผ ์๋ฌ๋ looping:build-until-green, ๋ฐฐํฌ ํ ์คํ ์ด์ง ์ค๋ชจํฌ ์ ๊ฒ์ looping:staging-smoke-test)
์ด ๋ธ๋์น์ ๊ฐ์ฅ ์ต๊ทผ ์คํจํ CI ์คํ์ gh๋ก ๊ฐ์ ธ์ ๋ก๊ทธ๋ฅผ ์ฝ๊ณ , ๋ก์ปฌ์์ ๋๊ฐ์ด ์ฌํํ ๋ค ๊ทผ๋ณธ ์์ธ์ ์ต์ diff๋ก ๊ณ ์น๊ณ pushํด์, ์ฒดํฌ๊ฐ ๋ค์ green์ด ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "CI ๋นจ๊ฐ๋ถ ๊ณ ์ณ์ค", "CI ํต๊ณผํ ๋๊น์ง ๊ณ ์ณ์ค", "๊นจ์ง CI ์ด๋ก๋ถ ๋ง๋ค์ด์ค", "CI ์คํจ ์์ธ ์ฐพ์์ ๊ณ ์ณ์ค", "GitHub Actions ์คํจ ๊ณ ์ณ", "fix CI until green", "fix the failing CI", "make CI pass", "get the build green"์ฒ๋ผ ์๊ฒฉ CI๊ฐ ๋นจ๊ฐ๊ฒ ๋ ์์ด ๊ทธ๊ฑธ ์ง์ ๊ณ ์ณ ํต๊ณผ์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ฃผ๊ธฐ์ ์ผ๋ก CI๋ฅผ ํด๋งํ๋ฉฐ ๊ฐ์ยท์๋ ์์ ํ๋ ๊ฑด looping:ci-failure-watcher, ๊ตฌํ๋ถํฐ PR์ ์ด๊ณ ๋จธ์ง ๊ฐ๋ฅ ์ํ๊น์ง ๋๊ณ ๊ฐ๋ ๊ฑด looping:ship-pr-until-green, ์๊ฒฉ์ด ์๋๋ผ ๋ก์ปฌ ํ ์คํธ ์ค์ํธ๋ฅผ green๊น์ง ๋๋ฆฌ๋ ๊ฑด looping:test-until-green, ํ๋ก๋์ ๋น๋ ์ปดํ์ผ ์๋ฌ๋ฅผ ๊ณ ์น๋ ๊ฑด looping:build-until-green)
์คํจํ๋ ํ ์คํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต ์คํํด ๊ฐ ์คํจ๋ฅผ ๋ถ์์ (flaky)์ธ์ง ์ง์ง ํ๊ท(real)์ธ์ง ๋ถ๋ฅํ๊ณ , ํ์ธ๋ ์ง์ง ํ๊ท๋ง ๊ณ ์น๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ด ํ ์คํธ flaky์ธ์ง ์ง์ง ๊นจ์ง ๊ฑด์ง ๊ฐ๋ ค์ค", "๊ฐํ์ ์ผ๋ก ๊นจ์ง๋ ํ ์คํธ ๋ถ๋ฅํด์ค", "ํ ์คํธ ์ฌ๋ฌ ๋ฒ ๋๋ ค์ ๋ถ์์ ํ ๊ฑฐ ๊ณจ๋ผ์ค", "flaky ํ ์คํธ ํธ๋ฆฌ์์ง", "flaky test triage", "classify flaky vs real failures", "run failing tests repeatedly and fix only real regressions"์ฒ๋ผ ๊ฐํ ์คํจ์ ์ง์ง ์คํจ๋ฅผ ๊ตฌ๋ถํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ ์ฒด ์ค์ํธ๋ฅผ ๋ฌด์กฐ๊ฑด green๊น์ง ๊ณ ์น๋ ๊ฑด looping:test-until-green, ๋ฒ๊ทธ ํ๋๋ฅผ ์ฌํ ์คํฌ๋ฆฝํธ๋ก ํ๊ณ ๋๋ ๊ฑด looping:investigation-script-loop, ์คํจํ ๋๋ง๋ค ํ๊ณ ๋ฉ๋ชจ๋ฅผ ๋จ๊ธฐ๋ฉฐ ์ฌ์๋ํ๋ ๊ฑด looping:reflexion-debug-loop, ์๊ฒฉ CI ์คํจ ๊ฐ์๋ looping:ci-failure-watcher)
ํ๋ก์ ํธ ํฌ๋งทํฐ(prettier, biome ๋ฑ)๋ฅผ ๋๋ฆฌ๊ณ , ํฌ๋งทํฐ๊ฐ ์๋์ผ๋ก ๋ชป ๊ณ ์น ์คํ์ผ ๋ฌธ์ ๋ฅผ ์๋ณด๊ณ , ์ฝ๋๋ฒ ์ด์ค๊ฐ diff ํ๋ ์์ด ๊นจ๋ํ๊ฒ ํฌ๋งท๋ ๋๊น์ง ๋ฐ๋ณตํ๋ ์๋ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "ํฌ๋งท ๊น๋ํ๊ฒ ์ ๋ฆฌํด์ค", "prettier ๋๋ ค์ diff ์์ ๋๊น์ง", "ํฌ๋งทํ ํต์ผํด์ค", "์ฝ๋ ์คํ์ผ ๋ค ๋ง์ถฐ์ค", "ํฌ๋งท ๊นจ๋ํด์ง ๋๊น์ง ๋๋ ค์ค", "format until clean", "run prettier/biome until clean", "fix formatting until no diff"์ฒ๋ผ ํฌ๋งท์ ๋๊น์ง ๊นจ๋ํ๊ฒ ๋ง์ถ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋ฆฐํธยทํ์ ์๋ฌ๊น์ง ์ก๋ ๊ฑด looping:lint-typecheck-fix, ๋ค์ด๋ฐยท์ฃฝ์ ์ฝ๋ยท๋๋ฒ๊ทธ ์์ฌ ์ ๋ฆฌ๋ looping:de-sloppify-pass, ๋ฏธ์ฌ์ฉ exportยท๊ณ ์ ํ์ผ ์ ๊ฑฐ๋ looping:knip-until-clean, ์ ๊ทผ์ฑ ๊ฒ์ฌ ํด๋ฆฐ์ ์ looping:a11y-audit-until-clean)
๊ฐ์ ์ฒดํฌ๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ ๋ฒ ์คํจํ๋ฉด ๊ทธ ์คํจ๋ฅผ `.ralph/guardrails.md`์ '๊ฐ๋๋ ์ผ ์ฌ์ธ'์ผ๋ก ์ ์ด ๋๊ณ , ๋ค์ ๋ฐ๋ณต๋ถํฐ๋ ๋๊ฐ์ ์ค์๋ฅผ ๋ํ์ดํ์ง ์๊ฒ ๋ง๋๋ ํ์ตํ ์๋ํ ๋ฃจํ์ ๋๋ค. ๋งค ๋ฐ๋ณต๋ง๋ค ๊ฐ๋๋ ์ผ์ ๋จผ์ ์ฝ๊ณ โ ์ฒดํฌ(`npm test && npm run lint`)๋ฅผ ๋๋ฆฌ๊ณ โ ์คํจ๊ฐ ๋ฐ๋ณต๋๋ฉด ์ฌ์ธ์ ์ถ๊ฐํ๊ณ โ ๊ทธ ์ฌ์ธ์ ์งํค๋ฉฐ ๊ณ ์นฉ๋๋ค. ์ฌ์ฉ์๊ฐ "๊ฐ์ ์คํจ ๋ฐ๋ณตํ์ง ๋ง๊ณ ๊ธฐ๋กํ๋ฉด์ ๊ณ ์ณ์ค", "๊ฐ๋๋ ์ผ์ ์ ์ด๊ฐ๋ฉฐ ํ์ตํ๋ ๋ฃจํ", "์คํจ ํจํด ๋ฉ๋ชจํ๊ณ ํผํด๊ฐ๊ฒ", "๋ ๋ฒ ๊นจ์ง ๊ฑด ๋ค์ ์ ๊นจ์ง๊ฒ", "guardrails learning loop", "append a guardrail sign", "learn from repeated failures and stop repeating them"์ฒ๋ผ ์์ฒญํ๊ฑฐ๋, ๋ฐ๋ณต๋๋ ์คํจ๋ฅผ ๋์คํฌ์ ๋จ๊ฒจ ๋ค์ ํ์ฐจ๊ฐ ํผํ๋๋ก ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋๋ฒ๊น ํ๊ณ ๋ฅผ ๋์คํฌ์ ์ ์ด ๊ฐ์ ์ค๋ต์ ํผํ๋ ๊ฑด looping:reflexion-debug-loop, prd.json ์คํ ๋ฆฌ๋ฅผ .ralph ์ํ๋ก ํ๋์ฉ ์คํํ๋ ๊ฑด looping:ralph-story-executor, ๊ทธ๋ฅ ํ ์คํธ๋ง green๊น์ง ๋๋ฆฌ๋ ๊ฑด looping:test-until-green, lint+typecheck๋ง ์ ๋ฆฌํ๋ ๊ฑด looping:lint-typecheck-fix)
๊ตฌํ์ด "๋ค ๋๋ค"๊ณ ์ ์ธํ์ ๋, ๊ตฌํ์์ ๊ทผ๊ฑฐ๋ ๋ณ๋ช ์๋ ์ ๊ทผํ์ง ์์ ๋ณ๋์ ๊ฒ์ฆ ํจ์ค๊ฐ ๋น๋ยท๋ฆฐํธยทํ ์คํธ๋ฅผ ์ง์ ๋ค์ ๋๋ ค ์ ๋ง ํต๊ณผํ๋์ง ํ์ธํ๊ณ , ์คํจ๊ฐ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "๊ตฌํ ๋๋ฌ๋ค๋๋ฐ ์ง์ง ํต๊ณผํ๋์ง ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒ์ฆํด์ค", "๊ตฌํ์ ๋ง ๋ฏฟ์ง ๋ง๊ณ ๋น๋ยท๋ฆฐํธยทํ ์คํธ ๋ค์ ๋๋ ค์ ํ์ธ", "๋ ๋ฆฝ ๊ฒ์ฆ ํจ์ค ๋๋ ค์ค", "๋จธ์ง ์ ์ต์ข ๊ฒ์ดํธ๋ก ๊ฒ์ฆ๋ง ๋ฐ๋ก", "independent verifier pass", "verify the implementation independently", "run build lint tests as a separate verifier"์ฒ๋ผ ๊ตฌํ ์ฃผ์ฅ๊ณผ ๋ณ๊ฐ๋ก ๋ช ๋ น ์ถ๋ ฅ๋ง ์ ๋ขฐํด ๊ฒ์ฆํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ํ ์คํธ๋ง green๊น์ง ๋๋ฆฌ๋ ๊ฑด looping:test-until-green, ํ๋ก๋์ ๋น๋๋ง ๊ณ ์น๋ ๊ฑด looping:build-until-green, ๋ฆฐํธยทํ์ ์ฒดํฌ๋ง ๊ณ ์น๋ ๊ฑด looping:lint-typecheck-fix, ์๊ธฐ diff๋ฅผ ๋ฆฌ๋ทฐ์ด์ฒ๋ผ ์ ๊ฒํ๋ ๊ฑด looping:pr-self-review)
๋ฒ๊ทธ๋ฅผ ์ฌํํ๋ ์์ ์ผํ์ฉ(throwaway) ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ์ง์ ์คํํ๊ณ , ์ถ๋ ฅ์ ์ฝ๊ณ , ๊ทผ๋ณธ ์์ธ์ด ์ฆ๋ช ๋ ๋๊น์ง ์คํฌ๋ฆฝํธ์ ๊ฐ์ค์ ๋ค๋ฌ๋ ๋๋ฒ๊น ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "๋ฒ๊ทธ ์์ธ ๋๊น์ง ํ์ค", "์ฌํ ์คํฌ๋ฆฝํธ ์ง์ ์์ธ ์ฐพ์์ค", "์ ์ด๋ฌ๋์ง ์คํฌ๋ฆฝํธ๋ก ์ฆ๋ช ํด์ค", "์ถ์ธก ๋ง๊ณ ์ถ๋ ฅ์ผ๋ก ํ์ธํด์ค", "throwaway repro๋ก ๋๋ฒ๊น ", "investigation script loop", "write a repro script to find the root cause", "prove the root cause with a probe script"์ฒ๋ผ ์ถ์ธก ๋์ ์ค์ ์ถ๋ ฅ์ผ๋ก ๊ทผ๋ณธ ์์ธ์ ๊ท๋ช ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์คํจํ ์ฌํ๋ง๋ค ๋์คํฌ์ reflection์ ๋จ๊ฒจ ๊ฐ์ ์ค๋ต์ ํผํ๋ ๊ฑด looping:reflexion-debug-loop, ํ ์คํธ๋ฅผ ์ ๋ถ ํต๊ณผ(green)์ํค๋ ๊ฑด looping:test-until-green, ๊ฐํ ์คํจ๋ฅผ flaky/real๋ก ๋ถ๋ฅํ๋ ๊ฑด looping:flaky-test-triage, CI ์คํจ๋ฅผ ๋ก์ปฌ์์ ์ฌํํด ๊ณ ์น๋ ๊ฑด looping:fix-ci-until-green)
knip์ ๋๋ ค ์ฃฝ์ export, ์ ์ฐ๋ ํ์ผ, ๊ณ ์(orphan) ์์กด์ฑ์ ์ฐพ์ ์ ๊ฑฐํ๊ณ , knip์ด ๊นจ๋(์ข ๋ฃ ์ฝ๋ 0)ํ๋ค๊ณ ํ ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ ์ฐ๋ ์ฝ๋ ๋ค ์ง์์ค", "๋ฐ๋ ์ฝ๋ ์ ๋ฆฌํด์ค", "์ฐ์ง ์๋ exportยทํ์ผยท์์กด์ฑ ์ ๊ฑฐ", "knip ๊นจ๋ํด์ง ๋๊น์ง ๋๋ ค์ค", "์ฌ์ฉ ์ ํ๋ deps ํธ์ด์ค", "knip until clean", "remove dead exports and unused files", "find orphan dependencies"์ฒ๋ผ knip(๋๋ depcheck) ๊ธฐ๋ฐ์ผ๋ก ๋ฏธ์ฌ์ฉ ์ฝ๋ยท์์กด์ฑ์ ๋ฐ๋ณต ์ ๊ฑฐํด ๊นจ๋ํ๊ฒ ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ผ๋ฐ์ ์ธ ๊ตฌํ ํ ์ฒญ์(๋๋ฒ๊ทธ ์ฝ๋ยท์ฃฝ์ ๋ถ๊ธฐ ์ ๊ฑฐ)๋ looping:de-sloppify-pass, ๋ฆฐํธยทํ์ ์ฒดํฌ ์๋ฐ ์ ๋ฆฌ๋ looping:lint-typecheck-fix, ํจํค์ง๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฑด looping:dependency-upgrade-one-by-one, ๋ณด์ ์ทจ์ฝ์ ์์กด์ฑ ํจ์น๋ looping:npm-audit-fix-loop)
lint์ typecheck๋ฅผ ์คํํด ๋ณด๊ณ ๋ ๊ฒฝ๊ณ ยท์๋ฌ๋ฅผ ์ต์ ๋ณ๊ฒฝ์ผ๋ก ๊ณ ์น๊ณ , ๋ ๋ช ๋ น์ด ๋ชจ๋ ๊นจ๋ํด์ง(์ข ๋ฃ ์ฝ๋ 0) ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "๋ฆฐํธ ์๋ฌ ๋ค ๊ณ ์ณ์ค", "ํ์ ์๋ฌ ๊นจ๋ํด์ง ๋๊น์ง ๋๋ ค์ค", "lint๋ typecheck ํต๊ณผ์์ผ์ค", "eslint ๊ฒฝ๊ณ ์ ๋ฆฌํ๊ณ tsc ํต๊ณผ", "ํ์ ์ฒดํฌ ํด๋ฆฐํ๊ฒ", "lint and typecheck fix", "fix all lint and type errors", "run lint and tsc until clean"์ฒ๋ผ ์ ์ ๊ฒ์ฌ(lint/typecheck)๋ฅผ ํต๊ณผ์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ํ๋ก๋์ ๋น๋/์ปดํ์ผ ์๋ฌ๋ looping:build-until-green, ํฌ๋งคํฐ ์คํ์ผ ์ ๋ฆฌ๋ looping:format-until-clean, ํ ์คํธ ์ค์ํธ ํต๊ณผ๋ looping:test-until-green, ์ฃฝ์ exportยท๋ฏธ์ฌ์ฉ ํ์ผ ์ ๊ฑฐ๋ looping:knip-until-clean)
ํ๊น ๋ธ๋์น(๋ณดํต main)๋ฅผ rebase ๋๋ merge ํ๊ณ , ๋จธ์ง ์ถฉ๋์ ํ์ผ ํ๋์ฉ ์์ชฝ ์๋๋ฅผ ์ด๋ ค ํด๊ฒฐํ ๋ค, ๋ธ๋์น๊ฐ ์ต์ ์ด ๋๊ณ ํ ์คํธ๊ฐ ํต๊ณผ(์ข ๋ฃ ์ฝ๋ 0)ํ ๋๊น์ง ๋ฐ๋ณตํ๋ ์๋ ์์ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ด ๋ธ๋์น main ์๋ก rebase ํ๊ณ ์ถฉ๋ ๋ค ํ์ด์ค", "๋จธ์ง ์ถฉ๋ ํด๊ฒฐํด์ค", "conflict ๋ ๊ฑฐ ํ๋์ฉ ์ ๋ฆฌํ๊ณ ํ ์คํธ๊น์ง ํต๊ณผ์์ผ์ค", "๋ธ๋์น ์ต์ ํํ๊ณ ์ถฉ๋ ํ์ด์ค", "merge conflict resolver", "rebase on main and resolve conflicts", "resolve merge conflicts until tests pass"์ฒ๋ผ ์ถฉ๋์ด ๋ ๋ธ๋์น๋ฅผ ์ต์ ํํ๋ฉด์ conflict๋ฅผ ๋๊น์ง ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋จธ์ง/rebase ์งํ ์ค๋ชจํฌ ํ๊ท ๊ฐ์๋ looping:post-merge-regression-guard, ๋จ์ผ PR์ ๋ง๋ค์ด CI greenยท๋จธ์ง ๊ฐ๋ฅ๊น์ง ๋๊ณ ๊ฐ๋ ๊ฑด looping:ship-pr-until-green, rebase ์์ด ๊นจ์ง ํ ์คํธ๋ง ํต๊ณผ์ํค๋ ๊ฑด looping:test-until-green, ์ฌ๋ฌ PR์ ์ฃผ๊ธฐ์ ์ผ๋ก rebaseยท๊ด๋ฆฌํ๋ ๊ฑด looping:pr-babysitter)
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ฉํ๊ณ , ์คํจํ๋ฉด ์คํค๋ง๋ SQL์ ๊ณ ์ณ์, dev ํ๊ฒฝ์์ ๋ง์ด๊ทธ๋ ์ด์ ์ด ๊น๋ํ๊ฒ ์ ์ฉ๋ ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "๋ง์ด๊ทธ๋ ์ด์ ์ ์ฉ๋ ๋๊น์ง ๋๋ ค์ค", "DB ๋ง์ด๊ทธ๋ ์ด์ ํต๊ณผํ ๋๊น์ง ๊ณ ์ณ์ค", "prisma migrate ์๋ฌ ๊ณ ์ณ์ค", "์คํค๋ง ์๋ฌ ๊ณ ์น๊ณ ๋ง์ด๊ทธ๋ ์ด์ ๊น๋ํ๊ฒ ์ ์ฉํด์ค", "migrate dev ์คํจํ๋ ๊ฑฐ ๊ณ ์ณ์ค", "run database migrations until they apply cleanly", "migration until applied", "fix migration errors and retry"์ฒ๋ผ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋๊น์ง ์ ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: API ์๋ต์ด ์คํค๋ง ๊ณ์ฝ๊ณผ ๋ง๋์ง๋ looping:api-contract-until-match, openapi.yaml ๋๊ธฐํ๋ looping:openapi-sync-until-valid, ํจํค์ง ์ ๊ทธ๋ ์ด๋๋ looping:dependency-upgrade-one-by-one, ๋น๋ ์ปดํ์ผ ์๋ฌ๋ looping:build-until-green)
high/critical npm audit ์ทจ์ฝ์ ์ ํ ๋ฒ์ ํ๋์ฉ, ๋งค๋ฒ ํ ์คํธ๋ก ๊ฒ์ฆํ๋ฉฐ ๊ณ ์น๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ๋ฌด์ง์ฑ `npm audit fix --force`๋ก ํ๊บผ๋ฒ์ ๋ฐ์ด๋ถ์ด์ง ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ "npm audit ์ทจ์ฝ์ ๊ณ ์ณ์ค", "high/critical ์ทจ์ฝ์ ํ๋์ฉ ์์ ํ๊ฒ ํจ์น", "audit fix ํ ์คํธ ํ์ธํ๋ฉด์ ๋๋ ค์ค", "๋ณด์ ์ทจ์ฝ์ ๋ค ์ก์์ค", "npm audit fix loop", "fix npm audit high/critical with test verification"์ฒ๋ผ npm ์์กด์ฑ ์ทจ์ฝ์ ์ ์์ ํ๊ฒ 0๊ฑด์ผ๋ก ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ฃผ๊ฐ npm audit ์ค์บยท์ฌ๊ฐ๋๋ณ ํธ๋ฆฌ์์ง๋ looping:security-audit-weekly, ์ทจ์ฝ์ ์ด ์๋๋ผ outdated ํจํค์ง๋ฅผ ํ๋์ฉ ์ฌ๋ฆฌ๋ ๊ฑด looping:dependency-upgrade-one-by-one, ์ฃผ๊ฐ outdated ์์กด์ฑ ์ ๊ฒยท์์ฝ์ looping:dependency-audit-weekly)
openapi.yaml์ redoclyยทspectralยทswagger-cli๋ก lintํ๊ณ , ๋ฌธ์์ ์ ํ pathยทschemaยทstatus code๊ฐ ์ค์ ๋ผ์ฐํธ ํธ๋ค๋ฌ์ ์ด๊ธ๋ ๋ถ๋ถ(drift)์ ๋งค ํ์ฐจ๋ง๋ค ๊ณ ์ณ lint๊ฐ 0 ์๋ฌ๋ก ํต๊ณผํ ๋๊น์ง ์๋ ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "openapi.yaml lint ํต๊ณผํ ๋๊น์ง ๊ณ ์ณ์ค", "OpenAPI ์คํ ํธ๋ค๋ฌ๋ ๋๊ธฐํํด์ค", "์คํ์ด๋ ๋ผ์ฐํธ ์ ๋ง๋ ๊ฑฐ ๋ง์ถฐ์ค", "OpenAPI drift ๊ณ ์ณ์ค", "API ๋ช ์ธ ๊นจ๋ํด์ง ๋๊น์ง ๋๋ ค์ค", "keep openapi.yaml valid and in sync", "lint the spec and fix drift", "sync openapi until valid"์ฒ๋ผ OpenAPI ๋ช ์ธ๋ฅผ ๊ฒ์ฆํ๊ณ ๊ตฌํ๊ณผ ๋ง์ถ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋ฐํ์ API ์๋ต์ด ๊ณ์ฝ๊ณผ ์ผ์นํ๋์ง ํ ์คํธ๋ก ๊ฒ์ฆํ๋ ๊ฑด looping:api-contract-until-match, ์ฝ๋ ์์ฒด์ lintยทํ์ ์ฒดํฌ๋ looping:lint-typecheck-fix, ์ฝ๋ ๋ณ๊ฒฝ ํ READMEยท๋ฌธ์๋ฅผ ๋ง์ถ๋ ๊ฑด looping:docs-sync-after-edits)
ํ์ผ์ ํธ์งํ ๋๋ง๋ค ๊ทธ ํ์ผ๊ณผ ์ฐ๊ด๋ ํ ์คํธ๋ง ์๋์ผ๋ก ๋๋ ค์ ํ๊ท(regression)๋ฅผ ์ฆ์ ์ก์๋ด๋ ํ (hook) ๊ธฐ๋ฐ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "ํธ์งํ ๋๋ง๋ค ๊ด๋ จ ํ ์คํธ ์๋ ์คํ", "ํ์ผ ๊ณ ์น๋ฉด ๋ฐ๋ก ์ฐ๊ด ํ ์คํธ ๋๋ ค์ค", "ํ๊ท ์กฐ๊ธฐ ๊ฐ์ง ํ ", "post-edit test guard", "run related tests after every edit", "test guard on save"์ฒ๋ผ ํธ์ง-ํ ์คํธ ๊ฐ๋๋ฅผ ๊ฑธ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. ์ด๋ฒคํธ ๊ธฐ๋ฐ์ด๋ผ Claude Code์์๋ hooks ์ค์ ์ด ํ์ํฉ๋๋ค. (๊ตฌ๋ถ: ์ปค๋ฐ ์ง์ ์ฐจ๋จ์ looping:pre-commit-guard, ๋จธ์ง ์งํ ์ค๋ชจํฌ๋ looping:post-merge-regression-guard, ์ ์ฒด ์ค์ํธ๋ฅผ ์๋์ผ๋ก green๊น์ง ๋๋ฆฌ๋ ๊ฑด looping:test-until-green)
git merge๋ rebase๊ฐ ๋๋๋ ์๊ฐ ์ค๋ชจํฌ ํ ์คํธ๋ฅผ ์๋์ผ๋ก ๋๋ ค, ๋ธ๋์น๋ฅผ ํฉ์น๋ฉด์ ์๊ธด ํตํฉ ํ๊ท(integration regression)๋ฅผ ์ ์์ ์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ์ฆ์ ์ก์๋ด๋ ํ (hook) ๊ธฐ๋ฐ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "๋จธ์งํ๊ณ ๋๋ฉด ์ค๋ชจํฌ ํ ์คํธ ์๋์ผ๋ก ๋๋ ค์ค", "rebase ์งํ ํ๊ท ๊ฒ์ฌ", "๋ธ๋์น ํฉ์น ๋ค์ ๊นจ์ง ๋ฐ ์๋์ง ๋ฐ๋ก ํ์ธ", "๋จธ์ง ํ ํตํฉ ํ๊ท ๊ฐ๋", "post-merge regression guard", "run smoke tests after every merge", "catch integration regressions after rebase"์ฒ๋ผ ๋จธ์งยทrebase ์งํ ํ๊ท ๊ฐ๋๋ฅผ ๊ฑธ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. ์ด๋ฒคํธ ๊ธฐ๋ฐ์ด๋ผ Claude Code์์๋ hooks ์ค์ ์ด ํ์ํฉ๋๋ค. (๊ตฌ๋ถ: ํ์ผ ํธ์ง ์งํ ์ฐ๊ด ํ ์คํธ๋ looping:post-edit-test-guard, ์ปค๋ฐ ์ง์ ์ฐจ๋จ์ looping:pre-commit-guard, ๋จธ์ง ์ค ์ถฉ๋์ ํ์ผ๋ณ๋ก ํธ๋ ๊ฑด looping:merge-conflict-resolver, ๋ฐฐํฌ๋ ์คํ ์ด์ง์ ์ค๋ชจํฌ๋ฅผ ๋๋ฆฌ๋ ๊ฑด looping:staging-smoke-test)
์ผ์ ๊ฐ๊ฒฉ(์ 15๋ถ)๋ง๋ค watch ๋ผ๋ฒจ์ด ๋ถ์ ์ด๋ฆฐ PR๋ค์ ์ ๊ฒํด์ โ ๋ฆฌ๋ทฐ์ด๋ฅผ ๋์งํ๊ณ , CI๋ฅผ ๊ณ ์น๊ณ , main๋ณด๋ค ๋ค์ฒ์ก์ผ๋ฉด rebase ํ๋ ์ธํฐ๋ฒ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ด๋ฆฐ PR๋ค ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ด์ค", "PR babysitter", "PR ์ํ 15๋ถ๋ง๋ค ์ฒดํฌํด์ CI ๊ณ ์น๊ณ rebase ํด์ค", "watch ๋ผ๋ฒจ PR ๊ด๋ฆฌ", "babysit my PRs", "keep PRs green on a schedule"์ฒ๋ผ ์ฌ๋ฌ PR์ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฑด๊ฐํ๊ฒ ์ ์งํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋จ์ผ PR์ ๋จธ์ง ๊ฐ๋ฅ ์ํ๊น์ง ๋๊ณ ๊ฐ๋ ๊ฑด looping:ship-pr-until-green, ์๊ฒฉ CI ํ ๊ฑด๋ง ๊ฐ์ํ๋ ๊ฑด looping:ci-failure-watcher, ๋จธ์ง๋ PR ์๋ฆผ ๊ฐ์๋ looping:pr-watch-loop)
PR์ ์ด๊ธฐ ์ ์ ์์ ์ด ์์ฑํ diff๋ฅผ ์๋์ด ๋ฆฌ๋ทฐ์ด์ ๋์ผ๋ก ์ง์ ๋ฆฌ๋ทฐํ๊ณ โ ๋ฒ๊ทธยท์ฃ์ง์ผ์ด์คยท๋ค์ด๋ฐยท๋๋ฝ๋ ํ ์คํธ๋ฅผ ์ฐพ์ ๊ณ ์น๊ณ โ ๊ฐ์ ์์ ์ 3ํ ๋ฐ๋ณตํ๋ ์๋ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "PR ์ฌ๋ฆฌ๊ธฐ ์ ์ ๋ด diff ์ ํ ๋ฆฌ๋ทฐํด์ค", "PR ์ด๊ธฐ ์ ์์ฒด ๋ฆฌ๋ทฐ ์ธ ๋ฒ ๋๋ ค์ค", "๋ด๊ฐ ์ง ์ฝ๋ ์๋์ด์ฒ๋ผ ๋ฆฌ๋ทฐํ๊ณ ๊ณ ์ณ์ค", "diff ์ ํ ๋ฆฌ๋ทฐ", "self-review my diff before the PR", "PR self-review", "review my own diff like a senior"์ฒ๋ผ PR ์ ์ถ ์ง์ ์ ์ค์ค๋ก ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋๋ฆฌ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๊ตฌํ ํ ๋๋ฒ๊ทธ ์ฝ๋ยท๋ฐ๋์ฝ๋ยท๋ค์ด๋ฐ ์ ๋ฆฌ ํจ์ค๋ looping:de-sloppify-pass, ๋ณ๋ ๊ฒ์ฆ์๊ฐ buildยทlintยทtest๋ฅผ ๋ ๋ฆฝ ์คํํ๋ ๊ฑด looping:independent-verifier-pass, ์ค์ ๋ก PR์ ์ด๊ณ CI๋ฅผ green๊น์ง ๋๊ณ ๊ฐ๋ ๊ฑด looping:ship-pr-until-green, ์ด๋ฏธ ๋ ์๋ ์ฌ๋ฌ PR์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ณด๋ ๊ฑด looping:pr-babysitter)
codex-watch ๋ผ๋ฒจ์ด ๋ถ์ ์ด๋ฆฐ PR๋ค์ 15๋ถ๋ง๋ค ํด๋งํด์ โ CI ์ํยท๋ฆฌ๋ทฐ ์งํยท๋ง์ง๋ง ํ๋์ ์์ฝํ๊ณ , ํ๊ท(regression)๋ ๋ฉ์ถ ์ค๋ ๋(stale thread)๋ฅผ ํ์ํ๊ณ , watch ๋์ PR๋ง๋ค ํ ์ค ์ํ ๋ฆฌํฌํธ๋ฅผ ๋จ๊ธฐ๋ ์ธํฐ๋ฒ ๊ฐ์ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ด๋ฆฐ PR๋ค 15๋ถ๋ง๋ค ๊ฐ์ํด์ค", "PR ํ๋ ํด๋งํด์ ํ๊ท/๋ฉ์ถ ์ค๋ ๋ ํ์ํด์ค", "watch ๋ผ๋ฒจ PR ์ํ ๋ฆฌํฌํธ ๋๋ ค์ค", "PR ์์น ๋ฃจํ", "PR watch loop", "poll watched PRs", "flag stale PR threads", "watch open PRs for regressions"์ฒ๋ผ ์ฌ๋ฌ PR์ ์ํ ๋ณํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ง์ผ๋ณด๊ณ ๋ฆฌํฌํธํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋ฆฌ๋ทฐ์ด ๋์งยทCI ์์ ยทrebase๊น์ง ์ ๊ทน์ ์ผ๋ก ๋๋ณด๋ ๊ฑด looping:pr-babysitter, ์๊ฒฉ CI ํ ๊ฑด์ green๊น์ง ๊ฐ์ยท์์ ํ๋ ๊ฑด looping:ci-failure-watcher, ๋จ์ผ PR์ ๋จธ์ง ๊ฐ๋ฅ ์ํ๊น์ง ๋๊ณ ๊ฐ๋ ๊ฑด looping:ship-pr-until-green, ๋ด diff๋ฅผ ์๋์ด์ฒ๋ผ ์ ํ ๋ฆฌ๋ทฐํ๋ ๊ฑด looping:pr-self-review)
git commit ๋ช ๋ น์ด ์คํ๋๋ ค๋ ์๊ฐ์ ๊ฐ๋ก์ฑ, ์ปค๋ฐ ์ ์ ์ ์ฒด ํ ์คํธ ์ค์ํธ๋ฅผ ๋๋ฆฌ๊ณ ์คํจํ๋ฉด(์ค์ํธ๊ฐ ๋นจ๊ฐ๋ฉด) ์ปค๋ฐ์ ๋ง์ ๊นจ์ง ์ฝ๋๊ฐ ํ์คํ ๋ฆฌ์ ๋ค์ด๊ฐ์ง ๋ชปํ๊ฒ ํ๋ ํ (hook) ๊ธฐ๋ฐ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ปค๋ฐ ์ ์ ํ ์คํธ ๋๋ ค์ ์คํจํ๋ฉด ๋ง์์ค", "๊นจ์ง ์ฑ๋ก ์ปค๋ฐ ๋ชป ํ๊ฒ", "์ปค๋ฐ ์ ๊ฐ๋ ๊ฑธ์ด์ค", "pre-commit ํ ์ผ๋ก ํ ์คํธ ๊ฐ์ ", "pre-commit guard", "block commits when tests fail", "run tests before git commit"์ฒ๋ผ ์ปค๋ฐ ์ง์ ์ฐจ๋จ ๊ฐ๋๋ฅผ ๊ฑธ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. ์ด๋ฒคํธ ๊ธฐ๋ฐ์ด๋ผ Claude Code์์๋ hooks ์ค์ ์ด ํ์ํฉ๋๋ค. (๊ตฌ๋ถ: ํธ์งํ ๋๋ง๋ค ์ฐ๊ด ํ ์คํธ๋ looping:post-edit-test-guard, ๋จธ์งยท๋ฆฌ๋ฒ ์ด์ค ์งํ ์ค๋ชจํฌ๋ looping:post-merge-regression-guard, ์ ์ฒด ์ค์ํธ๋ฅผ ์๋์ผ๋ก green๊น์ง ๋๋ฆฌ๋ ๊ฑด looping:test-until-green)
prd.json์ ์ ํ ์ฌ์ฉ์ ์คํ ๋ฆฌ๋ฅผ ํ ๋ฒ์ ๋ฑ ํ๋์ฉ, "๋งค๋ฒ ์ ์ปจํ ์คํธ(fresh-context)"๋ก ๊ณจ๋ผ ๊ตฌํํ๊ณ โ testยทlintยทbuild ๋ฐฑํ๋ ์ (backpressure) ๊ฒ์ฌ๋ฅผ ๋๋ฆฌ๊ณ โ ์ปค๋ฐํ๊ณ โ progress.md์ ๋ฐฐ์ด ์ ์ ๊ธฐ๋กํ ๋ค ๋ค์ ์คํ ๋ฆฌ๋ก ๋์ด๊ฐ๋ ์๋ํ ๋ฃจํ์ ๋๋ค. ๋ชจ๋ ์คํ ๋ฆฌ๊ฐ passes: true๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค. ์ฌ์ฉ์๊ฐ "๋ ํ ๋ฃจํ ๋๋ ค์ค", "prd.json ์คํ ๋ฆฌ ํ๋์ฉ ๋ค ๊ตฌํํด์ค", "๋ฐฑ๋ก๊ทธ ์คํ ๋ฆฌ ์๋์ผ๋ก ๋๊น์ง ์ฒ๋ฆฌํด์ค", ".ralph ์คํ ๋ฆฌ ์คํ", "Ralph Story Executor", "run the ralph loop", "implement the prd stories one by one", "execute the backlog until every story passes"์ฒ๋ผ .ralph/ ์ค์บํด๋ฉ์ ์์ธ ์คํ ๋ฆฌ๋ฅผ ๋ฌด์ธ์ผ๋ก ํ๋์ฉ ์์ฃผ์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ฒดํฌ๋ฆฌ์คํธํ spec.md ์๊ตฌ์ฌํญ์ ํ๋์ฉ ๊ตฌํํ๋ ๊ฑด looping:spec-first-ship, ์คํจ๊ฐ ๊ฐ์ ์์ผ๋ก ๋ ๋ฒ ๋ฐ๋ณต๋๋ฉด .ralph/guardrails.md์ ์ฌ์ธ์ ๋จ๊ธฐ๋ ๊ฑด looping:guardrails-learning-loop, ํ ์คํธ๋ถํฐ ์ฐ๋ TDD ๋ฐ๋ณต์ looping:autoloop-tdd, ๋ธ๋์น์์ ๊ตฌํโํธ์โPR๊น์ง ๋๊ณ ๊ฐ๋ ๊ฑด looping:ship-pr-until-green)
๋๋ฒ๊น ์ด ๊ฐ์ ์๋ชป๋ ์์ ์ ๋น๋น ๋๋ ๊ฑธ ๋ง์์ฃผ๋ ๋๋ฒ๊น ๋ฃจํ์ ๋๋ค. ์ฌํ(repro)์ ์คํจํ ๋๋ง๋ค ๋ฌด์์ ์๋ํ๊ณ ์ ์คํจํ๋์ง, ๋ค์์ ๋ญ ํผํ ์ง ํ ์ค ํ๊ณ ๋ฅผ `.loops/reflexion.md`์ ์ ์ด ๋๊ณ , ๊ทธ ๊ธฐ์ต์ ์ฝ์ ๋ค ์ด์ ๊ณผ ๋ค๋ฅธ ํ์ ์์ ์ ์๋ํด ์ด์ ์ ์คํจํ๋ ํ ์คํธ๊ฐ ํต๊ณผ(์ข ๋ฃ ์ฝ๋ 0)ํ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค. ์ฌ์ฉ์๊ฐ "์ด ๋ฒ๊ทธ ๊ณ์ ๋ชป ๊ณ ์น๊ฒ ์ด ํ๊ณ ๋จ๊ธฐ๋ฉด์ ๋๋ฒ๊ทธํด์ค", "๊ฐ์ ์์ ๋ฐ๋ณตํ์ง ๋ง๊ณ ๊ธฐ๋กํ๋ฉด์ ๊ณ ์ณ์ค", "๋ฆฌํ๋ ์ ๋๋ฒ๊ทธ", "ํ๊ณ ๊ธฐ๋ฐ ๋๋ฒ๊น ๋ฃจํ", "reflexion debug loop", "debug with reflection memory", "stop repeating the same failed fix"์ฒ๋ผ ์์ฒญํ๊ฑฐ๋, ๋๋ฒ๊น ์ด ์ ์๋ฆฌ๊ฑธ์์ผ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋ฒ๋ ค๋ ๋๋ ์ฌํ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ๊ทผ๋ณธ ์์ธ์ ์ฆ๋ช ํ๋ ๊ฑด looping:investigation-script-loop, ๊ฐ์ ์คํจ๊ฐ ๋ ๋ฒ ๋๋ฉด ๊ฐ๋๋ ์ผ์ .ralph/guardrails.md์ ์ ๋ ๊ฑด looping:guardrails-learning-loop, ์ ์ฒด ํ ์คํธ ์ค์ํธ๋ฅผ ๊ทธ๋ฅ green๊น์ง ๋๋ฆฌ๋ ๊ฑด looping:test-until-green, ๋ถ์์ ยท๊ฐํ ์คํจ๋ฅผ ๋ถ๋ฅํ๋ ๊ฑด looping:flaky-test-triage)
๋งค์ฃผ npm audit๋ก ์์กด์ฑ ์ทจ์ฝ์ ์ ์ค์บํ๊ณ , ์ฌ๊ฐ๋(critical/high/moderate)๋ณ๋ก ํธ๋ฆฌ์์งํ ๋ค, ์์ ํ ํจ์น๋ฅผ ์ ์ํ๊ฑฐ๋ ์ ์ฉํ๊ณ , ์ฐ์ ์์๊ฐ ๋งค๊ฒจ์ง ์์ ์์ด ๋ด๊ธด ์ฃผ๊ฐ ์์ฝ ๋ฆฌํฌํธ๋ฅผ ๋ด๋๋ ์ธํฐ๋ฒ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์ฃผ๊ฐ ๋ณด์ ๊ฐ์ฌ ๋๋ ค์ค", "๋งค์ฃผ npm audit ์๋์ผ๋ก ๋๋ ค์ค", "์ทจ์ฝ์ ์ ๊ธฐ ์ ๊ฒ", "๋ณด์ ์ทจ์ฝ์ ์ฃผ๊ฐ ๋ฆฌํฌํธ ๋ง๋ค์ด์ค", "7์ผ๋ง๋ค ๋ณด์ ์ค์บ", "Security Audit Weekly", "run npm audit weekly", "weekly security scan", "triage vulnerabilities by severity"์ฒ๋ผ ๋ณด์ ์ทจ์ฝ์ ์ ์ ๊ธฐ์ ์ผ๋ก ์ ๊ฒยท์ ๋ฆฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ค๋๋(outdated) ์์กด์ฑ์ ์ฃผ๊ฐ์ผ๋ก ์ ๊ฒยท์ ๊ทธ๋ ์ด๋ ์ ์ํ๋ ๊ฑด looping:dependency-audit-weekly, high/critical ์ทจ์ฝ์ ์ ํ ์คํธ ๊ฒ์ฆํ๋ฉฐ ํ๋์ฉ ์ค์ ๋ก ๊ณ ์น๋ ๊ฑด looping:npm-audit-fix-loop, ํจํค์ง๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ์ฌ๋ฆฌ๋ฉฐ ๊นจ์ง์ ๊ณ ์น๋ ๊ฑด looping:dependency-upgrade-one-by-one)
๋ธ๋์น์์ ๋ณ๊ฒฝ์ ๊ตฌํํ๊ณ โ ๋ก์ปฌ ํ ์คํธ โ ์ปค๋ฐยทpush โ PR ์ด๊ธฐ โ CI ๋๊ธฐ ์์ผ๋ก, ๋ชจ๋ ์ฒดํฌ๊ฐ ํต๊ณผํด PR์ด ๋จธ์ง ๊ฐ๋ฅํด์ง ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "PR ์ด๋ก๋ถ ๋ ๋๊น์ง ๋ฐ์ด์ค", "๊ตฌํํ๊ณ PR๊น์ง ์ฌ๋ ค์ CI green ๋ง๋ค์ด์ค", "์ด ๋ณ๊ฒฝ PR ๋จธ์ง ๊ฐ๋ฅํ๊ฒ ๋๊น์ง ๊ฐ์ค", "PR ์ด๊ณ CI ํต๊ณผ์ํฌ ๋๊น์ง ๋ฐ๋ณต", "ship this PR until green", "open a PR and fix CI until it passes", "implement, push, and get the PR merge-ready"์ฒ๋ผ ํ๋์ ๋ณ๊ฒฝ์ PR ๋จธ์ง ์ง์ ๊น์ง ์์ฃผ์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ด๋ฏธ ์คํจํ CI ํ ๊ฑด๋ง ๊ณ ์น๋ ๊ฑด looping:fix-ci-until-green, ์๊ฒฉ CI๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํด๋งยท๊ฐ์ํ๋ ๊ฑด looping:ci-failure-watcher, ์ฌ๋ฌ PR์ ์ ํด์ง ๊ฐ๊ฒฉ๋ง๋ค ๋๋ณด๋ ๊ฑด looping:pr-babysitter, PR ์ด๊ธฐ ์ ์์ฒด ๋ฆฌ๋ทฐ๋ง ๋๋ ๊ฑด looping:pr-self-review)
spec.md์ ์ ์ด ๋ ์๊ตฌ์ฌํญ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ผ, ๋งค ๋ฐ๋ณต๋ง๋ค ๋ฏธ์ฒดํฌ ํญ๋ชฉ ํ๋๋ฅผ ๊ฒ์ฆ๊น์ง ๋๋ด๊ณ [x]๋ก ๋งํนํ๋ ๊ธฐํ(Planning) ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "spec.md ์ฒดํฌ๋ฆฌ์คํธ๋๋ก ํ๋์ฉ ๊ตฌํํด์ค", "๋ช ์ธ ๋ฐ๋ผ ์๊ตฌ์ฌํญ ํ๋์ฉ ๊ฒ์ฆํ๋ฉด์ ship", "์คํ ๋จผ์ ์ ๊ณ ๊ทธ ์์๋๋ก ๋ง๋ค์ด์ค", "์ฒดํฌ๋ฆฌ์คํธ ๋ค ์ฒดํฌ๋ ๋๊น์ง ๊ตฌํ", "spec-first ship", "implement from spec.md one requirement at a time", "spec-driven implementation loop"์ฒ๋ผ ๋ฏธ๋ฆฌ ์ ์ด ๋ ๋ช ์ธ/์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ํญ๋ชฉ์ฉ ์์ฑํด ๋๊ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: prd.json ์คํ ๋ฆฌ๋ฅผ fresh-context๋ก ํ๋์ฉ ๊ตฌํยท์ปค๋ฐํ๋ ๊ฑด looping:ralph-story-executor, ์คํจ ํ ์คํธ ๋จผ์ ์ฐ๊ณ ์ต์ ๊ตฌํํ๋ TDD ๋ฃจํ๋ looping:autoloop-tdd, ๋ธ๋์น์์ ๊ตฌํํด PR ์ฌ๋ฆฌ๊ณ CI green๊น์ง ๊ฐ๋ ๊ฑด looping:ship-pr-until-green, ๋ช ์ธ ์์ด ๊นจ์ง ํ ์คํธ๋ง ์ ๋ถ ํต๊ณผ์ํค๋ ๊ฑด looping:test-until-green)
๋ฐฐํฌ ์งํ ์คํ ์ด์ง ํ๊ฒฝ์ ๊ณ ์ ๋ ์ค๋ชจํฌ ์ฒดํฌ๋ฆฌ์คํธ(๋ก๊ทธ์ธ/์ธ์ฆ, ํต์ฌ ํ๋ก์ฐ, ์นํ , ์๋ฌ ๋ฒ์ง)๋ฅผ ๋๋ ค์, ์คํจํ๋ฉด ๊ฐ์ฅ ์์ ๋ฌธ์ ๋ถํฐ ๊ณ ์น๊ณ ์ ๋ถ ํต๊ณผ(์ข ๋ฃ ์ฝ๋ 0)ํ ๋๊น์ง ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "์คํ ์ด์ง ์ค๋ชจํฌ ํ ์คํธ ๋๋ ค์ค", "๋ฐฐํฌ ํ ์ค๋ชจํฌ ์ฒดํฌ๋ฆฌ์คํธ ํ์ธํด์ค", "staging์์ ๋ก๊ทธ์ธ/ํต์ฌ ํ๋ก์ฐ/์นํ ์ ๊ฒํด์ค", "์ค๋ชจํฌ ํต๊ณผํ ๋๊น์ง ๊ณ ์ณ์ค", "run staging smoke checklist", "post-deploy smoke check", "Staging Smoke Test"์ฒ๋ผ ์คํ ์ด์ง ๋ฐฐํฌ ๊ฒ์ฆ์ ์์ฒญํ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ๋ฐฐํฌ ํ healthยทsmoke ์๋ํฌ์ธํธ๋ฅผ ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ํํ๋ ๊ฑด looping:deploy-verification-loop, ๋จธ์งยท๋ฆฌ๋ฒ ์ด์ค ์งํ ์๋ ์ค๋ชจํฌ๋ looping:post-merge-regression-guard, E2E ์ค์ํธ ์ ์ฒด๋ฅผ green๊น์ง ๋๋ฆฌ๋ ๊ฑด looping:e2e-until-green, ๋ก์ปฌ ์ ๋ ํ ์คํธ ํต๊ณผ๋ looping:test-until-green)
ํ ์คํธ ์ค์ํธ๋ฅผ ์คํํด ์คํจ๊ฐ ๋์ค๋ฉด ๊ฐ์ฅ ์์ ๊ทผ๋ณธ ์์ธ์ ๊ณ ์น๊ณ , ๋ชจ๋ ํ ์คํธ๊ฐ ํต๊ณผ(์ข ๋ฃ ์ฝ๋ 0)ํ ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "ํ ์คํธ ํต๊ณผํ ๋๊น์ง ๋๋ ค์ค", "๊นจ์ง ํ ์คํธ ๋ค ๊ณ ์ณ์ค", "ํ ์คํธ ์ด๋ก๋ถ ๋ง๋ค์ด์ค", "ํ ์คํธ ๋ค green ๋๊ฒ", "make all tests pass", "test until green", "fix failing tests until they pass"์ฒ๋ผ ์์ฒญํ๊ฑฐ๋, ์คํจํ๋ ํ ์คํธ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ ์ณ ์ ๋ถ ํต๊ณผ์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ํ๋ก๋์ ๋น๋ ์๋ฌ๋ looping:build-until-green, ์๊ฒฉ CI ์คํจ ๊ฐ์๋ looping:ci-failure-watcher, ๋ถ์์ ยท๊ฐํ ์คํจ ๋ถ๋ฅ๋ looping:flaky-test-triage, ์ปค๋ฒ๋ฆฌ์ง ๋์ด์ฌ๋ฆฌ๊ธฐ๋ looping:coverage-until-threshold)
UI ๋ณ๊ฒฝ์ Playwright๋ Percy ๋น์ฃผ์ผ ์ค๋ ์ท์ ๋๋ ค์, ์๋์น ์์ ์๊ฐ์ diff๋ ๊ณ ์น๊ณ ์๋๋ ๋ณ๊ฒฝ๋ง ๋ฒ ์ด์ค๋ผ์ธ์ ๋ฐ์ํด ์ค๋ ์ท์ด ๊น๋ํ ์ผ์น(์ข ๋ฃ ์ฝ๋ 0)ํ ๋๊น์ง ์๋์ผ๋ก ๋ฐ๋ณตํ๋ ๋ซํ ๋ฃจํ์ ๋๋ค. ์ฌ์ฉ์๊ฐ "๋น์ฃผ์ผ ํ๊ท ํ ์คํธ ๋๋ ค์ค", "UI ๋ฐ๋ ๊ฑฐ ์คํฌ๋ฆฐ์ท diff ์ก์์ค", "Playwright ๋น์ฃผ์ผ ์ค๋ ์ท ๋ง์ ๋๊น์ง", "์๋ ์ ํ ์๊ฐ ๋ณํ ๊ณ ์ณ์ค", "Percy/Chromatic ๋ฒ ์ด์ค๋ผ์ธ ์ผ์น์์ผ์ค", "visual regression until match", "run visual snapshot tests", "fix unintended visual diffs until baselines match"์ฒ๋ผ ์์ฒญํ๊ฑฐ๋, ๋์์ธ ๋ณ๊ฒฝ ํ ํฝ์ ๋จ์ ํ๊ท๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ ์ณ ๋ฒ ์ด์ค๋ผ์ธ์ ์๋ ด์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ์ธ์. (๊ตฌ๋ถ: ์ ์ฒด E2E ์ฌ์ฉ์ ํ๋ฆ ๊ฒ์ฆ์ looping:e2e-until-green, ์ ๊ทผ์ฑ ์๋ฐ ์ ๊ฒ์ looping:a11y-audit-until-clean, ์ผ๋ฐ ๋จ์ยทํตํฉ ํ ์คํธ ์ค์ํธ๋ฅผ green๊น์ง๋ looping:test-until-green)