Destination
TryOn(VTON) + StyleDNA ์ฅ๊ธฐ ์คํ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋๋ฆด ์ ์๋ ํตํฉ ์ก UX ์ spec-ready ๊ฒฐ์ ์ธํธ โ ์ํคํ
์ฒ ๊ฒฐ์ (๊ณต์ vs per-feature ยท ์ก ์์ ยท transport ยท ์์์ฑ ยท ๋์์ฑ/๊ฐ์ญ ์ ์ฑ
) + prototype์ผ๋ก ์ ๊ทผ progressยท์๋ฃยท๋ณต๊ท UX . ๊ฒฐ์ +ํ๋กํ ํ์
์ด ์๋ฉด /to-spec์ผ๋ก ๋๊ธธ ์ ์๋ ์ํ๊ฐ destination. (planning โ ํฐ์ผ์ ๊ฒฐ์ /ํ๋กํ ํ์
, ์ค์ ๊ตฌํ ์๋.)
Notes
Decisions so far
[research] ARQ ํ ์ฌ์ฌ์ฉ ํ๋น์ฑ โ tryon/styleDNA ์ก ๋ฐฑ์๋ย #928 (research, CLOSED 07-11) โ ARQ ์ฌ์ฌ์ฉ ํ๋น์ฑ = hybrid-recommended. ์์ ๊ถ ๋น๋์นญ์ด ๊ฒฐ์ : VTON=์๋ฒ owner ์์(NextโVertex ์ง์ ) / StyleDNA=api-serverโai-server gRPC seam ์กด์ฌ. ARQ ์ฌ์ฌ์ฉโ ์ ๋ ด(RustโPython enqueue ๋นํ์ค์ , native Postgres ์ก+tokio::spawn์ด ์ ๋ต). ํ๋๊ฒ์ดํธ=max_jobs=1ยทprogress terminal-only(๋ณ๋ DB ์ก๋ ์ฝ๋ ํ์). ๋ธ๋ฆฌํ=PR docs(briefs): #928 ARQ ํ ์ฌ์ฌ์ฉ ํ๋น์ฑ ๋ฆฌ์์น ๋ธ๋ฆฌํย #932 (docs/superpowers/briefs/928-arq-reuse.md).
[grilling] ์ก ์์ ยทtransportยท์์์ฑ ์ํคํ
์ฒ ๊ฒฐ์ (๊ณต์ vs per-feature)ย #929 (grilling, 07-13) โ ์ก ์ํคํ
์ฒ 4๊ฒฐ์ ํ์ :
์์์ฑ : ์๋ฒ durable ์ก ๋ ์ฝ๋ + detached ์คํ. ๊ฒฌ๋ค ๋ฒ์=๊ฐ์ ๋ธ๋ผ์ฐ์ ํ ์๋ก๊ณ ์นจ (ํฌ๋ก์ค๋๋ฐ์ด์คยทํธ์๋ ๋ฒ์ ๋ฐยท๋์ค). zustand-persist ๋จ๋
๋ถ๊ฐ(์ก=request-scoped๋ผ ์ฃฝ์).
์์ : api-server๊ฐ ์ก ๋ ์ฝ๋ ํตํฉ ์์ (generic jobs ํ
์ด๋ธ, type discriminator), ์คํ์ ๋ค์ดํฐ๋ธ โ StyleDNA=api-serverโai-server gRPC+tokio::spawn, VTON=Next๊ฐ Vertex ๊ณ์(prod GCP auth ๋ณด์กด)+waitUntil detachedโapi-server ๋ ์ฝ๋ ๊ธฐ๋ก.
transport : ํด๋ง (๋ง์ดํธ GET /jobs?active ์ฌ-attach + ๊ฐ ์ก 2โ3s ํด). progress=coarse ์ํ์ ์ด/named-stage(๋งค๋ํ % ์๋).
ํ๋ก ํธ : ํตํฉ shared shell + per-feature ์ด๋ํฐ (1 jobStore registry + 1 floating dock + 1 notifier + 1 poll loop). vtonStore/VtonBackgroundNotifier ์ผ๋ฐํ(์ฒซ type=vton)ยทStyleDNA ์๋ ด. result ๋ ๋ยทre-open๋ง type ๋์คํจ์น.
ํ์(๊ตฌํ/๋ค์ด์คํธ๋ฆผ): orphan/timeout reconcile ํ์(์คํ์ ์ฌ๋ง ์ "running" ๊ณ ์ฐฉ, ai-server orphan_recovery ์ ๋ก) ยท VTON detached=waitUntil(MVP, 60s<300s) vs Vercel Queue(durable, ๋์ค).
Not yet specified
Out of scope
Destination
TryOn(VTON) + StyleDNA ์ฅ๊ธฐ ์คํ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋๋ฆด ์ ์๋ ํตํฉ ์ก UX์ spec-ready ๊ฒฐ์ ์ธํธ โ ์ํคํ ์ฒ ๊ฒฐ์ (๊ณต์ vs per-feature ยท ์ก ์์ ยท transport ยท ์์์ฑ ยท ๋์์ฑ/๊ฐ์ญ ์ ์ฑ ) + prototype์ผ๋ก ์ ๊ทผ progressยท์๋ฃยท๋ณต๊ท UX. ๊ฒฐ์ +ํ๋กํ ํ์ ์ด ์๋ฉด
/to-spec์ผ๋ก ๋๊ธธ ์ ์๋ ์ํ๊ฐ destination. (planning โ ํฐ์ผ์ ๊ฒฐ์ /ํ๋กํ ํ์ , ์ค์ ๊ตฌํ ์๋.)Notes
vtonStore.backgroundJob+ ์ ์ญ ๋ง์ดํธVtonBackgroundNotifier(์๋ฃ sonner ํ ์คํธ+์ฌ์คํ ๋ณต์). ๋จ (1)์๋ก๊ณ ์นจ ์ ์๋ฉธ(persist ์์ยท๋ฐฑ์๋ ๊ธฐ๋ก ์์), (2)๋จ์ผ ์ฌ๋กฏ์ด๋ผ 2๋ฒ์งธ ์ก์ด ์กฐ์ฉํ ๋ฎ์ด์. StyleDNA๋ ์ ๋ฌด(๋ผ์ฐํธ ์ดํ ์ reset()๋ก ํ๊ธฐ, ์งํ๋ฐ๋ setInterval ๊ฐ์ง). ai-server ARQ ํ(editorial-publish PR feat(editorial): IG ์บ๋ฌ์ ์๋ ๋ฐํ (ai-server ARQ + Meta ์บ๋ฌ์ )ย #681ยทraw_posts)๋ ์กด์ฌํ๋ ๋ ๊ธฐ๋ฅ ๋ชจ๋ ์ฐํ.build_my_style_dnaโai-server gRPC Gemini) ๊ฒฝ์ ๋ผ ์ก ๋ ์ฝ๋๋ฅผ owner๋ก ์ผ์ ์ ์์./grillingยท/domain-modeling; UX=/prototype; ์ธํ๋ผ ์กฐ์ฌ=/research.Decisions so far
hybrid-recommended. ์์ ๊ถ ๋น๋์นญ์ด ๊ฒฐ์ : VTON=์๋ฒ owner ์์(NextโVertex ์ง์ ) / StyleDNA=api-serverโai-server gRPC seam ์กด์ฌ. ARQ ์ฌ์ฌ์ฉโ ์ ๋ ด(RustโPython enqueue ๋นํ์ค์ , native Postgres ์ก+tokio::spawn์ด ์ ๋ต). ํ๋๊ฒ์ดํธ=max_jobs=1ยทprogress terminal-only(๋ณ๋ DB ์ก๋ ์ฝ๋ ํ์). ๋ธ๋ฆฌํ=PR docs(briefs): #928 ARQ ํ ์ฌ์ฌ์ฉ ํ๋น์ฑ ๋ฆฌ์์น ๋ธ๋ฆฌํย #932(docs/superpowers/briefs/928-arq-reuse.md).jobsํ ์ด๋ธ,typediscriminator), ์คํ์ ๋ค์ดํฐ๋ธ โ StyleDNA=api-serverโai-server gRPC+tokio::spawn, VTON=Next๊ฐ Vertex ๊ณ์(prod GCP auth ๋ณด์กด)+waitUntildetachedโapi-server ๋ ์ฝ๋ ๊ธฐ๋ก.GET /jobs?active์ฌ-attach + ๊ฐ ์ก 2โ3s ํด). progress=coarse ์ํ์ ์ด/named-stage(๋งค๋ํ % ์๋).vtonStore/VtonBackgroundNotifier์ผ๋ฐํ(์ฒซ type=vton)ยทStyleDNA ์๋ ด. result ๋ ๋ยทre-open๋งtype๋์คํจ์น.orphan_recovery์ ๋ก) ยท VTON detached=waitUntil(MVP, 60s<300s) vs Vercel Queue(durable, ๋์ค).Not yet specified
Out of scope
style_dna_recompute_queue+recompute_user_dna, LLM ์๋ ๋ก์ปฌ ๋ฌด๋ ์ค์ฝ์ด๋ง). ์ด๋ฏธ async-by-batch โ ๋ฐฑ๊ทธ๋ผ์ด๋ UX ๋ถ์. (์ด ๋งต์ ๊ธด Gemini ํฉ์ฑbuild_my_style_dna๋ง.)