Skip to content

chore: back-merge main → dev (#601 generating fix + ai/api version bumps)#603

Merged
thxforall merged 9 commits into
devfrom
chore/back-merge-main-to-dev-2026-05-28
May 28, 2026
Merged

chore: back-merge main → dev (#601 generating fix + ai/api version bumps)#603
thxforall merged 9 commits into
devfrom
chore/back-merge-main-to-dev-2026-05-28

Conversation

@thxforall
Copy link
Copy Markdown
Contributor

Summary

main HEAD가 dev에 미반영된 4개 commit 흡수.

Conflicts resolved

Auto-merged

  • packages/web/lib/api/admin/magazines.tsMAGAZINE_STATUSES"generating" 추가
  • packages/ai-server/pyproject.toml — version 1.8.0 → 1.10.1
  • packages/api-server/Cargo.toml — version 0.13.0 → 0.15.1

Why

기존 release flow 가 dev → main 일방향이라 main-only 변경 (release manifest bump, hotfix 직진 머지) 이 dev 에 반영 안 되는 갭이 누적됨. drift gate 도입 이후 갭이 PR 차단 요인으로 노출.

Test plan

🤖 Generated with Claude Code

CIOI and others added 7 commits May 26, 2026 00:44
)

* 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
@thxforall thxforall added the bump:patch Bug fixes / internal refactor label May 28, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented May 28, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
decoded-app Canceled Canceled May 28, 2026 11:32am

@thxforall thxforall moved this from Todo to In Progress in decoded-monorepo May 28, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 28, 2026

Schema drift report (#373 v2)

OK — 1 SOT entries match.

SOT Status Detail
post_magazines.status OK draft, generating, pending, published, rejected

SOT mapping: docs/database/schema-drift-sot.md · Bypass via drift-bypass label.

@thxforall
Copy link
Copy Markdown
Contributor Author

Follow-up — uv.lock 재생성 필요

본 PR 머지 후 ai-server lockfile 재생성 필요:

```bash
cd packages/ai-server && uv lock
```

: `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 하지 않고 드롭.

@thxforall
Copy link
Copy Markdown
Contributor Author

Follow-up — STATUS_DOT 타입 에러 (#601 'generating' 추가 의 dependent)

본 PR 머지 후 `packages/web/lib/components/admin/magazines/MagazineApprovalTable.tsx` 의 `STATUS_DOT` 에 `generating` 키 추가 필요. 그렇지 않으면 `tsc` fail.

```tsx
const STATUS_DOT: Record<AdminMagazineListItem["status"], string> = {
draft: "bg-gray-400",
pending: "bg-yellow-400",
generating: "bg-blue-400", // 추가 필요
published: "bg-emerald-400",
rejected: "bg-red-400",
};
```

본 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>
@thxforall
Copy link
Copy Markdown
Contributor Author

Update — STATUS_DOT fix 추가 commit (4579e75c)

#611 Vercel build log 에서 발견한 dependent TS fail 을 본 PR 에 직접 포함.

MagazineApprovalTable.tsxSTATUS_DOTRecord<MAGAZINE_STATUSES[number], string> 형식이므로 'generating' 키가 빠지면 back-merge 후 tsc fail. 본 PR 의 의도 (#601 generating 복원) 와 직결되어 별도 PR 대신 같은 PR 의 후속 commit 으로 처리.

generating 도트 색: bg-blue-400 (blue) — pending/yellow, published/emerald, rejected/red 와 시각적 대비.

@thxforall thxforall merged commit 870ff33 into dev May 28, 2026
5 of 6 checks passed
@github-project-automation github-project-automation Bot moved this from In Progress to Done in decoded-monorepo May 28, 2026
thxforall added a commit that referenced this pull request May 28, 2026
MagazineApprovalTable 과 동일 패턴 — \`STATUS_DOT: Record<MagazineStatus, string>\`
가 'generating' 키 누락으로 TS fail. blue dot 부여.

#603 로컬 빌드에서 #611 maxDuration fix 적용 후 노출된 second STATUS_DOT 위반.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
thxforall added a commit that referenced this pull request May 28, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bump:patch Bug fixes / internal refactor

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants