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>
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>
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>
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>
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>
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>
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>
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>
Token lives in sessionStorage but user/workspaces existed only in the
zustand store, so any full reload left workspaces=[] and every
event-scoped screen fell to 'select an event' with an empty selector.
RequireAuth now restores /api/auth/me + /api/auth/workspaces once when
authenticated with an empty store, and logs out on 401.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PostgreSQL cannot infer the type of a bare bind in '(? IS NULL OR col = ?)',
failing GET /api/admin/messages with BadSqlGrammarException. Cast the
null-check occurrence to ::text (findAll category/locale, delete locale).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Unescaped <= at findProducts/findProduct broke SqlSessionFactory XML
parsing, crashing every new jar at startup; deploy rolled back to the
pre-V50 jar, so V50/V51 never reached prod and the admin demo account
lost event membership again (floorplan menu fell back to /home).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Records the AI feature slices, demo deck/sample-data registration,
Gemini free-tier quota blocker, and the confirmed CI/CD defect: a
3-day-old deploy_server.py process held port 9999 with pre-clean-build
kintex logic, shipping stale jars on two consecutive deploys. Fixed by
restarting zioinfo-deploy; jar-content verification added to the gate
checklist. This push also retriggers the pipeline on fresh code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
10-slide PPTX (docs/demo/AI_DEMO_SCRIPT.pptx): env/accounts, 4 demo
flows with concrete input examples (NL auto-layout phrases, ReRoom
sample photo at /downloads/demo/sample_booth.jpg, NL-query/rules-chat
questions), pre-demo checklist (Gemini paid-tier action item) and
fallback troubleshooting. Hook commands in .claude/settings.json now
use forward slashes - backslashes were eaten by the sh hook runner.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Floorplan/dashboard scoped menu resolves the target event from the
user workspaces; admin had zero event_member rows so clicks silently
landed on /home (perceived broken link). Idempotent V51 enrolls admin
as ORGANIZER of e-2026-live and e-2026-smf.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
POST .../auto-generate/interpret parses NL conditions into a clamped
AutoLayoutRequest via AiTextRouter (Claude, injection-guarded JSON-only
prompt; degraded:true fallback keeps manual form authoritative).
auto-generate?ai=true attaches metric-grounded pros/cons per option
(generation never blocked by AI failure). AutoLayoutDialog gains an NL
input bar + interpreted-note + AI summary cards with WISE AI label.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
auction/visitor/marketing sample data + cms.css headers now state the
real wiring status (live API primary, samples are degraded fallback
only; G-04 SMTP follow-up noted). Mark hygiene item resolved in
GAP_AUDIT.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace hand-rolled zebra tables with KxDataTable (sort/filter/CSV,
per-column control) on HolidayAdminPage, ProgramAdminPage and
RulesetVersionsPage. Manage columns excluded from CSV/sort/search;
empty states delegated to the table.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replace hardcoded TENANTS array and disabled add button with live
GET/POST /api/admin/tenants via react-query: list states, create modal
(server-authoritative validation mirrored client-side), KxDataTable
search/sort/CSV. tenant.* i18n 17 keys x 4 locales (parity kept).
Mark G-01 resolved in GAP_AUDIT.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
EAS preview APK is staged at /opt/kintex/downloads and reinjected into the
web root during deploy, keeping /downloads/kintex.apk (QR install page) alive.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Normalize 13 custom page roots to the .kx-page canon (flex:1, min-width:0,
overflow-y:auto) fixing right-side dead space and bottom clipping inside the
shell content flexbox; add missing narrow-width breakpoints to settlement KPIs
and hall-assignment forms. No visual redesign - WISE shell and kx tokens intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Remote main was force-rewritten by the deploy pipeline into a single snapshot
commit built from local 0add2cd/490b723. Local HEAD supersedes it (deliverables
docs, icons.tsx, title-icon sweep, gitignore, solution-name fix), so this merge
keeps the local tree verbatim while preserving the remote commit in history.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- PublicShell: track tabs get icons + title tooltips (right-aligned), login link restored at >=768px
- VisitorTrackPage: wayfinding/checkin CTAs point to #guide/#transport//tickets/lookup instead of /login
- accent buttons: enforce --color-on-accent (white text) across approval/docs/home/movein/schedule/work/public
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
KintexPrincipal.hasAccess/roleFor ignored global role_code=ADMIN, so
admin@ users got 403 on all event-scoped endpoints. Add isAdmin() and
treat ADMIN as hall-manager equivalent (all-event read + approve).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- HomePage: wire fetchHolidaySet, is-holiday cell class + holiday name label
- home.css: is-holiday red daynum, kx-home__cal-holiday-name, neutral-100 grid lines
- PublicShell: absorb 3-track switcher into single top header (COEX 1-frame), drop dark topbar
- public.css: remove .kxp-topbar styles, tracktabs bar/menu variants
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>