After saving tenant config, the unrestrictedMode form state variable
was not updated from the server response. This could cause UI
inconsistency where the hasChanges check gets confused about the
current vs saved state.
https://claude.ai/code/session_01Xcix9bwMXijqN7xa57Vko6
1. Gather rules edit: ensure expandedRuleId is explicitly set in
startEditing() so the card stays expanded when entering edit mode.
Add stopPropagation to Export/Edit/Delete action buttons as a
defensive measure against click event bubbling.
2. Add missing EnrollmentSummaryLaunchRetrySeconds to both
ConvertToTableEntity and ConvertFromTableEntity in
TenantConfigurationService - this property was never persisted
to Azure Table Storage.
https://claude.ai/code/session_01Xcix9bwMXijqN7xa57Vko6
1. UnrestrictedMode was not persisted to Azure Table Storage because
it was missing from both ConvertToTableEntity and ConvertFromTableEntity
mappings in TenantConfigurationService.
2. GatherRule toggle/edit destroyed rule data: the toggle sent only
{ enabled: bool } which deserialized with IsBuiltIn=false, causing
the backend to store a near-empty custom rule instead of updating
the rule state. Fixed by checking global rules for type determination
in UpdateRuleAsync (backend) and including isBuiltIn/isCommunity in
the toggle payload (frontend).
3. GatherRule edit payload was missing enabled/author/createdAt, causing
edits to reset the enabled state to false and lose metadata.
https://claude.ai/code/session_01Xcix9bwMXijqN7xa57Vko6
Dual-table approach keeps Sessions table unchanged (O(1) point queries)
and adds SessionsIndex with inverted-tick RowKey for efficient time-sorted
listing and cursor-based Load More. Includes auto-migration strategy.
https://claude.ai/code/session_015CiKa2WSHQ4C3pvXcPJ8Ww
Plan for cursor-based pagination: change RowKey from SessionId to
invertedTicks_SessionId so Azure Table Storage returns newest sessions
first natively, enabling efficient $top=100 queries and Load More.
https://claude.ai/code/session_015CiKa2WSHQ4C3pvXcPJ8Ww
Convert page.tsx from "use client" to a Server Component so crawlers
and users without JavaScript see the full page content instead of just
a loading spinner.
Extract interactive parts into small Client Components:
- AuthGate: handles auth redirect + loading overlay (no longer blocks SSR)
- LoginButton: wraps login() calls
- PlatformStats: fetches live stats, SSRs with defaults
Move CSS animations (stepReveal, dotPulse) from styled-jsx to globals.css
so they work in Server Components.
https://claude.ai/code/session_01BwtFQovtdDWzUcykXQuMYp
Document the approach to convert the landing page from a full
"use client" component to a Server Component, so crawlers and
users without JavaScript see the complete page content.
https://claude.ai/code/session_01BwtFQovtdDWzUcykXQuMYp