- Spis treści
- Podział serwerów i kanałów
- Skrypty
- Format stagingu
- Trzy role, zero dublowania treści (ustalone 2026-08-23)
- Konwencje treści
- Przebieg
- Ziarnistość zadań: jedno zadanie = jeden dokument (2026-08-24)
- Pułapki techniczne (sprawdzone w boju)
- Formatowanie stron wiki – kanon
- Rejestry na wiki: kotwice i odesłania (zasada, 2026-08-24)
- Sesja przeglądarki a świeżość strony
- Projekt roboczy obok klienckiego (wzorzec z 2026-08-23)
- Zasady twarde
- Google Tasks – uwagi
- Przypomnienia terminów
- Numery i identyfikatory
Strona nadrzędna: Zasady Fabryki
Źródło: ZasadyRealizacji\redmine-instrukcja-dla-projektow.md w drzewie FB. Wiki jest kopią do czytania – zmiany nanosimy w pliku źródłowym, nie tutaj.
Ustanowiona 2026-08-23 po pierwszym pełnym przebiegu kanału zadań (Akademia UKSC, projekt laa-2026). Obowiązuje w każdym projekcie FB – komercyjnym i rozwojowym. Uzupełnia most-sesja-redmine.md (zasada kanału) o stronę wykonawczą: jak wystawiać zadania, czym, w jakim formacie i czego nie robić.
Podział serwerów i kanałów¶
s62 (projekty.fabrykabezpieczenstwa.pl) |
s87 (r.fabrykabezpieczenstwa.pl) |
|
|---|---|---|
| Rola | klienci: projekty aktualne, baza wiedzy | baza Fabryki: projekty rozwojowe, zasady biznesowe |
| Co trafia |
ProjektyC\Komercyjne\*, domeny PIWJ, oraz wszystkie zadania – także rozwojowe
|
wiki doktryny i zasad: FB_rozwojowe\*, ZasadyRealizacji\*
|
| Stan | działa (wiki + zadania) | uruchamiany 2026-08-23; projekt zasady-fabryki
|
Zadania mają jeden kręgosłup – s62 (rozstrzygnięcie 2026-08-23). Powód: relacje między zgłoszeniami (blokady, powiązania) działają wyłącznie w obrębie jednej instancji Redmine, a zależności między rozwojem a robotą u klientów są realne – wydanie metodyki blokuje zadania wdrożeniowe. Projekt organizacyjny dla rozwoju: fb-rozwojowe (https://projekty.fabrykabezpieczenstwa.pl/projects/fb-rozwojowe/).
Docelowo s87 przejmie także klientów; migracja będzie tania, bo zadania generujemy ze stagingu, a źródłem prawdy są harmonogramy w plikach – przeniesienie to ponowny przebieg skryptu z czystym mapowaniem, nie przepisywanie zgłoszeń.
Kanały równoległe, jedno źródło:
-
pliki projektu (
Administracja\Harmonogram.md) – źródło prawdy; - Redmine – wykonanie, zależności, przypomnienia mailowe;
- Google Tasks – prywatny widok dnia (tylko zadania własne).
Skrypty¶
| Skrypt | Do czego |
|---|---|
ProjektyC\Skrypty\Publikuj-Zadania-Redmine.ps1 |
zadania → zgłoszenia Redmine (create/update + relacje) |
ProjektyC\Skrypty\Publikuj-Zadania-GoogleTasks.ps1 |
te same zadania → Google Tasks (lista „Fabryka") |
ProjektyC\FB_rozwojowe\Redmine\Publikuj-PIWJ-Redmine.ps1 |
strony wiki PIWJ |
Akademia_UKSC_2026-07\Redmine\Publikuj-Akademia-Redmine.ps1 |
strony wiki Akademii |
Oba skrypty zadaniowe czytają ten sam staging: ProjektyC\Redmine_STAGING\zadania\RRRR-MM-DD_<projekt>.json. Podfolder wstrzymane\ = pliki zaparkowane (nie publikują się).
Format stagingu¶
{
"projekt": "VCN",
"projekt_redmine": "vcn",
"tracker": 2,
"przypisz_do": 7,
"przypisz_do_mnie": false,
"do_google": true,
"zadania": [
{
"id": "VCN-3.1",
"zadanie": "Warsztaty: szacowanie i ocena ryzyka",
"opis": "treść z linkami [[Strona_Wiki]]",
"start": "2026-09-01",
"koniec": "2026-09-30",
"godziny": 11.0,
"tracker": 2,
"przypisz_do": 7,
"google": true,
"zaleznosc": ["VCN-2.5", "VCN-2.6"]
}
]
}
Pola opcjonalne działają kaskadowo: ustawienie przy zadaniu ma pierwszeństwo przed ustawieniem przy pliku.
| Pole | Znaczenie |
|---|---|
tracker |
typ zgłoszenia; domyślnie 2 = Zadanie. 1 = Uwaga ogólna – bez jawnego podania Redmine wybiera pierwszy typ projektu |
przypisz_do |
numer użytkownika Redmine (Greg = 7) |
przypisz_do_mnie |
true → właściciel klucza API (przydatne przy kontach projektowych, np. LAA2026 = #43) |
do_google / google
|
co idzie do prywatnej listy zadań; zadania innych osób zostają wyłącznie w Redmine |
zaleznosc |
jedno ID albo lista ID – zakładane jako relacje blocked
|
godziny |
estimated_hours; parowanie z rozliczeniem godzin po id
|
Trzy role, zero dublowania treści (ustalone 2026-08-23)¶
- Redmine – miejsce pracy. Tam się wpisuje ustalenia, podpina dokumenty, prowadzi ślad. Treść zadania żyje tutaj.
- Google Tasks – magazyn listy dnia. Nie zawiera treści; notatka to link do zgłoszenia plus jedna linia opisu. Termin dzienny, bez godziny.
- Google Calendar – podgląd. Pokazuje zadania z Tasks obok spotkań; to jest widok, na który Greg patrzy rano na iPadzie.
Konsekwencja praktyczna: z kalendarza klikasz zadanie → link → jesteś w zgłoszeniu, gdzie dopisujesz i podpinasz. Lista dnia zostaje listą, praca zostaje w Redmine.
Konwencje treści¶
-
ID zadania = identyfikator z harmonogramu, prefiks projektu (
VCN-3.1,AQU-01,S2-Z1-U1). Trafia do tematu w nawiasie kwadratowym:[VCN-3.1] Nazwa zadania. - Jedno zgłoszenie = jeden produkt. Nie „przerób sekwencję", tylko „wypełnij tabelę charakterystyki".
-
Odesłanie do wiki linkiem
[[Nazwa_Strony]], nigdy kopia treści. - Narzędzie wskazane wprost – jeśli zadanie wykonuje się promptem, link do strony promptu jest w opisie.
- Opisy z polskimi znakami; skrypt wysyła treść jawnie jako UTF-8 (PowerShell 5.1 potrafi inaczej zrobić mojibake).
Przebieg¶
cd C:\Users\Greg\FB\ProjektyC\Skrypty
.\Publikuj-Zadania-Redmine.ps1 -DryRun # kontrola: co powstanie, komu, z jakimi blokadami
.\Publikuj-Zadania-Redmine.ps1 # na żywo (klucz przez Read-Host)
.\Publikuj-Zadania-GoogleTasks.ps1 # zadania własne do listy „Fabryka"
Cały raport wklejasz do czatu – asystent weryfikuje i odhacza manifest. Klucz API nigdy nie trafia do pliku ani do agenta.
Ziarnistość zadań: jedno zadanie = jeden dokument (2026-08-24)¶
Zadanie obejmujące pakiet („przegląd sześciu polityk") jest wygodne przy zakładaniu i bezużyteczne w pracy: nie da się go powiązać ze stroną wiki, na której leży konkretny dokument, a postęp widać dopiero po zamknięciu całości.
Reguła: jeden dokument do przeglądu albo opracowania = jedno zgłoszenie. W opisie zgłoszenia pierwszy wiersz to link do strony wiki z dokumentem, dalej liczby (wymagania, pozycje otwarte) i pytanie do rozstrzygnięcia.
Skutki, dla których warto tego pilnować:
- wiązanie dwustronne – zgłoszenie wskazuje stronę wiki, tabela przeglądu statusów wskazuje zgłoszenie; jedno źródło prawdy, dwa widoki,
- postęp per dokument zamiast per pakiet,
- oszacowania są uczciwsze – pół godziny na politykę jest sprawdzalne, trzy godziny na pakiet są życzeniem,
- pakiet nadal widać: jako wspólny termin i sąsiedztwo w tabeli przeglądu.
Konsekwencja dla wiki: każdy dokument roboczy w formacie md, który czeka na przegląd, dostaje własną podstronę. Bez niej zgłoszenie nie ma do czego odesłać, a przegląd wymaga otwierania drzewa plików zamiast czytania w przeglądarce.
Pułapki techniczne (sprawdzone w boju)¶
Wszystkie z tej samej rodziny: PowerShell i .NET rozumieją to samo pojęcie inaczej.
| Pułapka | Objaw | Rozwiązanie |
|---|---|---|
Get-Content -Raw + ConvertTo-Json
|
rozsypana treść strony wiki (lekcja UOPP_rozdzial1) |
czytać przez [System.IO.File]::ReadAllText(..., UTF8)
|
| Kodowanie w REST | krzaki w polskich znakach | treść wysyłać jako bajty UTF-8 + charset=utf-8 w Content-Type |
Ścieżki względne w [System.IO.File]
|
„Nie można odnaleźć części ścieżki C:\WINDOWS\…" | .NET rozwija je wobec katalogu procesu, nie lokalizacji PowerShella – normalizować do bezwzględnej (Resolve-Path) |
Brak tracker_id
|
zgłoszenia jako „Uwaga ogólna" | podawać jawnie, domyślnie 2 |
| Wstawianie wierszy w xlsx | rozjechane formuły podsumowań | po insert_rows przeliczyć zakresy sum i odwołania |
| Landing pod własną nazwą | zakładka „Wiki" projektu otwiera pusty edytor | stronę główną projektu publikować pod nazwą Wiki
|
| Zawinięte akapity w źródle | zdania łamane co wiersz (Hardbreaks) | staging renderować z rozwiniętymi akapitami (jedna linia = jeden akapit); listy, tabele i cytaty bez zmian |
Formatowanie stron wiki – kanon¶
Nie powielamy tego opisu. Konwencja formatowania stron Redmine jest opisana w pamięci projektu PIWJ i obowiązuje wszystkie projekty:
-
ZasadyRealizacji\pamiec-asystenta\projekty\PIWJ\instrukcja.md, sekcja „Narzędzia i formaty"; -
ZasadyRealizacji\pamiec-asystenta\projekty\PIWJ\memory.md, punkt „Redmine wiki table formatting".
Skrót do szybkiego sprawdzenia (źródłem pozostają pliki wyżej): tabele o nierównych szerokościach wyłącznie HTML <table style="width:100%"> z jawnym style na każdej kolumnie (dwie kolumny 30/70, nawigacyjne trzy 20/35/45); w komórkach HTML używać <strong> i <code>, nie składni Markdown; tekst wprowadzający jako zwykły akapit, nie cytat >; strony złożone jako strona nadrzędna plus podstrony z **Strona nadrzędna:** w nagłówku.
Rejestry na wiki: kotwice i odesłania (zasada, 2026-08-24)¶
Sprawdzone w boju na s62 przy rejestrze decyzji VCN, potwierdzone przez Grega. Dotyczy każdego rejestru pozycji numerowanych: decyzji, ustaleń audytowych, wymagań, pozycji do potwierdzenia.
Zapis obowiązujący¶
Rejestr to jedna tabela. Identyfikator pozycji stoi w pierwszej kolumnie jako nagłówek <h3> – i to on tworzy kotwicę.
<table style="width:100%">
<tr><th style="width:6%">Nr</th><th style="width:9%">Data</th><th style="width:22%">Czego dotyczy</th><th style="width:57%">Treść</th><th style="width:6%">St.</th></tr>
<tr><td><h3>D24</h3></td><td>2026-08-03</td><td>Temat pozycji</td><td>Pełna treść</td><td>P</td></tr>
</table>
Odesłanie z dowolnego dokumentu: [[Decyzje#D24|D24]], międzyprojektowo [[vcn-robocze:Decyzje#D24|D24]]. Link dowozi do konkretnego wiersza.
Trzy warunki, bez których to nie działa:
-
Nagłówek zawiera wyłącznie identyfikator (
D24,P-FIZ-03), nigdy tytuł opisowy – kotwica powstaje z treści nagłówka, więc każda zmiana brzmienia zerwałaby wszystkie odesłania. -
Atrybutu
idnie używamy – jest zbędny (identyfikator i tak powstaje z treści) i bywa usuwany przy sanityzacji. -
Odwołania w tekście zawsze jako link, nigdy jako goły kod –
D24w treści dokumentu bez linku jest ślepym zaułkiem dla czytającego.
Co nie działa¶
| Zapis | Zachowanie |
|---|---|
w treści albo w komórce |
znacznik usuwany przy renderowaniu, odesłanie ląduje na początku strony |
| kotwica w komórce bez nagłówka | brak celu, jak wyżej |
Czego już nie budujemy¶
Warianty „tabela plus pełne wpisy pod spodem" oraz „dwie strony: tabela i rejestr z nagłówkami" są śladem po nieudanych próbach z kotwicami HTML. Mnożą treść albo miejsca do otwierania, a nagłówek w komórce daje jedno i drugie naraz: widok do skanowania i cel odesłania w tym samym wierszu.
Sesja przeglądarki a świeżość strony¶
Objaw z 2026-08-24: opublikowana strona nie pokazuje treści, mimo że raport publikacji potwierdza zapis, a historia strony ma nową wersję. Przyczyna nie leży po stronie skryptu ani cache przeglądarki – pomaga wylogowanie i ponowne zalogowanie do Redmine. Zanim zaczniemy szukać błędu w treści, sprawdzamy to jako pierwsze.
Projekt roboczy obok klienckiego (wzorzec z 2026-08-23)¶
Klient nie ogląda wersji roboczych. Dlatego przy projektach, w których publikujemy treść merytoryczną do Redmine, obowiązuje para projektów:
| Projekt | Widoczność | Rola |
|---|---|---|
-robocze |
wyłącznie FB (prywatny) | wersja wstępna: przegląd, poprawki, praca nad treścią |
|
klient | treść zatwierdzona, do której klient ma dostęp |
Przepływ: staging → projekt roboczy → przegląd Grega → dopiero stamtąd do projektu klienckiego. Publikacja do projektu klienckiego jest osobną decyzją, nie automatem.
Zastosowanie źródłowe: VCN – 14 obszarów SZBI z plików 00_Wprowadzenie.md jako strony wiki; cel dodatkowy: pokazać klientowi, że cały SZBI da się prowadzić na Redmine, a co najmniej na wiki.
Zasady twarde¶
-
Ręczna zmiana w Redmine wygrywa tylko wtedy, gdy wróci do źródła. Po ręcznym przypisaniu albo zmianie statusu: albo parkujesz staging w
wstrzymane\, albo nanosisz zmianę w pliku. Inaczej kolejny przebieg przywróci stan z pliku. -
Mapowania są święte.
mapowanie_<projekt>.jsonimapowanie_gtasks_<projekt>.jsonwiążą ID harmonogramu z numerami zgłoszeń. Skasowanie = duplikaty przy następnym przebiegu. - Agent nie ma dostępu sieciowego do Redmine ani Google. Kończy na stagingu; publikuje człowiek.
- Tracker podawaj jawnie (lekcja 2026-08-23: 18 zgłoszeń wyszło jako „Uwaga ogólna").
- Nie publikuj zadań innych osób do swojej listy zadań – od tego są flagi kanału.
Google Tasks – uwagi¶
- Konfiguracja OAuth jednorazowa; poświadczenia w
%APPDATA%\FB\gtasks.cred, szyfrowane DPAPI. - Ekran zgody typu Internal (Greg jest administratorem Workspace) – bez testowych użytkowników i bez wygasania tokenu.
- Google Tasks przyjmuje wyłącznie datę terminu, godzinę ignoruje – zadanie ma dzień, spotkania mają godziny.
- Lista domyślna:
Fabryka(parametr-Lista).
Przypomnienia terminów¶
Redmine ma wbudowane rake redmine:send_reminders days=N – do wpięcia w cron na s62 ([do zrobienia]). To zdejmuje problem braku przypomnień bez dokładania kolejnego narzędzia.
Numery i identyfikatory¶
| Co | Wartość |
|---|---|
| Greg – użytkownik Redmine | 7 |
| Konto projektowe Akademii | LAA2026 (#43) |
| Projekt Akademii | laa-2026 |
| Uczestnicy Akademii 2026-07 | U1 – Cynamon 16, U2 – lukrak, U3 – GB |
| Identyfikatory projektów klienckich | [do uzupełnienia przy pierwszym pushu] – skrypt zapyta i zapamięta |