Projekt

Ogólne

Profil

Redmine instrukcja » Historia » Wersja 1

Greg K, 2026-08-24 13:35
Publikacja ze stagingu FB (2026-08-24)

1 1 Greg K
{{>toc}}
2
3
**Strona nadrzędna:** [[Wiki|Zasady Fabryki]]
4
5
Ź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.
6
7
---
8
9
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ć.
10
11
## Podział serwerów i kanałów
12
13
<table style="width:100%">
14
<tr><th style="width:20%"></th><th style="width:35%">s62 (<code>projekty.fabrykabezpieczenstwa.pl</code>)</th><th style="width:45%">s87 (<code>r.fabrykabezpieczenstwa.pl</code>)</th></tr>
15
<tr><td>Rola</td><td>klienci: projekty aktualne, baza wiedzy</td><td>baza Fabryki: projekty rozwojowe, zasady biznesowe</td></tr>
16
<tr><td>Co trafia</td><td><code>ProjektyC\Komercyjne\*</code>, domeny PIWJ, <strong>oraz wszystkie zadania – także rozwojowe</strong></td><td>wiki doktryny i zasad: <code>FB_rozwojowe\*</code>, <code>ZasadyRealizacji\*</code></td></tr>
17
<tr><td>Stan</td><td>działa (wiki + zadania)</td><td>uruchamiany 2026-08-23; projekt <code>zasady-fabryki</code></td></tr>
18
</table>
19
20
**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/`).
21
22
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ń.
23
24
Kanały równoległe, jedno źródło:
25
26
- **pliki projektu** (`Administracja\Harmonogram.md`) – źródło prawdy;
27
- **Redmine** – wykonanie, zależności, przypomnienia mailowe;
28
- **Google Tasks** – prywatny widok dnia (tylko zadania własne).
29
30
## Skrypty
31
32
<table style="width:100%">
33
<tr><th style="width:30%">Skrypt</th><th style="width:70%">Do czego</th></tr>
34
<tr><td><code>ProjektyC\Skrypty\Publikuj-Zadania-Redmine.ps1</code></td><td>zadania → zgłoszenia Redmine (create/update + relacje)</td></tr>
35
<tr><td><code>ProjektyC\Skrypty\Publikuj-Zadania-GoogleTasks.ps1</code></td><td>te same zadania → Google Tasks (lista „Fabryka")</td></tr>
36
<tr><td><code>ProjektyC\FB_rozwojowe\Redmine\Publikuj-PIWJ-Redmine.ps1</code></td><td>strony wiki PIWJ</td></tr>
37
<tr><td><code>Akademia_UKSC_2026-07\Redmine\Publikuj-Akademia-Redmine.ps1</code></td><td>strony wiki Akademii</td></tr>
38
</table>
39
40
Oba skrypty zadaniowe czytają ten sam staging: `ProjektyC\Redmine_STAGING\zadania\RRRR-MM-DD_<projekt>.json`. Podfolder `wstrzymane\` = pliki zaparkowane (nie publikują się).
41
42
## Format stagingu
43
44
```json
45
{
46
  "projekt": "VCN",
47
  "projekt_redmine": "vcn",
48
  "tracker": 2,
49
  "przypisz_do": 7,
50
  "przypisz_do_mnie": false,
51
  "do_google": true,
52
  "zadania": [
53
    {
54
      "id": "VCN-3.1",
55
      "zadanie": "Warsztaty: szacowanie i ocena ryzyka",
56
      "opis": "treść z linkami [[Strona_Wiki]]",
57
      "start": "2026-09-01",
58
      "koniec": "2026-09-30",
59
      "godziny": 11.0,
60
      "tracker": 2,
61
      "przypisz_do": 7,
62
      "google": true,
63
      "zaleznosc": ["VCN-2.5", "VCN-2.6"]
64
    }
65
  ]
66
}
67
```
68
69
Pola opcjonalne działają kaskadowo: ustawienie przy zadaniu ma pierwszeństwo przed ustawieniem przy pliku.
70
71
<table style="width:100%">
72
<tr><th style="width:30%">Pole</th><th style="width:70%">Znaczenie</th></tr>
73
<tr><td><code>tracker</code></td><td>typ zgłoszenia; <strong>domyślnie 2 = Zadanie</strong>. 1 = Uwaga ogólna – bez jawnego podania Redmine wybiera pierwszy typ projektu</td></tr>
74
<tr><td><code>przypisz_do</code></td><td>numer użytkownika Redmine (Greg = <strong>7</strong>)</td></tr>
75
<tr><td><code>przypisz_do_mnie</code></td><td><code>true</code> → właściciel klucza API (przydatne przy kontach projektowych, np. LAA2026 = #43)</td></tr>
76
<tr><td><code>do_google</code> / <code>google</code></td><td>co idzie do prywatnej listy zadań; zadania innych osób zostają wyłącznie w Redmine</td></tr>
77
<tr><td><code>zaleznosc</code></td><td>jedno ID albo lista ID – zakładane jako relacje <code>blocked</code></td></tr>
78
<tr><td><code>godziny</code></td><td><code>estimated_hours</code>; parowanie z rozliczeniem godzin po <code>id</code></td></tr>
79
</table>
80
81
## Trzy role, zero dublowania treści (ustalone 2026-08-23)
82
83
- **Redmine – miejsce pracy.** Tam się wpisuje ustalenia, podpina dokumenty, prowadzi ślad. Treść zadania żyje tutaj.
84
- **Google Tasks – magazyn listy dnia.** Nie zawiera treści; notatka to **link do zgłoszenia** plus jedna linia opisu. Termin dzienny, bez godziny.
85
- **Google Calendar – podgląd.** Pokazuje zadania z Tasks obok spotkań; to jest widok, na który Greg patrzy rano na iPadzie.
86
87
Konsekwencja praktyczna: z kalendarza klikasz zadanie → link → jesteś w zgłoszeniu, gdzie dopisujesz i podpinasz. Lista dnia zostaje listą, praca zostaje w Redmine.
88
89
## Konwencje treści
90
91
- **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`.
92
- **Jedno zgłoszenie = jeden produkt.** Nie „przerób sekwencję", tylko „wypełnij tabelę charakterystyki".
93
- **Odesłanie do wiki linkiem** `[[Nazwa_Strony]]`, nigdy kopia treści.
94
- **Narzędzie wskazane wprost** – jeśli zadanie wykonuje się promptem, link do strony promptu jest w opisie.
95
- Opisy z polskimi znakami; skrypt wysyła treść jawnie jako UTF-8 (PowerShell 5.1 potrafi inaczej zrobić mojibake).
96
97
## Przebieg
98
99
```powershell
100
cd C:\Users\Greg\FB\ProjektyC\Skrypty
101
.\Publikuj-Zadania-Redmine.ps1 -DryRun    # kontrola: co powstanie, komu, z jakimi blokadami
102
.\Publikuj-Zadania-Redmine.ps1            # na żywo (klucz przez Read-Host)
103
.\Publikuj-Zadania-GoogleTasks.ps1        # zadania własne do listy „Fabryka"
104
```
105
106
Cały raport wklejasz do czatu – asystent weryfikuje i odhacza manifest. Klucz API nigdy nie trafia do pliku ani do agenta.
107
108
## Ziarnistość zadań: jedno zadanie = jeden dokument (2026-08-24)
109
110
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.
111
112
**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.
113
114
Skutki, dla których warto tego pilnować:
115
116
- **wiązanie dwustronne** – zgłoszenie wskazuje stronę wiki, tabela przeglądu statusów wskazuje zgłoszenie; jedno źródło prawdy, dwa widoki,
117
- **postęp per dokument** zamiast per pakiet,
118
- **oszacowania są uczciwsze** – pół godziny na politykę jest sprawdzalne, trzy godziny na pakiet są życzeniem,
119
- pakiet nadal widać: jako wspólny termin i sąsiedztwo w tabeli przeglądu.
120
121
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.
122
123
## Pułapki techniczne (sprawdzone w boju)
124
125
Wszystkie z tej samej rodziny: PowerShell i .NET rozumieją to samo pojęcie inaczej.
126
127
<table style="width:100%">
128
<tr><th style="width:20%">Pułapka</th><th style="width:35%">Objaw</th><th style="width:45%">Rozwiązanie</th></tr>
129
<tr><td><code>Get-Content -Raw</code> + <code>ConvertTo-Json</code></td><td>rozsypana treść strony wiki (lekcja <code>UOPP_rozdzial1</code>)</td><td>czytać przez <code>[System.IO.File]::ReadAllText(..., UTF8)</code></td></tr>
130
<tr><td>Kodowanie w REST</td><td>krzaki w polskich znakach</td><td>treść wysyłać jako bajty UTF-8 + <code>charset=utf-8</code> w Content-Type</td></tr>
131
<tr><td>Ścieżki względne w <code>[System.IO.File]</code></td><td>„Nie można odnaleźć części ścieżki C:\WINDOWS\…"</td><td>.NET rozwija je wobec katalogu <strong>procesu</strong>, nie lokalizacji PowerShella – normalizować do bezwzględnej (<code>Resolve-Path</code>)</td></tr>
132
<tr><td>Brak <code>tracker_id</code></td><td>zgłoszenia jako „Uwaga ogólna"</td><td>podawać jawnie, domyślnie 2</td></tr>
133
<tr><td>Wstawianie wierszy w xlsx</td><td>rozjechane formuły podsumowań</td><td>po <code>insert_rows</code> przeliczyć zakresy sum i odwołania</td></tr>
134
<tr><td>Landing pod własną nazwą</td><td>zakładka „Wiki" projektu otwiera pusty edytor</td><td>stronę główną projektu publikować <strong>pod nazwą <code>Wiki</code></strong></td></tr>
135
<tr><td>Zawinięte akapity w źródle</td><td>zdania łamane co wiersz (Hardbreaks)</td><td>staging renderować z <strong>rozwiniętymi akapitami</strong> (jedna linia = jeden akapit); listy, tabele i cytaty bez zmian</td></tr>
136
</table>
137
138
## Formatowanie stron wiki – kanon
139
140
**Nie powielamy tego opisu.** Konwencja formatowania stron Redmine jest opisana w pamięci projektu PIWJ i obowiązuje wszystkie projekty:
141
142
- `ZasadyRealizacji\pamiec-asystenta\projekty\PIWJ\instrukcja.md`, sekcja „Narzędzia i formaty";
143
- `ZasadyRealizacji\pamiec-asystenta\projekty\PIWJ\memory.md`, punkt „Redmine wiki table formatting".
144
145
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.
146
147
## Rejestry na wiki: kotwice i odesłania (zasada, 2026-08-24)
148
149
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.
150
151
### Zapis obowiązujący
152
153
**Rejestr to jedna tabela. Identyfikator pozycji stoi w pierwszej kolumnie jako nagłówek `<h3>` – i to on tworzy kotwicę.**
154
155
```
156
<table style="width:100%">
157
<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>
158
<tr><td><h3>D24</h3></td><td>2026-08-03</td><td>Temat pozycji</td><td>Pełna treść</td><td>P</td></tr>
159
</table>
160
```
161
162
Odesłanie z dowolnego dokumentu: `[[Decyzje#D24|D24]]`, międzyprojektowo `[[vcn-robocze:Decyzje#D24|D24]]`. Link dowozi do konkretnego wiersza.
163
164
Trzy warunki, bez których to nie działa:
165
166
1. **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.
167
2. **Atrybutu `id` nie używamy** – jest zbędny (identyfikator i tak powstaje z treści) i bywa usuwany przy sanityzacji.
168
3. **Odwołania w tekście zawsze jako link**, nigdy jako goły kod – `D24` w treści dokumentu bez linku jest ślepym zaułkiem dla czytającego.
169
170
### Co nie działa
171
172
<table style="width:100%">
173
<tr><th style="width:30%">Zapis</th><th style="width:70%">Zachowanie</th></tr>
174
<tr><td><code><a id="D24"></a></code> w treści albo w komórce</td><td>znacznik usuwany przy renderowaniu, odesłanie ląduje na początku strony</td></tr>
175
<tr><td>kotwica w komórce bez nagłówka</td><td>brak celu, jak wyżej</td></tr>
176
</table>
177
178
### Czego już nie budujemy
179
180
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**.
181
182
## Sesja przeglądarki a świeżość strony
183
184
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.
185
186
## Projekt roboczy obok klienckiego (wzorzec z 2026-08-23)
187
188
Klient nie ogląda wersji roboczych. Dlatego przy projektach, w których publikujemy treść merytoryczną do Redmine, obowiązuje **para projektów**:
189
190
<table style="width:100%">
191
<tr><th style="width:20%">Projekt</th><th style="width:35%">Widoczność</th><th style="width:45%">Rola</th></tr>
192
<tr><td><code><klient>-robocze</code></td><td>wyłącznie FB (prywatny)</td><td>wersja wstępna: przegląd, poprawki, praca nad treścią</td></tr>
193
<tr><td><code><klient></code></td><td>klient</td><td>treść zatwierdzona, do której klient ma dostęp</td></tr>
194
</table>
195
196
Przepływ: staging → projekt roboczy → **przegląd Grega** → dopiero stamtąd do projektu klienckiego. Publikacja do projektu klienckiego jest osobną decyzją, nie automatem.
197
198
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.
199
200
## Zasady twarde
201
202
1. **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.
203
2. **Mapowania są święte.** `mapowanie_<projekt>.json` i `mapowanie_gtasks_<projekt>.json` wiążą ID harmonogramu z numerami zgłoszeń. Skasowanie = duplikaty przy następnym przebiegu.
204
3. **Agent nie ma dostępu sieciowego do Redmine ani Google.** Kończy na stagingu; publikuje człowiek.
205
4. **Tracker podawaj jawnie** (lekcja 2026-08-23: 18 zgłoszeń wyszło jako „Uwaga ogólna").
206
5. **Nie publikuj zadań innych osób do swojej listy zadań** – od tego są flagi kanału.
207
208
## Google Tasks – uwagi
209
210
- Konfiguracja OAuth jednorazowa; poświadczenia w `%APPDATA%\FB\gtasks.cred`, szyfrowane DPAPI.
211
- Ekran zgody typu **Internal** (Greg jest administratorem Workspace) – bez testowych użytkowników i bez wygasania tokenu.
212
- **Google Tasks przyjmuje wyłącznie datę terminu, godzinę ignoruje** – zadanie ma dzień, spotkania mają godziny.
213
- Lista domyślna: `Fabryka` (parametr `-Lista`).
214
215
## Przypomnienia terminów
216
217
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.
218
219
## Numery i identyfikatory
220
221
<table style="width:100%">
222
<tr><th style="width:30%">Co</th><th style="width:70%">Wartość</th></tr>
223
<tr><td>Greg – użytkownik Redmine</td><td><strong>7</strong></td></tr>
224
<tr><td>Konto projektowe Akademii</td><td><strong>LAA2026 (#43)</strong></td></tr>
225
<tr><td>Projekt Akademii</td><td><code>laa-2026</code></td></tr>
226
<tr><td>Uczestnicy Akademii 2026-07</td><td>U1 – Cynamon 16, U2 – lukrak, U3 – GB</td></tr>
227
<tr><td>Identyfikatory projektów klienckich</td><td><strong>[do uzupełnienia przy pierwszym pushu]</strong> – skrypt zapyta i zapamięta</td></tr>
228
</table>