diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md
index 8d41e4e4..15c52b8f 100644
--- a/PROJECT_STATE.md
+++ b/PROJECT_STATE.md
@@ -1,6 +1,6 @@
# ThothII — Project State
-Last updated: 2026-09-06.
+Last updated: 2026-09-24 (slide 11 PNG numbering aligned with popups).
This file is the short operational snapshot. Stable commands and the architecture mental model
live in `AGENTS.md`; current design and runtime contracts live under `docs/architecture/`,
@@ -12,6 +12,45 @@ Authentik, internal catalog/embedding services, and the PSD workspace repository
`docs/operations/server-upgrade-gitea-workspace-v2.md`. Treat its operator gates and rollback
requirements as mandatory; do not replace the running server stack in place.
+## Presentation publishing
+
+Presentation PNG source (user instruction, 2026-09-23): all PNGs to import come from
+`/Users/mp/Desktop/ScreenshotPresentation/ThothIIScreens/`. This is the verified on-disk
+path the user refers to as `desktop/screenshot/presentation/thothIIscreens`.
+Copy supplied files unchanged into `presentation/deck/screenshots/thothii/`, preserving
+their embedded annotations. The 12 slide 11 PNGs are numbered `01` through `12` in
+popup order, in both the source folder and the deck. The first popup uses
+`01-StartingPoint.png`; popup 2 uses `02-Disambiguation01.png`. Refresh the image
+cache version when replacing a PNG. During the current editing session, refresh both
+operational browser windows after every modification, as explicitly requested.
+Popup 3 uses `03-DisambiguationFinal.png`, popup 4 uses `04-SchemaLinking01.png`,
+and popup 5 uses `05-CloseSchemaLinking.png`. Popups 6–12 are CTE planning, CTE 1,
+Final SQL, Datamart, Saving memory, Final step, and Back to start.
+The HTML references PNGs by relative URL: they are external static assets, not
+compiled or embedded. Keep `presentation/deck/screenshots/thothii/` with the deck;
+the Desktop source folder is not a runtime dependency.
+On 2026-09-23, the complete source folder was backed up to
+`/Users/mp/Desktop/ThothIIScreens-backup-20260923-FkCqV3/` and verified by SHA-256.
+The four unused PNGs (original prefixes 02, 05, 09, and 10) were removed from the
+source folder and, on 2026-09-24, from the deck after verifying backup equality.
+The backup retains all 16 original PNGs under their original names. Renumbering
+preserved each file's bytes; the existing Starting point images in the source and
+deck differ and were each retained unchanged.
+On 2026-09-24, annotated PNGs 08–12 were updated directly in the deck and verified
+visually; these deck copies are newer than the Desktop source copies. Preserve
+them when importing images. Their image cache version is `v=5`. Presenter notes
+for popups 09–12 are also updated in `presentation/deck/index.html`. The two Snagit
+comment boxes in PNG 12 share the same horizontal centre (1676.5 px in the
+3830 px source image); their text is centred within each box.
+
+The user confirmed the public AritmoLab presentation and presenter console working on
+2026-09-20. Updates use the `feat/ai-etl-presentation` branch on Gitea: commit and push
+locally, then the user runs `git pull --ff-only origin feat/ai-etl-presentation` in
+`/var/www/aritmolab/presentation` on the remote server. No SSH tunnel is available;
+the user can operate an authenticated remote terminal in VS Code. Nginx routes are
+already configured, so ordinary slide updates need no Nginx reload. Exact URLs,
+paths, checks and cache behavior: [Presentation publishing](docs/operations/presentation-publishing.md).
+
## Current product shape
ThothII is a human-in-the-loop datamart builder with three independently built layers:
diff --git a/docs/operations/presentation-publishing.md b/docs/operations/presentation-publishing.md
new file mode 100644
index 00000000..fdc24a45
--- /dev/null
+++ b/docs/operations/presentation-publishing.md
@@ -0,0 +1,105 @@
+# Updating the AritmoLab presentation
+
+Last confirmed by the user: 2026-09-20, after deploying commit `5217c574`.
+The user reported both the presentation and presenter console working. This is
+the static presentation deployment, separate from the ThothII application stack.
+
+## Locations
+
+- Local worktree: `/Users/mp/projects/ThothII-presentazione`.
+- Source: `presentation/deck/` and `presentation/presenter/`.
+- Git remote: `origin`, `https://git.tylconsulting.it/mptyl/ThothII.git`.
+- Publication branch: `feat/ai-etl-presentation`.
+- Remote checkout: `/var/www/aritmolab/presentation`.
+
+Presentation:
+
+```text
+https://aritmolab.policlinicosandonato.it/presentation/
+```
+
+Presenter console:
+
+```text
+https://aritmolab.policlinicosandonato.it/presentation/presenter/
+```
+
+Give these URLs as copyable plain text when providing instructions: the user
+reported difficulty clicking Markdown links.
+
+## Routine update
+
+1. In the local worktree, review and validate the requested presentation changes,
+ then commit and push the intended files to `origin/feat/ai-etl-presentation`.
+ Include new images, styles, scripts and presenter files. A remote pull cannot
+ receive changes that remain uncommitted or unpushed. Leave unrelated changes alone.
+2. The user connects to the remote server and runs:
+
+ ```bash
+ cd /var/www/aritmolab/presentation
+ git branch --show-current
+ git status --short
+ ```
+
+ Continue only when the branch is `feat/ai-etl-presentation` and there are no
+ unexpected local changes. If either differs, inspect before updating; do not
+ reset, discard files or merge the presentation branch into another branch.
+
+ ```bash
+ git pull --ff-only origin feat/ai-etl-presentation
+ git log -1 --oneline
+ ```
+
+3. Refresh both browser windows. Static responses advertise
+ `Cache-Control: public, max-age=300`, so a browser may reuse assets for five
+ minutes. Use a hard refresh if the old version remains visible; bump asset
+ query versions when changing cached JavaScript or CSS.
+4. When network access is available, verify the expected version at both URLs,
+ including screenshots and synchronization of presenter and audience popups.
+ Distinguish a successful Git push from a completed remote deployment.
+
+Changes to slides, notes, images, CSS and JavaScript need no build, application
+restart or Nginx reload. A reload is necessary only if Nginx configuration changes.
+
+## Remote access
+
+The site was reachable from the user's Mac while connected to the VPN.
+Do not use SSH tunnels for this deployment. A non-interactive direct SSH attempt
+on 2026-09-20 failed authentication. The user offered an authenticated SSH session
+inside VS Code, then chose to execute the remote commands personally. The normal
+workflow is to push locally and provide the remote pull command to the user;
+do not assume autonomous remote access or ask for passwords in chat.
+
+## Nginx routing already configured
+
+The existing `/presentation` route redirects to `/presentation/`.
+The user supplied the original deck alias and subsequently confirmed successful
+setup of the two additional routes for the console:
+
+| URL prefix | Filesystem alias |
+| --- | --- |
+| `/presentation/` | `/var/www/aritmolab/presentation/presentation/deck/` |
+| `/presentation/deck/` | `/var/www/aritmolab/presentation/presentation/deck/` |
+| `/presentation/presenter/` | `/var/www/aritmolab/presentation/presentation/presenter/` |
+
+These are sibling `location ^~` blocks within the site's `server` block. The
+specific `deck/` route supports the console's relative links to fonts and slide
+iframes. The configuration filename was not recorded.
+
+The presentation is intentionally public static content, bypassing Django and
+Authentik. Preserve its existing routing and protections: directory listings off,
+`index index.html`, GET/HEAD only, five-minute cache, `nosniff`, `SAMEORIGIN`, and
+`noindex, nofollow, noarchive`. Do not expose the entire repository or change
+unrelated application routes.
+
+Only if routing needs diagnosis:
+
+```bash
+sudo nginx -T 2>/dev/null | grep -n -A 12 -B 3 '/presentation'
+```
+
+Only after an intentional configuration edit:
+
+```bash
+sudo nginx -t && sudo systemctl reload nginx
+```
diff --git a/presentation/deck/index.html b/presentation/deck/index.html
index 22ab1d30..2d7b8134 100644
--- a/presentation/deck/index.html
+++ b/presentation/deck/index.html
@@ -8,7 +8,7 @@
-
+
@@ -508,7 +508,7 @@
The portal, today
AritmoLab — a quick tour
-
+
@@ -602,14 +602,111 @@
ThothII, step by step
From question to datamart — the app
-
-
screenshot
screenshot
screenshot
-
screenshot
screenshot
screenshot
+
+
+
+
+
+
+
+
+
+
+
+
+
-
[MP: 6-7 real screenshots of ThothII — ask, review SQL, datamart, dashboard]
+
Select a screen to enlarge · Follow the tour from 1 to 12
-
+
@@ -673,7 +770,7 @@
-
+
+
+
diff --git a/presentation/presenter/presenter.css b/presentation/presenter/presenter.css
index a51e9bb4..925bef50 100644
--- a/presentation/presenter/presenter.css
+++ b/presentation/presenter/presenter.css
@@ -37,6 +37,7 @@ h2 { margin: 0; font-size: 16px; font-weight: 600; white-space: nowrap; } #count
.popup-group-lens .popup-buttons:has(> button:nth-child(4):last-child) { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.popup-group-screenshot { grid-column: 1 / -1; }
.popup-group-screenshot .popup-buttons { grid-template-columns: repeat(7, minmax(0, 1fr)); }
+.popup-group-screenshot .popup-buttons:has(> button:nth-child(12):last-child) { grid-template-columns: repeat(6, minmax(0, 1fr)); }
#popup-controls .popup-group-screenshot button { justify-content: center; }
.popup-group-screenshot button > span { display: none; }
#popup-controls .popup-group-lens button { flex-direction: column; justify-content: center; text-align: center; }
diff --git a/presentation/presenter/presenter.js b/presentation/presenter/presenter.js
index b95a3e7e..362ce9d6 100644
--- a/presentation/presenter/presenter.js
+++ b/presentation/presenter/presenter.js
@@ -13,12 +13,13 @@
let nextPreviewReady = false;
let slides = [];
let current = null;
+ let currentNoteKey = null;
let audience = null;
let lastAudienceSeen = 0;
let lastPreviewSeen = 0;
let notesSize = 25;
let blocked = false;
- const urlFor = role => `../deck/index.html?view=${role}&session=${encodeURIComponent(session)}`;
+ const urlFor = role => `../deck/index.html?v=18&view=${role}&session=${encodeURIComponent(session)}`;
const pad = value => String(value).padStart(2, '0');
function showNoteLens(event) {
const cue = event.target.closest('[data-note-lens]');
@@ -101,7 +102,8 @@
$('notes-number').textContent = `SLIDE ${pad(state.index + 1)}`;
$('notes-title').textContent = slide.title;
// Trusted, same-origin authored notes, never channel-provided HTML.
- renderNotes(slide.notes);
+ if (!slide.popupNotes?.length) renderNotes(slide.notes);
+ currentNoteKey = null;
$('reading').scrollTop = 0;
$('next-title').textContent = slides[state.index + 1]?.title || 'End of presentation';
updateNextPreview();
@@ -148,6 +150,18 @@
}
}
}
+ if (slide.popupNotes?.length) {
+ // Keep the last selected notes readable when its screenshot is closed.
+ const note = slide.popupNotes.find(note => state.popup?.kind === 'screenshot' && note.key === state.popup.key)
+ || slide.popupNotes.find(note => note.key === currentNoteKey)
+ || slide.popupNotes[0];
+ if (note.key !== currentNoteKey) {
+ currentNoteKey = note.key;
+ $('notes-title').textContent = note.title;
+ renderNotes(note.html);
+ $('reading').scrollTop = 0;
+ }
+ }
$('popup-controls').querySelectorAll('button').forEach(button => {
button.setAttribute('aria-pressed', String(state.popup?.kind === button.dataset.kind && state.popup?.key === button.dataset.key));
});
@@ -194,7 +208,7 @@
updateNextPreview();
});
// No session token: the thumbnail must never navigate or publish to the audience.
- nextPreview.src = '../deck/index.html?view=thumbnail#/1';
+ nextPreview.src = '../deck/index.html?v=18&view=thumbnail#/1';
const stage = document.querySelector('.stage');
function sizeCurrentPreview() {
const style = getComputedStyle(stage);
diff --git a/presentation/prototype/deck-overview.html b/presentation/prototype/deck-overview.html
index b6248188..e72eecf7 100644
--- a/presentation/prototype/deck-overview.html
+++ b/presentation/prototype/deck-overview.html
@@ -31,6 +31,7 @@
Deck overview — 14 slides · AritmoLab
Live previews of /deck/index.html · click any slide to open it full-size, then flip with the arrow keys.
+
Open presenter console · Speaker notes, interactive preview and a separate audience window.