A Ściągawka języka tok
Ta sama ściągawka jest w pakiecie tok-agent (.github/skills/tok-modelowanie/references/sciagawka.md), więc agent AI pracuje na tym samym opisie języka co Ty. Pełna specyfikacja w języku angielskim: github.com/tok-lang-bpm/tok/blob/main/docs/spec.md, a przewodnik po języku i narzędziach: tok-lang-bpm.github.io.
Jedna instrukcja w jednym wierszu. Bloki tworzy wcięcie (spacje, nie tabulator). # zaczyna komentarz.
Każdy wiersz zaczyna się słowem kluczowym. Identyfikatory: litery ASCII, cyfry, _, -; każdy inny. Etykiety: „tekst w cudzysłowie”, dowolny język.
Atrybuty: klucz=wartość (słowo, liczba albo “tekst”) oraz flagi bez wartości.
Zdarzenia
| Instrukcja | Element BPMN | Przykład |
|---|---|---|
start ID "…" |
zdarzenie początkowe | start wplyw "Pismo wpłynęło" message="Pismo" |
end ID "…" |
zdarzenie końcowe | end koniec "Sprawa zamknięta" · terminate · error="Błąd zapisu" |
catch ID "…" |
pośrednie przechwytujące | catch odp "Odpowiedź autora" message="Odpowiedź" · timer=P14D |
throw ID "…" |
pośrednie rzucające | throw esk "Zgłoszenie opóźnienia" escalation="Opóźnienie" |
boundary ID "…" on=CZYNNOŚĆ |
graniczne | boundary termin "Minęło 7 dni" on=ocena timer=P7D noninterrupting |
Wyzwalacze (najwyżej jeden): message="…", timer=P3D / PT2H / 2027-01-15T09:00 / "R3/PT1H", signal="…", error="…", escalation="…", condition="…", link="…", flagi terminate, compensate.
Czynności
| Instrukcja | Zadanie | Kiedy |
|---|---|---|
task |
ogólne | sposób wykonania nieznany |
user |
użytkownika | człowiek pracuje w systemie |
manual |
ręczne | człowiek bez systemu |
service |
usługowe | system sam, automatycznie |
script |
skryptowe | wyliczenie według wzoru (expr="…" result=zmienna) |
rule |
reguły biznesowej | wynik z tabeli decyzyjnej (decision=ID result=zmienna) |
send / receive |
wysyłania / odbioru | message="…" |
call |
wywołania | process=ID |
sub ID "…" + blok |
podproces | własny start i end w bloku |
eventsub ID "…" + blok |
podproces zdarzeniowy | blok zaczyna start z wyzwalaczem |
Flagi czynności: loop (pętla), parallel / sequential (wiele instancji), compensation.
Bramki
xor (wykluczająca), and (równoległa), or (inkluzywna), eventgw (oparta na zdarzeniach). Etykieta bramki rozdzielającej to pytanie: xor kompletny "Czy wniosek kompletny?".
Baseny i linie
pool biblioteka "Biblioteka uczelniana" # basen z blokiem: uczestnik i jego proces
lane czytelnik "Czytelnik" # linie mogą się zagnieżdżać
start s "Potrzeba książki"
lane bibliotekarz "Bibliotekarz"
user k "Sprawdzenie katalogów"
pool dostawca "Dostawca" # bez bloku: basen zamknięty
Przepływy
flow a -> b -> c # łańcuch przepływów sekwencji
flow g -> d "tak" when="kwota > 1000" # jeden przepływ: etykieta i warunek FEEL
flow g -> e "nie" default # przepływ domyślny
message wyslanie -> dostawca "Zamówienie" # przepływ komunikatów między basenami
Wiersz z etykietą albo atrybutami ma dokładnie jedną strzałkę.
Dane i artefakty
data wniosek "Wniosek" state="złożony" # obiekt danych (stan w atrybucie)
store katalog "Katalog" # magazyn danych
reads k katalog # czynność czyta dane
writes k wniosek # czynność zapisuje dane
note n1 "Termin wg regulaminu, § 5" on=k # adnotacja
group g1 "Obsługa w czytelni" members="a b c"
Tabela decyzyjna
decision limit "Limit wypożyczeń" hit=first
| wiek: number | konto: string || limit: number || uwagi |
| < 18 | - || 5 || niepełnoletni |
| - | "pracownik" || 30 || |
| - | - || 10 || pozostali |
Nagłówek: wejścia nazwa: typ (string, number, boolean, date), potem ||, potem wyniki; opcjonalnie || i uwagi. Komórki wejść to testy FEEL: - (dowolnie), < 18, [18..65], "student", "pracownik", not("gość"). Polityka trafień hit=: unique (domyślna), first, any, priority, collect.
Formularz
form f-wniosek "Wniosek"
text "## Wniosek o udostępnienie\nWypełnij wszystkie pola."
field tytul "Tytuł" type=textfield required
field cel "Cel" type=select options="naukowy:Naukowy, prywatny:Prywatny"
field liczba "Liczba stron" type=number min=1
Typy pól: textfield, textarea, number, checkbox, select, radio, datetime.
Model wykonywalny (Camunda 8)
Nagłówek z flagą executable. Zadania użytkownika: form=. Zadania reguły biznesowej: decision= i result=. Zadania skryptowe: expr= i result=. Każde wyjście bramki xor/or z kilkoma wyjściami: when="…" albo default. Wyrażenia FEEL piszesz bez znaku = na początku.
Symulacja
simulate cases=200 seed=1 arrival="exp(2h)"
resource archiwisci "Archiwiści" count=2
variable strony "unif(10, 200)"
Atrybuty: czynność by=zasób duration="tri(10m, 20m, 1h)" assign="zgoda=bern(0.8)", zdarzenie oczekujące delay="exp(3d)", przepływ p=0.3.
Rozkłady: fixed, unif, tri, norm, lnorm, exp, bern, cat(a=0.7, b=0.3). Jednostki: s, m, h, d.
Polecenia
| Polecenie | Co robi |
|---|---|
tok check plik.tok --lang pl |
sprawdza model; --json dla programów, --level basic dla poziomu podstawowego |
tok fmt plik.tok -w |
porządkuje zapis (forma kanoniczna) |
tok bpmn plik.tok / tok svg plik.tok |
plik BPMN z układem / rysunek |
tok export plik.tok -o wynik/ |
BPMN, SVG, DMN i formularze |
tok import model.bpmn |
BPMN 2.0 XML na tok |
tok eval plik.tok DECYZJA nazwa=wartość … |
wynik tabeli decyzyjnej |
tok sim plik.tok --seed 1 --lang pl |
symulacja; --log log.csv, --cases-csv sprawy.csv |
Zapis w tok i symbol na diagramie
Każdy symbol BPMN, który rysuje tok svg, z wierszem tok, który go tworzy. Wielkie litery w zapisie (ID, ACTIVITY, P) zastępujesz identyfikatorami ze swojego modelu, a w miejsce przykładowych wartości ("M", P1D) wpisujesz własne. Kolumna Camunda 8 mówi, czy silnik wykonuje element w modelu wykonywalnym (spotkanie 7); kody C1… zgłasza wtedy tok check.
Zdarzenia początkowe
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
start ID |
zdarzenie początkowe | wykonuje | |
start ID message="M" |
zdarzenie początkowe: wiadomość | wykonuje | |
start ID timer=P1D |
zdarzenie początkowe: czas | wykonuje | |
start ID condition="x > 1" |
zdarzenie początkowe: warunek | wykonuje w podprocesach zdarzeniowych | |
start ID signal="S" |
zdarzenie początkowe: sygnał | wykonuje | |
start ID message="A" signal="B" |
zdarzenie początkowe: wielokrotne | nie wykonuje (C104) |
|
start ID message="A" message="B" parallel |
zdarzenie początkowe: równoległe wielokrotne | nie wykonuje (C105) |
Zdarzenia początkowe podprocesów zdarzeniowych
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
eventsub … / start ID message="M" |
przerywające zdarzenie początkowe podprocesu zdarzeniowego: wiadomość | wykonuje | |
eventsub … / start ID timer=P1D |
przerywające zdarzenie początkowe podprocesu zdarzeniowego: czas | wykonuje | |
eventsub … / start ID condition="x > 1" |
przerywające zdarzenie początkowe podprocesu zdarzeniowego: warunek | wykonuje | |
eventsub … / start ID signal="S" |
przerywające zdarzenie początkowe podprocesu zdarzeniowego: sygnał | wykonuje | |
eventsub … / start ID error="E" |
przerywające zdarzenie początkowe podprocesu zdarzeniowego: błąd | wykonuje | |
eventsub … / start ID escalation="X" |
przerywające zdarzenie początkowe podprocesu zdarzeniowego: eskalacja | wykonuje | |
eventsub … / start ID compensate |
przerywające zdarzenie początkowe podprocesu zdarzeniowego: kompensacja | wykonuje | |
eventsub … / start ID message="A" signal="B" |
przerywające zdarzenie początkowe podprocesu zdarzeniowego: wielokrotne | nie wykonuje (C104) |
|
eventsub … / start ID message="A" message="B" parallel |
przerywające zdarzenie początkowe podprocesu zdarzeniowego: równoległe wielokrotne | nie wykonuje (C105) |
|
eventsub … / start ID message="M" noninterrupting |
nieprzerywające zdarzenie początkowe podprocesu zdarzeniowego: wiadomość | wykonuje | |
eventsub … / start ID timer=P1D noninterrupting |
nieprzerywające zdarzenie początkowe podprocesu zdarzeniowego: czas | wykonuje | |
eventsub … / start ID condition="x > 1" noninterrupting |
nieprzerywające zdarzenie początkowe podprocesu zdarzeniowego: warunek | wykonuje | |
eventsub … / start ID signal="S" noninterrupting |
nieprzerywające zdarzenie początkowe podprocesu zdarzeniowego: sygnał | wykonuje | |
eventsub … / start ID escalation="X" noninterrupting |
nieprzerywające zdarzenie początkowe podprocesu zdarzeniowego: eskalacja | wykonuje | |
eventsub … / start ID message="A" signal="B" noninterrupting |
nieprzerywające zdarzenie początkowe podprocesu zdarzeniowego: wielokrotne | nie wykonuje (C104) |
|
eventsub … / start ID message="A" message="B" parallel noninterrupting |
nieprzerywające zdarzenie początkowe podprocesu zdarzeniowego: równoległe wielokrotne | nie wykonuje (C105) |
Zdarzenia pośrednie
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
catch ID message="M" |
zdarzenie pośrednie przechwytujące: wiadomość | wykonuje | |
catch ID timer=P1D |
zdarzenie pośrednie przechwytujące: czas | wykonuje | |
catch ID condition="x > 1" |
zdarzenie pośrednie przechwytujące: warunek | wykonuje | |
catch ID signal="S" |
zdarzenie pośrednie przechwytujące: sygnał | wykonuje | |
catch ID message="A" signal="B" |
zdarzenie pośrednie przechwytujące: wielokrotne | nie wykonuje (C104) |
|
catch ID message="A" message="B" parallel |
zdarzenie pośrednie przechwytujące: równoległe wielokrotne | nie wykonuje (C105) |
|
catch ID link="L" |
zdarzenie pośrednie przechwytujące: łącznik | wykonuje | |
throw ID |
zdarzenie pośrednie | wykonuje | |
throw ID message="M" |
zdarzenie pośrednie rzucające: wiadomość | wykonuje | |
throw ID signal="S" |
zdarzenie pośrednie rzucające: sygnał | wykonuje | |
throw ID escalation="X" |
zdarzenie pośrednie rzucające: eskalacja | wykonuje | |
throw ID compensate |
zdarzenie pośrednie rzucające: kompensacja | wykonuje | |
throw ID message="A" signal="B" |
zdarzenie pośrednie rzucające: wielokrotne | nie wykonuje (C104) |
|
throw ID link="L" |
zdarzenie pośrednie rzucające: łącznik | wykonuje |
Zdarzenia graniczne
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
boundary ID on=ACTIVITY message="M" |
przerywające zdarzenie graniczne: wiadomość | wykonuje | |
boundary ID on=ACTIVITY timer=P1D |
przerywające zdarzenie graniczne: czas | wykonuje | |
boundary ID on=ACTIVITY condition="x > 1" |
przerywające zdarzenie graniczne: warunek | wykonuje | |
boundary ID on=ACTIVITY signal="S" |
przerywające zdarzenie graniczne: sygnał | wykonuje | |
boundary ID on=ACTIVITY error="E" |
przerywające zdarzenie graniczne: błąd | wykonuje | |
boundary ID on=ACTIVITY escalation="X" |
przerywające zdarzenie graniczne: eskalacja | wykonuje | |
boundary ID on=ACTIVITY message="A" signal="B" |
przerywające zdarzenie graniczne: wielokrotne | nie wykonuje (C104) |
|
boundary ID on=ACTIVITY message="A" message="B" parallel |
przerywające zdarzenie graniczne: równoległe wielokrotne | nie wykonuje (C105) |
|
boundary ID on=TRANSACTION cancel |
zdarzenie graniczne: anulowanie | nie wykonuje (C101) |
|
service ID compensate=HANDLER |
zdarzenie graniczne: kompensacja | wykonuje | |
boundary ID on=ACTIVITY message="M" noninterrupting |
nieprzerywające zdarzenie graniczne: wiadomość | wykonuje | |
boundary ID on=ACTIVITY timer=P1D noninterrupting |
nieprzerywające zdarzenie graniczne: czas | wykonuje | |
boundary ID on=ACTIVITY condition="x > 1" noninterrupting |
nieprzerywające zdarzenie graniczne: warunek | wykonuje | |
boundary ID on=ACTIVITY signal="S" noninterrupting |
nieprzerywające zdarzenie graniczne: sygnał | wykonuje | |
boundary ID on=ACTIVITY escalation="X" noninterrupting |
nieprzerywające zdarzenie graniczne: eskalacja | wykonuje | |
boundary ID on=ACTIVITY message="A" signal="B" noninterrupting |
nieprzerywające zdarzenie graniczne: wielokrotne | nie wykonuje (C104) |
|
boundary ID on=ACTIVITY message="A" message="B" parallel noninterrupting |
nieprzerywające zdarzenie graniczne: równoległe wielokrotne | nie wykonuje (C105) |
Zdarzenia końcowe
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
end ID |
zdarzenie końcowe | wykonuje | |
end ID message="M" |
zdarzenie końcowe: wiadomość | wykonuje | |
end ID error="E" |
zdarzenie końcowe: błąd | wykonuje | |
end ID escalation="X" |
zdarzenie końcowe: eskalacja | wykonuje | |
end ID signal="S" |
zdarzenie końcowe: sygnał | wykonuje | |
end ID compensate |
zdarzenie końcowe: kompensacja | wykonuje | |
end ID message="A" signal="B" |
zdarzenie końcowe: wielokrotne | nie wykonuje (C104) |
|
end ID cancel |
zdarzenie końcowe: anulowanie | nie wykonuje (C101) |
|
end ID terminate |
zdarzenie końcowe: zakończenie wszystkiego | wykonuje |
Czynności
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
task ID |
zadanie | wykonuje | |
user ID |
zadanie użytkownika | wykonuje | |
manual ID |
zadanie ręczne | wykonuje | |
service ID |
zadanie usługowe | wykonuje | |
script ID |
zadanie skryptowe | wykonuje | |
rule ID |
zadanie reguły biznesowej | wykonuje | |
send ID |
zadanie wysyłania | wykonuje | |
receive ID |
zadanie odbioru | wykonuje | |
receive ID message="M" instantiate |
zadanie odbioru rozpoczynające proces | nie wykonuje (C106) |
|
sub ID (block) |
podproces osadzony | wykonuje | |
eventsub ID (block) |
podproces zdarzeniowy | wykonuje | |
transaction ID (block) |
transakcja | nie wykonuje (C100) |
|
adhoc ID (block) |
podproces ad hoc | wykonuje | |
call ID process=P |
czynność wywołująca | wykonuje | |
call ID task=GLOBAL |
czynność wywołująca zadanie globalne | nie wykonuje (C108) |
Znaczniki czynności
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
task ID loop |
zadanie ze znacznikiem pętli | nie wykonuje (C103) |
|
task ID parallel |
zadanie wielokrotne równoległe | wykonuje | |
task ID sequential |
zadanie wielokrotne sekwencyjne | wykonuje | |
service ID compensation |
zadanie kompensujące | wykonuje |
Bramki
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
xor ID |
bramka wykluczająca | wykonuje | |
or ID |
bramka inkluzywna | wykonuje | |
and ID |
bramka równoległa | wykonuje | |
complex ID |
bramka złożona | nie wykonuje (C102) |
|
eventgw ID |
bramka oparta na zdarzeniach | wykonuje | |
eventgw ID instantiate |
bramka oparta na zdarzeniach rozpoczynająca proces | nie wykonuje (C107) |
|
eventgw ID instantiate parallel |
równoległa bramka oparta na zdarzeniach rozpoczynająca proces | nie wykonuje (C107) |
Dane
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
data ID |
obiekt danych | tylko model | |
data ID collection |
kolekcja obiektów danych | tylko model | |
input ID |
dane wejściowe | tylko model | |
output ID |
dane wyjściowe | tylko model | |
store ID |
składnica danych | tylko model |
Połączenia
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
flow A -> B |
przepływ sekwencji | wykonuje | |
flow A -> B when="feel" |
przepływ warunkowy | wykonuje | |
flow G -> B default |
przepływ domyślny | wykonuje | |
message A -> B |
przepływ wiadomości | wykonuje | |
note ID "Text" on=ID |
powiązanie | tylko model | |
writes ACTIVITY DATA |
powiązanie danych | tylko model |
Baseny i linie
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
pool ID "Label" (block) |
basen | wykonuje | |
lane ID "Label" |
basen z dwiema liniami | wykonuje | |
pool ID "Label" (no block) |
basen zamknięty | tylko model | |
pool ID "Label" min=2 max=5 |
basen z krotnością uczestników | nie wykonuje (C123) |
Konwersacje
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
conversation ID "Label" pools="P Q" |
konwersacja | nie wykonuje (C120) |
|
subconversation ID "Label" pools="P Q" (block) |
podkonwersacja | nie wykonuje (C120) |
|
callconversation ID "Label" pools="P Q" collaboration=ID |
wywołanie konwersacji | nie wykonuje (C121) |
|
pools= of a conversation |
łącze konwersacji | nie wykonuje (C120) |
Choreografie
| Symbol | Zapis w tok | Element | Camunda 8 |
|---|---|---|---|
choreo ID "Label" from=P to=Q message="M" |
zadanie choreografii | nie wykonuje (C122) |
|
subchoreo ID "Label" pools="P Q" from=P (block) |
podchoreografia | nie wykonuje (C122) |
|
callchoreo ID "Label" pools="P Q" from=P choreography=ID |
wywołanie choreografii | nie wykonuje (C122) |