Commit Graph

92 Commits

Author SHA1 Message Date
zio
92572df511 feat(backend): visitor/ticket/parking/livenotice/session domains, Jasper PDF, tenant switch (V86-V106)
- Jasper grid report (PDF), fonts + extension config
- Subscription/live-notice, parking congestion, session RSVP
- Smart ticket TOTP guard, ticket cancel policy
- Visitor membership/contact/notification/pay-method/feed
- Multitenancy demo tenant + tenant switch response
- M2 layout version DTO; unit/integration tests for above

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 00:41:37 +09:00
zio
bbd4a63f5a feat(db): demo/testdata seed and CMS hero images (V68-V75)
- V68 demo exhibitors expand, V69 auctions+contractor, V70 dock slots
- V71 sponsorship fulfillment, V72 BI history, V73 live utility orders
- V75 CMS content hero images (public site)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 00:41:11 +09:00
zio
b718310854 docs: PLANNING v3.4/design v2.4 updates, backlogs and owner feedback log
- PLANNING: home IA, AI token-min plan (§8A), data standard, SSO+HR
- design.md: COEX-style public visual/motion spec, Nifty design system
- IMPLEMENTATION_BACKLOG + UNDEVELOPED_BACKLOG waves
- OWNER_FEEDBACK: authoritative session directive log

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 00:40:56 +09:00
397b5de985 docs(demo): customer-facing AI demo deck in scenario order
12-slide PPTX (cover, overview, agenda, divider+flow per demo 1-4,
closing) generated by scripts/gen_ai_demo_ppt.py. Content sourced from
internal AI_DEMO_SCRIPT.pptx with internal-only info (accounts,
checklist, troubleshooting) removed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 18:46:05 +09:00
zio
02c6b8ddee fix(m2): V67 K1 band-to-hall mapping corrected - was reversed
Owner directive 2026-07-16: verify the K1 band-hall numbering assumption.

Decisive evidence: 832 electrical circuit labels (P{panel}-{hall}{zone}-{no})
in the trench drawing, zero exceptions: band1=hall5(165) band2=hall4(168)
band3=hall3(168) band4=hall2(168) band5=hall1(163) => band n = hall (6-n).
The previous assumption (band n = hall n) was WRONG - only hall 3 matched by
luck. Mirror features in official JPGs (notch corners, exterior entrances)
independently agree.

- V67: delete all K1 measured rows (old mapping) and reseed with corrected
  generators (trench 875, pillars, obstacles, K1 exits). Assembly strips the
  V61 y-flip UPDATE (would double-flip) and the global obstacle DELETE
  (would wipe K2 rows)
- Swap DWG-tab underlays hall1<->hall5, hall2<->hall4
- All 5 generators now canonically map band = 6 - hall

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 06:53:55 +09:00
zio
0702b414bf feat(m2): V66 K2 hall 6-10 trench measured seed from CAD (65 channels, 941 points)
- Extract trench channels from original 1F site plan DWG (same origin as
  hall frames) via streaming DXF tag parser that walks xref BLOCK contents
  and resolves INSERT-chain transforms (missed by top-level iteration,
  which caused the earlier 'no trench layer in K2' misjudgment).
- Power trunk plan (E3-59~69) used as cross-validation only: its util-line
  xref is a cropped copy (x<=509.2m) with ~3.5m phase offset; angle
  clusters (0/+-11/-12 deg) confirm frame rotation alignment.
- Generator tools/cad/extract_trench_seed_k2.py: frame rotation, horizontal
  clip (Liang-Barsky), >=30m runs, 1.5m twin-line merge, 6m point sampling
  (V61 convention). H6 9 / H7 H8 H9 H10 14 channels each, is_assumed=false.
- All halls H1-H10 now have measured trench (PLANNING R4 resolved).
- Docs: cad-extraction.md V66 section, OWNER_FEEDBACK log.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 00:49:45 +09:00
zio
d80b761983 feat(m2): V65 measured exit positions + canvas real trench data
Owner directives 2026-07-16 (items 2-3 of follow-up batch).

- tools/cad/extract_exit_seed.py: boundary door clusters (+-2m band) from CAD
  DOOR layers projected onto hall edges -> V65 replaces assumed exits for
  H1-H8 (34 measured); H9/H10 keep assumed (0-1 boundary doors - low trust).
  Cross-validated against V63/V64 obstacle door strips (same source, matching)
- Canvas trench layer: renders real supply points (HallInfo.trenches, r=0.5m
  dots with supplies tooltip) when present; falls back to synthetic 9m grid

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 00:18:42 +09:00
zio
355016445b docs: owner log - dev-to-prod promotion verified (kintex.wise.ai.kr live, same artifact, smoke 13/13)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 00:04:35 +09:00
zio
7f86104c74 feat(m2): V64 K2 obstacle seeds - all 10 halls now obstacle-aware
Owner directive 2026-07-15: extend obstacle recognition to K2 (halls 6-10).

- tools/cad/extract_obstacle_seed_k2.py: same 1m-cell raster + row-strip
  method as K1, plus hall-frame rotation transform (+-11..12deg wings)
- 31 measured strips: edge doors, service-room walls, and the full-width
  midline door strips on H9/H10 = the A/B divider shutter tracks - the 1.0m
  door buffer keeps the shutter travel line clear (operationally correct)
- Layers: ELEVATOR, STAIR, DOOR, gypsum/lightweight-steel/cement-panel walls

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 23:45:14 +09:00
zio
ffa133aee5 feat(m2): V63 wall/stair/elevator/door obstacle recognition + avoidance
Owner directive 2026-07-15: recognize walls, stairs, elevators, doors, drywall.

- tools/cad/extract_obstacle_seed.py: rasterize hall floor into 1m cells over
  obstacle layers (WALL/DRYWALL/masonry/panel, STAIR, ELEVATOR, DOOR), connected
  components, row-strip decomposition (prevents bbox inflation of L-shaped
  thin wall runs) -> 60 measured rects for K1 halls 1-5
- V63: hall_obstacle table (kind: stair|elevator|door|wall) + seeds
- Engine: auto-layout reserves obstacles with kind-based buffer (door 1.0m
  approach clearance, others 0.3m)
- Canvas: structure layer renders obstacle rects (door tinted green);
  HallInfo.obstacles contract extension (additive)
- Limits recorded: wall strips not filled room interiors (perimeter margin +
  wall strips still block booth intrusion); K2 deferred (different layer set)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 23:38:29 +09:00
zio
6ff692c03f feat(m2): V62 measured pillar seed + auto-layout pillar avoidance
Owner directive 2026-07-15: extract pillars and make auto-placement avoid them.

- tools/cad/extract_pillar_seed.py: K1 pillars from CAD layer 4-COL-H
  (cross-validated against official drawing dims 54/117m south wall pillars);
  K2 H7-H10 from official drawing dimension annotations (one interior midline
  pillar each, dia 2.3m); H6 not seeded (no source - recorded as limitation)
- V62: hall_pillar table + 74 seeds; also corrects V61 trench y-axis
  (RT points were seeded in CAD-y without the top-of-drawing flip - now 63-y,
  generator fixed as the canonical form)
- Engine: autoGenerate reserves pillar radius + 0.6m buffer, packing skips
  overlapping cells; HallInfo.pillars contract extension (additive, NON_NULL)
- Canvas: structure layer renders pillar circles (editor passes hall pillars)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 23:09:11 +09:00
zio
6be091aa7c feat(m2): V61 measured trench seed for K1 halls 1-5 from CAD
Owner directive 2026-07-15: seed real trench coordinates.

- tools/cad/extract_trench_seed.py: deterministic generator - extracts trench
  channels from CAD layer 5-tranchi (spelling differs from expected), merges
  paired channel edges into centerlines, emits supply points every 6m
- Measured layout (identical across halls 1-5, cross-validating band alignment):
  7 horizontal channels per hall, 9.0m pitch, y=5.85..59.8m local,
  extent x[20.6..170.2]m
- V61: delete assumed grid points for H1-H5, insert 875 measured points
  (is_assumed=false); supply flags keep V5 policy; K2 stays assumed (no trench
  layer in its plan drawing - power trunk drawing analysis is follow-up)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 06:45:32 +09:00
zio
4e0e707257 docs: owner feedback log - K2 DWG renders complete (all 10 halls in DWG tab)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 02:35:30 +09:00
zio
832ab7f8a9 feat(m2): K2 halls 6-10 DWG underlays - DWG tab complete for all 10 halls
Owner directive 2026-07-15: render exhibition center 2 and complete the DWG tab.

- fast_render.py: --rotate/--center options (align tilted halls axis-straight);
  slim-DXF workflow notes (K2 plan 106MB DXF, basement xref/detail layers dropped)
- Hall geometry measured programmatically (long-line angle clusters) and verified
  visually: H6 -12deg 60x93, H7/H8 axis-aligned 90x126 stacked (block exactly
  252m = 2x126, floor width exactly 90m), H9 -11deg / H10 +11deg 99x132
- public/media/floorplans/dwg/hall6..10.png: floor+3m crops, calibration stays
  deterministic (same margin formula as K1)
- hallFloorplan.ts: DWG_HALL_DIMS extended to all 10 halls (rotation noted)
- docs/analysis/cad-extraction.md: K2 section with confirmed coordinates table

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 02:32:58 +09:00
zio
fc0c5acc0a docs: owner feedback log - DWG pipeline + DWG/JPG floorplan tabs (session 5 cont.)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 00:36:57 +09:00
zio
d8ef5c53df feat(m2): DWG/JPG floorplan underlay tabs + CAD extraction pipeline
Owner directives 2026-07-14~15: run the DWG pipeline; split floorplan into DWG and JPG tabs.

- tools/cad/dwg_extract.py: DWG(LibreDWG dwg2dxf) -> DXF -> layer inventory /
  keyword extraction / grid-label anchor detection (ezdxf, recover fallback)
- tools/cad/render_hall_png.py: render hall-band crops from the K1 combined
  plan+trench drawing (x0=293.5m, width 171m, Y bands 80.1m + 63m pitch,
  single load -> multi-crop). Real trench layout confirmed: 7 horizontal runs
  at ~9m pitch + central feeder (differs from assumed 6m grid seed - V61 later)
- public/media/floorplans/dwg/hall1..5.png: K1 hall underlays (3m margin crop,
  deterministic calibration from render params)
- Editor left panel new tool group with JPG/DWG tabs; DWG disabled for
  halls without CAD render yet (K2 pending). Canvas switches url+region.
- docs/analysis/cad-extraction.md: pipeline findings, limits (A3002 LibreDWG
  crash, band-to-hall numbering direction to confirm), next steps

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 00:35:12 +09:00
zio
d4bd4fb214 docs: PLANNING v3.5 (M2-1 easy auto-layout wizard) + design.md v2.6 (SCR-03/04 wizard, lightbox) + owner feedback log session 5
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:39:34 +09:00
zio
6c0d364fc9 feat(m2): floorplan tree selection + easy 3-step auto-layout wizard (real operation)
Owner directives 2026-07-14: select floorplan via tree (center > hall > zone),
generate booths inside it, images only on button click, zoom popup + save.

- V59: align hall width/depth to official floorplan orientation (all 10 halls
  were transposed vs drawings, e.g. H1 63x171 -> 171x63); re-derive assumed
  exits (V4 formula) and trench grid (V5 formula)
- V60: hall_zone tree table + drawing-measured zones (1A/1B, 6A/6B/6C, 7A/7B,
  8A/8B, 9B/9A, 10B/10A) - data as tree: center > hall > zone
- GET /api/halls/tree (HallTreeController) - selection tree for the wizard
- AutoLayoutRequest.zoneId: pack booths only inside the selected zone bounds
- S7 aerial preview is NO LONGER auto-published per option (Gemini quota);
  new POST .../auto-generate/preview publishes only on user button click,
  persisted in render_job for gallery re-view and auction reference reuse
- AutoLayoutDialog reworked as 3-step wizard (place > conditions > pick):
  per-option generate-aerial-image button, click-to-zoom lightbox with
  download/save, and REAL apply via POST /apply-option (was refetch-only -
  selected options were never persisted)
- FloorplanCanvas calibration: H8/H10 floor regions re-measured with
  union-of-blobs (center aisle split the color blob, bottom half only before)
- Editor toolbar hall selector (grouped by exhibition center)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:36:07 +09:00
zio
0cc7f26c56 feat(m2): place auto-generated booths inside the hall floorplan
Owner directive 2026-07-14: booths must be auto-placed inside the floorplan.

- hallFloorplan.ts: per-hall floor-region calibration [x0,y0,x1,y1] (auto-measured
  largest color blob of the exhibition floor in each crawled JPG, halls 1-10)
- FloorplanCanvas: align calibrated floor region to hall rect (0,0-W,H m) so booth
  coordinates land inside the drawn floor; raise underlay visibility (0.3 -> 0.55)
- BoothLayoutEditorPage: use real hall dims from LayoutDto.hall (was hardcoded 126x90),
  pass floorRegion; types.ts HallInfoDto added in previous commit
- FloorplanServiceImpl.packBooths: honor request conditions as reserved zones -
  central cross aisles (>=40m spans), entrance clear zones, stage/lounge blocks
  (previously mainEntranceCount/stageCount/loungeCount were ignored)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 22:59:31 +09:00
zio
c686365021 feat(live-demo): admin stats API, auction realtime ranking push, CMS scheduled publish
- AdminStatsController/AdminStatsDto: real-count admin metrics (SCR-16), SystemAccessGuard.requireAdmin
- AuctionRealtimeService: STOMP /topic/auctions/{id}/ranking broadcast after commit (public ranking only, sealed-bid safe), polling fallback kept
- CmsScheduledPublisher: 30s DB poller -> CmsService.runScheduledPublish (same path as manual publish), V58 partial index (idempotent)
- Frontend: AdminDashboardPage real stats wiring, AuctionDetailPage live ranking via websocket, CmsWorkflowPage schedule UI
- CmsServiceTest: constructor updated for AuditLogService

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 22:59:14 +09:00
zio
4fe3d18b7e docs: owner feedback log — session 4 backlog sweep (design v2.5, reviewer fixes, canvas pan/zoom, GAP re-adjudication)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 22:11:27 +09:00
zio
41503f7bb6 docs(audit): GAP_AUDIT re-adjudication 2026-07-14 — code gaps 0 remaining
- G-01~G-09 all verified resolved against live code/endpoints/Flyway V50~V56
- remaining items are roadmap-only: document HWP render, AppQr iOS (EAS G3)
- UNDEVELOPED_BACKLOG: lead AI rescore + CMS AI translation marked shipped

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 22:06:45 +09:00
zio
1c4edb0cd8 feat(m2): floorplan canvas wheel zoom + left-drag pan (owner directive 07-14)
- non-passive wheel listener zooms 0.3x~4x, synced to page zoom state via
  new onZoomChange prop (wired in BoothLayoutEditorPage)
- pointer-capture left-drag pans the canvas; 3px threshold and click-capture
  suppression so a drag never mis-fires booth select/deselect
- grab/grabbing cursor, transition off while panning, touch-action none

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 22:06:45 +09:00
zio
3f479a93cb fix(ui): resolve reviewer backlog R13-01, R15-02, R17-01, R17-02 + stale comments
- R13-01: SCR-13 revenue trend now renders AI forecast as dashed area —
  client-side least-squares linear regression, 2-month horizon, bridge point,
  AiLabel + note; skipped gracefully under 3 data points
- R15-02: SCR-15 category default is now visible — categoryDefaulted flag
  renders a '기본값' badge with tooltip instead of silent 'exhibition'
- R17-01: SCR-17 adds §8 system icon library — auto-enumerates icons.tsx
  line-SVG set (namespace import, self-syncing)
- R17-02: CHART.warning renamed CHART.violationWarn (value unchanged),
  ReportPage usage updated
- hygiene: MeetingPage/MultilingualCmsPage header comments updated to reflect
  shipped STT + AI-translation wiring (stale '미배선' removed)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 22:06:23 +09:00
zio
d548044f34 docs(design): design.md v2.5 — resolve designer backlog B-01, B-04~B-08, B-10
- B-01: SCR-06 assembled-booth mode (signage/furniture/lighting option panels,
  option quote, deadline lock states, dedicated Stitch prompt) + SCR-05 branch
- B-04: screen count re-audit — P0 core 15, total 89 screens (SCR-T0~T3 included)
- B-05: organizer sitemap gains 정산·결제 [M9] entry, SCR-02 IA memo
- B-06: SCR-01 prompt adds email-verification login tertiary button
- B-07: SCR-03 share button in prompt + violation pins aligned 1:1 with summary
- B-08: SCR-04 sales area corrected 4,420 -> 4,590㎡ (510 booths x 9㎡)
- B-10: Phase 2/3 labels on SCR-10/11, SCR-M1/M2; M4a lighting UI review memo

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 22:06:05 +09:00
zio
f7256a0c56 fix(auth): global ADMIN has full permissions; member role no longer masked by hm flag
Owner: 'admin은 모든 권한'. requireRole(ORGANIZER)-style endpoints 403'd for
admin because roleFor() returned HALL_MANAGER (hm/ADMIN flag) even when the
user held an explicit ORGANIZER membership.
- EventAccessGuard.requireRole: isAdmin() bypasses the allowed-role set
  (tenant boundary still enforced)
- KintexPrincipal.roleFor: explicit event membership role wins; HALL_MANAGER
  only as fallback
- HallAssignController: ADMIN allowed alongside hall manager

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 21:52:34 +09:00
zio
8719d110f3 fix(m2): floorplan studio — real hall drawing underlay + 404 as empty start state
Owner report: '도면이 안나온다 / 도면을 불러오지 못했습니다'.
- Canvas now renders crawled hall drawings (hall1-10.jpg, build-bundled per
  V46 poster pattern) as blueprint-tone underlay beneath booth polygons;
  hides gracefully on load failure.
- GET layout 404 (no saved layout for the hall) no longer shows a hard error
  screen — enters empty canvas with 'AI 자동배치로 시작' CTA instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 21:35:46 +09:00
zio
7a735a4c71 fix(ui): approval queue grid — remove fixed-viewport clipping, flow with page scroll
Owner directive: grids must render fully without internal scrollbars
(pagination handles row counts). .kx-aq was the only data-grid shell with
height:100% + overflow:hidden/auto clipping; now page-flow with sticky side.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 21:35:45 +09:00
zio
7b861a4af2 docs: log Gemini paid-tier E2E and render completion-loop fixes (session 3)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 21:04:50 +09:00
zio
b5d29e6061 fix(m5): close render completion loop — worker HTTP callback + /renders static serving
Worker published only Redis pub/sub events; backend status stayed QUEUED
forever (callback endpoint never called — gap masked by earlier Gemini 429).
- worker.py: POST /api/internal/render/callback (X-Worker-Token) after each
  job with imageUrl=/renders/{key}, schemaHash, modelVersion, errorMessage
- backend: serve /renders/** from RENDER_OUTPUT_DIR + security permit

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 20:52:54 +09:00
zio
9099f7d0d4 docs: SPF/DKIM audit — chain healthy, PTR missing is the one gap (ISP action)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 07:38:52 +09:00
zio
4e7e2d3981 docs: log EDM live-send E2E and unsubscribe-link test results
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 07:30:30 +09:00
zio
911572c1a8 docs: mark demo recipient email cleanup resolved (V56)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 07:14:21 +09:00
zio
a03f9d4de8 fix(seed): make demo EDM recipients deliverable via owner plus-addressing (V56)
All @kintex.test seed addresses bounce now that live send is open.
Replace them with ythong86+<registrationId>@gmail.com so live-send E2E
actually delivers — every address routes to the owner's own inbox; no
third-party real addresses are introduced. Idempotent (post-update the
LIKE predicate matches nothing).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 07:13:02 +09:00
zio
1463a69dca docs: record EDM live-send opening (env + UI double-confirm)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 07:09:28 +09:00
zio
0892bbfb07 feat(marketing): open EDM live send — double-confirm UI path (live=true)
Server EDM_TEST_MODE flipped to false (env, owner request), so the UI
gains an explicit live-send button: existing button stays as safe test
send, live send requires an audience-count warning confirm plus typing
LIVE. sendMut now carries {id, live}; i18n keys x4 locales.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 07:09:27 +09:00
zio
1e15173fd4 docs: log EDM test send (SMTP auth env fix) + close 1.5/1.10 backlog, refresh pending list
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:57:12 +09:00
zio
e47fb0f8aa fix(marketing): honest send-result wording — queued counts, mail_log is source of truth
sentCount tallies async queue submissions, so SMTP failures (e.g. the
2026-07-14 MailAuthenticationException) were invisible in the response.
Meta now says 'N queued, see send history' for both test and live paths.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:57:12 +09:00
zio
b3d3a5588c style(ui): finish Nifty component alignment + grey border token sweep (backlog 1.5/1.10)
Buttons gain Nifty size scale/icon-only/group/focus ring (additive,
md default unchanged); .kx-select gets kx caret + hover/focus/disabled
states; .kx-menu and .kx-list-group canonical patterns added. Undefined
/hardcoded border vars converge on --color-neutral-200 (theme-aware);
hallassign primary-hall accent moves off-palette blue to
--color-primary-600. Print border and recharts tooltip intentionally
excluded (documented exceptions).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:57:11 +09:00
zio
ffeb251194 docs: log 2026-07-14 session 2 (crash-loop chain, session rehydration, UI fixes, feature batch)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:30:29 +09:00
zio
c664743087 docs(demo): refresh AI demo deck for new AI slices
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:26:52 +09:00
zio
216f3720a1 feat(render): booth render history gallery (G-09)
History endpoint over render_job (DONE only) with covering index V54;
design studio shows a per-booth history gallery with watermark intact.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:26:52 +09:00
zio
23ff7d1799 feat(document): report PDF generation with embedded NanumGothic (G-05)
openhtmltopdf renderer with bundled NanumGothic for Korean text;
report authoring page gains PDF download wired to the new endpoint.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:26:52 +09:00
zio
660568f332 feat(cms): AI translate for multilingual content (Claude-routed)
CmsService translate path returns per-locale drafts with degraded
fallback; multilingual CMS page gets an AI translate action. Service
test updated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:26:51 +09:00
zio
a836b79852 feat(account): my-page profile, password change and notification prefs (G-08)
AccountSettings endpoints (profile update, password change with current
-password check, notification preference toggles persisted via V55;
absent row = server defaults all-on). MyPage wires the settings UI.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:26:50 +09:00
zio
cf431a8809 feat(marketing): EDM real send with consent, unsubscribe and history (G-04)
Consent-filtered recipient resolution, SMTP send with test-mode ON by
default (EDM_TEST_MODE, campaign cap, per-minute rate), opaque
unsubscribe tokens with a public unsubscribe endpoint (no PII in
URLs/logs), and per-campaign send history via V53.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:26:32 +09:00
zio
0922e5660b feat(search): AI natural-language search over work data (grounded)
SearchAiService interprets the query via AiTextRouter and grounds
results on existing search providers; degraded fallback keeps plain
search working when AI is unavailable.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:26:31 +09:00
zio
ef7400632e feat(meeting): audio upload + STT + AI minutes generation (G-06)
Meeting recording upload (<=20MB, multipart cap raised to 25MB),
configurable on-prem whisper STT (empty URL = degraded fallback),
Claude-routed minutes generation with action-item drafts, transcript
persisted via V52 for re-generation. Frontend meeting page wires the
record->transcribe->minutes flow (shared workAiApi client).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 06:26:30 +09:00
zio
3c8058546e fix(ui): stop table/grid clipping — min-width:0 + overflow-x sweep
Root cause: flex/grid children default min-width:auto let wide tables
blow out their track instead of scrolling, and .kx-dash__table-wrap
clipped with overflow:hidden. Converge the fix on the canonical
wrappers (.kx-table-scroll, .kx-dt) plus four screens lacking a scroll
wrapper (dashboard, admin matrix, settlement modal/report, hallassign
quote).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 02:25:18 +09:00
zio
a3fdb62fc6 feat(shell): left-nav menu search (UIWS NavSearch pattern) + accordion alignment
Adds a menu search box above the nav (match-highlight, Escape/clear
restores the accordion, track/admin gates preserved). Single-open
accordion with route-driven active group confirmed per owner request.
i18n keys shell.menu.search.* added across ko/en/ja/zh.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 02:25:17 +09:00