diff --git a/documentation/TODO__Agents.md b/documentation/TODO__Agents.md
index ab68e5da..d9f728a1 100644
--- a/documentation/TODO__Agents.md
+++ b/documentation/TODO__Agents.md
@@ -3,8 +3,60 @@
> **Status:** Stable β ongoing development.
> **Scope:** Active/open work only. Completed detail lives in archive files.
-## π΄ CMSC Charlotte β May 27 (Presentation Management)
-**Post-show hardening only**
+## π΄ LCI October β Pres Mgmt Restoration (in progress 2026-06-12)
+
+These features regressed over the last 6 months and must be working before the LCI conference.
+Reference commit for original working implementation: `bb993a102`.
+
+### Session POC (Champion/Moderator) β `session_view.svelte`
+
+**Root cause of visible bugs:** The POC section is placed *below* the session hero card as a
+separate disconnected block. In the original it was part of a structured `
` with the session
+name, code, datetime, location, and description all together. The current layout looks and feels
+wrong to users.
+
+- [x] **[Pres Mgmt] POC section β move inside session hero card** (2026-06-12)
+ Restructured hero card as a `` with datetime, room, and POC as rows inside the card.
+ Session name and code are now always visible (not just in edit_mode β that was a bug).
+
+- [x] **[Pres Mgmt] POC assignment β "Select Person" flow broken** (2026-06-12)
+ Gated the select editor on `person_options_loaded` (`Object.keys($slct.person_obj_kv).length > 0`).
+ "Select Person" button renders as "Reload Person" after list is loaded.
+
+- [x] **[Pres Mgmt] Email Session POC sign-in link β UI missing** (2026-06-12)
+ Restored email button in POC row with `sending/sent/error` state feedback.
+ Shown when `require__session_agree && show__email_access_link && poc_person_primary_email`.
+
+- [x] **[Pres Mgmt] Copy Session POC access link β UI missing from session view** (2026-06-12)
+ Restored inline `MyClipboard` copy button in POC row for trusted staff.
+ Shown when `show__copy_access_link && trusted_access && poc_sign_in_url`.
+
+### Presenter Sign-In
+
+- [ ] **[Pres Mgmt] Presenter email sign-in link routes to wrong page**
+ `email_sign_in__event_presenter()` builds a URL to `/presenter/[id]?person_id=...&person_pass=...`.
+ The URL param parser (`sign_in_out.svelte`) is only mounted on the *session* page menu, not the
+ presenter page. A presenter clicking their email link lands on their page with no auth granted.
+ Fix: mount `Sign_in_out` in `presenter_page_menu.svelte` (same way session menu does it), or
+ change the email link to route to the session page (which already has the parser) and include
+ the presenter/presentation IDs as params β which is how it worked originally.
+
+- [ ] **[Pres Mgmt] Presenter agreement not enforced before file upload**
+ `require__presenter_agree` is stored and displayed but the upload components are gated on
+ `auth__kv.presenter[id]` only, not on `presenter.agree`. A presenter who signs in but has not
+ agreed can still upload. The original blocked the upload section until `agree === true`.
+
+### Session POC Sign-In
+
+- [ ] **[Pres Mgmt] `session_page_menu.svelte` sign-in prop still wrong**
+ `event_session_id` prop passed to `Sign_in_out` was just changed from `event_id` to
+ `event_session_id` β verify this is actually `$lq__event_session_obj?.event_session_id`
+ (the real session ID string) not the URL param `url_session_id`. The sign-in component
+ uses this value to set `auth__kv.session[event_session_id]`.
+
+---
+
+
- [ ] **[Launcher/Electron] Wallpaper reliability (post-CMSC)**
- [ ] Use timestamp/randomized temp filename so macOS always sees a new path.
diff --git a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.svelte b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.svelte
index e92aace4..84c7501c 100644
--- a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.svelte
+++ b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/+page.svelte
@@ -87,6 +87,23 @@ let lq__event_obj = $derived(
liveQuery(async () => await db_events.event.get(url_event_id))
);
+// Sync server-side pres_mgmt config into local PersistedState.
+// WHY: this page is often reached directly by URL without first visiting the
+// pres_mgmt overview, which is the only other place this sync runs. Without
+// it, pres_mgmt_loc.current keeps stale values (e.g. hide__session_poc=true)
+// that make POC assignment and other edit controls invisible to staff.
+$effect(() => {
+ const remote_cfg = $lq__event_obj?.mod_pres_mgmt_json;
+ if (remote_cfg) {
+ untrack(() => {
+ events_func.sync_config__event_pres_mgmt({
+ pres_mgmt_cfg_remote: remote_cfg,
+ log_lvl: 0
+ });
+ });
+ }
+});
+
// $derived.by: capture only the specific ID so that unrelated store changes
// don't needlessly recreate the liveQuery observable.
let lq__event_presenter_obj = $derived.by(() => {
diff --git a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__event_session_poc_profile.svelte b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__event_session_poc_profile.svelte
index 58213ed8..98f0485c 100644
--- a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__event_session_poc_profile.svelte
+++ b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__event_session_poc_profile.svelte
@@ -1,31 +1,16 @@
{#if $lq__event_session_obj}
- {#if $lq__event_session_obj.poc_person_id_random && $ae_loc.trusted_access}
+ {#if $lq__event_session_obj.poc_person_id && $ae_loc.trusted_access}
@@ -90,7 +68,7 @@ let clipboard_success = $state(false);