Commit graph

12 commits

Author SHA1 Message Date
oskar cfcfbdf6bf dane skipassowe od grupy 08.2026
Cztery sekcje skipassowe uzupełnione o stawki przysłane przez grupę,
każda z adnotacją źródła i datą. Istniejące tabele nietknięte —
w każdym regionie nowe liczby stoją obok starych, z datami obu.

Saalbach: peak season 440/330/220 € potwierdza dotychczasową prognozę
(i jest górną granicą, bo nasz termin jest poza szczytem).
Kronplatz: twardy cennik, ale sezonu 2025/26 — nie tego, na który
jedziemy; szacunki 26/27 zostają.
Ischgl: dane od grupy SPRZECZNE z cennikiem w karcie — 385/231 € wobec
451/257 € i próg młodzieży 10–17 wobec 8–<17. Obie wersje zestawione,
rozstrzygnięcie zostawione grupie; do budżetowania nadal wariant
droższy. Jeśli obowiązuje próg 10–17, znika "pułapka wiekowa", która
jest dziś głównym argumentem przeciw Ischgl w tabeli w wyjazd.md.
SFL: link informacyjny (portal agregujący, nie cennik oficjalny).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 16:48:58 +02:00
oskar ae9d170ba3 Regeneracja: 19 kart w pages/, graf 18 konceptów + 20 external
Karta zbiorcza pages/index.html grupowała tylko korzeń i oferty/ —
dziewięć konceptów wariantów dostawało własne karty, ale nie było ich
na liście. Grupowanie idzie teraz po katalogach najwyższego poziomu,
a nazwa grupy to pierwszy nagłówek index.md tego katalogu, więc kolejny
region wystarczy dodać do bundle'a, żeby pojawił się tu sam.

Linki wariantów w root index.md prowadzą do region.md, nie do index.md
podkatalogów: pliki zarezerwowane nie mają kart, więc w pages/ taki
odnośnik degenerował się do linku na samego siebie.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 16:23:25 +02:00
oskar f4d69867cd Normalizacja wariantów do konwencji bundle'a + indexy podkatalogów
Frontmattery nowych konceptów dostają pola OKF (title/description/
timestamp/tags) przed polami rozszerzeń producenta, które zostają
nietknięte. Body plików bez zmian — skopiowane dokumenty nie miały
żadnych linków markdown, więc nie było czego przepisywać na formę
bundle-relative.

Nowe indexy (§8/§6): <region>/index.md i <region>/oferty/index.md —
bez frontmattera, listing z opisami z frontmatterów konceptów.

wyjazd.md dostaje tabelę noclegów w wariantach z linkami do wszystkich
sześciu kart — bez tego cztery nowe oferty byłyby w grafie sierotami
(indexy nie są konceptami, a region.md wariantów do ofert nie linkuje).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 16:21:01 +02:00
oskar c913a96cb6 Scalenie trzech wariantów alternatywnych z ski-2027-kb
Ischgl/Paznaun, Kronplatz i Serfaus-Fiss-Ladis wchodzą do bundle'a jako
podkatalogi <region>/region.md + <region>/oferty/*.md — ta sama konwencja,
co dotychczasowy (bazowy) Saalbach.

Root index.md źródłowej paczki nie jest kopiowany: jego treść rozdzielona
zgodnie z rolami dokumentów tego bundle'a — listing wariantów do sekcji
"Warianty alternatywne" w index.md, tabela porównawcza i wnioski
przekrojowe do wyjazd.md (tam, gdzie już mieszka ranking i decyzje).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 16:19:15 +02:00
oskar e8163d3800 Węzły konceptów w grafie linkują do kart HTML w pages/
Panel szczegółów renderuje pole `resource` jako klikalny odnośnik
(viz.js:171-183), więc ustawienie tam ścieżki pages/<id>.html daje
przejście z grafu do pełnej treści dokumentu — zero zmian w viewerze.
Ścieżka jest względna wobec viz.html, więc działa lokalnie i po deployu.

Węzły external zachowują swoje URL-e (podmiana leci przed dołożeniem
węzłów zewnętrznych). Jeśli koncept miałby własny `resource` we
frontmatterze, trafia do danych węzła jako `resource_frontmatter`.

Zmiana wyłącznie w window.BUNDLE — pliki .md nietknięte, check_okf.py
nadal zielony.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:47:00 +02:00
oskar c4f6cf3f1d Karty HTML konceptów: gen_pages.py + katalog pages/
Graf pokazywał strukturę, ale treść (ceny, dostępność, plusy/minusy)
siedziała tylko w panelu szczegółów viewera. gen_pages.py renderuje każdy
koncept do pages/<id>.html: metadane frontmattera jako tabelka (wszystkie
pola, też polskie rozszerzenia), body poniżej, plus pages/index.html
z listą kart.

Renderer: python-markdown, jeśli jest w systemie; tutaj go nie ma, więc
działa fallback na samej bibliotece standardowej (nagłówki, akapity,
tabele GFM, listy z - [ ], cytaty, kod, hr, inline bold/kursywa/kod/linki).

Linki miedzy konceptami przepisane na względne <id>.html, linki
zewnętrzne bez zmian. Pliki zarezerwowane (index.md, log.md) nie są
konceptami (§3.1) i nie mają kart — linki do nich prowadzą do listy kart.

Pliki .md nietknięte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:46:08 +02:00
oskar 8cca477153 Viewer: jedna reguła stylu dla węzłów typu "external"
Jedyna ingerencja w logikę viewera w tym repo, wydzielona do osobnego
commita zgodnie z ustaleniem.

Kolor węzła jest sterowany danymi ("background-color": "data(color)"),
więc odróżnienie kolorem załatwiła sama warstwa danych (poprzedni commit,
zero zmian w viewerze). Kształt już nie — cytoscape'owa tablica stylów
siedzi w viz.js. Dokładamy do niej DOKŁADNIE jedną regułę:

    selector: 'node[type = "external"]'
    shape: round-diamond, border-style: dotted, font-size: 10

To ta sama konwencja co istniejące reguły node[?stale] i
node[status = "deprecated"] — selektor po polu danych. Reguła jest
wstawiana przed node[?stale], czyli przed node:selected, więc
podświetlenie zaznaczenia nadal wygrywa.

Podmiana dzieje się w locie, na stringu wstawianym do viz.html; plik
viz.js w repo upstream pozostaje nietknięty. Jeśli upstream zmieni
kotwicę, gen_viz.py przerywa z błędem zamiast po cichu wygenerować
viewer bez reguły.

Zweryfikowane: viz.js w viz.html == upstream + ta jedna reguła (diff
bajtowy równy jej długości), viz.css nadal bajt w bajt, składnia
osadzonego JS-a sprawdzona node --check.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 16:27:19 +02:00
oskar c1c53d1b6c Linki zewnętrzne jako węzły typu "external" w grafie
gen_viz.py wyciąga adresy z konceptów i dokłada je do window.BUNDLE jako
węzły typu "external" (teal #0d9488, odróżnialne od szarych konceptów)
z krawędzią koncept → link. Cztery niezależne źródła, każde wyłączalne
stałą SOURCES: md-link, bare-url, bare-domain, frontmatter.

Deduplikacja po znormalizowanym URL-u: bez fragmentu #, bez trailing
slash, schemat i host małymi literami. Odfiltrowane domeny techniczne:
github.com/GoogleCloudPlatform, localhost, 192.168.*, 100.*.

Klik w węzeł external otwiera URL w nowej karcie bez zmiany w viewerze:
pełny adres trafia do pola `resource`, które istniejący panel szczegółów
renderuje jako <a target="_blank" rel="noopener"> (viz.js:171-183). To
mniej inwazyjny wariant niż podpinanie się pod cy.on("tap", "node").

Uwaga: body konceptów nie zawiera dziś żadnego adresu http(s):// —
wszystkie adresy obiektów siedzą we frontmatterze (www:, gdzie_szukac:),
w body są tylko gołe domeny. Samo body + http/https dałoby 0 węzłów,
stąd źródła bare-domain i frontmatter.

Logika viewera nietknięta — viz.js i viz.css nadal bajt w bajt z
upstreamu. Bundle bez zmian: 0 zmodyfikowanych plików .md,
check_okf.py nadal zielony.

Wynik: 9 konceptów + 12 external, 23 krawędzie (9 + 14).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 16:25:54 +02:00
oskar d7abf0a68e Walidator konformancji OKF v0.1 (§9)
check_okf.py — tylko stdlib, minimalny parser YAML wystarczający dla
frontmatterów w tym bundle'u. Sprawdza trzy warunki z §9:

- każdy nie-zarezerwowany .md ma parsowalny blok frontmattera YAML,
- każdy frontmatter ma niepuste pole `type`,
- pliki zarezerwowane bez frontmattera, poza root index.md, w którym
  dozwolone jest wyłącznie okf_version (§11).

Wynik na frontmatterach zweryfikowany krzyżowo z PyYAML; walidator
przetestowany na 5 wstrzykniętych naruszeniach (każde wykryte).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 15:48:49 +02:00
oskar 7ef5c34e52 Graph viewer: viz.html z knowledge-catalog + skrypt generujący
Viewer jest samowystarczalny — bundle jest wpiekany do HTML jako
window.BUNDLE (nodes/edges/bodies), nie ma odczytu .md w runtime, więc
nie potrzeba manifestu ani konkretnej ścieżki serwowania. Źródłem danych
jest gen_viz.py, uruchamiany po zmianach w bundle'u.

Logika viewera (viz.js, viz.css, szkielet templates/viz.html) wstawiona
dosłownie z upstreamu — zweryfikowane bajt w bajt. gen_viz.py koryguje
wyłącznie zbieranie danych, w dwóch miejscach niezgodnych ze spec:

- _extract_links pomijał linki bundle-relative "/..." (generator.py:74),
  czyli formę zalecaną w §5.1 — bundle zgodny ze spec dawał graf z 0
  krawędzi. Sam viewer te linki rozumie (viz.js:297).
- _walk_concepts pomijał tylko index.md, więc zarezerwowany log.md
  trafiał do grafu jako koncept typu "Unknown" (wbrew §3.1).

Wynik: 9 konceptów, 9 krawędzi (było 9 i 0).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 15:48:32 +02:00
oskar e3b50cd43e Konwersja bundle'a do OKF v0.1
- index.md: frontmatter zredukowany do samego okf_version (§6/§11),
  body przepisane na listing sekcji w formacie §6.
- Nowy koncept wyjazd.md (type: Trip) przejmuje metadane wyjazdu
  (nazwa/grupa/termin) oraz ranking ofert i najbliższe kroki z index.md.
- Każdy koncept dostał title/description/timestamp/tags (§4.1);
  polskie pola zostawione bez zmian jako rozszerzenia.
- Wszystkie linki wewnątrz bundle'a na bundle-relative z / (§5.1).
- Nowe: oferty/index.md (§6) i log.md (§7).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 15:47:04 +02:00
oskar 5745349040 stan wyjściowy: saalbach-kb przed konwersją do OKF 2026-07-31 15:41:38 +02:00