Pobieralna paczka źródeł dla AI: pages/ski-2027-kb.zip

Przy każdej regeneracji gen_pages.py buduje archiwum do wrzucenia w okno
czatu: wszystkie pliki .md bundle'a z zachowaniem struktury katalogów
(28 plików: koncepty, indexy podkatalogów, log.md) plus wygenerowany
AI-README.md. Nie wchodzą pages/, zdjęcia, generatory ani __pycache__ —
paczka niesie samą wiedzę, nie rusztowanie.

Deterministycznie: stały czas modyfikacji wpisów (1980-01-01), stała
kolejność i stały poziom kompresji, więc archiwum jest bajt w bajt takie
samo, dopóki nie zmieni się treść — git nie widzi diffów z niczego
(zweryfikowane: dwa uruchomienia, ten sam md5).

Z tego samego powodu AI-README.md podaje jako datę nie odczyt zegara,
tylko najnowsze `ostatnia_aktualizacja` w bundle'u ("data treści") —
data z zegara robiłaby nową wersję pliku każdego dnia, także wtedy, gdy
nic nie doszło.

AI-README.md (PL + EN, generowany z bundle'a): czym jest baza, format
OKF (markdown + YAML frontmatter, jeden plik = jeden koncept), polecenie
odpowiadania wyłącznie z tych plików i objaśnienie dwóch pól niosących
pewność danych — `status_ceny` i `dostepnosc_6_13_02_2027`, z ostrzeżeniem,
żeby nie zgadywać dostępności przy 🔍 i nie podawać szacunków jako cen
potwierdzonych.

Link "Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj" jako piąty
kafel na start.html i pozycja w sekcji "Wejście" na linki.html.

Plus wpis do log.md podsumowujący całą zmianę terminu.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
oskar 2026-08-04 10:03:32 +02:00
parent 06ab1b24aa
commit 2491ae59f3
6 changed files with 140 additions and 5 deletions

View file

@ -41,10 +41,12 @@ Uruchomienie: python3 gen_pages.py
from __future__ import annotations from __future__ import annotations
import html import html
import io
import posixpath import posixpath
import re import re
import shutil import shutil
import sys import sys
import zipfile
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
@ -61,6 +63,16 @@ TERM_SHORT = "613.02" # nagłówek kolumny w tabeli porównawczej
TERM_NOTE = "tydzień Fasching, szczyt sezonu" TERM_NOTE = "tydzień Fasching, szczyt sezonu"
RESERVED = {"index.md", "log.md"} RESERVED = {"index.md", "log.md"}
# Pobieralna paczka źródeł dla AI (patrz sekcja niżej): same .md bundle'a
# plus wygenerowany AI-README.md, bez stron, zdjęć i generatorów.
ZIP_NAME = "ski-2027-kb.zip"
ZIP_ROOT = "ski-2027-kb" # katalog wewnątrz archiwum, żeby się nie rozsypało
AI_README = "AI-README.md"
# Stały czas modyfikacji wpisów: archiwum ma być bajt w bajt identyczne,
# dopóki nie zmieni się treść — inaczej każda regeneracja robiłaby gitowi
# diff z niczego. 1980-01-01 to minimum formatu ZIP.
ZIP_TIMESTAMP = (1980, 1, 1, 0, 0, 0)
# Publiczny adres wystawki — jedyne miejsce, w którym siedzi domena. Używa go # Publiczny adres wystawki — jedyne miejsce, w którym siedzi domena. Używa go
# WYŁĄCZNIE pages/linki.html (spis do kopiowania i wysyłania grupie); wszystkie # WYŁĄCZNIE pages/linki.html (spis do kopiowania i wysyłania grupie); wszystkie
# pozostałe strony linkują względnie albo root-absolutnie, żeby działały tak # pozostałe strony linkują względnie albo root-absolutnie, żeby działały tak
@ -1190,6 +1202,9 @@ TILES = [
("/pages/linki.html", "Wszystkie linki", ("/pages/linki.html", "Wszystkie linki",
"Pełne adresy wszystkich stron wystawki, z przyciskiem „kopiuj” — " "Pełne adresy wszystkich stron wystawki, z przyciskiem „kopiuj” — "
"do wrzucenia grupie."), "do wrzucenia grupie."),
(f"/{PAGES_DIRNAME}/{ZIP_NAME}", "Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj",
"Wszystkie źródła wiedzy w markdownie, bez stron i zdjęć — model "
"przeczyta całość i odpowie na pytania o wyjazd."),
] ]
@ -1326,6 +1341,12 @@ def link_sections(
), ),
Link(site_url("viz.html"), "Graf powiązań", "Struktura bazy — załącznik."), Link(site_url("viz.html"), "Graf powiązań", "Struktura bazy — załącznik."),
Link(site_url("pages/linki.html"), "Ten spis linków", "Strona, którą czytasz."), Link(site_url("pages/linki.html"), "Ten spis linków", "Strona, którą czytasz."),
Link(
site_url(f"{PAGES_DIRNAME}/{ZIP_NAME}"),
"Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj",
"Wszystkie źródła wiedzy w markdownie, bez stron i zdjęć — model "
"przeczyta całość i odpowie na pytania o wyjazd.",
),
] ]
used.add("wyjazd") used.add("wyjazd")
@ -1494,6 +1515,110 @@ def render_links(concepts: list[Concept], regions: list[Region]) -> str:
return _page_shell("Linki", 0, content, script=LINKS_JS) return _page_shell("Linki", 0, content, script=LINKS_JS)
# --- pobieralna paczka źródeł dla AI ----------------------------------
def bundle_sources() -> list[Path]:
"""Pliki .md bundle'a — z zachowaniem struktury katalogów."""
return sorted(
path
for path in BUNDLE_ROOT.rglob("*.md")
if ".git" not in path.parts
and PAGES_DIRNAME not in path.relative_to(BUNDLE_ROOT).parts
)
def bundle_date(concepts: list[Concept]) -> str:
"""Data treści = najnowsze `ostatnia_aktualizacja` w bundle'u.
Świadomie NIE bierzemy zegara: paczka ma być identyczna, dopóki nie
zmieni się wiedza. Data z zegara robiłaby nową wersję pliku każdego
dnia, także wtedy, gdy nic nie doszło.
"""
dates = [
str(c.frontmatter.get("ostatnia_aktualizacja") or "").strip() for c in concepts
]
return max((d for d in dates if d), default="")
def render_ai_readme(concepts: list[Concept]) -> str:
"""AI-README.md do paczki — skrót index.md dla modelu po drugiej stronie."""
offers = [c for c in concepts if is_offer(c)]
active = [c for c in offers if not is_archived(c)]
regions = sorted(
c.id.split("/")[0] for c in concepts if c.id.endswith("/region")
)
date = bundle_date(concepts)
return f"""# Ski 2027 — baza wiedzy wyjazdu ({TERM_LABEL})
## PL
To baza wiedzy wyjazdu narciarskiego czterech rodzin (14 osób: 8 dorosłych,
4 nastolatków, 2 dzieci) z Warszawy w Alpy w terminie **{TERM_LABEL}**
({TERM_NOTE}). Format to OKF: markdown z frontmatterem YAML, gdzie jeden
plik = jeden koncept, `index.md` w każdym katalogu jest listingiem, a
`log.md` historią zmian; porównywane {len(regions)} regiony
({", ".join(regions)}) w schemacie `<region>/region.md` +
`<region>/oferty/*.md`, razem {len(active)} aktualnych kart noclegów.
Odpowiadaj na pytania o ten wyjazd **wyłącznie na podstawie tych plików** i
podawaj, z którego pliku pochodzi odpowiedź.
O pewności danych mówią dwa pola frontmattera: `status_ceny`
(ZWERYFIKOWANE = odczytane z cennika obiektu, SZACUNEK = nasza estymacja,
do potwierdzenia) oraz `{AVAILABILITY_FIELD}` ze statusem DOSTĘPNE
(zweryfikowane) / BRAK (zweryfikowane) / 🔍 BRAK DANYCH (do
weryfikacji). Nie przedstawiaj szacunków jako cen potwierdzonych i nie
zgaduj dostępności tam, gdzie stoi 🔍. Karty z `priorytet: ARCHIWALNA`
pochodzą z riserczu na poprzedni termin (1623.01.2027) traktuj je jako
historyczne, nie jako aktualną ofertę.
**Data treści (najnowsza aktualizacja w bazie): {date}.**
## EN
This is the knowledge base of a ski trip for four families (14 people:
8 adults, 4 teenagers, 2 children) driving from Warsaw to the Alps on
**{TERM_LABEL}** (carnival week, peak season). The format is OKF: markdown
with YAML frontmatter, one file = one concept, `index.md` in each directory
is a listing and `log.md` is the change history; {len(regions)} regions
({", ".join(regions)}) are compared using the same schema
`<region>/region.md` + `<region>/oferty/*.md`, with {len(active)} current
accommodation cards in total. Answer questions about this trip **only from
these files** and say which file an answer comes from.
Two frontmatter fields carry the confidence of the data: `status_ceny`
(ZWERYFIKOWANE = read from the property's own price list, SZACUNEK = our
estimate, unconfirmed) and `{AVAILABILITY_FIELD}` ( AVAILABLE,
verified / NOT AVAILABLE, verified / 🔍 NO DATA, to be checked). Never
present an estimate as a confirmed price and never guess availability where
the value is 🔍. Cards marked `priorytet: ARCHIWALNA` come from research
for the previous date (1623.01.2027) treat them as historical.
**Content date (latest update in the base): {date}.**
"""
def write_bundle_zip(concepts: list[Concept]) -> Path:
"""Buduje pages/ski-2027-kb.zip — deterministycznie, bajt w bajt."""
entries: list[tuple[str, str]] = [
(f"{ZIP_ROOT}/{AI_README}", render_ai_readme(concepts))
]
for path in bundle_sources():
rel = path.relative_to(BUNDLE_ROOT).as_posix()
entries.append((f"{ZIP_ROOT}/{rel}", path.read_text(encoding="utf-8")))
buffer = io.BytesIO()
with zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED, compresslevel=9) as archive:
for name, text in sorted(entries):
info = zipfile.ZipInfo(name, date_time=ZIP_TIMESTAMP)
info.compress_type = zipfile.ZIP_DEFLATED
info.external_attr = 0o644 << 16
archive.writestr(info, text.encode("utf-8"))
target = PAGES_DIR / ZIP_NAME
target.write_bytes(buffer.getvalue())
return target
# --- raport braków ---------------------------------------------------- # --- raport braków ----------------------------------------------------
@ -1566,6 +1691,8 @@ def main() -> int:
path.write_text(markup, encoding="utf-8") path.write_text(markup, encoding="utf-8")
written.append(path) written.append(path)
written.append(write_bundle_zip(concepts))
print(f"Renderer markdown: {RENDERER}") print(f"Renderer markdown: {RENDERER}")
print(f"Zapisano {len(written)} plików w {PAGES_DIR}:") print(f"Zapisano {len(written)} plików w {PAGES_DIR}:")
for path in written: for path in written:

8
log.md
View file

@ -1,5 +1,13 @@
# Update Log # Update Log
## 2026-08-04
* **Update**: **Zmiana terminu wyjazdu: 1623.01 → 613.02.2027** i nałożenie riserczu 08.2026 na cały bundle. Nowy termin to tydzień **Fasching** (karnawał, Popielec 10.02) plus ferie bawarskie — szczyt sezonu, więc wszystkie budżety noclegowe poszły w górę, a [SFL](/sfl/region.md) traci styczniową przewagę cenową (u nich luty to pełny wysoki sezon). Zaktualizowane body i pola merytoryczne czterech regionów, dziesięciu kart noclegów i [szablonu maila](/szablon-maila.md). Każda karta noclegu ma nowe pole `dostepnosc_6_13_02_2027` z legendą ✅ DOSTĘPNE (zweryfikowane) / ❌ BRAK (zweryfikowane) / 🔍 BRAK DANYCH (do weryfikacji). Jedyny zweryfikowany status w bazie jest negatywny: [Glemm Lodge](/saalbach/oferty/glemm-lodge.md) ma na ten tydzień zajęte wszystkie 3 apartamenty (wolne 1320.02 i 27.0206.03) — twardy dowód presji na tydzień karnawału. [Wyjazd](/wyjazd.md) przepisany: nowa tabela porównawcza regionów, tabela dostępności i wnioski przekrojowe (Kronplatz najlepiej znosi termin), plus sekcja "Plan B na wypadek pełnego tygodnia".
* **Update**: Restrukturyzacja do symetrii — `region.md` i `oferty/` z korzenia przeniesione do [`saalbach/`](/saalbach/index.md), więc wszystkie cztery regiony siedzą w jednym schemacie `<region>/region.md` + `<region>/oferty/*.md`. Zdjęcia obiektów przetrwały bez ruszania: mapowanie oferta→zdjęcia jest kluczowane po polu `id`, nie po ścieżce. Dołożony [`saalbach/index.md`](/saalbach/index.md), indexy podkatalogów zaktualizowane, listing [index.md](/index.md) przebudowany na cztery równorzędne regiony.
* **Update**: Karty [dom dla grupy](/saalbach/oferty/dom-dla-grupy.md) i [AlpenParks Rehrenberg](/saalbach/oferty/alpenparks-rehrenberg.md) — spoza paczki riserczowej — oznaczone jako **ARCHIWALNE**: ich ceny i dostępność dotyczą starego terminu. Wypadają z tabeli porównawczej i ze statusów dostępności do osobnej sekcji "Archiwum" na dole porównania.
* **Update**: `gen_pages.py` — nowa kolumna "Dostępność 613.02" w tabeli porównawczej (emoji + werdykt w komórce, pełna notatka pod kursorem, sortowanie decyzyjne), wiersz z zweryfikowanym brakiem miejsc na czerwono, sekcja "Archiwum", termin wyjazdu w stałych `TERM_LABEL`/`TERM_SHORT`/`TERM_NOTE` (stąd biorą go nagłówki wszystkich stron i raport braków). Raport braków czyta dostępność z pola frontmattera zamiast zgadywać z nagłówków w body.
* **Update**: Nowa **pobieralna paczka źródeł dla AI**: `pages/ski-2027-kb.zip` (budowana przy każdej regeneracji, deterministycznie — bajt w bajt taka sama, dopóki nie zmieni się treść) z wszystkimi plikami `.md` bundle'a, `log.md` i wygenerowanym `AI-README.md` po polsku i angielsku (czym jest baza, jak czytać `status_ceny` i `dostepnosc_6_13_02_2027`, data treści). Link "Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude'a i pytaj" na [starcie](/index.md) i w spisie linków.
## 2026-08-03 ## 2026-08-03
* **Update**: Rozstrzygnięcie rozbieżności skipassowej w [Ischgl](/ischgl/region.md) (ischgl.com, cennik 26/27, sprawdzone 03.08.2026): 385/231 € to **VIP Skipass** — tylko dla nocujących w Ischgl/Mathon, 46 urządzeń, bez wyciągów Kappl; 451/257 € to **Silvretta Skipass** — dla gości spoza Ischgl/Mathon (w tym Kappl), 75 urządzeń. Przy PLANIE A (nocleg w Kappl) obowiązuje Silvretta, więc ceny w tabelach zostają. Poprawione dwa błędy w karcie: tabela 451/257 € była podpisana jako VIP, a sekcja "Teren" przypisywała VIP-owi zasięg całego Paznaun. Pułapka wiekowa 8<17 potwierdzona, dopisany plus: dzieci <8 lat gratis w karcie i w [wyjeździe](/wyjazd.md) (tabela porównawcza + wniosek nr 2). * **Update**: Rozstrzygnięcie rozbieżności skipassowej w [Ischgl](/ischgl/region.md) (ischgl.com, cennik 26/27, sprawdzone 03.08.2026): 385/231 € to **VIP Skipass** — tylko dla nocujących w Ischgl/Mathon, 46 urządzeń, bez wyciągów Kappl; 451/257 € to **Silvretta Skipass** — dla gości spoza Ischgl/Mathon (w tym Kappl), 75 urządzeń. Przy PLANIE A (nocleg w Kappl) obowiązuje Silvretta, więc ceny w tabelach zostają. Poprawione dwa błędy w karcie: tabela 451/257 € była podpisana jako VIP, a sekcja "Teren" przypisywała VIP-owi zasięg całego Paznaun. Pułapka wiekowa 8<17 potwierdzona, dopisany plus: dzieci <8 lat gratis w karcie i w [wyjeździe](/wyjazd.md) (tabela porównawcza + wniosek nr 2).

View file

@ -158,9 +158,9 @@ td.thumb .placeholder { display: flex; width: 120px; height: 80px; border-radius
<body> <body>
<nav><a href="start.html">← Start</a> · <a href="index.html">Wszystkie karty</a> · <a href="porownanie.html">Porównanie ofert</a> · <a href="linki.html">Linki</a> · <a href="../viz.html">Graf</a></nav> <nav><a href="start.html">← Start</a> · <a href="index.html">Wszystkie karty</a> · <a href="porownanie.html">Porównanie ofert</a> · <a href="linki.html">Linki</a> · <a href="../viz.html">Graf</a></nav>
<h1>Linki do wysłania</h1> <h1>Linki do wysłania</h1>
<p class="lead">Wszystkie 24 stron wystawki jako pełne adresy — do skopiowania i wrzucenia grupie. Lista powstaje z tych samych danych co reszta stron, więc nowa oferta pojawi się tu sama.</p> <p class="lead">Wszystkie 25 stron wystawki jako pełne adresy — do skopiowania i wrzucenia grupie. Lista powstaje z tych samych danych co reszta stron, więc nowa oferta pojawi się tu sama.</p>
<div class="copybar"><button type="button" id="copy-all">Kopiuj wszystkie</button><button type="button" id="copy-start" data-url="https://narty27.kapala.org/">Kopiuj link startowy</button><span class="copy-status" role="status" aria-live="polite"></span></div> <div class="copybar"><button type="button" id="copy-all">Kopiuj wszystkie</button><button type="button" id="copy-start" data-url="https://narty27.kapala.org/">Kopiuj link startowy</button><span class="copy-status" role="status" aria-live="polite"></span></div>
<section data-section="Wejście"><h2>Wejście</h2><ul class="links"><li><a href="https://narty27.kapala.org/">Start</a><code class="url">https://narty27.kapala.org/</code><p>Landing decyzyjny — od tego zaczyna grupa.</p></li><li><a href="https://narty27.kapala.org/pages/porownanie.html">Porównanie ofert</a><code class="url">https://narty27.kapala.org/pages/porownanie.html</code><p>Wszystkie noclegi w jednej sortowalnej tabeli, ze zdjęciami.</p></li><li><a href="https://narty27.kapala.org/pages/wyjazd.html">Analiza wariantów</a><code class="url">https://narty27.kapala.org/pages/wyjazd.html</code><p>Wyjazd narciarski 4 rodzin (14 osób) z Warszawy w tygodniu Fasching: porównanie czterech regionów, statusy…</p></li><li><a href="https://narty27.kapala.org/pages/index.html">Spis wszystkich kart</a><code class="url">https://narty27.kapala.org/pages/index.html</code><p>Każdy dokument bazy wiedzy w jednym miejscu.</p></li><li><a href="https://narty27.kapala.org/viz.html">Graf powiązań</a><code class="url">https://narty27.kapala.org/viz.html</code><p>Struktura bazy — załącznik.</p></li><li><a href="https://narty27.kapala.org/pages/linki.html">Ten spis linków</a><code class="url">https://narty27.kapala.org/pages/linki.html</code><p>Strona, którą czytasz.</p></li></ul></section> <section data-section="Wejście"><h2>Wejście</h2><ul class="links"><li><a href="https://narty27.kapala.org/">Start</a><code class="url">https://narty27.kapala.org/</code><p>Landing decyzyjny — od tego zaczyna grupa.</p></li><li><a href="https://narty27.kapala.org/pages/porownanie.html">Porównanie ofert</a><code class="url">https://narty27.kapala.org/pages/porownanie.html</code><p>Wszystkie noclegi w jednej sortowalnej tabeli, ze zdjęciami.</p></li><li><a href="https://narty27.kapala.org/pages/wyjazd.html">Analiza wariantów</a><code class="url">https://narty27.kapala.org/pages/wyjazd.html</code><p>Wyjazd narciarski 4 rodzin (14 osób) z Warszawy w tygodniu Fasching: porównanie czterech regionów, statusy…</p></li><li><a href="https://narty27.kapala.org/pages/index.html">Spis wszystkich kart</a><code class="url">https://narty27.kapala.org/pages/index.html</code><p>Każdy dokument bazy wiedzy w jednym miejscu.</p></li><li><a href="https://narty27.kapala.org/viz.html">Graf powiązań</a><code class="url">https://narty27.kapala.org/viz.html</code><p>Struktura bazy — załącznik.</p></li><li><a href="https://narty27.kapala.org/pages/linki.html">Ten spis linków</a><code class="url">https://narty27.kapala.org/pages/linki.html</code><p>Strona, którą czytasz.</p></li><li><a href="https://narty27.kapala.org/pages/ski-2027-kb.zip">Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude&#x27;a i pytaj</a><code class="url">https://narty27.kapala.org/pages/ski-2027-kb.zip</code><p>Wszystkie źródła wiedzy w markdownie, bez stron i zdjęć — model przeczyta całość i odpowie na pytania o wyjazd.</p></li></ul></section>
<section data-section="Regiony"><h2>Regiony</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/saalbach/region.html">Saalbach</a><code class="url">https://narty27.kapala.org/pages/saalbach/region.html</code><p>Budżet grupy ~16 20019 500 €. Wariant bazowy: 270 km tras i najkrótszy dojazd z Warszawy, ale w tygodniu Fasching…</p></li><li><a href="https://narty27.kapala.org/pages/ischgl/region.html">Ischgl/Paznaun</a><code class="url">https://narty27.kapala.org/pages/ischgl/region.html</code><p>Budżet grupy ~14 20017 000 €. Wariant alternatywny: 239 km Silvretta Areny z jazdą do bezcłowego Samnaun, nocleg w…</p></li><li><a href="https://narty27.kapala.org/pages/kronplatz/region.html">Kronplatz</a><code class="url">https://narty27.kapala.org/pages/kronplatz/region.html</code><p>Budżet grupy ~14 50017 700 €. Wariant alternatywny i najlepiej znoszący tydzień Fasching: 121 km na jednej górze plus…</p></li><li><a href="https://narty27.kapala.org/pages/sfl/region.html">SFL</a><code class="url">https://narty27.kapala.org/pages/sfl/region.html</code><p>Budżet grupy ~14 50017 900 €. Wariant alternatywny: 214 km na słonecznym płaskowyżu i najlepsza infrastruktura…</p></li></ul></section> <section data-section="Regiony"><h2>Regiony</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/saalbach/region.html">Saalbach</a><code class="url">https://narty27.kapala.org/pages/saalbach/region.html</code><p>Budżet grupy ~16 20019 500 €. Wariant bazowy: 270 km tras i najkrótszy dojazd z Warszawy, ale w tygodniu Fasching…</p></li><li><a href="https://narty27.kapala.org/pages/ischgl/region.html">Ischgl/Paznaun</a><code class="url">https://narty27.kapala.org/pages/ischgl/region.html</code><p>Budżet grupy ~14 20017 000 €. Wariant alternatywny: 239 km Silvretta Areny z jazdą do bezcłowego Samnaun, nocleg w…</p></li><li><a href="https://narty27.kapala.org/pages/kronplatz/region.html">Kronplatz</a><code class="url">https://narty27.kapala.org/pages/kronplatz/region.html</code><p>Budżet grupy ~14 50017 700 €. Wariant alternatywny i najlepiej znoszący tydzień Fasching: 121 km na jednej górze plus…</p></li><li><a href="https://narty27.kapala.org/pages/sfl/region.html">SFL</a><code class="url">https://narty27.kapala.org/pages/sfl/region.html</code><p>Budżet grupy ~14 50017 900 €. Wariant alternatywny: 214 km na słonecznym płaskowyżu i najlepsza infrastruktura…</p></li></ul></section>
<section data-section="Oferty — Saalbach"><h2>Oferty — Saalbach</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-sonnleiten.html">AlpenParks Hotel &amp; Apartment Sonnleiten</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-sonnleiten.html</code><p>PLAN A-bis · Saalbach</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/kristall-schattbergxpress.html">Appartementhaus Kristall at SchattbergXpress</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/kristall-schattbergxpress.html</code><p>PLAN A · Saalbach (centrum)</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/sportchalet-viehhofen.html">Sportchalet Viehhofen</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/sportchalet-viehhofen.html</code><p>PLAN B · Viehhofen (3 km od Saalbach)</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-rehrenberg.html">AlpenParks Apartments Rehrenberg</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-rehrenberg.html</code><p>ARCHIWALNA · Viehhofen</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/dom-dla-grupy.html">Duży dom wakacyjny 1214 os. (do wyszukania)</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/dom-dla-grupy.html</code><p>ARCHIWALNA · Viehhofen / Maishofen / strona Fieberbrunn</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/glemm-lodge.html">Glemm Lodge Apartments ⭐⭐⭐⭐</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/glemm-lodge.html</code><p>NIEDOSTĘPNY w terminie; referencja cenowa + opcja przy zmianie tygodnia · między Saalbach a Hinterglemm</p></li></ul></section> <section data-section="Oferty — Saalbach"><h2>Oferty — Saalbach</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-sonnleiten.html">AlpenParks Hotel &amp; Apartment Sonnleiten</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-sonnleiten.html</code><p>PLAN A-bis · Saalbach</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/kristall-schattbergxpress.html">Appartementhaus Kristall at SchattbergXpress</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/kristall-schattbergxpress.html</code><p>PLAN A · Saalbach (centrum)</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/sportchalet-viehhofen.html">Sportchalet Viehhofen</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/sportchalet-viehhofen.html</code><p>PLAN B · Viehhofen (3 km od Saalbach)</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-rehrenberg.html">AlpenParks Apartments Rehrenberg</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/alpenparks-rehrenberg.html</code><p>ARCHIWALNA · Viehhofen</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/dom-dla-grupy.html">Duży dom wakacyjny 1214 os. (do wyszukania)</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/dom-dla-grupy.html</code><p>ARCHIWALNA · Viehhofen / Maishofen / strona Fieberbrunn</p></li><li><a href="https://narty27.kapala.org/pages/saalbach/oferty/glemm-lodge.html">Glemm Lodge Apartments ⭐⭐⭐⭐</a><code class="url">https://narty27.kapala.org/pages/saalbach/oferty/glemm-lodge.html</code><p>NIEDOSTĘPNY w terminie; referencja cenowa + opcja przy zmianie tygodnia · między Saalbach a Hinterglemm</p></li></ul></section>
<section data-section="Oferty — Ischgl/Paznaun"><h2>Oferty — Ischgl/Paznaun</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/ischgl/oferty/apartment-brandau-kappl.html">Apartment Brandau</a><code class="url">https://narty27.kapala.org/pages/ischgl/oferty/apartment-brandau-kappl.html</code><p>PLAN A · Kappl (Paznaun)</p></li><li><a href="https://narty27.kapala.org/pages/ischgl/oferty/apartments-kappl.html">Apartments Kappl</a><code class="url">https://narty27.kapala.org/pages/ischgl/oferty/apartments-kappl.html</code><p>PLAN B · Kappl (Paznaun)</p></li></ul></section> <section data-section="Oferty — Ischgl/Paznaun"><h2>Oferty — Ischgl/Paznaun</h2><ul class="links"><li><a href="https://narty27.kapala.org/pages/ischgl/oferty/apartment-brandau-kappl.html">Apartment Brandau</a><code class="url">https://narty27.kapala.org/pages/ischgl/oferty/apartment-brandau-kappl.html</code><p>PLAN A · Kappl (Paznaun)</p></li><li><a href="https://narty27.kapala.org/pages/ischgl/oferty/apartments-kappl.html">Apartments Kappl</a><code class="url">https://narty27.kapala.org/pages/ischgl/oferty/apartments-kappl.html</code><p>PLAN B · Kappl (Paznaun)</p></li></ul></section>

BIN
pages/ski-2027-kb.zip Normal file

Binary file not shown.

View file

@ -159,7 +159,7 @@ td.thumb .placeholder { display: flex; width: 120px; height: 80px; border-radius
<nav><a href="/pages/index.html">Wszystkie karty</a> · <a href="/pages/porownanie.html">Porównanie ofert</a> · <a href="/pages/linki.html">Linki</a> · <a href="/viz.html">Graf</a></nav> <nav><a href="/pages/index.html">Wszystkie karty</a> · <a href="/pages/porownanie.html">Porównanie ofert</a> · <a href="/pages/linki.html">Linki</a> · <a href="/viz.html">Graf</a></nav>
<h1>Ski 2027 — wyjazd 613.02.2027</h1> <h1>Ski 2027 — wyjazd 613.02.2027</h1>
<p class="lead"><strong>613.02.2027</strong> (tydzień Fasching, szczyt sezonu), 4 rodziny / 14 osób, wyjazd z Warszawy. Od czego zacząć:</p> <p class="lead"><strong>613.02.2027</strong> (tydzień Fasching, szczyt sezonu), 4 rodziny / 14 osób, wyjazd z Warszawy. Od czego zacząć:</p>
<ul class="tiles"><li><a href="/pages/porownanie.html">Porównanie ofert<small>Wszystkie noclegi w jednej sortowalnej tabeli: dostępność na 613.02, ceny, status ceny, priorytet, odległość od wyciągu.</small></a></li><li><a href="/pages/wyjazd.html">Analiza wariantów<small>Cztery regiony obok siebie: skipassy, dojazd, budżet całkowity grupy i wnioski przekrojowe.</small></a></li><li><a href="/viz.html">Graf powiązań<small>Struktura bazy wiedzy — koncepty, linki między nimi i adresy zewnętrzne. Załącznik, nie punkt wejścia.</small></a></li><li><a href="/pages/linki.html">Wszystkie linki<small>Pełne adresy wszystkich stron wystawki, z przyciskiem „kopiuj” — do wrzucenia grupie.</small></a></li></ul> <ul class="tiles"><li><a href="/pages/porownanie.html">Porównanie ofert<small>Wszystkie noclegi w jednej sortowalnej tabeli: dostępność na 613.02, ceny, status ceny, priorytet, odległość od wyciągu.</small></a></li><li><a href="/pages/wyjazd.html">Analiza wariantów<small>Cztery regiony obok siebie: skipassy, dojazd, budżet całkowity grupy i wnioski przekrojowe.</small></a></li><li><a href="/viz.html">Graf powiązań<small>Struktura bazy wiedzy — koncepty, linki między nimi i adresy zewnętrzne. Załącznik, nie punkt wejścia.</small></a></li><li><a href="/pages/linki.html">Wszystkie linki<small>Pełne adresy wszystkich stron wystawki, z przyciskiem „kopiuj” — do wrzucenia grupie.</small></a></li><li><a href="/pages/ski-2027-kb.zip">Pobierz bazę (.zip) — wrzuć do ChatGPT/Claude&#x27;a i pytaj<small>Wszystkie źródła wiedzy w markdownie, bez stron i zdjęć — model przeczyta całość i odpowie na pytania o wyjazd.</small></a></li></ul>
<h2>Regiony</h2> <h2>Regiony</h2>
<p class="lead">Karta regionu = skipassy, dojazd, terminy, koszty życia i budżet całkowity.</p> <p class="lead">Karta regionu = skipassy, dojazd, terminy, koszty życia i budżet całkowity.</p>
<ul class="regions"><li><a href="/pages/saalbach/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/alpenparks-sonnleiten/01.jpg')">Saalbach<small>Budżet grupy: ~16 20019 500 €</small></a></li><li><a href="/pages/ischgl/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/apartment-brandau-kappl/01.jpg')">Ischgl/Paznaun<small>Budżet grupy: ~14 20017 000 €</small></a></li><li><a href="/pages/kronplatz/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/haeuslerhof-valdaora/01.jpg')">Kronplatz<small>Budżet grupy: ~14 50017 700 €</small></a></li><li><a href="/pages/sfl/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/haus-central-ladis/01.jpg')">SFL<small>Budżet grupy: ~14 50017 900 €</small></a></li></ul> <ul class="regions"><li><a href="/pages/saalbach/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/alpenparks-sonnleiten/01.jpg')">Saalbach<small>Budżet grupy: ~16 20019 500 €</small></a></li><li><a href="/pages/ischgl/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/apartment-brandau-kappl/01.jpg')">Ischgl/Paznaun<small>Budżet grupy: ~14 20017 000 €</small></a></li><li><a href="/pages/kronplatz/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/haeuslerhof-valdaora/01.jpg')">Kronplatz<small>Budżet grupy: ~14 50017 700 €</small></a></li><li><a href="/pages/sfl/region.html" class="hero" style="background-image:linear-gradient(rgba(15,23,42,.62),rgba(15,23,42,.72)),url('/pages/img/haus-central-ladis/01.jpg')">SFL<small>Budżet grupy: ~14 50017 900 €</small></a></li></ul>

File diff suppressed because one or more lines are too long