chore: back-merge main → dev (#601 generating fix + ai/api version bumps)#603
Conversation
) * feat(data-pipeline): Instagram 엔티티 enrichment 파이프라인 추가 (#544) * feat(data-pipeline): add Instagram entity enrichment Adds a quota-aware Instagram account enrichment pipeline that keeps runtime state in assets while writing reviewed entity catalog data to operation. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(data-pipeline): retry stale entity enrichment steps Co-authored-by: Cursor <cursoragent@cursor.com> * style(data-pipeline): format enrichment admin routes Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> * feat(admin): improve group member management UI (#546) Co-authored-by: Cursor <cursoragent@cursor.com> * feat(web): add legal pages and minimal footer for Rakuten affiliate (#553) Add About, Privacy Policy, Terms of Service, and Affiliate Disclosure pages with a streamlined footer so affiliate reviewers can reach policy content and contact email without dedicated contact routes. Closes #552 Co-authored-by: Cursor <cursoragent@cursor.com> * docs: Step 1 (ADR+architecture stub) + Step 2 (미분류 문서 매핑) — refs #518 (#542) * docs: ADR + architecture → vault stub 전환 (refs #518) 본문이 decoded-docs vault Architecture/ 로 이미 마이그레이션(M2) 완료된 상태. monorepo 원본은 vault redirect stub만 남김 — sync-policy.md 의 "MOVED" 룰 대로 vault 가 SoT, monorepo 원본은 stub. 변경 파일 (6): - docs/adr/ADR-0001-ai-dev-boilerplate.md - docs/adr/ADR-0002-llm-wiki-foundation.md - docs/architecture/README.md - docs/architecture/assets-project.md - docs/architecture/data-pipeline.md - docs/architecture/state-management.md 각 파일은 vault GitHub 링크 + Obsidian path + sync-policy 참조만 보유. 검증: vault 본문은 monorepo 본문에 frontmatter(date/tags/source/migrated_on) 만 추가된 형태로 정보 손실 없음. CLAUDE.md / docs/agent/ 의 architecture·adr 링크는 stub 을 거쳐 vault 로 redirect 되는 구조이므로 깨지지 않음. CLAUDE.md 직링크 교체는 Step 5(라우팅 업데이트)에서 처리. * docs: Step 2 — 미분류 문서 매핑 (refs #518) decoded-docs vault 마이그레이션 Step 2 산출물. docs/ + .planning/codebase/ 전체 파일을 transition-design.md §분류 원칙(5가지 판단 기준)에 따라 🟢 MONOREPO / 🔵 VAULT / ⚪ STUB / 🟡 ARCHIVE 로 분류. 핵심 결정: - wiki/ 전체 MONOREPO 유지 — tools/wiki/lib/config.ts 의 INDEX_PATH + INGEST_TOPICS 하드코딩, CLAUDE.md SSOT import 의존성 (spec과 충돌, Step 5 PR에서 spec 정정 예정) - .planning/codebase/ STUB 패턴 — CLAUDE.md L19/L25/L87-93 8건 직접 링크. Step 1 (ADR/architecture) 와 동일 패턴 적용 - qa-screenshots/ MONOREPO — visual-qa.spec.ts:41 테스트 출력 경로 집계: 🟢 65% / 🔵 28% / ⚪ 11% / 🟡 2%, 🔴 REVIEW 0건 (전부 확정). 다음: 팀 리뷰 → Step 3 (vault 복사 + stub 생성) * docs: Step 2 매핑 재점검 — Q3 B + Q4 E 반영 (refs #518) grill-docs 재점검 (2026-05-21, Q1~Q5) 결과 Step 2 매핑 정정: - Section A: post-centric, home-sections-feasibility → 🟢 MONOREPO 정정 - Section I: plans/specs/briefs 전체 🟢 MONOREPO 잔류 (Q4 E, 5-criteria 4/5 monorepo) - Section K: research/incidents/handoffs 전체 🟢 MONOREPO 잔류 - Section N: `.planning/codebase/*` STUB 패턴 폐기 → 🟢 MONOREPO 잔류 (Q3 B) · 갱신 책임 모호 + outdated 스냅샷이 vault "팀 지식"으로 위장하는 비용 회피 · CLAUDE.md L19/L25/L87-L93 직접 링크 변경 없음 집계 재계산: - 🟢 MONOREPO ~145 / ⚪ STUB 6 (Step 1) / 🔵 VAULT 9 / 🟡 ARCHIVE 2 - vault 이동 대상이 종전 ~35건 → 9건으로 축소 Step 3 scope: - A (이 commit): Step 2 매핑 정정. monorepo 변경 0건. - B (다음): vault `decoded-docs`에 9개 파일 복사 + frontmatter, 별도 PR. `Archive/` 신설안(Q2 C)은 Q4 E 채택으로 자연 폐기. * fix(docs): vault stub frontmatter 추가 — wiki-lint 통과 (refs #518) Step 1 (PR #542 first commit `64a5a76`) 에서 ADR + architecture 본문을 vault redirect stub으로 전환할 때 frontmatter도 함께 제거되어 wiki-lint MISSING_FRONTMATTER 실패. 6개 stub에 minimal frontmatter 추가: - docs/adr/ADR-0001-ai-dev-boilerplate.md - docs/adr/ADR-0002-llm-wiki-foundation.md - docs/architecture/README.md - docs/architecture/assets-project.md - docs/architecture/data-pipeline.md - docs/architecture/state-management.md 각 stub: owner=llm, status=deprecated (Step 5에서 삭제 예정), tags 에 [obsidian, deprecated] 포함하여 wiki-lint 허용 어휘 준수. ADR 의 title 콜론은 YAML parse 위해 큰따옴표 인용. * fix(vton): handle Vertex AI RAI filter error (#535) * docs: add content-studio pipeline v2 design spec (#530) Post picker modal, UUID packet ID fix, unified LLM call, channel thumbnails, and Research/Firecrawl removal. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(vton): handle Vertex AI RAI filter with user-friendly error Vertex AI returns raiFilteredReason instead of image data when safety filter triggers. Log full response in dev and surface actionable message. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * docs: add content studio spec frontmatter --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * ci(github): dispatch git events to decoded-docs vault (#556) Trigger decoded-docs repository_dispatch (git-event) when a PR is merged into main/dev, a release is published, or via manual workflow_dispatch. Pairs with the vault-sync workflow in decoded-docs to record changelog entries automatically. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ci(github): sync issue and project status automation (#555) * docs: add content-studio pipeline v2 design spec (#530) Post picker modal, UUID packet ID fix, unified LLM call, channel thumbnails, and Research/Firecrawl removal. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci(github): close linked issues on dev merge * ci(github): sync issue and project status automation --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * revert: ci: dispatch git events to decoded-docs vault (#557) Reverts PR #556. An external dispatch source (likely decoded-app or a GitHub App) is already populating decoded-docs vault Changelog with a richer set of events (pr-opened, pr-merged, push, deploy-success). The new workflow added in PR #556 was duplicating dispatches and causing vault-sync concurrency cancellations. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(spec): mark telegram-bot-vault-integration as deprecated/superseded (#554) 원안(5/14) Phase 1+2가 decoded-agent의 manager agent + conversation digest agent로 흡수·발전되어 본 spec은 역사적 참조용으로 전환. - frontmatter status: draft → deprecated - superseded_by, superseded_date 필드 추가 - 본문 최상단에 redirect 안내 + 신규 위치(decoded-agent#61, vault history note) 링크 - H1 title (SUPERSEDED) 마커 - tags: superseded → deprecated (wiki-lint 허용 어휘) Refs: - closes/supersedes monorepo #516, #517 (both closed as not-planned/superseded) - decoded-agent epic: #61 (conversation digest) - vault history: decoded-docs Project/integrations/telegram-vault-bot.md * docs(harness): docs/agent + skills/commands 정합성 점검 (audit #558) (#559) * docs(harness): add 2026-05-21 docs/agent + skills/commands audit report HIGH/MEDIUM/LOW findings for .agents/skills/* (9 new), .claude/commands/* (6 new), and docs/agent ↔ decoded-docs vault routing. Confirms vault-dispatch.yml is intended state (#557 reverted a separate duplicate workflow). Companion master issue will track follow-up actions. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(skills): add excalidraw-generator and meeting-prep skills audit (2026-05-21)에서 즉시 커밋 가능 판정된 2개 스킬. - excalidraw-generator: 다이어그램 JSON 생성 - meeting-prep: 주간 업데이트 요약, 실 사용 검증된 동적 조회 사용 Refs #558 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(skills): add 7 generator skills with F1/F2/F3 fixes applied audit #558 즉시 체크리스트 적용: - F1: model: Codex-sonnet-4-20250514 비표준 ID 줄 제거 - F2: specs/shared/ → specs/_shared/ (실제 경로 정정) - F2: git-workflow .Codex/agents/ → ~/.claude/agents/ 정정 - F3: data-model-generator lib/types/ → packages/shared/types/ prefix 추가 - F3: component-template-generator @/lib/types → @decoded/shared/types 정정 신규 스킬: - api-contract-generator, component-template-generator - data-model-generator, git-workflow - pencil-screen-ui, screen-spec-generator - supabase-migration-generator Refs #558 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(commands): add Matt Pocock slash commands with F4 path fix audit #558 F4 적용: - /Users/kiyeol/.agents/ → ~/.agents/ (타 머신 호환) - gstack.md 컨벤션과 일치 신규 commands: - /grill, /grill-docs (plan/design 인터뷰) - /to-prd, /to-issues (PRD/이슈 분해) - /zoom-out (맥락 확장) - /setup-matt-skills (1회성 setup) Refs #558 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(agent): add decoded-docs vault routing note to README audit #558 F6 적용. docs/agent/README.md가 CLAUDE.md의 vault 라우팅 컨벤션과 drift 상태였음 — vault 위치와 sync-policy 링크를 intro 직후에 추가하여 에이전트가 회의/결정/기획 질의를 vault로 라우팅하도록 명시. Refs #558 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(claude): register 9 new skills + 6 Matt Pocock commands in skill routing audit #558 routing 표 등록. 신규 9개 spec/generator 스킬과 6개 Matt Pocock slash command를 CLAUDE.md Skill routing 섹션에 트리거 키워드와 함께 등록하여 에이전트가 자동으로 라우팅하도록 함. Refs #558 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(agents): add Matt Pocock skills setup (F5) audit #558 F5 적용. /to-prd, /to-issues, /grill 등 Matt Pocock skills가 요구하는 1회성 setup 완료: - docs/agents/issue-tracker.md: GitHub Issues + gh CLI 컨벤션 - docs/agents/triage-labels.md: canonical 5-role mapping - docs/agents/domain.md: multi-context (monorepo) layout - CLAUDE.md: ## Agent skills 블록 추가 (3개 docs로 라우팅) decisions: - Issue tracker: GitHub (decodedcorp/decoded) - Triage labels: canonical defaults (기존 triage 라벨 없음) - Domain docs: multi-context, .planning/codebase/* + docs/adr/ 기반 Refs #558 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(wiki): replace UNKNOWN_TAG values in harness-audit frontmatter wiki-lint CI 실패 해결 — "audit", "docs"는 tag vocabulary (docs/wiki/schema/tags.md)에 없는 태그. 의미가 가까운 "ops"와 audit이 위치한 폴더 기반 "superpowers"로 대체. before: [harness, agent, audit, docs] after: [harness, agent, ops, superpowers] Refs #558 #559 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(harness): audit #558 후속 정리 — gitignore + plans + command 등록 (#560) * chore(gitignore): ignore per-package OMC artifacts, .next.bak, .scratch audit #558 후속 F7. PR #559 작업 중 untracked 노이즈가 다수 — root .omc/ 정책(state 폴더 ignore, project-memory.json만 tracked)을 package 레벨에도 일관되게 적용. ignore: - packages/*/.omc/ (per-package OMC state, project-memory) - packages/*/.next.bak/ (Next.js 빌드 백업) - .scratch/ (로컬 작업물 디렉토리) 검증: git status -s에서 packages/web/.omc/, packages/api-server/.omc/, packages/web/.next.bak/, .scratch/ 모두 사라짐. Refs #558 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(plans): add profile-tries-detail-modal + content-studio-pipeline-v2 plans audit #558 후속. 5/7, 5/14 작성된 구현 plan 2개를 작업 이력으로 보존. specs/...-design.md(origin/dev)가 설계 SOT, plans는 구현 task breakdown. - 2026-05-07-profile-tries-detail-modal.md (1293 lines) - 2026-05-14-content-studio-pipeline-v2.md (1892 lines) Refs #558 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(commands): register /improve-codebase-architecture slash command audit #558 후속. Matt Pocock의 improve-codebase-architecture 스킬을 /grill, /to-prd 등과 동일 패턴으로 .claude/commands/에 등록. - 코드베이스 deepening opportunities 발견 - docs/agents/domain.md + docs/adr/ 기반 (PR #559 setup 결과 활용) - subagent_type=Explore 사용 - \$ARGUMENTS로 대상 영역 지정 (예: packages/web/lib/supabase) Refs #558 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(content-studio): unified pipeline v2 — LLM generation, post picker, thumbnails (#565) * fix(content-studio): use crypto.randomUUID() for packet/variant IDs Replace packet_{postId} format that caused 'invalid input syntax for type uuid' errors. DB uniqueness is enforced by content_packets.post_id unique constraint. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor(content-studio): remove research schemas, add unified content schema Drop all Research/Firecrawl types (ResearchRun, ResearchSource, ResearchInsight, etc.) and research-related fields from ContentPacket, ContentVariant, generateVariantsRequestSchema, assetPlanRequestSchema, shortFormPlanRequestSchema. Add unifiedContentResponseSchema for the new single-call LLM pipeline that generates keywords + imagePrompts + channel variants together. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor(content-studio): remove research module and all dependencies Remove the entire research subsystem (Firecrawl client, domain policy, normalization, query suggestions, recommendations, service) and clean all references from governance checks, LLM generation, asset/short-form pipelines, UI components, API routes, and tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(content-studio): add rule keyword extraction and unified LLM generation Single OpenAI call now returns keywords, image prompts, and channel variants together, replacing the previous multi-call pattern. Template fallback preserved when LLM is unavailable or validation fails. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(content-studio): add channel thumbnail generation API - schemas.ts — thumbnailChannelSchema + generateThumbnailsRequestSchema - assets/service.ts — generateChannelThumbnails(): parallel image gen per channel (youtube/instagram_feed/instagram_story) with partial failure handling - assets/thumbnails/route.ts — POST /api/v1/content/assets/thumbnails with admin auth - assets/index.ts — export new service functions - tests — 6 new tests (schema validation + generation + partial failures), 28 total passing Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(content-studio): add PostPickerModal and post search API Admin 전용 포스트 검색 API(GET /api/v1/content/posts/search)와 PostPickerModal 컴포넌트 추가. ILIKE 검색, cursor 기반 무한스크롤, 이미지 그리드 UI로 Content Studio에서 포스트를 시각적으로 선택 가능. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat(content-studio): integrate PostPickerModal into page.tsx Add Browse button next to Post ID input for visual post selection, wiring PostPickerModal with open/close state and onSelect callback. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(content-studio): add local API types and fix test type warnings Replace @/lib/api/generated/models imports with local api-types.ts to resolve missing module errors. Fix 'response possibly undefined' warnings in post-picker tests and add missing PostDetailResponse fields in test fixtures. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(content-studio): align PostDetailResponse import to local api-types Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * chore(harness): entry SSOT + ownership-matrix + folder unify (#561 PR-A) (#562) * docs(harness): add docs/agent/skills.md as skills inventory canonical (#561) * docs(plan): add #561 harness docs/wiki SSOT implementation plan * docs(harness): expand AGENTS.md as canonical cross-tool entry (#561) * docs(harness): shrink CLAUDE.md to Claude Code overlay (#561) * docs(harness): align WARP.md as Warp overlay, defer common rules to AGENTS.md (#561) * docs(harness): point .cursor/rules to AGENTS.md as common entry (#561) * docs(harness): redirect AGENT.md to AGENTS.md (#561) * docs(harness): promote ownership-matrix to routing SSOT, add 5 new rows (#561) * docs(harness): merge docs/agents/ into docs/agent/setup/ (#561) * docs(wiki): add `skills` tag to vocabulary for docs/agent/skills.md (#561) `docs/agent/skills.md` introduced in this PR uses `tags: [agent, harness, skills]` but `skills` was missing from the vocab, breaking wiki-lint. Add `skills` to the domain category — slash command / skill 카탈로그 의미. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(modal): prevent maximize/close buttons from overlapping social actions (#528) (#566) - Keep maximize/close buttons fixed at top-right on all breakpoints - Convert SocialActions footer to floating pill bar matching full-page style Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * chore(harness): recover #561 PR-B/PR-C commits that missed dev (#567) * docs(adr): add monorepo index pointing to vault canonical (#561) * docs(adr): convert ADR-0001/0002 to vault redirect stubs (#561) * docs(adr): make ADR stubs wiki-lint compliant (#561) ADR redirect stubs were failing wiki-lint due to: - MISSING_FIELD owner/tags - INVALID_STATUS "superseded-by-vault" (not in vocab) - H1_TITLE_MISMATCH - UNKNOWN_TAG "adr" in docs/adr/index.md Normalize frontmatter to the existing vocab: - status: deprecated for redirect stubs (vault is canonical) - tags: [harness, agent] - align H1 with title; move "(redirect to vault)" into body callout No semantic change — vault remains the canonical ADR source. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(archive): create docs/_archive/, move warehouse-schema (#561) * docs(wiki): fix INDEX.md interface/impl drift, manual maintenance explicit (#561) --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(harness): expand vault-dispatch to issues/comments/reviews/release (#569) * feat(harness): expand vault-dispatch to issues/comments/reviews/release (#540) Adds 4 new event types to the changelog dispatch: - issues (opened/closed/reopened/labeled/assigned) - issue_comment (created) - pull_request_review (submitted) - release (published) projects_v2_item is deferred — needs org-level webhook config and additional PAT scope (projects: read). Closes #540 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(ci): bump actions/checkout v4 → v6 (Node.js 24 support) GitHub Actions runner removes Node.js 20 on 2026-09-16. v6 explicitly supports Node.js 24. Affected: backend-release, db-drift-check, api-server-invariants, wiki-lint, daily-digest, health-check, deploy-backend. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> * chore(harness): #561 follow-up — archive misc docs + qa-screenshots quarterly + conventions lint cleanup (#570) #561 잔여 follow-up 3건을 하나의 PR로: 1. qa-screenshots 분기별 archive 정책 - docs/qa-screenshots/{40 PNG, DIFFERENCES.md, README.md} → docs/_archive/qa-screenshots-2026-Q1/ - docs/qa-screenshots/는 visual-qa.spec.ts 출력 경로로 유지 (새 placeholder README) - docs/_archive/README.md에 분기 정책 명시 (QN cutoff, 디렉토리 명명) 2. 미분류 docs 3건 archive (이전 grill-docs 재결정) - post-centric-refactoring-summary.md → _archive/ (2025-12-18 완료 회고 snapshot) - home-sections-backend-feasibility.md → _archive/ (MVP feasibility, home 리뉴얼로 superseded) - backend-frontend-status.md → _archive/ (2026-02-08 상태 snapshot) - 각 파일에 frontmatter status: archived + archive 사유 callout 추가 - docs/superpowers/plans/2026-05-15-docs-migration-step2-mapping.md에 재결정 노트 3. docs/wiki/schema/conventions.md TOO_MANY_RELATED warning 해소 (6→4) - 제거: .cursor/rules/{api-routes,react-components,rust-api}.mdc (파일별 패턴) - 추가: AGENTS.md (canonical entry) - 최종: ownership-matrix.md, AGENTS.md, CLAUDE.md, .cursor/rules/monorepo.mdc Verification: - bun run wiki:lint → 0 errors, 0 warnings (이전: 1 warning) - archived 파일 참조는 historical plan(2026-05-15 mapping, 2026-05-21 #561 plan)만 잔존, OK Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(design-system): map magazine palette to colors tokens (#573) Adds magPrimary/magAccent/magBg/magText to the colors object so TS consumers can reach the editorial palette without raw CSS vars. The --mag-* CSS vars already exist in globals.css; this only closes the TS-side SSOT drift. Refs #311 Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> * feat(web): add GA4 integration for Rakuten affiliate traffic (#568) (#574) Load Google Analytics when NEXT_PUBLIC_GA_MEASUREMENT_ID is set so production traffic can be reported for affiliate program approval. Co-authored-by: Cursor <cursoragent@cursor.com> * chore(ops): mount Instaloader session volume for prod ai-server (#575) (#576) Persist Instagram Instaloader sessions across ai container restarts and sync .env.backend.example with prod-required RAW_POSTS_R2_* / INSTAGRAM_* keys. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(admin): serve instagram enrichment list via api-server (#578) (#583) * fix(admin): serve instagram enrichment list via api-server, not web service role Fixes #578 — move operation DB reads to GET /api/v1/admin/entity-enrichment/instagram-accounts so Vercel web never needs DATABASE_SERVICE_ROLE_KEY. Web BFF proxies with admin JWT only. Co-authored-by: Cursor <cursoragent@cursor.com> * docs(database): note api-server admin reads and #580 program links Part of #578 — enrichment RFC points to epic/issues; operating-model table links program tracking on GitHub instead of a separate monorepo file. Co-authored-by: Cursor <cursoragent@cursor.com> * style(web): format instagram-accounts admin proxy route Co-authored-by: Cursor <cursoragent@cursor.com> * style(api-server): rustfmt entity_enrichment admin module Co-authored-by: Cursor <cursoragent@cursor.com> * fix(api-server): satisfy clippy on entity_enrichment SQL statements Co-authored-by: Cursor <cursoragent@cursor.com> * test(api-server): unit tests for entity enrichment instagram-accounts admin API Covers ILIKE escaping, summary pending counts, account row mapping, and DB errors. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Kiyori <113906780+thxforall@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
release: dev → main (cody Stage 1+2 pipeline + ADR-0005 Phase A-E)
* feat(ci): schema drift PR gate (TS<->DB) — #373 v2 (#588) * docs(database): add schema-drift-sot.md SSOT mapping (#373 v2) TS 상수 ↔ DB CHECK constraint 매핑 SSOT. scripts/check-schema-drift.ts 의 SOT_MAPPINGS 와 함께 갱신한다. v2 PR gate 의 동작/허용 constraint 형식/ 의도적 우회(drift-bypass label)/v3 후속 항목(posts.status, generated types) 명시. * feat(scripts): add check-schema-drift.ts for TS<->DB enum drift (#373 v2) ts-morph 로 TS 상수 (`export const X = [...] as const`) 값 set 추출 → psql 로 pg_get_constraintdef 파싱 → set-equality 비교. 세 가지 CHECK constraint 형식 (status::text=ANY ARRAY, col=ANY ARRAY, IN list) 지원. drift 1건 이상이면 exit 1, stdout 은 PR comment 용 markdown report. devDependency: ts-morph@^24.0.0 추가. * feat(ci): add schema-drift.yml PR gate workflow (#373 v2) postgres:17 service + postgresql-client-17 + bun install + supabase migrations 순차 적용 + check-schema-drift.ts 실행 + sticky PR comment (marocchino/sticky-pull-request-comment@v2, header=schema-drift). drift-bypass label: continue-on-error 로 job green 유지 (comment 는 유지). branch protection 별도 설정 필요. * docs(database): drift-check.md mark v2 PR gate landed (#373) v1 nightly 와 v2 PR gate 채널을 분리 명시. v2 세부는 schema-drift-sot.md 에서 별도 owning. * docs(design-system): v2.2.0 동기화 — content fundamentals, animations, dual palette (#589) * docs(design-system): bump README to v2.2.0 with content fundamentals + dual palette - Version: 2.1.0 -> 2.2.0, Last Updated: 2026-05-28 - Add v2.2 변경사항: Content Fundamentals, Animations 카탈로그, Dual Palette, Magazine palette tokens (#573), Navigation Facts, Home sequence, IBM Plex Mono (inline), DecodedLogo WebGL - Document Index: 신규 Foundation (v2.2) 섹션 — content-fundamentals.md, animations.md 추가 - Tech Stack table 확장: OKLCH + Hex magazine palette, typography 4종, three.js + @chenglou/pretext (DecodedLogo) - Navigation Facts + Home Page Sequence 섹션 추가 (app/page.tsx:568 앵커) Closes #572 (part 1/7). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(design-system): add content-fundamentals.md 7 sections covering Voice / Casing / Person / Language / Pricing / Numbers / Emoji policy with Do/Don't rules and code anchors: - Pricing: ko-KR locale + ₩ prefix, toLocaleString (앵커: DecodedSolutionsSection.tsx:40 — 마이그레이션 대상) - Numbers: 사용자 표면은 toLocaleString 통과 (앵커: lib/utils/format.ts:36) - Voice: editorial(큐레이션) vs product UI(명료) 분리 - Language: ko-KR 기본, 고유명사·기술 용어 원문 유지 - Emoji: editorial 표면 금지, product UI 절제, Lucide 우선 Closes #572 (part 2/7). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(design-system): add animations.md catalog 15+ CSS keyframe catalog with file/line anchors from packages/web/app/globals.css: - dash-flow (L299), hologram-* family (L318-L351), spot-* family (L410-L458), slide-up (L487), shimmer (L503), ai-summary-* (L522-L535), card-glow (L551), marquee-c (L585) - duration/easing/용도/reduce-motion 컬럼 - Easing 함수 정리: ease-out (단방향 reveal), ease-in-out (펄스), linear (무한 flow), cubic-bezier(0.22, 1, 0.36, 1) — observe pattern, cubic-bezier(0.16, 1, 0.3, 1) — ai-summary smooth reveal - prefers-reduced-motion 정책: 4개 미디어 쿼리 블록 + .js-observe transition fallback - 사용 예시: spot 마커, skeleton shimmer, ai-summary, .js-observe Closes #572 (part 3/7). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(design-system): patterns.md add 5.4 dual palette usage * docs(design-system): tokens.md add magazine palette sub-table * docs(agent): rewrite design-system-llm.md as v2.2.0 1-pager SSOT * docs(agent): design-system-summary.md add v2.2.0 entry --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(content-studio): Video Generation Pipeline — AI 영상 합성 통합 (#592) * feat(content-studio): add xAI scene video pipeline * docs(content-studio): plan video job pipeline * docs(content-studio): harden video job plan * feat(content-studio): add video job pipeline * feat(content-studio): abstract video providers * feat(content-studio): select video mode per scene * feat(content-studio): compose final video exports * feat(content-studio): resume persisted video jobs * feat(content-studio): attach governance to video jobs * fix(content-studio): strengthen short-form video prompts * feat(content-studio): add local video download runner * feat(content-studio): save source image for local videos * fix(content-studio): split long local video scenes * feat(content-studio): compose local video clips * fix(magazines): MAGAZINE_STATUSES — 'generating' 누락 복원 (#373 drift) DB constraint post_magazines_status_check 는 'generating' 포함 5-state 인데 TS MAGAZINE_STATUSES 는 4-state. 1주일+ 잠재한 schema drift. #373 drift gate fix (#595) 가 처음 정상 작동하며 발견. 발생 경위: - 20260430120000: 'generating' 추가 (api-server generate handler 초기 INSERT) - 20260430150000: 4-state 로 축소 (TS 와 동기화) - 20260504133842: 'generating' 복원 (api-server insert + UI 필요) - 마지막 migration 의 TS 동기화 누락 → drift magazines.ts 의 MAGAZINE_STATUSES 에 'generating' 추가 (DB 와 같은 순서). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…mps) main HEAD가 dev에 미적용된 다음 변경 흡수: - b996f51 fix(magazines): MAGAZINE_STATUSES 'generating' 복원 (#601) → #591 외 dev 기반 PR drift gate 해소 - 66e2ec2, 056167e chore(release): ai/api 버전 메니페스트 동기화 - 916fb31 merge: dev → main 통합 commit Drift gate (#373 v2) 가 dev 에 active 이며 #601 fix 가 main 에만 머지된 상태였음. main → dev 백머지로 dev 기반 PR의 drift fail 해소. # Conflicts: # .github/workflows/schema-drift.yml
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Schema drift report (#373 v2)OK — 1 SOT entries match.
SOT mapping: |
Follow-up — uv.lock 재생성 필요본 PR 머지 후 ai-server lockfile 재생성 필요: ```bash 왜: `pyproject.toml` 이 1.10.1 로 back-merge 되지만 기존 dev 의 `uv.lock` 의 `decoded-ai` 는 1.1.9 에서 stale. 별도 commit/PR 로 sync 권장 (`chore(ai-server): regenerate uv.lock @ 1.10.1`). session-3 leftover commit `3682c557` 는 1.6.0 으로 bump 했지만 이 또한 stale 이라 cherry-pick 하지 않고 드롭. |
Follow-up — STATUS_DOT 타입 에러 (#601 'generating' 추가 의 dependent)본 PR 머지 후 `packages/web/lib/components/admin/magazines/MagazineApprovalTable.tsx` 의 `STATUS_DOT` 에 `generating` 키 추가 필요. 그렇지 않으면 `tsc` fail. ```tsx 본 PR base (origin/dev) 에선 `MAGAZINE_STATUSES` 에 `generating` 이 없어 통과하지만 머지 후 노출. PR #611 의 로컬 build 에서 발견. 후속 PR (chore/fix-magazine-status-dot) 또는 본 PR 에 추가 commit 으로 처리. |
back-merge 로 \`MAGAZINE_STATUSES\` 에 'generating' 이 추가되면서 \`MagazineApprovalTable\` 의 \`STATUS_DOT: Record<...status, string>\` 가 key 누락으로 TS fail (확인: \`#611\` Vercel build log). \`generating\` 상태는 blue (\`bg-blue-400\`) 로 도트 색 부여 — pending/yellow, published/emerald, rejected/red 와 시각적 대비. 본 PR 의 back-merge 변경과 함께 적용해야 \`tsc\` green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Update — STATUS_DOT fix 추가 commit (
|
…to-dev-2026-05-28
…614) PR #603 (back-merge main → dev) 가 \`packages/ai-server/pyproject.toml\` 의 version 을 1.8.0 → 1.10.1 로 bump 했지만 \`uv.lock\` 의 \`decoded-ai\` 항목은 1.1.9 에 정체. \`uv lock\` 으로 sync. \`\`\` Updated decoded-ai v1.1.9 -> v1.10.1 \`\`\` 세션 4 chore session-3 leftover commit \`3682c557\` 는 1.6.0 으로 bump 시도했지만 역시 stale → 본 PR 로 정상화. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
main HEAD가 dev에 미반영된 4개 commit 흡수.
b996f51b fix(magazines): MAGAZINE_STATUSES 'generating' 복원 (#601)→ schema drift gate (drift 검증 CI 게이트 (schema diff 자동화) #373 v2) 가 dev 에 active 인데 fix(magazines): MAGAZINE_STATUSES — 'generating' 누락 복원 (#373) #601 fix 는 main 으로만 머지 된 상태였음.
결과: feat(telegram): digest → Notion 파이프라인 통합 #591 외 dev 기반 PR이 모두 drift fail. 본 PR로 일괄 해소.
66e2ec2fchore(release): backend ai=1.10.0 api=0.15.0 [skip ci]056167e7chore(release): backend ai=1.10.1 api=0.15.1 [skip ci]916fb31eMerge pull request release: dev → main (cody Stage 1+2 pipeline + ADR-0005 Phase A-E) #586 from decodedcorp/dev (의미적 변경 없음)Conflicts resolved
.github/workflows/schema-drift.yml(both-added)supabase/postgres:17.6.1.131이미지 +supabase_adminuser 형식 (vanilla postgres 는 pgvector 부재로 fail).postgres:17+driftDB) 폐기.Auto-merged
packages/web/lib/api/admin/magazines.ts—MAGAZINE_STATUSES에"generating"추가packages/ai-server/pyproject.toml— version 1.8.0 → 1.10.1packages/api-server/Cargo.toml— version 0.13.0 → 0.15.1Why
기존 release flow 가
dev → main일방향이라 main-only 변경 (release manifest bump, hotfix 직진 머지) 이 dev 에 반영 안 되는 갭이 누적됨. drift gate 도입 이후 갭이 PR 차단 요인으로 노출.Test plan
packages/ai-server/pyproject.toml,packages/api-server/Cargo.toml)🤖 Generated with Claude Code