{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "88e0ff90",
   "metadata": {},
   "source": [
    "# Moduł 9: Lineage, audit trail i pakiet dowodowy\n",
    "\n",
    "**Wersja:** uczestnika  \n",
    "**Cel:** zbudować dwuwarstwowy ślad: metadane lineage cech oraz rejestr wykonanych transformacji  \n",
    "**Czas orientacyjny:** 45–60 min  \n",
    "**Dane:** feature_metadata.csv, transformation_history.csv, customer360_clean.csv  \n",
    "**Artefakt końcowy:** pakiet dowodowy: coverage lineage + luki + audit trail z checksumami\n",
    "\n",
    "Notebook jest częścią wspólnego case'u **Customer 360**. Dane są syntetyczne i służą wyłącznie ćwiczeniu."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f94519d",
   "metadata": {},
   "source": [
    "## Jak pracować\n",
    "\n",
    "1. Uruchamiaj komórki od góry do dołu.\n",
    "2. Najpierw zapisz obserwację z danych. Dopiero później formułuj hipotezę o przyczynie.\n",
    "3. W rekomendacji wskaż dowód, właściciela działania i warunek ponownej oceny.\n",
    "4. Wynik statystyczny jest sygnałem diagnostycznym. Sam nie przesądza o zatrzymaniu modelu, zmianie progu ani retrainingu."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db734f80",
   "metadata": {},
   "source": [
    "## Granice interpretacji\n",
    "\n",
    "- Lineage opisuje pochodzenie, transformacje, odpowiedzialność i użycie cechy; audit trail zapisuje, co wykonano, kiedy i w jakiej kolejności.\n",
    "- Brak lineage nie oznacza automatycznie braku formalnej certyfikacji ani nie dowodzi nielegalnego użycia danych.\n",
    "- Checksum pomaga wykryć zmianę wersji danych, ale sam nie gwarantuje niezmienności całego rejestru.\n",
    "- Brak logu nie dowodzi błędnej predykcji. Ogranicza możliwość pełnej rekonstrukcji.\n",
    "- Artefakty mogą wspierać audyt i wykazywanie zgodności procesu, ale notebook nie przypisuje automatycznie konkretnych obowiązków prawnych wynikających z RODO lub AI Act."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "456a3bd9",
   "metadata": {},
   "source": [
    "## Reguła operacyjna laboratorium\n",
    "Lineage i audit trail odpowiadają na różne pytania i pozostają oddzielne. Checksum pomaga wykryć zmianę lub powiązać wersję, ale sam hash nie tworzy niezmiennego rejestru. Artefakty mogą wspierać audyt i wykazywanie procesu; notebook nie jest mapą obowiązków prawnych RODO ani AI Act."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "73e64962",
   "metadata": {},
   "source": [
    "## Dane wejściowe i manifest\n",
    "Dane: `feature_metadata.csv`, `transformation_history.csv`, `customer360_clean.csv`.  \n",
    "Opis kolumn i reguł laboratoryjnych: `manifests/M09_data_manifest.csv` w paczce zbiorczej albo `data_manifest.csv` w paczce modułowej."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "71d13680",
   "metadata": {
    "tags": [
     "setup"
    ]
   },
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "import sys\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "DATA_DIR = Path('data')\n",
    "if not DATA_DIR.exists():\n",
    "    DATA_DIR = Path('..') / 'data'\n",
    "assert DATA_DIR.exists(), 'Nie znaleziono katalogu data. Uruchom notebook z katalogu paczki lub zachowaj strukturę ZIP.'\n",
    "print('Python:', sys.version.split()[0])\n",
    "print('pandas:', pd.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "111aa116",
   "metadata": {},
   "source": [
    "## 1. Coverage metadanych lineage\n",
    "\n",
    "Sprawdź kompletność source, transformation, owner, use_basis_or_purpose_record i model. Oprócz procentu pokaż, których cech dotyczą braki oraz ich importance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1ddd55fc",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "meta=pd.read_csv(DATA_DIR/'feature_metadata.csv').fillna('')\n",
    "required=['source','transformation','owner','use_basis_or_purpose_record','model']\n",
    "# TODO: coverage i gaps"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5d58641",
   "metadata": {},
   "source": [
    "## 2. Audit trail transformacji\n",
    "\n",
    "Wczytaj historię, sprawdź rosnący step_no oraz unikalność kombinacji run_id+step_no."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8bda4134",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "history=pd.read_csv(DATA_DIR/'transformation_history.csv')\n",
    "# TODO: integrity checks"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f3a4e676",
   "metadata": {},
   "source": [
    "## 3. Checksum jako kontrola wersji\n",
    "\n",
    "Oblicz checksum snapshotu danych oraz łańcuch hash wpisów rejestru. Traktuj go jako demonstrację wykrywania zmiany, nie dowód pełnej niezmienności systemu."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "83e4e84a",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "import hashlib\n",
    "def sha256_bytes(b): return hashlib.sha256(b).hexdigest()\n",
    "# TODO: snapshot_hash i chain_hash"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "affc4ef6",
   "metadata": {},
   "source": [
    "## 4. Pakiet dowodowy i luki\n",
    "\n",
    "Zestaw warstwy lineage i audit trail. Wskaż przynajmniej jedną lukę wraz z właścicielem domknięcia i kryterium zamknięcia."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e6469682",
   "metadata": {
    "tags": [
     "exercise"
    ]
   },
   "outputs": [],
   "source": [
    "evidence_summary=pd.DataFrame(columns=['item','status','gap','owner','closure'])\n",
    "display(evidence_summary)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f6602252",
   "metadata": {},
   "source": [
    "## Zadanie rozszerzające\n",
    "\n",
    "Wybierz jedną hipotetyczną predykcję i zapisz listę artefaktów potrzebnych do jej odtworzenia point-in-time."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "781b240f",
   "metadata": {},
   "source": [
    "## Kryteria akceptacji ćwiczenia\n",
    "- lineage i audit trail pozostają oddzielnymi warstwami\n",
    "- SHA-256 jest użyty do identyfikacji/porównania wersji, bez twierdzenia o samodzielnej gwarancji niezmienności\n",
    "- luki mają właściciela domknięcia i kryterium zamknięcia\n",
    "\n",
    "Przed oddaniem wykonaj **Restart Kernel and Run All**. Notebook nie powinien zależeć od ręcznie ustawionego stanu poprzednich komórek."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "911eb8b8",
   "metadata": {},
   "source": [
    "## Co oddajesz\n",
    "\n",
    "Zachowaj tabelę lub wykres będący wynikiem ćwiczenia oraz krótki komentarz: **obserwacja → hipoteza → potrzebny dowód → rekomendacja / dalszy krok**. Jeżeli nie da się rozstrzygnąć przyczyny na podstawie danych z notebooka, oznacz ją jako hipotezę i wskaż brakujący artefakt."
   ]
  }
 ],
 "metadata": {
  "course": {
   "generated": "2026-08-28",
   "module": 9,
   "variant": "participant"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.x"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
