Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
168 commits
Select commit Hold shift + click to select a range
b375098
docs: design admin operating console expansion
beyondwin May 27, 2026
4febfab
docs: plan admin operating console expansion
beyondwin May 27, 2026
89b3640
feat: expand admin operating console
beyondwin May 27, 2026
cbaeabd
docs: design admin audit ledger
beyondwin May 27, 2026
08fa53f
docs: plan admin audit ledger
beyondwin May 27, 2026
3647d7d
feat: add admin audit ledger projection service
beyondwin May 27, 2026
6cc9acc
feat: expose admin audit ledger API
beyondwin May 27, 2026
d7c12e8
feat: add admin audit frontend data layer
beyondwin May 27, 2026
375458a
feat: ship admin audit route
beyondwin May 27, 2026
e9c6d34
docs: document admin audit ledger release
beyondwin May 27, 2026
2798852
chore: clear admin ledger release gates
beyondwin May 27, 2026
4fd71eb
docs: design architecture flexibility roadmap
beyondwin May 27, 2026
1e5f0f7
docs: plan architecture boundary hardening
beyondwin May 27, 2026
48b6ab9
refactor: enforce server architecture slices
beyondwin May 27, 2026
e03227e
refactor: keep admin health ui presentation-only
beyondwin May 27, 2026
a8f48bd
test: enforce frontend query boundaries
beyondwin May 27, 2026
9fd2e99
docs: document architecture slice boundaries
beyondwin May 27, 2026
ac80029
chore: finish architecture boundary hardening
beyondwin May 27, 2026
a6f8174
docs: remove public-safety scanner self-match examples
beyondwin May 27, 2026
9e81570
docs: refresh post-v1.11.0 documentation
beyondwin May 27, 2026
be1471b
docs: design admin today operations ledger
beyondwin May 27, 2026
4d3ea1f
docs: plan admin today operations ledger
beyondwin May 27, 2026
7499f6a
Build admin today operations ledger
beyondwin May 27, 2026
791dcb5
docs: cover admin today ledger verification
beyondwin May 27, 2026
a43539b
docs: sequence admin operating depth and reporting roadmap
beyondwin May 29, 2026
2f803cd
docs: plan admin club operations triage list
beyondwin May 29, 2026
c6e4f23
feat: add platform admin club triage model
beyondwin May 29, 2026
6d5781a
feat: order admin clubs list by triage severity
beyondwin May 29, 2026
7362bf8
feat: add severity filter to admin clubs list
beyondwin May 29, 2026
6c29683
style: add admin clubs triage badge styles
beyondwin May 29, 2026
d18df35
test: cover admin clubs triage e2e and note changelog
beyondwin May 29, 2026
071a937
docs: design admin club triage failure counts
beyondwin May 29, 2026
8f2e340
docs: plan admin club triage failure counts
beyondwin May 29, 2026
af84f4d
feat: aggregate recent club notification and ai failures
beyondwin May 29, 2026
137a688
feat: fold club failure counts into triage severity
beyondwin May 29, 2026
63d730c
feat: expose club failure counts in admin clubs response
beyondwin May 29, 2026
7eb96b3
test: cover club failure-count triage reason in clubs route
beyondwin May 29, 2026
8fec8e8
docs: expand task 4 scope to all five type-break test files
beyondwin May 29, 2026
dbd22a8
test: cover club failure-count triage e2e and note changelog
beyondwin May 29, 2026
ae64d68
test: guard listClubs failure-count aggregation and fix status prose
beyondwin May 29, 2026
0c03daf
docs: design admin club detail trend completion (S3+ detail closure)
beyondwin May 29, 2026
6d7b221
docs: plan admin club detail trend completion (S3+ detail closure)
beyondwin May 29, 2026
94e3f7d
feat: add club operations trend fields to snapshot model
beyondwin May 29, 2026
f302e14
feat: add club operations trend and blocker-route model helpers
beyondwin May 29, 2026
b904834
chore: fix Claude agent config gaps and share project settings
beyondwin May 29, 2026
d5e0607
feat: aggregate windowed failure trend in club operations snapshot
beyondwin May 29, 2026
01de2df
docs: fix task 4 test to use getAllByText for repeated 5/delta text
beyondwin May 29, 2026
fc97a99
feat: surface club detail failure trend and next-action links
beyondwin May 29, 2026
d99e5f8
test: cover club detail trend e2e and note changelog
beyondwin May 29, 2026
b95d3f0
Merge club detail trend completion (S3+ detail closure)
beyondwin May 30, 2026
b81371a
docs: design admin vNext closeout roadmap (S8 -> S6 -> S9)
beyondwin May 30, 2026
997a197
docs: add S8 analytics reporting-lite implementation plan
beyondwin May 30, 2026
d94dace
chore: ignore root-level build and test artifacts
beyondwin May 30, 2026
50b265a
feat: add admin analytics overview domain model
beyondwin May 30, 2026
ed22cc5
feat: add admin analytics use-case and aggregate ports
beyondwin May 30, 2026
6b25eba
feat: derive admin analytics KPIs from raw aggregates
beyondwin May 30, 2026
db07196
feat: aggregate windowed cross-club analytics in JDBC adapter
beyondwin May 30, 2026
dd1f0a2
feat: expose admin analytics overview endpoint
beyondwin May 30, 2026
929672a
test: register admin.analytics server slice in architecture boundary
beyondwin May 30, 2026
40cca71
feat: add admin analytics model and display helpers
beyondwin May 30, 2026
bc07150
feat: add admin analytics api client
beyondwin May 30, 2026
ec99942
feat: add admin analytics query options
beyondwin May 30, 2026
635a44a
feat: seed admin analytics overview in route loader
beyondwin May 30, 2026
35399b2
feat: render admin analytics KPI cards and club benchmark
beyondwin May 30, 2026
b2dc5d0
feat: wire admin analytics route to window URL state
beyondwin May 30, 2026
257373a
feat: flip admin analytics route to ready and wire router
beyondwin May 30, 2026
da5d6e8
test: cover admin analytics overview e2e flow
beyondwin May 30, 2026
3f02fcc
docs: record admin analytics slice in changelog and roadmap
beyondwin May 30, 2026
4a5a874
test: update breadcrumb spec for now-ready analytics route
beyondwin May 30, 2026
462df18
test: update admin shell e2e for ready analytics route
beyondwin May 30, 2026
0e08c39
Merge admin vNext S8 analytics reporting-lite
beyondwin May 30, 2026
a8b6d35
docs: charter admin vNext closeout execution (S6 -> S9 -> S10 gate)
beyondwin May 30, 2026
802d6a0
docs: fix internal section refs in closeout execution charter
beyondwin May 30, 2026
ce66607
docs: plan admin S6 P1 ai-ops failure-code drilldown
beyondwin May 30, 2026
c42532b
feat: add admin ai-ops job filter url model
beyondwin May 30, 2026
e9a26e8
feat: make admin ai-ops failure codes drill into filtered jobs
beyondwin May 30, 2026
90b2a7e
feat: implement admin ai-ops failure-code drilldown UI
beyondwin May 30, 2026
9c95386
test: scope ai-ops banner assertion to the status region
beyondwin May 30, 2026
5699b8c
feat: seed admin ai-ops jobs from url filter in loader
beyondwin May 30, 2026
cda66d1
feat: drive admin ai-ops jobs query from url filter
beyondwin May 30, 2026
342e28f
test: cover admin ai-ops failure-code drilldown e2e
beyondwin May 30, 2026
a34419c
fix: keep ai-ops filter model framework-independent
beyondwin May 30, 2026
b7aefe7
docs: record admin ai-ops failure-code drilldown in changelog
beyondwin May 30, 2026
bffecbd
Merge admin S6 P1 ai-ops failure-code drilldown
beyondwin May 30, 2026
f5c1375
docs: design admin S6 AI Ops depth + S9 host-surface umbrella spec
beyondwin May 30, 2026
57a915c
docs: plan admin S6-T2 ai-ops cost/usage window trend
beyondwin May 30, 2026
7fca60e
feat(aigen): add ai-ops windowed cost-trend domain models
beyondwin May 30, 2026
0b911f0
feat(aigen): query ai-ops window cost/usage from audit log
beyondwin May 30, 2026
3e6bbe4
feat(aigen): derive ai-ops windowed cost trend in summary service
beyondwin May 30, 2026
e345254
feat: expose ai-ops window param and cost trend response
beyondwin May 30, 2026
25dfebd
test: isolate ai-ops audit repository integration tests per method
beyondwin May 30, 2026
e1777ce
feat: add ai-ops costTrend to admin summary contract type
beyondwin May 30, 2026
a851e42
feat: add ai-ops cost window url-state helpers
beyondwin May 30, 2026
9d2879c
feat: thread ai-ops cost window through summary query and loader
beyondwin May 30, 2026
7ce1b21
feat: render ai-ops windowed cost trend and window selector
beyondwin May 30, 2026
c0033f5
test: cover admin ai-ops cost window toggle e2e
beyondwin May 30, 2026
ff7ae95
docs: record admin ai-ops cost/usage window trend in changelog
beyondwin May 30, 2026
463101c
Merge admin S6-T2 ai-ops cost/usage window trend
beyondwin May 30, 2026
84a14ac
docs: redefine admin RETRY_COMMIT as COMMITTING recovery transition a…
beyondwin May 30, 2026
b351219
feat(aigen): add RETRY_COMMIT to ai-ops action enum
beyondwin May 30, 2026
2655073
feat(aigen): add RetryAiOpsJobCommitUseCase port
beyondwin May 30, 2026
f5979b0
feat(aigen): recover stuck committing job via admin retry-commit
beyondwin May 30, 2026
bb9adc2
feat(aigen): expose retry-commit in ai-ops available actions
beyondwin May 30, 2026
6e589c3
feat(aigen): add ai-ops retry-commit endpoint
beyondwin May 30, 2026
4e9a0ed
style(aigen): order retry-commit use-case imports lexicographically
beyondwin May 30, 2026
29abba1
feat: add RETRY_COMMIT to admin ai-ops action type
beyondwin May 30, 2026
139d363
feat: add admin ai-ops retry-commit api wrapper
beyondwin May 30, 2026
cb6cb8a
feat: add admin ai-ops retry-commit mutation
beyondwin May 30, 2026
8c2ad06
feat: render admin ai-ops retry-commit action button
beyondwin May 30, 2026
4967b8f
feat: wire admin ai-ops retry-commit mutation in route
beyondwin May 30, 2026
5c79650
test: cover admin ai-ops retry-commit affordance e2e
beyondwin May 30, 2026
54829ca
docs: record admin ai-ops retry-commit in changelog
beyondwin May 30, 2026
52e8b1a
style: space and wrap admin ai-ops job action buttons
beyondwin May 30, 2026
3b34047
Merge admin S6-T3 ai-ops admin retry-commit
beyondwin May 30, 2026
6f03f8b
docs: spec S6→S9 closeout umbrella (Slice C·D·E)
beyondwin May 30, 2026
691d971
docs: plan Slice C (S6-T4) ai-ops surface connectivity
beyondwin May 30, 2026
3dcf68f
Merge admin S6→S9 closeout umbrella spec + Slice C plan
beyondwin May 30, 2026
e185c25
feat(admin-ai-ops): add ai-ops outbound path builder for deep links
beyondwin May 30, 2026
fb52fd3
feat: derive ai-ops drilldown path for AI_OPS audit rows
beyondwin May 30, 2026
91722ae
feat: link AI_OPS audit detail to ai-ops club drilldown
beyondwin May 30, 2026
6c3cced
test: cover audit AI_OPS row to ai-ops drilldown e2e
beyondwin May 30, 2026
69e5ed5
test: guard health AI card links to ai-ops
beyondwin May 30, 2026
2aef89d
docs: record admin ai-ops surface connectivity in changelog
beyondwin May 30, 2026
63a7d0d
Merge admin S6-T4 ai-ops surface connectivity
beyondwin May 31, 2026
8f105a1
docs: spec unified S6→S9 closeout (C+D+E single plan)
beyondwin May 31, 2026
9172543
docs: plan admin S6-S9 closeout unified (Phase C+D+E)
beyondwin May 31, 2026
af48b50
feat: add neutral club-operations contract for admin and host
beyondwin May 31, 2026
eea2e0d
refactor: source admin club-ops subtypes from neutral contract
beyondwin May 31, 2026
5a435cd
feat: add host club-operations model and use-case port
beyondwin May 31, 2026
c9173af
feat: project host-scoped club operations with host authorization
beyondwin May 31, 2026
2f8ef15
feat: expose host club-operations endpoint
beyondwin May 31, 2026
89c6832
feat: add host club-operations api and query
beyondwin May 31, 2026
036c5be
feat: render read-only host club operations signals on dashboard
beyondwin May 31, 2026
d830a34
test: enforce club-ops contract boundary and host signal rendering
beyondwin May 31, 2026
ba52c66
docs: record host club-operations reinforcement in changelog
beyondwin May 31, 2026
25d674c
test: account for host club-operations field in dashboard loader expe…
beyondwin May 31, 2026
671c528
docs: closeout S6→S9 release-readiness review report
beyondwin May 31, 2026
775a31f
docs: spec post-admin-vNext enhancement umbrella (H→A→M→P)
beyondwin May 31, 2026
58977de
docs: plan H slice admin hardening baseline sweep
beyondwin May 31, 2026
0596c3f
test: add admin hardening a11y baseline
beyondwin May 31, 2026
e7adc26
docs: spec member host reading loop showcase
beyondwin May 31, 2026
3a7a5c7
docs: plan member host reading loop showcase
beyondwin May 31, 2026
39ed6ba
feat: add role-safe reading loop model
beyondwin May 31, 2026
282e8af
feat: align member home reading loop action
beyondwin May 31, 2026
0c42622
feat: surface current session reading loop status
beyondwin May 31, 2026
6f1b089
feat: bridge host dashboard to reading loop state
beyondwin May 31, 2026
bc72fd0
test: cover host to member reading loop e2e
beyondwin May 31, 2026
06bd583
docs: showcase member host reading loop evidence
beyondwin May 31, 2026
f1e612a
docs: record reading loop e2e check
beyondwin May 31, 2026
e3656f2
fix: keep member home loop read-only for suspended members
beyondwin May 31, 2026
d59110f
test: cover host api wrapper contracts
beyondwin May 31, 2026
dee5b3d
docs: add ops insight release trust spec
beyondwin May 31, 2026
7f2e2cc
docs: add ops insight release trust plan
beyondwin May 31, 2026
515e29d
feat: derive admin analytics KPI series
beyondwin May 31, 2026
25e6f7b
feat: expose admin analytics trend buckets
beyondwin May 31, 2026
914e238
feat: add admin analytics CSV model helpers
beyondwin May 31, 2026
2d25582
feat: render admin analytics trends and CSV export
beyondwin May 31, 2026
311854f
test: cover admin analytics trend export flow
beyondwin May 31, 2026
d945698
docs: align ai queue depth observability meaning
beyondwin May 31, 2026
44d585d
docs: reclassify release readiness residuals
beyondwin May 31, 2026
1559b51
test: include admin analytics series fixture
beyondwin May 31, 2026
67d0a3a
docs: record ops insight release readiness evidence
beyondwin May 31, 2026
33b2606
docs: close backup timer release residual
beyondwin May 31, 2026
f84ef2b
docs: close oauth release residual
beyondwin May 31, 2026
a9bf1a9
chore: fix release docs and pre-push checks
beyondwin May 31, 2026
35ccccc
docs: prepare v1.12.0 release
beyondwin May 31, 2026
9552a3a
test: allow host editor mode query in mobile route continuity
beyondwin May 31, 2026
12ddf21
docs: record v1.12.0 merge exception
beyondwin May 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 19 additions & 0 deletions .claude/commands/release-readiness.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
description: Review the current branch for release readiness against its base
argument-hint: "[base-ref, default origin/main]"
---

You are running a release-readiness review for ReadMates.

Base ref: `${ARGUMENTS:-origin/main}`. Review range: `${ARGUMENTS:-origin/main}..HEAD`.

Do NOT limit the review to the latest implementation plan. Review the whole diff of the branch against its base, following `docs/development/release-readiness-review.md`.

Steps:

1. `git fetch` the base ref if needed, then read the full diff and commit list for `${ARGUMENTS:-origin/main}..HEAD`.
2. Walk every checklist item in `docs/development/release-readiness-review.md`: CHANGELOG/Unreleased, CI/deploy scripts, operator-facing behavior changes, security-code hygiene, architecture-test baselines/exceptions, and public-release safety.
3. Run the smallest relevant verification for the touched surfaces (see `AGENTS.md`): frontend `pnpm --dir front lint|test|build`, server `./server/gradlew -p server clean test`, e2e `pnpm --dir front test:e2e` for auth/BFF/route changes.
4. For public-release-affecting work, run `./scripts/build-public-release-candidate.sh` then `./scripts/public-release-check.sh .tmp/public-release-candidate`.

Report: changed surfaces, checks actually run (with results), and any remaining risk or skipped validation. Passing tests are evidence, not proof that no operational or release risk remains.
17 changes: 17 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"permissions": {
"allow": [
"Bash(pnpm --dir front lint:*)",
"Bash(pnpm --dir front test:*)",
"Bash(pnpm --dir front build:*)",
"Bash(pnpm --dir front test:e2e:*)",
"Bash(./server/gradlew:*)",
"Bash(./scripts/build-public-release-candidate.sh:*)",
"Bash(./scripts/public-release-check.sh:*)",
"Bash(git status:*)",
"Bash(git diff:*)",
"Bash(git log:*)"
]
}
}
15 changes: 14 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,16 @@ replay_pid*
# =============================================================================
node_modules/
*.tsbuildinfo
dist/
.vite/
.turbo/

# =============================================================================
# Test / e2e artifacts (root-level safety net; front/ has its own too)
# =============================================================================
coverage/
test-results/
playwright-report/

# =============================================================================
# Logs, PIDs, runtime artifacts
Expand Down Expand Up @@ -75,7 +85,10 @@ node_modules/
.cloudflare
.vercel
.superpowers/
.claude/
.claude/*
!.claude/settings.json
!.claude/commands/
!.claude/commands/**
.orchestrator/
.codex-orchestrator/
.waygent/
Expand Down
59 changes: 58 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,33 @@ ReadMates는 Git tag와 GitHub Releases를 함께 사용합니다. 이 파일은

### Highlights

- **Admin vNext S1 IA Foundation**: `/admin` 단일 페이지를 9-라우트 lazy-split 패밀리로 분해했습니다. 공유 좌측 nav · 상단 status strip · 권한 매트릭스 · URL-state onboarding modal · 표준 "준비 중" empty state를 갖춘 `AdminShellLayout` 위에서 5개 READY 라우트(`today`·`clubs`·`clubs/:clubId`·`ai-ops`·`support`)와 4개 COMING-SOON 라우트(`health`·`notifications`·`audit`·`analytics`)가 `admin-route-catalog` SSOT로 구동됩니다. 후속 슬라이스는 자기 라우트를 `coming_soon → ready`로 토글하는 한 줄 변경으로 자기 자리를 채울 수 있습니다.
- 다음 릴리즈 후보 변경을 이 섹션에 기록합니다.

## v1.12.0 - 2026-05-31

### Highlights

- **Admin vNext route family**: `/admin` 단일 페이지를 9-라우트 lazy-split 패밀리로 분해했습니다. 공유 좌측 nav · 상단 status strip · 권한 매트릭스 · URL-state onboarding modal을 갖춘 `AdminShellLayout` 위에서 `today`·`health`·`clubs`·`clubs/:clubId`·`notifications`·`ai-ops`·`support`·`audit`·`analytics` 9개 READY 라우트가 `admin-route-catalog` SSOT로 구동됩니다.
- **Admin vNext 운영 콘솔 확장**: `/admin/notifications`를 READY 라우트로 전환해 outbox, delivery, 실패 cluster, club별 알림 health와 two-step replay preview/confirm을 제공합니다. `/admin/clubs/:clubId`는 readiness, 멤버/세션/알림/AI 사용량을 하나의 운영 상세로 묶고, `/admin/support`는 사용자 검색 기반 grant 생성과 ledger/revoke 흐름을 제공합니다.
- **AI 운영 콘솔 + 호스트 복구**: `/admin`에서 AI job 상태, 실패 코드, 비용 추정, stale 후보를 보는 AI Ops 표면을 추가하고, 호스트 세션 편집기에서 자기 세션의 in-flight AI job을 다시 찾아 안전하게 취소/재시도할 수 있게 했습니다.
- **Query foundation 완주**: `archive`, `feedback`, `public` read path를 Query loader seeding으로 이전하고, AI commit 후 full page reload 대신 관련 Query cache invalidation으로 화면을 갱신합니다.
- **운영 안전망 보강**: 일일 MySQL 백업 systemd timer와 복구 runbook, release-tag `Unreleased` guard(`--release` gated, `--no-changelog-check` 비상 우회), graphify 기반 코드베이스 탐색 워크플로를 도입했습니다.
- `/admin/clubs`: triage list now orders clubs by operational severity (긴급/주의/정상), shows the blocking reasons inline, and adds a severity filter so operators see at-risk clubs first.
- `/admin/clubs`: triage now counts each club's recent (7-day) notification-delivery and AI-generation failures, ranks any club with a failure as 긴급, and shows `알림 실패 N건` / `AI 실패 N건` as the leading reasons so operators see member-impacting failures first.
- `/admin/clubs/:clubId`: 운영 스냅샷에 최근 7일 알림/AI 실패 추이(지난 7일 대비 델타)와 readiness 차단 신호별 next-action 링크를 추가하고, 플랫폼 운영/호스트 운영 섹션을 구분했습니다.
- **Admin vNext S8 분석/리포팅 lite**: `/admin/analytics`를 마지막 COMING-SOON 라우트에서 READY로 전환했습니다. 7/30/90일 윈도우 선택(URL state)으로 활성 멤버·세션 완료율·RSVP 응답률·AI 비용/세션·알림 도달률을 현재-대비-직전 윈도우 델타로 보여주고, 클럽 간 비교(cross-club benchmark)를 제공합니다. 분모가 0인 지표는 차트를 지어내지 않고 "데이터 부족" empty state로 정직하게 표기합니다. 새 read-only 서버 슬라이스 `admin.analytics`(controller → service → JDBC adapter)가 클럽 전반의 원시 카운트를 집계하고, 비율·델타·가용성 파생은 순수 application service에서 단위 테스트로 검증합니다.
- **member/host reading loop:** host dashboard의 다음 운영 행동과 member home/current-session의 다음 읽기 행동을 role-safe reading-loop 상태로 정렬했습니다. 공유 모델은 admin-only 신호를 노출하지 않고, showcase 문서는 private workflow를 guest에게 열지 않은 채 sanitized 테스트와 문서 evidence로 설명합니다.

### Engineering

- **observability:** clarified `readmates.aigen.queue.depth` as Redis active AI job backlog (`PENDING` + `RUNNING`) rather than a placeholder or Kafka consumer-lag metric. Metrics catalog, dashboard copy, alert wording, runbook triage, and KDoc now use the same meaning without adding high-cardinality labels.
- **release-readiness:** reclassified the v1.11.0 production OAuth and backup-timer residuals, then recorded both as closed after browser-profile OAuth return evidence, VM timer installation, and a manual Object Storage upload proof. The release-readiness checklist now distinguishes automated closure, manual operator evidence, and out-of-scope pre-existing risk.
- **platform-admin/a11y:** admin 전 라우트와 host dashboard에 하드닝 베이스라인을 적용했습니다. admin shell에 skip-link와 라벨된 nav/main 랜드마크를 추가하고, 이름 없는 상호작용 요소를 막는 의존성 없는 테스트 가드(`findUnnamedInteractiveElements`)와 각 라우트 a11y 어서션을 도입했습니다. 색 대비·키보드 순서·모바일 360px는 `docs/development/admin-hardening-baseline.md` 의 수동 게이트로 문서화했습니다.
- **host-surface:** club operations의 host-적절 신호(준비 상태·세션 진행·AI 사용량)를 중립 계약 `front/shared/model/club-operations.ts`로 분리해 admin·host가 공유합니다. host dashboard는 `/api/host/club-operations`(host 인증, 자기 클럽만)로 read-only 운영 신호 카드를 렌더합니다. admin 전용 신호(support grant, raw member email, notification replay, safeLinks)는 host projection에서 제외하며, admin↔host 직접 import는 경계 테스트로 차단합니다. host에 write 명령은 추가하지 않습니다.
- **platform-admin:** `/admin/audit`의 AI 운영(AI_OPS) 감사 행 상세에 `/admin/ai-ops?clubId=…` 드릴다운 링크를 추가해, 운영자가 감사 신호에서 해당 클럽의 AI job 필터 뷰(원인→조치)로 바로 이동할 수 있게 했습니다. `/admin/health`의 AI provider 카드는 이미 `/admin/ai-ops`로 연결됩니다. 신규 서버 계약 없이 기존 `target.clubId`만 사용하며, P1 필터 모델(`?clubId=`/`?errorCode=`)을 SSOT로 재사용합니다. raw provider error/transcript는 노출하지 않습니다.
- **platform-admin:** `/admin/ai-ops` now offers an OWNER/OPERATOR `Retry commit` action on jobs stuck in `COMMITTING`. It recovers the job to `SUCCEEDED` (reusing the commit service's existing recovery transition) so the host can re-commit, without admin writing any session content and without deleting the result snapshot. The action is audit-logged (`RETRY_COMMIT`, COMMITTING→SUCCEEDED) and SUPPORT is denied. No new generation state or transition semantics were introduced.
- **platform-admin:** `/admin/ai-ops` summary now shows a 7/30/90-day cost/usage trend (`?window=`) with current-vs-prior delta. The JDBC adapter returns only raw window cost/count; the application service derives delta/availability (pure, unit-tested) and reports `NOT_ENOUGH_DATA` honestly when the prior window had no jobs. No charting library added; the month-to-date headline is unchanged. aigen-local window enum keeps the slice framework-independent.
- **platform-admin:** `/admin/ai-ops` failure codes are now drilldown controls. Selecting a failure code filters the job list to the affected clubs/sessions and reflects the filter in URL state (`?errorCode=`), with a "전체 보기" control to clear it. Filtered empty states stay honest ("이 필터에 해당하는 AI job이 없습니다.") and no raw provider error/content fields are exposed.
- **deploy:** `deploy/oci/backup-mysql.service` + `backup-mysql.timer`를 추가해 04:15 UTC에 MySQL dump → OCI Object Storage 업로드를 자동화합니다. 복구·검증·보존(30/6/1) 절차는 [`docs/operations/runbooks/db-backup.md`](docs/operations/runbooks/db-backup.md)에 정리합니다.
- **deploy:** post-deploy watch가 부모 attempt id를 자식 attempt로 전파하도록 수정해 배포 ledger의 attempt 계보가 정확히 이어집니다 (`deploy/oci/watch-compose-post-deploy.sh`, `deploy/oci/tests/watch-attempt-id.test.sh`).
- **scripts:** `scripts/pre-push-check.sh`에 `--release`/`READMATES_PRE_PUSH_RELEASE=true` 조건의 `CHANGELOG Unreleased` guard를 추가했습니다. concrete 카테고리 헤더, feature-style bold marker, 두 개 이상 placeholder를 거부합니다. `--no-changelog-check`로 비상 우회하며, branch protection bypass 정책은 [`docs/development/release-management.md`](docs/development/release-management.md)에 함께 문서화했습니다.
Expand All @@ -35,6 +55,43 @@ ReadMates는 Git tag와 GitHub Releases를 함께 사용합니다. 이 파일은
notification dispatch success ratio. 10-second `@Scheduled` refresh into an `AtomicReference` cache;
per-card failures stay isolated (one provider down → that card only is `status=unknown`).
- Hardened `/admin/health` with a pinned camelCase snapshot contract, seven-card fixture coverage, refresh/stale UI, deploy strip rendering, and isolated provider refresh behavior.
- **platform-admin:** ship `/admin/audit` as a read-only operating ledger over platform, club, notification replay, and AI audit sources. The route uses safe metadata projection, role-aware masking, cursor pagination, and S8-compatible filter vocabulary without exposing raw provider errors, email bodies, transcripts, or generated result JSON.
- **platform-admin:** `/admin/today` now shows an operations ledger that prioritizes club readiness, domain, notification, and AI Ops work.
- **platform-admin:** expand the operating console with notification operations, club operations, and support workbench slices.
`/api/admin/notifications/*` adds read-only ledgers plus OWNER/OPERATOR two-step replay preview/confirm with an audit trail in Flyway V35.
`/api/admin/clubs/{clubId}/operations` returns aggregate-only readiness, member/session, notification, and AI usage signals without raw member email/body fields.
`/api/admin/support/*` adds masked user search, grant ledger, 24-hour maximum grant creation, duplicate-active protection, and revoke support.
- **frontend/query:** move admin notification ledgers, club operations snapshots, and support search/grants into platform-admin Query modules with route loader seeding and focused invalidation. `/admin/health` outbox drilldowns now target `/admin/notifications?focus=...`.
- **architecture:** server slice registry now covers `admin.audit`, `admin.health`, and `aigen`; `aigen` passes application-safe actor values instead of web/session carriers. Frontend boundary tests also enforce Query module imports, and `/admin/health` keeps data orchestration in the route layer with presentation-only UI components.
- **public-release:** public release documentation now matches the helper scripts: `docs/superpowers/` remains a private historical archive outside the clean release candidate, while current source-of-truth material belongs in `docs/development/`, `docs/deploy/`, or `docs/operations/`.
- **platform-admin:** add the read-only `admin.analytics` slice and `/admin/analytics` overview.
`GET /api/admin/analytics/overview?window=7d|30d|90d` aggregates raw counts across clubs over
current/prior windows; the application service derives rate/delta/availability (pure, unit-tested)
while the JDBC adapter returns only counts. Metric contract pinned as `admin.analytics_overview.v1`:
ACTIVE_MEMBERS, SESSION_COMPLETION, RSVP_RATE, AI_COST_PER_SESSION, NOTIFICATION_DELIVERY, with
`NOT_ENOUGH_DATA` when a denominator is 0 and numeric `deltaDirection` (UP/DOWN/FLAT/NONE) leaving
good/bad coloring to the UI. No charting library added — trend is current-vs-prior delta. Registered
in `ServerArchitectureBoundaryTest` and covered by service/adapter/controller and e2e tests asserting
no `@example.com` or raw JSON bodies leak.

### Deployment Notes

- **DB migration**: Flyway V34 (`ai_generation_admin_action_audit` + `ai_generation_audit_log` indexes) supports AI Ops/audit lookups, and Flyway V35 (`admin_notification_replay_previews`) creates the admin notification replay preview/audit table. Both are additive; rollback leaves unused rows/tables until a later cleanup migration.
- **배포 순서**: server image를 먼저 배포해 V34/V35와 새 `/api/admin/**` contract를 적용한 뒤 frontend를 배포합니다. 이전 frontend는 새 endpoint를 호출하지 않으므로 서버 선배포가 안전합니다.
- **운영 확인**: OWNER 또는 OPERATOR 권한으로 `/admin/notifications`에서 replay preview가 10분 TTL과 selection hash를 반환하는지, confirm 후 audit row와 outbox replay 상태가 남는지 확인합니다. `/admin/support`에서는 grant 만료가 24시간 이내로 제한되고 masked email만 보이는지 확인합니다. AI generation이 켜진 환경에서는 `/admin/ai-ops` summary/job ledger와 `/admin/audit`의 AI source filter가 raw transcript나 provider error body 없이 렌더링되는지도 확인합니다.
- **Branch protection exception**: PR #10 was CI-green but blocked by a one-review/code-owner requirement in a single-collaborator repository, so the release uses an admin merge after documenting the exception in the release-readiness review. Before the next DB/API release, configure a non-author reviewer/code owner or adjust branch protection to avoid requiring an impossible self-review.

### Verification

- Local release preparation (2026-05-31): `git diff --check v1.11.0..HEAD -- . ':(exclude)docs/superpowers/**'` — pass.
- Local release preparation (2026-05-31): `./scripts/pre-push-check.sh --release --dry-run` — pass; `CHANGELOG Unreleased` guard accepted the placeholder-only section and printed the release-mode command plan.
- Local release preparation (2026-05-31): `pnpm --dir front lint` — pass.
- Local release preparation (2026-05-31): `pnpm --dir front test` — pass (125 files, 1090 tests).
- Local release preparation (2026-05-31): `pnpm --dir front build` — pass.
- Local release preparation (2026-05-31): `./server/gradlew -p server clean test` — pass (Gradle build successful; `test` task skipped by current Gradle task selection/configuration).
- Local release preparation (2026-05-31): `pnpm --dir front test:e2e` — pass (57/57).
- Local release preparation (2026-05-31): `./scripts/build-public-release-candidate.sh` — pass.
- Local release preparation (2026-05-31): `./scripts/public-release-check.sh .tmp/public-release-candidate` — pass; gitleaks scanned 8.06 MB and found no leaks.

## v1.11.0 - 2026-05-18

Expand Down
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@AGENTS.md
Loading