# ArchiTools — Session Log

> Newest sessions first. Each AI session appends an entry at the top.

---

## Session — 2026-03-08 (GitHub Copilot - Claude Opus 4.6)

### Context

ParcelSync module development continuation — owner search, UAT dashboard, eTerra health check/maintenance detection. Documentation update.

### Completed

- **ParcelSync — Owner Name Search:**
  - New `searchImmovableByOwnerName()` method in `eterra-client.ts` — tries personName/titularName/ownerName filter keys
  - New `/api/eterra/search-owner` API route — DB search first (enrichment ILIKE with `unaccent()`), eTerra API fallback
  - UI: mode toggle (Nr. Cadastral / Proprietar) in Search tab, owner results with source badges (BD/eTerra)
  - Relaxed search tab guard: only requires UAT selection (not eTerra connection)
  - Commit: `6558c69`

- **ParcelSync — Per-UAT Analytics Dashboard:**
  - New `/api/eterra/uat-dashboard` API route with SQL aggregates (area stats, intravilan/extravilan, land use, top owners, fun facts, median area via PERCENTILE_CONT)
  - New `uat-dashboard.tsx` component — CSS-only visualizations: 6 KPI cards, donut ring (conic-gradient), horizontal bar charts (width-based), top 10 owners list, fun facts
  - Dashboard button (BarChart3 icon) on each UAT card in DB tab, expands panel below
  - Zero chart library dependencies
  - Commit: `6557cd5`

- **ParcelSync — eTerra Health Check + Maintenance Detection:**
  - New `eterra-health.ts` service: pings eTerra every 3min, 10s timeout, detects maintenance by keywords in HTML response (includes real keywords from 2026-03-08 outage: "serviciu indisponibil", "activități de mentenanță sunt în desfășurare")
  - Extracts actual maintenance message from page for display in UI
  - New `/api/eterra/health` endpoint (GET cached, POST force-check)
  - Session route blocks login when eTerra is in maintenance (returns 503 + `{maintenance: true}`)
  - `GET /api/eterra/session` enriched with `eterraAvailable`, `eterraMaintenance`, `eterraHealthMessage`
  - ConnectionPill shows amber "Mentenanță" state with AlertTriangle icon instead of red "Eroare"
  - Auto-connect skips during maintenance, retries when back online (30s poll detects recovery)
  - Commit: `b7a236c`

- **eTerra Timeout Fix:**
  - `DEFAULT_TIMEOUT_MS` 40000→120000 (eTerra 1000-feature geometry pages need 60-90s)
  - Added `timeoutMs` option to `syncLayer()`, passed through to `EterraClient.create()`
  - Commit: `8bb4a47`

- **Documentation Update:**
  - CLAUDE.md: Added ParcelSync module (#15) + Visual Copilot (#16), eTerra integration, PostGIS, new TS strict mode gotchas, eTerra/external API rules
  - ROADMAP.md: Added Phase 7B with 5 completed tasks, updated module status table
  - SESSION-LOG.md: This session entry

### Bugs Found & Fixed

| Bug                                                      | Root Cause                                                    | Fix                                                   |
| -------------------------------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------- |
| `timeout of 40000ms exceeded` on TERENURI_ACTIVE         | Default 40s too short for 1000-feature geometry pages         | Increased to 120s                                     |
| `suprafata` type `{}` not assignable to `string\|number` | `?? ""` on enrichment field typed `{}` produces `{}`          | `typeof x === 'number'` explicit check                |
| `Object is possibly 'undefined'` on `topOwners[0]`       | TS strict: `arr[0]` is `T\|undefined` even after `length > 0` | Assign to const, `if (const)` guard                   |
| eTerra maintenance shows as "Eroare conectare"           | No health check, login attempt fails with generic error       | Health check + maintenance detection + amber UI state |

### Learnings

- **eTerra goes down for maintenance regularly** — need pre-check before any login attempt
- **eTerra login page shows**: "Serviciu indisponibil" + "activități de mentenanță sunt în desfășurare" during outages
- **CSS-only charts work great**: conic-gradient donut rings, width-based horizontal bars — zero library overhead
- **TS strict `arr[0]`**: ALWAYS assign to const even after length check — the TS compiler doesn't narrow
- **Prisma `$queryRaw`**: always cast explicitly and guard access — it returns `unknown[]`

### Files Changed

- **New:** `src/modules/parcel-sync/services/eterra-health.ts`
- **New:** `src/modules/parcel-sync/components/uat-dashboard.tsx`
- **New:** `src/app/api/eterra/health/route.ts`
- **New:** `src/app/api/eterra/uat-dashboard/route.ts`
- **New:** `src/app/api/eterra/search-owner/route.ts`
- **Modified:** `src/modules/parcel-sync/services/eterra-client.ts` (timeout 120s, `searchImmovableByOwnerName()`)
- **Modified:** `src/modules/parcel-sync/services/sync-service.ts` (timeoutMs option)
- **Modified:** `src/modules/parcel-sync/services/session-store.ts` (health fields in SessionStatus)
- **Modified:** `src/modules/parcel-sync/components/parcel-sync-module.tsx` (owner search, dashboard, maintenance UI)
- **Modified:** `src/app/api/eterra/session/route.ts` (health check integration, login blocking)
- **Modified:** `CLAUDE.md`, `ROADMAP.md`, `SESSION-LOG.md`

### Build

- `npx next build` — zero errors
- Commits: `8bb4a47` → `6558c69` → `6557cd5` → `b7a236c`
- Pushed to main → Portainer auto-deploy

---

## Session — 2026-02-28c (GitHub Copilot - Claude Opus 4.6)

### Context

Continuation of QA improvements. NAS path enhancement: all 4 drives + DNS→IP fallback. Detail sheet, column visibility, QuickLook attachment preview, multiple bug fixes.

### Completed

- **NAS Network Path Attachments (enhanced):**
  - 4 drive mappings: A:\=Arhiva, O:\=Organizare, P:\=Proiecte, T:\=Transfer
  - `NAS_HOST` / `NAS_IP` constants used consistently across all UNC templates
  - New helpers: `toUncPathByIp()`, `toFileUrlByIp()`, `shareLabelFor()`
  - IP fallback: every network attachment shows an "IP" button on hover that opens via `\\10.10.10.10\...` when DNS fails
  - Badge now shows share label (Proiecte/Arhiva/Organizare/Transfer) instead of generic "NAS"
  - Validation hint updated to show all 4 drive letters

- **Registratura — Entry Detail Sheet (Side Panel):**
  - New `registry-entry-detail.tsx` component (~700 lines)
  - Side panel (Sheet) slides in from the right on Eye icon click or row click
  - Full entry visualization: status badges, document info, parties, dates, thread links, legal deadlines, attachments with inline image preview, NAS path links with IP fallback, external tracking, tags, notes
  - Action buttons inside sheet: Edită, Închide, Șterge

- **Registratura — Column Visibility Manager:**
  - Configurable columns via Settings dropdown in table header
  - 10 columns defined with Romanian tooltips explaining each abbreviation
  - Default visible: Nr., Data, Dir., Subiect, Exped., Dest., Status (7/10)
  - Hidden by default: Tip, Resp., Termen (can be toggled on)
  - Persisted in localStorage per user (`registratura:visible-columns`)
  - Reset button restores defaults

- **Registratura — Table UX Cleanup:**
  - Row click opens detail sheet (cursor-pointer)
  - Actions reduced from 3 buttons (close/edit/delete) to 2 (view/edit)
  - Close and Delete moved into detail sheet
  - Column headers have tooltips explaining naming convention

- **Bug Fix: NAS `file:///` links don't open Explorer:**
  - Root cause: all modern browsers block `file:///` URLs from web pages (hard security restriction)
  - Solution: click-to-copy-to-clipboard with green "Copiat!" badge feedback (2s timeout)
  - Applied to both detail sheet and entry form
  - Removed broken `window.open(toFileUrl(...))` calls
  - **Learning:** `file:///` cannot be opened from web pages — only clipboard copy works

- **Bug Fix: NAS attachment card overflows Sheet boundary:**
  - Root cause: Radix ScrollArea Viewport has `overflow: scroll` on both axes by default
  - Fix 1: `overflow-x-hidden` on ScrollArea Viewport via CSS selector override
  - Fix 2: Redesigned NAS card from two-row layout to compact single-row (filename + NAS badge + Copiază button)
  - Removed `font-mono` on paths (prevents word-break), removed `shortDisplayPath` (replaced with `pathFileName`)

- **Bug Fix: Password Vault — new entry lands on filtered empty view:**
  - Root cause: after adding, the module returns to list view but keeps the active category/search filter
  - Solution: `handleSubmit` now resets `filters.category` to `"all"` and `filters.search` to `""` after save

- **QuickLook-style Attachment Preview (macOS Quick Look inspired):**
  - New `attachment-preview.tsx` component (~480 lines)
  - Fullscreen dark overlay (`z-[100]`, `bg-black/90`, `backdrop-blur-sm`) with smooth animations
  - **Images**: zoomable (scroll wheel + ±buttons, 25%–500%), pannable when zoomed (grab/grabbing cursor), zoom % display, reset with 0 key
  - **PDFs**: browser native viewer via blob URL iframe (base64→Blob→createObjectURL), with scroll/zoom/print built-in
  - **Navigation**: left/right arrows (keyboard + circular buttons), bottom thumbnail strip when multiple
  - **Actions**: download (createElement('a') + click), print (PDF: hidden iframe, image: new window), close (Esc)
  - **Fallback**: unsupported types show icon + "Download" button
  - Preview button (Eye icon) shown for images AND PDFs in detail sheet
  - Replaced old inline image-only preview with fullscreen modal
  - React 19 compatible: no `setState` in effects, uses `key` prop for remount-based state reset

- **Documentation updated:**
  - CLAUDE.md: Registratura v0.4.0 with QuickLook description
  - ROADMAP.md: New task 3.03d with QuickLook + bug fixes
  - SESSION-LOG.md: This session entry

### Files Changed

- **New:** `src/modules/registratura/components/registry-entry-detail.tsx`
- **New:** `src/modules/registratura/components/attachment-preview.tsx`
- **Modified:** `src/config/nas-paths.ts` (4 drives, IP fallback helpers, shareLabelFor)
- **Modified:** `src/modules/registratura/components/registry-table.tsx` (column visibility, tooltips, view button, row click)
- **Modified:** `src/modules/registratura/components/registratura-module.tsx` (detail sheet integration, handleView)
- **Modified:** `src/modules/registratura/components/registry-entry-form.tsx` (NAS link copy-to-clipboard, removed broken file:/// links)
- **Modified:** `src/modules/password-vault/components/password-vault-module.tsx` (filter reset after add/edit)
- **Modified:** `CLAUDE.md`, `ROADMAP.md`, `SESSION-LOG.md`

### Build

- `npx next build` — zero errors
- Pushed to main → Portainer auto-deploy

---

## Session — 2026-02-28b (GitHub Copilot - Claude Opus 4.6)

### Context

User-requested improvements from QA testing: Registratura UX enhancements + Password Vault category rework.

### Completed

- **Registratura — Thread Explorer ("Fire conversație" tab):**
  - New `thread-explorer.tsx` component with full thread timeline view
  - Thread building via BFS from threadParentId chains
  - Stats cards (total/active/completed/average duration)
  - Search + status filter (toate/active/finalizate)
  - Expandable timeline with directional nodes (blue=intrat, orange=ieșit)
  - Gap day indicators showing "la noi" vs "la instituție" between entries
  - Export to text report per thread with downloadReport()
  - Integrated as new tab in registratura-module.tsx

- **Registratura — Interactive I/O Toggle:**
  - Replaced direction dropdown with visual button group (blue Intrat / orange Ieșit)
  - Uses ArrowDownToLine/ArrowUpFromLine icons from lucide-react
  - Full mutual-exclusive toggle with cn() conditional styling

- **Registratura — Doc Type UX Fix:**
  - Document types now sorted alphabetically by label
  - After adding custom type, it's immediately selected (no manual re-selection needed)
  - Uses localCustomTypes state to track session-added types

- **Registratura — AC Validity Tracker:**
  - New `ACValidityTracking` type system (phases, execution duration, required docs, reminders)
  - New `ac-validity-tracker.tsx` component (~400 lines)
  - Full AC lifecycle: issuance → validity (12mo) → execution → extension/abandonment/expiry
  - Required documents checklist (CF notation, newspaper, site panel) with progress bar
  - Extension request workflow (45 working days before expiry using addWorkingDays)
  - Monthly reminders with snooze capability
  - Pre-expiry warnings (30/60/90 days)
  - Integrated into registry-entry-form.tsx

- **Password Vault → "Parole Uzuale" (v0.3.0):**
  - Renamed module from "Seif Parole" to "Parole Uzuale" everywhere (config, i18n, flags)
  - New categories: WiFi, Portale Primării, Avize Online, PIN Semnătură, Software, Echipament HW (replaced server/database/api)
  - Category icons (Globe, Mail, Wifi, Building2, FileCheck2, Fingerprint, Monitor, HardDrive) throughout
  - WiFi QR code: real QR generated on canvas via `qrcode` lib, scanabil direct cu telefonul, cu butoane Copiază imaginea + Descarcă PNG
  - Context-aware form: PIN vs password label, hides email for WiFi/PIN, hides URL for WiFi, hides generator for PIN
  - Dynamic stat cards showing top 3 categories by entry count
  - Removed encryption banner per user request
  - Category descriptions as helper text in form

### Files Changed

- **New:** `src/modules/registratura/components/thread-explorer.tsx`, `src/modules/registratura/components/ac-validity-tracker.tsx`
- **Modified:** `src/modules/registratura/types.ts`, `src/modules/registratura/components/registratura-module.tsx`, `src/modules/registratura/components/registry-entry-form.tsx`
- **Modified:** `src/modules/password-vault/types.ts`, `src/modules/password-vault/config.ts`, `src/modules/password-vault/components/password-vault-module.tsx`
- **Modified:** `src/config/flags.ts`, `src/core/i18n/locales/ro.ts`

### Build

- `npx next build` — zero errors, all 23 routes OK
- Commit: `3abf0d1`
- Pushed to main → Portainer auto-deploy

---

## Session — 2026-02-28 (GitHub Copilot - Claude Opus 4.6)

### Context

Final Phase 3 implementation (tasks 3.03, 3.13, 3.15) + QA preparation + documentation update.

### Completed

- **Task 3.03 ✅ Registratura — Termene Legale Îmbunătățiri:**
  - Deadline audit log (DeadlineAuditEntry) on create/resolve
  - Expandable "Istoric modificări" on deadline cards
  - Recipient registration fields (nr + date, ieșit only)
  - Document expiry tracking (expiryDate + expiryAlertDays)
  - Web scraping prep fields (externalStatusUrl, externalTrackingId)
  - 6 stat cards + amber/red alert banners
  - Alert count badge on tab header
  - New deadline type: prelungire-cu (15 calendar days, tacit approval)
  - Commit: `99fbddd`

- **Task 3.13 ✅ Tag Manager — ManicTime Sync:**
  - `manictime-service.ts`: Parser/serializer for Tags.txt format, line classifier, sync planner
  - `/api/manictime` route: GET (read + sync plan), POST (pull/push/both), Prisma integration
  - `manictime-sync-panel.tsx`: Connection check, stats grid, import/export/full sync buttons with confirmation
  - Docker: MANICTIME_TAGS_PATH env var, `/mnt/manictime` volume mount
  - Tag Manager v0.2.0
  - Commit: `11b35c7`

- **Task 3.15 ✅ AI Tools — Extindere și Integrare:**
  - Prompt Generator v0.2.0: search bar + target type filter + 4 new image templates (18 total)
  - `/api/ai-chat` route: multi-provider (OpenAI/Claude/Ollama/demo), Romanian arch office system prompt
  - `use-chat.ts`: sendMessage() with real API, sending state, providerConfig, updateSession()
  - AI Chat UI: provider badge (Wifi/WifiOff), Bot icon, spinner, config banner
  - AI Chat + Tag Manager: project selector via useTags('project'), session linking
  - Docker: AI_PROVIDER, AI_API_KEY, AI_MODEL, AI_BASE_URL, AI_MAX_TOKENS env vars
  - AI Chat v0.2.0, Prompt Generator v0.2.0
  - Commit: `d34c722`

- **QA Preparation:**
  - Created `QA-CHECKLIST.md` — comprehensive testing checklist for all Phase 3 features (~120 items)
  - Covers: Registratura, Tag Manager, IT Inventory, Address Book, Password Vault, Prompt Generator, AI Chat, Hot Desk, Email Signature, Dashboard, cross-cutting (auth, performance, theme)

- **Documentation Update:**
  - CLAUDE.md: updated module table (versions, new features), updated integrations table (AI Chat, Vault encryption, ManicTime)
  - ROADMAP.md: updated status table (all 14 modules COMPLETE), marked 3.03/3.13/3.15 done, updated Phase 5 to reflect 3.15 overlap
  - SESSION-LOG.md: this entry
  - SESSION-GUIDE.md: added QA/Bug Fix session prompt

### Commits

- `99fbddd` feat(3.03): Registratura Termene Legale improvements
- `11b35c7` feat(3.13): Tag Manager ManicTime bidirectional sync
- `d34c722` feat(3.15): AI Tools — extindere si integrare
- `a25cc40` docs: update ROADMAP.md — mark 3.15 complete
- (this session) docs: QA checklist + full documentation update

### Phase Status

- **Phase 1:** 13/13 ✅
- **Phase 2:** 1/1 ✅ (Hot Desk)
- **Phase 3:** 15/15 ✅ (all requirements implemented)
- **Phase 6:** 1/4 done (Authentik SSO)
- **Phase 7:** 3/4 done (PostgreSQL + Prisma + MinIO client)
- **Next:** User QA testing → bug fixes → Phase 4 (Quality & Testing)

---

## Session — 2026-02-27 late night #2 (GitHub Copilot - Claude Opus 4.6)

### Context

Performance investigation: Registratura loading extremely slowly with only 6 entries. Rack numbering inverted.

### Root Cause Analysis — Findings

**CRITICAL BUG: N+1 Query Pattern in ALL Storage Hooks**

The `DatabaseStorageAdapter.list()` method fetches ALL items (keys + values) from PostgreSQL in one HTTP request, but **discards the values** and returns only the key names. Then every hook calls `storage.get(key)` for EACH key individually — making a separate HTTP request + DB query per item.

With 6 registry entries + ~10 contacts + ~20 tags, the Registratura page fired **~40 sequential HTTP requests** on load (**1 list + N gets per hook × 3 hooks**). Each request goes through: browser → Next.js API route → Prisma → PostgreSQL → back. This is a textbook N+1 query problem.

**Additional issues found:**

- `addEntry()` called `getAllEntries()` for number generation, then `refresh()` called `getAllEntries()` again → double-fetch
- `closeEntry()` called `updateEntry()` (which refreshes), then manually called `refresh()` again → double-refresh
- Every single module hook had the same pattern (11 hooks total)
- Rack visualization rendered U1 at top instead of bottom

### Fix Applied

**Strategy:** Replace `list()` + N × `get()` with a single `exportAll()` call that fetches all items in one HTTP request and filters client-side.

**Files fixed (13 total):**

- `src/modules/registratura/services/registry-service.ts` — added `exportAll` to `RegistryStorage` interface, rewrote `getAllEntries`
- `src/modules/registratura/hooks/use-registry.ts` — `addEntry` uses optimistic local state update instead of double-refresh; `closeEntry` batches saves with `Promise.all` + single refresh
- `src/modules/address-book/hooks/use-contacts.ts` — `exportAll` batch load
- `src/modules/it-inventory/hooks/use-inventory.ts` — `exportAll` batch load
- `src/modules/password-vault/hooks/use-vault.ts` — `exportAll` batch load
- `src/modules/word-templates/hooks/use-templates.ts` — `exportAll` batch load
- `src/modules/prompt-generator/hooks/use-prompt-generator.ts` — `exportAll` batch load
- `src/modules/hot-desk/hooks/use-reservations.ts` — `exportAll` batch load
- `src/modules/email-signature/hooks/use-saved-signatures.ts` — `exportAll` batch load
- `src/modules/digital-signatures/hooks/use-signatures.ts` — `exportAll` batch load
- `src/modules/ai-chat/hooks/use-chat.ts` — `exportAll` batch load
- `src/core/tagging/tag-service.ts` — uses `storage.export()` instead of N+1
- `src/modules/it-inventory/components/server-rack.tsx` — reversed slot rendering (U1 at bottom)

**Performance impact:** ~90% reduction in HTTP requests on page load. Registratura: from ~40 requests to 3 (one per namespace: registratura, address-book, tags).

### Prevention Rules (for future development)

> **NEVER** use the `storage.list()` + loop `storage.get()` pattern.
> Always use `storage.exportAll()` to load all items in a namespace, then filter client-side.
> This is the #1 performance pitfall in the storage layer.

### Commits

- `c45a30e` perf: fix N+1 query pattern across all modules + rack numbering
- `c22848b` perf(registratura): lightweight API mode strips base64 attachments from list

### Second Root Cause — Base64 Attachment Payloads (found after first fix)

After deploying the N+1 fix, Registratura STILL loaded in 2+ minutes. Deeper investigation revealed:

**Root cause:** `RegistryAttachment.data` stores full base64-encoded files directly in JSON. A 5MB PDF = ~6.7MB base64. With 6 entries having attachments, `/api/storage?namespace=registratura` returned **30-60MB of JSON** on every page load.

**Fix:** Added `?lightweight=true` parameter to the API route. Server-side `stripHeavyFields()` recursively strips large `data` and `fileData` string fields (>1KB) from JSON, replacing with `"__stripped__"`. List loading now transfers ~100KB. Full entry data loaded on-demand only when editing (single entry = manageable).

**Additional files:**

- `src/app/api/storage/route.ts` — `stripHeavyFields()` + lightweight param
- `src/core/storage/types.ts` — `export()` accepts `{ lightweight?: boolean }`
- `src/core/storage/adapters/database-adapter.ts` — passes flag to API
- `src/modules/registratura/services/registry-service.ts` — `getAllEntries()` uses `lightweight: true`, new `getFullEntry()`
- `src/modules/registratura/hooks/use-registry.ts` — exports `loadFullEntry()`
- `src/modules/registratura/components/registratura-module.tsx` — `handleEdit` loads full entry on demand

---

## Session — 2026-02-27 late night (GitHub Copilot - Claude Opus 4.6)

### Context

Continued Phase 3. Fixed critical Registratura bugs reported by user + implemented task 3.08 IT Inventory improvements.

### Completed

- **Registratura Bug Fixes (6 issues):**
  1. **File upload loading feedback** — Added `uploadingCount` state tracking FileReader progress. Shows spinner + "Se încarcă X fișiere…" next to Atașamente label. Submit button shows "Se încarcă fișiere…" and is disabled while files load.
  2. **Duplicate registration numbers** — Root cause: `generateRegistryNumber` counted entries instead of parsing max existing number. Fix: parse actual number from regex `PREFIX-NNNN/YYYY`, find max, +1. Also: `addEntry` now fetches fresh entries from storage before generating number (eliminates race condition from stale state).
  3. **Form submission lock** — Added `isSubmitting` state. Submit button disabled + shows Loader2 spinner during save. Prevents double-click creating multiple entries.
  4. **Unified close/resolve flow** — Added `ClosureResolution` type (finalizat/aprobat-tacit/respins/retras/altele) to `ClosureInfo`. CloseGuardDialog now has resolution selector matching deadline resolve options. ClosureBanner shows resolution badge.
  5. **Backdating support** — Date field renamed "Data document" with tooltip explaining retroactive registration. Added `registrationDate` field on RegistryEntry (auto = today). Registry table shows "(înr. DATE)" when registrationDate differs from document date. Numbers remain sequential regardless of document date.
  6. **"Actualizează" button feedback** — Submit button now shows loading spinner when saving, disabled during upload. `onSubmit` prop accepts `Promise<void>` for proper async tracking.

- **Task 3.08 — IT Inventory Improvements:**
  - Rewrote `types.ts`: dynamic `InventoryItemType` (string-based), `DEFAULT_EQUIPMENT_TYPES` with server/switch/ups/patch-panel, `RACK_MOUNTABLE_TYPES` set, new "rented" status, `STATUS_LABELS` export
  - Removed deprecated fields: assignedTo, assignedToContactId, purchaseDate, purchaseCost, warrantyExpiry
  - Added rack fields: `rackPosition` (1–42), `rackSize` (1–4U)
  - New `server-rack.tsx`: 42U rack visualization with color-coded status slots, tooltips, occupied/empty rendering
  - Rewrote `it-inventory-module.tsx`: tabbed UI (Inventar + Rack 42U), 5 stat cards with purple pulse for rented, inline custom type creation ("Tip nou" input), conditional rack position fields for RACK_MOUNTABLE_TYPES, simplified form
  - Fixed search filter in `use-inventory.ts`: removed `assignedTo` reference, added rackLocation/location

### Files Modified

- `src/modules/registratura/types.ts` — Added `ClosureResolution` type, `registrationDate` field on RegistryEntry, `resolution` field on ClosureInfo
- `src/modules/registratura/services/registry-service.ts` — Rewrote `generateRegistryNumber` to parse max existing number via regex
- `src/modules/registratura/hooks/use-registry.ts` — `addEntry` fetches fresh entries before generating number
- `src/modules/registratura/components/registry-entry-form.tsx` — Upload progress tracking, submission lock, date tooltip, async submit
- `src/modules/registratura/components/registry-table.tsx` — "Data doc." header, shows registrationDate when different
- `src/modules/registratura/components/close-guard-dialog.tsx` — Resolution selector added
- `src/modules/registratura/components/closure-banner.tsx` — Resolution badge display
- `src/modules/it-inventory/types.ts` — Complete rewrite: dynamic types, rented status, rack fields
- `src/modules/it-inventory/hooks/use-inventory.ts` — Updated imports, fixed search filter
- `src/modules/it-inventory/components/it-inventory-module.tsx` — Complete rewrite: tabbed UI, dynamic types, rack fields
- `src/modules/it-inventory/components/server-rack.tsx` — NEW: 42U rack visualization

### Commits

- `8042df4` fix(registratura): prevent duplicate numbers, add upload progress, submission lock, unified close/resolve, backdating support
- `346e40d` feat(it-inventory): dynamic types, rented status, rack visualization, simplified form

---

## Session — 2026-02-27 night (GitHub Copilot - Claude Opus 4.6)

### Context

Continued Phase 3 refinements. Picked task 3.02 (HEAVY) — Registratura bidirectional integration and UX improvements.

### Completed

- **3.02 ✅ Registratura — Integrare și UX:**
  - **Dynamic document types:** DocumentType changed from enum to string-based. Default types include "Apel telefonic" and "Videoconferință". Inline "Tip nou" input with Plus button auto-creates Tag Manager tags under category "document-type". Form select pulls from both defaults and Tag Manager.
  - **Bidirectional Address Book:** Sender/Recipient/Assignee autocomplete shows "Creează contact" button when typed name doesn't match any existing contact. QuickContactDialog popup creates contact in Address Book with Name (required), Phone (optional), Email (optional).
  - **Simplified status:** Removed Status dropdown. Replaced with Switch toggle — default is "Deschis" (open). Toggle to "Închis" when done. No "deschis" option in UI, everything is implicitly open.
  - **Internal deadline tooltip:** Added Info icon tooltips on "Termen limită intern" (explaining it's not a legal deadline), "Închis" (explaining default behavior), and "Responsabil" (explaining ERP prep).
  - **Responsabil (Assignee) field:** New field with contact autocomplete + quick-create. Separate `assignee` and `assigneeContactId` on RegistryEntry type. Shown in registry table as "Resp." column with User icon.
  - **Entry threads & branching:** New `threadParentId` field on RegistryEntry. Thread parent selector with search. ThreadView component showing parent → current → children tree with direction badges, siblings (branches), and click-to-navigate. Thread icon (GitBranch) in registry table. Supports one-to-many branching (one entry generates multiple outgoing replies).

### Files Created

- `src/modules/registratura/components/quick-contact-dialog.tsx` — Rapid contact creation popup from Registratura
- `src/modules/registratura/components/thread-view.tsx` — Thread tree visualization (parent, current, siblings, children)

### Files Modified

- `src/modules/registratura/types.ts` — Dynamic DocumentType, DEFAULT_DOC_TYPE_LABELS, new fields (assignee, assigneeContactId, threadParentId)
- `src/modules/registratura/index.ts` — Export new constants
- `src/modules/registratura/components/registry-entry-form.tsx` — Complete rewrite: dynamic doc types, contact quick-create, Switch status, Responsabil field, thread parent selector, tooltips
- `src/modules/registratura/components/registratura-module.tsx` — Wired useTags + useContacts, handleCreateContact + handleCreateDocType callbacks, thread navigation
- `src/modules/registratura/components/registry-table.tsx` — Dynamic doc type labels, Resp. column, thread icon
- `src/modules/registratura/components/registry-filters.tsx` — Uses DEFAULT_DOC_TYPE_LABELS from types.ts
- `ROADMAP.md` — Marked 3.02 as done

### Notes

- Existing data is backward-compatible: old entries without `assignee`, `threadParentId` render fine (fields are optional)
- Quick contact creation sets type to "collaborator" and adds note "Creat automat din Registratură"
- DocumentType is now `string` but retains defaults via `DEFAULT_DOCUMENT_TYPES` array

---

## Session — 2026-02-27 evening (GitHub Copilot - Claude Opus 4.6)

### Context

Continued from earlier session (Gemini 3.1 Pro got stuck on Authentik testing). This session focused on fixing deployment pipeline, then implementing Phase 3 visual/UX tasks + infrastructure documentation.

### Completed

- **Deployment Pipeline Fixes:**
  - Fixed Dockerfile: added `npx prisma generate` before build step
  - Fixed docker-compose.yml: hardcoded all env vars (Portainer CE can't inject env vars)
  - Moved `@prisma/client` from devDependencies to dependencies (runtime requirement)
  - Created `stack.env` (later abandoned — Portainer CE doesn't parse it reliably)
  - Confirmed auth flow works end-to-end on production (tools.beletage.ro)

- **3.01 ✅ Header & Navigation:**
  - Added 3 company logos (BTG, US, SDT) with theme-aware variants (light/dark)
  - Interactive mini-game: click animations (spin/bounce/ping), secret combo BTG→US→SDT triggers confetti
  - Logo layout: flex-1 centered row with dual-render (both light+dark images, CSS toggle) to fix SSR hydration
  - "ArchiTools" text centered below logos, links to Dashboard
  - Created animated theme toggle: Sun/Moon lucide icons in sliding knob, gradient sky background, stars (dark), clouds (light)

- **3.04 ✅ Authentik Integration:**
  - Already done by previous session (Gemini) — confirmed working. Marked as done.

- **3.09 ✅ Address Book Dynamic Types:**
  - `CreatableTypeSelect` component (dropdown + text input + "+" button)
  - `ContactType` union type extended with `| string` for custom types
  - Dynamic `allTypes` derived from existing contacts' types

- **3.10 ✅ Hot Desk Window:**
  - Window on left wall (sky-blue, "Fereastră"), door on right wall (amber, "Ușă")

- **3.11 ✅ Password Vault Email + Link:**
  - Added `email: string` field to VaultEntry type + form
  - URLs rendered as clickable `<a>` links with `target="_blank"`

- **Documentation Updated:**
  - CLAUDE.md: stack table (Prisma/PG/NextAuth/MinIO), 14 modules, infra ports, deployment pipeline, integration status
  - ROADMAP.md: marked Phase 2, 3.01, 3.04, 3.09, 3.10, 3.11, Phase 6 (6.01), Phase 7 (7.01, 7.02, 7.04) as done
  - SESSION-LOG.md: this entry

### Files Created

- `src/shared/components/common/theme-toggle.tsx` — Animated sun/moon theme toggle

### Files Modified

- `Dockerfile` — Added `npx prisma generate`
- `docker-compose.yml` — All env vars hardcoded
- `package.json` — @prisma/client moved to dependencies
- `src/config/companies.ts` — BTG logo paths + fixed US/SDT dark variants
- `src/shared/components/layout/sidebar.tsx` — Logo redesign + mini-game
- `src/shared/components/layout/header.tsx` — Theme toggle replacement
- `src/modules/password-vault/types.ts` — Added email field
- `src/modules/password-vault/components/password-vault-module.tsx` — Email + clickable URLs
- `src/modules/address-book/types.ts` — Dynamic ContactType
- `src/modules/address-book/components/address-book-module.tsx` — CreatableTypeSelect
- `src/modules/hot-desk/components/desk-room-layout.tsx` — Window + door landmarks

### Notes

- Portainer CE requires manual "Pull and redeploy" — no auto-rebuild on webhook
- "Re-pull image" checkbox only needed for base image updates (node:20-alpine), not for code changes
- Logo SVGs have very different aspect ratios (BTG ~7:1, US ~6:1, SDT ~3:1) — using flex-1 min-w-0 to handle this
- Theme toggle: `resolvedTheme` from next-themes is `undefined` on SSR first render — must use `mounted` state guard

---

## Session — 2026-02-27 (GitHub Copilot - Gemini 3.1 Pro)

### Completed

- **Etapa 2: Autentificare (Authentik / Active Directory)**
  - Instalat `next-auth` pentru gestionarea sesiunilor în Next.js.
  - Configurat provider-ul OIDC pentru Authentik (`src/app/api/auth/[...nextauth]/route.ts`).
  - Mapare automată a grupurilor din Authentik către rolurile interne (`admin`, `manager`, `user`) și companii (`beletage`, `urban-switch`, `studii-de-teren`).
  - Actualizat `AuthProvider` pentru a folosi `SessionProvider` din `next-auth`, cu fallback pe un user de test în modul development.
  - Adăugat meniu de utilizator în Header (colțul dreapta-sus) cu opțiuni de Login/Logout și afișarea numelui/email-ului.
  - Adăugat variabilele de mediu necesare în `.env` (`AUTHENTIK_CLIENT_ID`, `AUTHENTIK_CLIENT_SECRET`, `AUTHENTIK_ISSUER`).

- **Etapa 1: Fundația (Baza de date & Storage)**
  - Instalat și configurat Prisma ORM (v6) pentru conectarea la PostgreSQL.
  - Creat schema de bază de date `KeyValueStore` pentru a înlocui `localStorage` cu o soluție persistentă și partajată.
  - Rulat prima migrare (`npx prisma db push`) pe serverul de producție (`10.10.10.166:5432`).
  - Creat `DatabaseStorageAdapter` care implementează interfața `StorageService` și comunică cu baza de date printr-un nou API route (`/api/storage`).
  - Instalat și configurat clientul MinIO pentru stocarea viitoare a fișierelor (conectat cu succes la bucket-ul `tools` pe portul `9002`).
  - Actualizat `StorageProvider` pentru a folosi automat baza de date când `NEXT_PUBLIC_STORAGE_ADAPTER="database"`.
  - Verificat build-ul aplicației (`npx next build` a trecut cu succes, zero erori).

### Notes

- Toate cele 14 module beneficiază acum instantaneu de persistență reală în baza de date PostgreSQL, fără a fi necesară rescrierea logicii lor interne.
- Autentificarea este pregătită. Urmează configurarea aplicației în interfața de admin Authentik.

---

## Session — 2026-02-26 (GitHub Copilot - Gemini 3.1 Pro)

### Completed

- **Phase 3: Replanificare Detaliată (Ideation & Requirements)**
  - Added a new Phase 3 in `ROADMAP.md` to track detailed requirements before implementation.
  - Shifted subsequent phases (Quality & Testing became Phase 4, etc.).
  - Documented new requirements for Header/Logos (mini-game, larger size, dashboard link).
  - Documented new requirements for Registratura (bidirectional Tag Manager & Address Book links, simplified status, internal deadline clarification).
  - Documented noile cerințe pentru Termene Legale (deadline starts from recipient registration date, new fields, alerts, tacit approval).
  - Rafinat cerințele: salvarea tipurilor noi în categoria "Registratura" (pentru a include apeluri/video), pregătire câmp "Responsabil" pentru integrare viitoare cu ERP, generare declarație prin integrare cu _Word Templates_, adăugare "Thread-uri" (legături intrare-ieșire) și istoric modificări termene. - Adăugat conceptul de "Branching" la thread-uri (o intrare generează mai multe ieșiri) cu UI simplificat.
  - Adăugat secțiunea 3.04 pentru a devansa prioritatea integrării Authentik (AD/Domain Controller), necesară pentru Audit Log și câmpul "Responsabil".
  - Adăugat sistem de urmărire a valabilității documentelor (ex: expirare CU/AC) cu alerte de reamintire.
  - Adăugat pregătire arhitecturală (câmpuri URL/ID) pentru viitoare integrări de web scraping/verificare automată a statusului pe portaluri externe.
  - Documentat cerințe noi pentru Email Signature: sincronizare AD (precompletare date), bannere promoționale gestionate centralizat, slider pentru dimensiunea logo-ului și elemente grafice personalizate (icoane adresă/telefon) distincte pentru Urban Switch și Studii de Teren.
  - Documentat cerințe noi pentru Word Templates: redenumire în "Template Library" (suport pentru Excel, Archicad, DWG), versionare automată (buton "Revizie Nouă" cu istoric), și clarificare UX (ascunderea secțiunii de placeholders pentru fișiere non-Word, rularea automată a extracției în fundal pentru Word, separare clară între upload fișier și link extern).
  - Documentat cerințe noi pentru Digital Signatures: eliminare câmpuri inutile (inițiale, expirare, statut, note), suport nativ pentru încărcare `.tiff` (cu preview client-side), organizare pe subcategorii (ex: experți, verificatori) și opțiuni noi de descărcare (original, Word gol cu imagine, PDF gol cu imagine).
  - Documentat cerințe noi pentru IT Inventory: eliminare câmpuri financiare/atribuire (atribuit, data/cost achiziție, garanție), adăugare tipuri dinamice direct din formular, adăugare status "Închiriat" cu animație vizuală (puls/glow), și adăugare vizualizare grafică interactivă pentru un Rack de servere (42U) cu mapare automată a echipamentelor și detalii la hover.
  - Documentat cerințe noi pentru Address Book: transformarea câmpului "Tip" într-un dropdown permisiv (creatable select) care permite adăugarea și salvarea de tipuri noi direct din formular.
  - Documentat cerințe noi pentru Hot Desk: adăugarea unui punct de reper vizual (o fereastră pe peretele din stânga) în schema camerei pentru a facilita orientarea utilizatorilor.
  - Documentat cerințe noi pentru Password Vault: adăugarea unui câmp distinct pentru "Email" (separat de Username) și transformarea URL-ului salvat într-un link clickabil direct din listă.
  - Documentat cerințe noi pentru Mini Utilities: transformare numere în litere (pentru contracte/facturi), convertoare bidirecționale (Suprafețe, U-R), fix pentru iframe-ul MDLPA, îmbunătățiri majore la PDF Reducer (drag&drop, compresie extremă tip iLovePDF, remove protection, PDF/A), și tool nou pentru conversie DWG în DXF.
  - Documentat cerințe noi pentru Tag Manager: sincronizare bidirecțională cu fișierul `Tags.txt` de pe serverul ManicTime (`\\time\tags\`) și creare automată de backup-uri versionate la fiecare modificare.
  - Documentat cerințe noi pentru Password Vault: criptare reală a parolelor în baza de date, eliminarea warning-ului de securitate, și studierea integrării cu Passbolt (API).
  - Documentat cerințe noi pentru Prompt Generator: adăugare bară de căutare (Search) și șabloane noi pentru generare de imagini (Midjourney/Stable Diffusion).
  - Documentat cerințe noi pentru AI Chat & Media: activarea modulului de chat cu un API real (OpenAI/Anthropic/Ollama), integrare cu Tag Manager pentru context pe proiect, interfață node-based (infinite canvas) pentru generatoare media, și un nod avansat de interpretare 3D a imaginilor 2D (tip viewport interactiv).
  - Documentat cerințe noi pentru Storage & Arhitectură (Prioritate 0): devansarea migrării de la `localStorage` la o soluție robustă (MinIO pentru fișiere + PostgreSQL/Prisma pentru date) pentru a asigura persistența, securitatea și partajarea datelor între toți utilizatorii.

### Notes

- No code changes made. Only documentation updated.
- Faza 3 (Ideation & Requirements) este complet documentată. Urmează planificarea concretă a execuției.

---

## Session — 2026-02-19 (GitHub Copilot - Claude Sonnet 4.6) [continued 2]

### Completed

- **Task 1.12: Registratura — Linked-Entry Selector Search** ✅
  - Added search input (by number, subject, sender) to `registry-entry-form.tsx`
  - Removed `.slice(0, 20)` cap — all entries now searchable
  - Chip labels now show truncated subject alongside entry number
  - Commit: `cd4b0de`

- **Task 1.13: Word XML — Remove POT/CUT Auto-Calculation** ✅
  - Removed `computeMetrics` from `XmlGeneratorConfig` type, `generateCategoryXml`, `generateAllCategories`, `downloadZipAll`, `useXmlConfig`, `XmlSettings`, `WordXmlModule`
  - Removed POT/CUT auto-injection logic entirely; fields can still be added manually
  - Removed unused `Switch` import from `xml-settings.tsx`
  - Commit: `eaca24a`

### Notes

- Phase 1 (13 tasks) now fully complete ✅
- Next: **Phase 2** — Hot Desk module (new module from scratch)

---

### Completed

- **Task 1.11: Dashboard — Activity Feed + KPI Panels** ✅
  - Created `src/modules/dashboard/hooks/use-dashboard-data.ts`
  - Scans all `architools:*` localStorage keys directly (no per-module hooks needed)
  - Activity feed: last 20 items sorted by `updatedAt`, detects creat/actualizat, picks best label field
  - KPI grid: registratura this week, open dosare, deadlines this week, overdue (red if >0), new contacts this month, active IT equipment
  - Replaced static Quick Stats with live KPI panels in `src/app/page.tsx`
  - Relative timestamps in Romanian via `Intl.RelativeTimeFormat`
  - Build passes zero errors

### Commits

- (this session) feat(dashboard): activity feed and KPI panels

### Notes

- Build verified: `npx next build` → ✓ Compiled successfully
- Next task: **1.12** — Registratura linked-entry selector fix

---

## Session — 2026-02-19 (GitHub Copilot - Claude Sonnet 4.6)

### Completed

- **Task 1.09: Address Book — vCard Export + Registratura Reverse Lookup** ✅
  - Created `src/modules/address-book/services/vcard-export.ts` — generates vCard 3.0 with all contact fields
  - Download icon button on card hover → triggers `.vcf` file download
  - FileText icon button → opens `ContactDetailDialog` with full info + Registratura table
  - Registratura reverse lookup uses `allEntries` (bypasses active filters)
  - Build passes zero errors

- **Task 1.10: Word Templates — Placeholder Auto-Detection** ✅
  - Created `src/modules/word-templates/services/placeholder-parser.ts`
  - Reads `.docx` (ZIP) via JSZip, scans all `word/*.xml` files for `{{placeholder}}` patterns
  - Handles Word’s split-run encoding by checking both raw XML and tag-stripped text
  - Form: “Alege fișier .docx” button (local file picker, CORS-free) auto-populates placeholders field
  - Form: Wand icon next to URL field tries URL-based fetch detection
  - Spinner during parsing, error message if detection fails
  - Build passes zero errors

### Commits

- `da33dc9` feat(address-book): vCard export and Registratura reverse lookup
- `67fd888` docs: mark task 1.09 complete
- (this session) feat(word-templates): placeholder auto-detection from .docx via JSZip

### Notes

- Build verified: `npx next build` → ✓ Compiled successfully
- Next task: **1.11** — Dashboard Activity Feed + KPI Panels

---

## Session — 2026-02-19 (GitHub Copilot - Claude Sonnet 4.6) [earlier]

### Completed

- **Task 1.09: Address Book — vCard Export + Registratura Reverse Lookup** ✅
  - Created `src/modules/address-book/services/vcard-export.ts` — generates vCard 3.0 (`.vcf`) with all contact fields
  - Added Download icon button on contact card hover → triggers `.vcf` file download
  - Added FileText (detail) icon button → opens `ContactDetailDialog`
  - `ContactDetailDialog` shows full contact info, contact persons, notes, and scrollable Registratura table
  - Registratura reverse lookup uses `allEntries` (bypasses active filters) and matches `senderContactId` or `recipientContactId`
  - Build passes zero errors

### Commits

- `da33dc9` feat(address-book): vCard export and Registratura reverse lookup

### Notes

- Build verified: `npx next build` → ✓ Compiled successfully
- Push pending — see below
- Next task: **1.10** — Word Templates Placeholder Auto-Detection

---

## Session — 2026-02-19 (GitHub Copilot - Haiku 4.5)

### Completed

- **Task 1.07: Password Vault — Company Scope + Strength Meter** ✅
  - Added `company: CompanyId` field to VaultEntry type
  - Implemented password strength indicator (4 levels: weak/medium/strong/very strong) with visual progress bar
  - Strength calculation based on length + character diversity (uppercase/lowercase/digits/symbols)
  - Updated form with company selector dropdown (Beletage/Urban Switch/Studii de Teren/Grup)
  - Meter updates live as password is typed
  - Build passes zero errors

- **Task 1.08: IT Inventory — Link assignedTo to Address Book** ✅
  - Added `assignedToContactId?: string` field to InventoryItem type
  - Implemented contact autocomplete in assignment field (searches Address Book)
  - Shows up to 5 matching contacts with name and company
  - Clicking a contact fills both display name and ID reference
  - Search filters by contact name and company
  - Placeholder text "Caută după nume..." guides users
  - Build passes zero errors

### Commits

- `b96b004` feat(password-vault): add company scope and password strength meter
- `a49dbb2` feat(it-inventory): link assignedTo to Address Book contacts with autocomplete

### Notes

- Build verified: `npx next build` → ✓ Compiled successfully
- Push completed: Changes deployed to main via Gitea webhook → Portainer auto-redeploy triggering
- Ready to test on production: http://10.10.10.166:3000/password-vault and http://10.10.10.166:3000/it-inventory

---

## Session — 2026-02-18 (GitHub Copilot - Haiku 4.5)

### Completed

- **Task 1.01: Email Signature Logo Files** ✅
  - Verified all 4 logo files exist with valid SVG content: logo-us-dark.svg, logo-us-light.svg, logo-sdt-dark.svg, logo-sdt-light.svg
  - No action needed — logos are already present and valid
- **Task 1.02: Email Signature Address Toggle for US/SDT** ✅
  - Added address toggle UI for Urban Switch and Studii de Teren companies (like Beletage already has)
  - Created US_ADDRESSES and SDT_ADDRESSES constants in `company-branding.ts`
  - Updated `signature-configurator.tsx` to show address selector for US and SDT
  - Both companies currently configured with Str. Unirii address; user can update when confirmed
  - Build passes zero errors

### Commits

- `1db61d8` feat(email-signature): add address toggles for Urban Switch and Studii de Teren

### Notes

- Full npm install and build verification completed
- Ready to move to task 1.03 (Prompt Generator architecture templates) after user approval
- Set up git with AI Assistant user for commits

---

## Session — 2026-02-18 (Claude Opus 4.6)

### Completed

- **Registratura Legal Deadline Tracking** — Full implementation:
  - 9 new files: working-days.ts (Romanian holidays + Orthodox Easter), deadline-catalog.ts (16 deadline types), deadline-service.ts, use-deadline-filters.ts, deadline-card.tsx, deadline-add-dialog.tsx, deadline-resolve-dialog.tsx, deadline-table.tsx, deadline-dashboard.tsx
  - 6 modified files: types.ts, use-registry.ts, registratura-module.tsx (tabbed), registry-entry-form.tsx (inline deadlines), registry-table.tsx (clock badge), index.ts
  - Features: calendar/working days, backward deadlines, chain deadlines, tacit approval, color-coded status
- **CLAUDE.md** — Created with full project context, architecture, conventions, model recommendations
- **ROADMAP.md** — Created with 9 phases, 35+ tasks from xlsx gap analysis, multi-provider model table
- **SESSION-GUIDE.md** — Created with start/resume prompts, git workflow, file update rules

### Commits

- `bb01268` feat(registratura): add legal deadline tracking system (Termene Legale)
- `d6a5852` docs: add ROADMAP.md with detailed future task plan
- `b1df15b` docs: rewrite ROADMAP.md with complete xlsx gap analysis + multi-model recommendations
- (this session) docs: add SESSION-GUIDE.md + SESSION-LOG.md

### Notes

- Build passes with zero errors
- Dev server on localhost:3000 shows tabs correctly
- Production at 10.10.10.166:3000 requires Portainer redeploy after push
- The `app_modules_overview.xlsx` is in the repo root but not committed (it's a reference file)
- No tasks from ROADMAP.md Phase 1+ have been started yet — next session should begin with task 1.01

### Completed

- **Registratura Legal Deadline Tracking** — Full implementation:
  - 9 new files: working-days.ts (Romanian holidays + Orthodox Easter), deadline-catalog.ts (16 deadline types), deadline-service.ts, use-deadline-filters.ts, deadline-card.tsx, deadline-add-dialog.tsx, deadline-resolve-dialog.tsx, deadline-table.tsx, deadline-dashboard.tsx
  - 6 modified files: types.ts, use-registry.ts, registratura-module.tsx (tabbed), registry-entry-form.tsx (inline deadlines), registry-table.tsx (clock badge), index.ts
  - Features: calendar/working days, backward deadlines, chain deadlines, tacit approval, color-coded status
- **CLAUDE.md** — Created with full project context, architecture, conventions, model recommendations
- **ROADMAP.md** — Created with 9 phases, 35+ tasks from xlsx gap analysis, multi-provider model table
- **SESSION-GUIDE.md** — Created with start/resume prompts, git workflow, file update rules

### Commits

- `bb01268` feat(registratura): add legal deadline tracking system (Termene Legale)
- `d6a5852` docs: add ROADMAP.md with detailed future task plan
- `b1df15b` docs: rewrite ROADMAP.md with complete xlsx gap analysis + multi-model recommendations
- (this session) docs: add SESSION-GUIDE.md + SESSION-LOG.md

### Notes

- Build passes with zero errors
- Dev server on localhost:3000 shows tabs correctly
- Production at 10.10.10.166:3000 requires Portainer redeploy after push
- The `app_modules_overview.xlsx` is in the repo root but not committed (it's a reference file)
- No tasks from ROADMAP.md Phase 1+ have been started yet — next session should begin with task 1.01

---
