Proposal persistence (layout versions incl status=proposal) inflated
booth KPI to 1589/600 - count only latest non-proposal version per hall.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- schedule: MiniCalendar removed per owner; AsideMonthNav keeps month cursor for hall widgets
- dashboard hero: overflow moved to .kx-timeline-scroll wrapper so the section never shows scrollbars
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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>
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>
- 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>
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>
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>
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>
- 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>
- 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>
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>
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>
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>
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>
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>
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>
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>