É-01: Ţĥé þŕöçéššîñĝ éñĝîñé
Šüḿḿàŕý
Çöñţéñţ îš þŕöçéššéđ ƃý à çĥàññéļ-ƃàšéđ šţŕéàḿîñĝ þîþéļîñé. Éàçĥ ţööļ ŕüñš îñ
îţš öŵñ ĝöŕöüţîñé; ţööļš àŕé çöññéçţéđ ƃý ƃüƒƒéŕéđ çĥàññéļš ţĥàţ þŕöṽîđé
àüţöḿàţîç ƃàçķþŕéššüŕé. Àñ errgroup.Group çööŕđîñàţéš éŕŕöŕš àñđ þŕöþàĝàţéš
çöñţéẋţ çàñçéļļàţîöñ. Ƃļöçķ þàŕàļļéļîšḿ ŵîţĥîñ à ţööļ, ƒîļé àñđ đöçüḿéñţ
çöñçüŕŕéñçý, àñđ šţŕéàḿîñĝ öƃšéŕṽàţîöñ éàçĥ ĥàṽé ţĥéîŕ öŵñ çöñţŕöļ. À ƒļöŵ îš
đéçļàŕéđ àš à ĝŕàþĥ öƒ ñöđéš àñđ éđĝéš öŕ àš à ļîšţ öƒ šţéþš, àñđ îţ ŕüñš àš àñ
öŕđéŕéđ çĥàîñ öƒ ţööļš: ţĥé ĥöšţ ţĥàţ ļöàđš à đéƒîñîţîöñ đéŕîṽéš ţĥàţ öŕđéŕ,
àñđ à þàŕàļļéļ šţàĝé îñšîđé ţĥé çĥàîñ àđḿîţš à ƃöüñđéđ ñüḿƃéŕ öƒ Þàŕţš.
Çöñţéẋţ
Ĝö'š ĝöŕöüţîñéš àñđ çĥàññéļš ḿàķé îţ ñàţüŕàļ ţö šţŕüçţüŕé à þîþéļîñé àš çöñçüŕŕéñţ šţàĝéš çöññéçţéđ ƃý ţýþéđ çĥàññéļš. Šüçĥ à þîþéļîñé ḿîẋéš ÇÞÜ-ƃöüñđ ŵöŕķ (ƒöŕḿàţ þàŕšîñĝ, çĥéçķš) ŵîţĥ ÎÖ-ƃöüñđ ŵöŕķ (ĻĻḾ çàļļš, ḿéḿöŕý ļööķüþš). Ţĥé šàḿé þîþéļîñé ḿüšţ àļšö ƃé đŕîṽéñ àţ šéṽéŕàļ šçàļéš: à šîñĝļé ƒîļé öñ à ļàþţöþ; ĥüñđŕéđš öƒ ƒîļéš îñ à ƃàţçĥ; à ļöñĝ-ļîṽéđ þŕöĵéçţ ŵîţĥ ḿàñý đöçüḿéñţš þŕöçéššéđ îñ þàŕàļļéļ.
Îţ ḿüšţ àļšö šüþþöŕţ ƃöţĥ đéçļàŕàţîṽé àüţĥöŕîñĝ (à ṽîšüàļ ƒļöŵ éđîţöŕ, ĥüḿàñ-ŕéàđàƃļé ÝÀḾĻ) àñđ þŕöĝŕàḿḿàţîç çöñšţŕüçţîöñ (ţĥé Ĝö ļîƃŕàŕý) ƒŕöḿ öñé đàţà ḿöđéļ.
Đéçîšîöñ
Çĥàññéļ-ƃàšéđ þîþéļîñé
Çöñţéñţ ƒļöŵš ţĥŕöüĝĥ à çĥàññéļ-ƃàšéđ çöñçüŕŕéñţ þîþéļîñé:
Çöñţéñţ éñţéŕš ţĥŕöüĝĥ à šöüŕçé ƃîñđîñĝ àñđ ļéàṽéš ţĥŕöüĝĥ à šîñķ
ƃîñđîñĝ (É-04). Ƒöŕ ţĥé đéƒàüļţ file ƃîñđîñĝ
ţĥéšé àŕé à ĐàţàƑöŕḿàţ ŕéàđéŕ àñđ ŵŕîţéŕ (É-02); à
þŕöĵéçţ šţöŕé, à .kpz, öŕ àñ îñţéŕçĥàñĝé ƒîļé ƃîñđ ţĥé šàḿé šţŕéàḿ ŵîţĥ ñö
ŕéàđéŕ öŕ ŵŕîţéŕ. Ƃéţŵééñ ţĥé éñđš, éàçĥ ţööļ ŕüñš îñ îţš öŵñ ĝöŕöüţîñé.
Ƃüƒƒéŕéđ çĥàññéļš þŕöṽîđé ƃàçķþŕéššüŕé. errgroup.Group çööŕđîñàţéš éŕŕöŕ
ĥàñđļîñĝ àçŕöšš ĝöŕöüţîñéš, àñđ çöñţéẋţ çàñçéļļàţîöñ þŕöþàĝàţéš ţö àļļ šţàĝéš.
Þàŕţš çàŕŕý ţýþéđ ŕéšöüŕçéš (Ƒ-02): Ƃļöçķš çöñţàîñ ţŕàñšļàţàƃļé çöñţéñţ, Đàţà çàŕŕîéš šţŕüçţüŕàļ ḿàŕķüþ, Ļàýéŕš ĝŕöüþ ñéšţéđ çöñţéñţ, Ḿéđîà ĥöļđš ƃîñàŕý àššéţš. Ţööļš đéçļàŕé ŵĥîçĥ ŕéšöüŕçé ţýþéš ţĥéý ĥàñđļé; ţĥé ŕéšţ þàšš ţĥŕöüĝĥ üñçĥàñĝéđ.
Éẋéçüţöŕ
flow.DefaultExecutor öŕçĥéšţŕàţéš ţööļ çĥàîñš üšîñĝ ţĥé ĝöŕöüţîñé-þéŕ-ţööļ
ḿöđéļ:
- Éàçĥ ţööļ îñ ţĥé çĥàîñ ŕüñš îñ îţš öŵñ ĝöŕöüţîñé.
- Ƃüƒƒéŕéđ çĥàññéļš (çöñƒîĝüŕàƃļé šîžé) çöññéçţ àđĵàçéñţ ţööļš.
errgroupçöļļéçţš ţĥé ƒîŕšţ éŕŕöŕ àñđ çàñçéļš ţĥé šĥàŕéđ çöñţéẋţ.- Þàŕàļļéļ đöçüḿéñţ þŕöçéššîñĝ îš ƃöüñđéđ ƃý à šéḿàþĥöŕé ŵöŕķéŕ þööļ.
ToolFactoriesçŕéàţé ƒŕéšĥ ţööļ îñšţàñçéš þéŕ đöçüḿéñţ, šö çöñçüŕŕéñţ đöçüḿéñţš ñéṽéŕ šĥàŕé ḿüţàƃļé ţööļ šţàţé.
Çöñƒîĝüŕàţîöñ üšéš ţĥé ƒüñçţîöñàļ-öþţîöñš þàţţéŕñ:
executor := flow.NewExecutor(
flow.WithMaxConcurrency(8),
flow.WithChannelSize(128),
flow.WithCollectors(wordCounter, checkReport),
)
flow.WithImmutabilityCheck ţüŕñš öñ ţĥé þéŕ-đîšþàţçĥ çöñţéñţ-îḿḿüţàƃîļîţý
ƃàçķšţöþ ƒöŕ à ŕüñ (É-03); îţ îš đéṽ/ţéšţ ţööļîñĝ àñđ îš
öƒƒ üñļéšš à çàļļéŕ àšķš ƒöŕ îţ.
Þàŕàļļéļ ƃļöçķ þŕöçéššîñĝ
Ƒöŕ ÎÖ-ƃöüñđ ţööļš (ĻĻḾ ţŕàñšļàţîöñ, ŕéḿöţé çĥéçķš), šéǫüéñţîàļ þéŕ-þàŕţ
þŕöçéššîñĝ üñđéŕüţîļîžéš ţĥŕöüĝĥþüţ. tool.ParallelBlockTool ŕüñš ţĥé ƃļöçķ
ĥàñđļéŕ öƒ à *tool.BaseTool öñ à ƒîẋéđ þööļ öƒ Ñ ŵöŕķéŕš ŵĥîļé þŕéšéŕṽîñĝ
šţŕîçţ Þàŕţ öŕđéŕ. À ŵŕàþþéđ ţööļ öƒ àñöţĥéŕ çöñçŕéţé ţýþé, öŕ öñé ŵîţĥ ñö ţýþéđ
ƃļöçķ ĥàñđļéŕ, ŕüñš ţĥŕöüĝĥ îţš öŵñ Process, àñđ à ŵŕàþþéđ SessionTool ķééþš
îţš SessionProcess:
Ţĥé đîšþàţçĥéŕ ñüḿƃéŕš éṽéŕý îñçöḿîñĝ Þàŕţ àñđ àđḿîţš àţ ḿöšţ Ñ ƃļöçķš ŵĥöšé ŕéšüļţš ĥàṽé ñöţ ýéţ ŕéàçĥéđ ţĥé öüţþüţ. À ƃļöçķ ķééþš îţš þļàçé îñ ţĥàţ ŵîñđöŵ ƒŕöḿ àđḿîššîöñ üñţîļ îţ îš éḿîţţéđ, šö à šļöŵ ƒîŕšţ ƃļöçķ šţöþš ţĥé đîšþàţçĥéŕ ŕéàđîñĝ ƒüŕţĥéŕ îñþüţ éṽéñ ŵĥéñ ļàţéŕ ƃļöçķš ĥàṽé ƒîñîšĥéđ, àñđ đöŵñšţŕéàḿ ƃàçķþŕéššüŕé ŕéàçĥéš ţĥé îñþüţ. Ñöñ-Ƃļöçķ Þàŕţš çöüñţ àĝàîñšţ à šéþàŕàţé ŵîñđöŵ öƒ 4Ñ, šö Ñ ƃļöçķš šţàý îñ ƒļîĝĥţ ŵĥéñ à ŕéàđéŕ þüţš Đàţà öŕ Ĝŕöüþ Þàŕţš ƃéţŵééñ ţĥéḿ. Ŕéàššéḿƃļý ĥöļđš ţĥé àđḿîţţéđ Þàŕţš îñ à ŕîñĝ àñđ éḿîţš ţĥéḿ îñ îñþüţ öŕđéŕ, šö đöŵñšţŕéàḿ ţööļš šéé ţĥé šàḿé Þàŕţ öŕđéŕîñĝ ŵĥîçĥéṽéŕ ŵöŕķéŕ ƒîñîšĥéđ ƒîŕšţ. À đŕöþþéđ Þàŕţ àđṽàñçéš ţĥé šéǫüéñçé àñđ éḿîţš ñöţĥîñĝ.
Ŵĥéñ ţĥé îññéŕ ţööļ šéţš à ĥàñđļéŕ ƒöŕ à ñöñ-Ƃļöçķ Þàŕţ (Đàţà, Ḿéđîà, Ļàýéŕ, Ĝŕöüþ), ţĥàţ ĥàñđļéŕ ŕüñš àƒţéŕ éṽéŕý éàŕļîéŕ ƃļöçķ ĥàñđļéŕ ĥàš ƒîñîšĥéđ àñđ ƃéƒöŕé àñý ļàţéŕ ƃļöçķ šţàŕţš, šö à ĥàñđļéŕ ţĥàţ üþđàţéš ļàýéŕ öŕ ĝŕöüþ šţàţé ñéṽéŕ ŕüñš ƃéšîđé à ƃļöçķ ĥàñđļéŕ ţĥàţ ŕéàđš îţ. À ñöñ-Ƃļöçķ Þàŕţ ŵîţĥ ñö ĥàñđļéŕ þàššéš ţĥŕöüĝĥ îñ öŕđéŕ ŵîţĥöüţ ţĥàţ ŵàîţ. Ƃļöçķ ĥàñđļéŕš ḿüšţ ƃé šàƒé ţö çàļļ çöñçüŕŕéñţļý ƒöŕ đîšţîñçţ ƃļöçķš àñđ ḿüšţ öƃšéŕṽé ţĥé çöñţéẋţ ţĥéý ŕéçéîṽé: öñ àñ éŕŕöŕ öŕ çàñçéļļàţîöñ ţĥé ŵŕàþþéŕ çàñçéļš îţš ŵöŕķéŕš àñđ ĵöîñš ţĥéḿ ƃéƒöŕé îţ ŕéţüŕñš.
Àüţö-þàŕàļļéļîšḿ îš à ţööļ þŕöþéŕţý. Éàçĥ ţööļ đéçļàŕéš
ToolMeta.DefaultParallelBlocks (É-03); ţĥé ŕüññéŕ ţàķéš
ţĥé ḿàẋîḿüḿ àçŕöšš ţĥé ƒļöŵ'š ţööļš àñđ ŵŕàþš éṽéŕý ţööļ àţ ţĥàţ ŵîđţĥ. À
þŕöĵéçţ ḿàý þîñ îţš öŵñ ṽàļüé, àñđ --parallel-blocks N öṽéŕŕîđéš ƃöţĥ
(--parallel-blocks 1 đîšàƃļéš ţĥé ŵŕàþþéŕ). Ţĥé ţööļš ţĥàţ đéçļàŕé à đéƒàüļţ
àŕé ţĥé ĻĻḾ-ƃàçķéđ öñéš, šö àñ öŕđîñàŕý ŕüļéš-öñļý ƒļöŵ ŕüñš šéǫüéñţîàļļý ŵîţĥ
ñö çöñƒîĝüŕàţîöñ. Ţĥé ŵŕàþþéŕ þàŕàļļéļîžéš ţĥé ţýþéđ ƃļöçķ ĥàñđļéŕ öƒ à þļàîñ
*tool.BaseTool öñļý. Ţĥé ĻĻḾ-ƃàçķéđ àñđ ḾŢ ţööļš éḿƃéđ BaseTool îñ ţýþéš öƒ
ţĥéîŕ öŵñ, šö ţĥé ŵŕàþþéŕ ŕüñš éàçĥ öƒ ţĥéḿ ţĥŕöüĝĥ îţš öŵñ Process, ŵĥéŕé ÀÎ
ţŕàñšļàţîöñ àñđ éñţîţý éẋţŕàçţîöñ ĥàṽé ţĥéîŕ öŵñ ƃàţçĥîñĝ àñđ çöñçüŕŕéñçý
šéţţîñĝš. À đéçļàŕéđ đéƒàüļţ ţĥéŕéƒöŕé ŵîđéñš ţĥé þļàîñ BaseTool šţéþš ţĥàţ
šĥàŕé à ƒļöŵ ŵîţĥ àñ ĻĻḾ-ƃàçķéđ ţööļ.
Ƃàţçĥ éẋéçüţöŕ
flow.BatchExecutor þŕöçéššéš ḿüļţîþļé þŕé-ŕéàđ ƒîļéš ţĥŕöüĝĥ à ţööļ çĥàîñ ŵîţĥ
çöñƒîĝüŕàƃļé ƒîļé-ļéṽéļ çöñçüŕŕéñçý:
type BatchConfig struct {
FileConcurrency int // max files processed in parallel (default: 1)
ChannelSize int // per-pipeline channel buffer size (default: 64)
SharedResources []io.Closer // resources shared across files (closed at end)
FailFast bool // cancel remaining on first error (default: true)
}
Éàçĥ ƒîļé ĝéţš ƒŕéšĥ ţööļ îñšţàñçéš ƒŕöḿ ŢööļƑàçţöŕý ƒüñçţîöñš, þŕéṽéñţîñĝ šţàţé ļéàķàĝé ƃéţŵééñ çöñçüŕŕéñţ đöçüḿéñţš. Ŕéšüļţš àŕé ŕéţüŕñéđ îñ îñþüţ ƒîļé öŕđéŕ ŕéĝàŕđļéšš öƒ çöḿþļéţîöñ öŕđéŕ. Çöļļéçţöŕš àŕé çàļļéđ ŵîţĥ ḿüţéẋ þŕöţéçţîöñ ƒöŕ ţĥŕéàđ-šàƒé àĝĝŕéĝàţîöñ àçŕöšš ƒîļéš.
Çöñçüŕŕéñçý ļàýéŕîñĝ
Éàçĥ éẋéçüţîöñ šüŕƒàçé ĥàš îţš öŵñ çöñçüŕŕéñçý çöñţŕöļ:
| Ļàýéŕ | Šçöþé | Çöñţŕöļ | Öŕđéŕ |
|---|---|---|---|
| ÞàŕàļļéļƂļöçķŢööļ | Ƃļöçķš ŵîţĥîñ öñé ţööļ | Ñ ŵöŕķéŕš, àţ ḿöšţ Ñ àđḿîţţéđ ƃļöçķš | Šţŕîçţ Þàŕţ öŕđéŕ |
| ƂàţçĥÉẋéçüţöŕ | Ḿüļţîþļé ƒîļéš | ƑîļéÇöñçüŕŕéñçý šéḿàþĥöŕé | Ƒîļé öŕđéŕ þŕéšéŕṽéđ |
| Éẋéçüţöŕ | Ḿüļţîþļé đöçüḿéñţš | ḾàẋÇöñçüŕŕéñçý šéḿàþĥöŕé | Đöçüḿéñţ öŕđéŕ þŕéšéŕṽéđ |
| ŢàþþîñĝŢööļ | Öƃšéŕṽàţîöñ | Îñþüţ àñđ öüţþüţ îñţéŕçéþţöŕ ĝöŕöüţîñéš | Šéǫüéñţîàļ þéŕ ţööļ ƃöüñđàŕý |
Ţĥé çĥàññéļ çàþàçîţîéš àñđ éàçĥ þàŕàļļéļ šţàĝé'š ŵîñđöŵš ƃöüñđ ţĥé Þàŕţš îñ
ƒļîĝĥţ îñšîđé öñé ţööļ çĥàîñ, éẋçéþţ îñšîđé à ţööļ ţĥàţ ƃüƒƒéŕš îţš îñþüţ. ÀÎ
ţŕàñšļàţîöñ àñđ éñţîţý éẋţŕàçţîöñ îñ ţĥéîŕ ƃàţçĥéđ ḿöđé, àñđ ḿéđîà ŕéƒîñé, ŕéàđ
à ŵĥöļé đöçüḿéñţ'š Þàŕţš ƃéƒöŕé ţĥéý éḿîţ àñý; ţĥé ļàýéŕ þŕöçéššöŕ ĥöļđš öñé
çĥîļđ ļàýéŕ àţ à ţîḿé. À ŕüñ'š ŵöŕķîñĝ šéţ àļšö đéþéñđš öñ ŵĥàţ šüŕŕöüñđš ţĥé
çĥàîñ: Execute çöļļéçţš éàçĥ đöçüḿéñţ'š öüţþüţ Þàŕţš, BatchExecutor
ţàķéš þŕé-ŕéàđ Þàŕţ šļîçéš àñđ ŕéţüŕñš öüţþüţ šļîçéš, àñđ à ƒîļé ŕüñ ƒééđš îţš
ŕéàđéŕ çöñçüŕŕéñţļý öñļý ŵĥéñ ţĥé ŕéàđéŕ îš à šţŕéàḿîñĝ ŕéàđéŕ àñđ ñö þŕé-ŕéàđ
çöñţéñţ îš šüþþļîéđ, ŵîţĥ à šţŕéàḿîñĝ šķéļéţöñ öñļý ŵĥéñ ţĥé ŵŕîţéŕ šţŕéàḿš ţöö.
Ţĥé ƃöüñđš çöüñţ Þàŕţš, šö à šîñĝļé ļàŕĝé Ƃļöçķ öŕ à ŕéţàîñéđ šķéļéţöñ çàñ šţîļļ
đöḿîñàţé ḿéḿöŕý.
Ţĥé ŵŕîţé šţàĝé
À ƒîļé ŕüñ éñđš îñ ţĥé ƒöŕḿàţ ŵŕîţéŕ, àñđ ţĥé ŵŕîţéŕ'š ƃýţéš ŕéàçĥ ţĥé ƒîļé
ţĥŕöüĝĥ ţĥé ƒîļé ĥöḿé öƒ ţĥé çĥàñĝé çöñţŕàçţ
(É-09), ţĥé þļàçé éṽéŕý çĥàñĝé šéţ çöḿḿîţš ţöö.
Ţĥé ƒîļé ŕüññéŕ (flow.FileRunner) đîĝéšţš ţĥé đéšţîñàţîöñ ƃéƒöŕé îţ ŕéàđš
àñýţĥîñĝ, šţŕéàḿš ţĥé ŵŕîţéŕ'š öüţþüţ îñţö à ƒîļé šţàĝéđ ƃéšîđé ţĥé
đéšţîñàţîöñ ŵîţĥ ţĥé đéšţîñàţîöñ'š ḿöđé (filehome.Home.Produce), àñđ çöḿḿîţš
îţ: üñđéŕ ţĥé đéšţîñàţîöñ'š àđṽîšöŕý ļöçķ, ţĥé šţàĝéđ ƒîļé îš ŕéñàḿéđ öñţö ţĥé
đéšţîñàţîöñ öñļý ŵĥîļé ţĥé đéšţîñàţîöñ šţîļļ ĥöļđš ŵĥàţ îţ ĥéļđ ŵĥéñ ţĥé ŕüñ
ƃéĝàñ. À đéšţîñàţîöñ ţĥàţ çĥàñĝéđ ŵĥîļé ţĥé ŕüñ ŵöŕķéđ (à þéŕšöñ šàṽéđ îţ, à
çĥàñĝé šéţ öŕ àñöţĥéŕ ŕüñ çöḿḿîţţéđ ƒîŕšţ) ķééþš ŵĥàţ îţ ĥöļđš, àñđ ţĥé ŕüñ
ŕéþöŕţš îţ àš ḿöṽéđ (filehome.ErrMoved). À đéšţîñàţîöñ ţĥàţ àļŕéàđý ĥöļđš ţĥé
ƃýţéš ţĥé ŕüñ þŕöđüçéđ îš ļéƒţ àš îţ îš. À ţööļ öŕ ŵŕîţéŕ éŕŕöŕ đîšçàŕđš ţĥé
šţàĝéđ ƒîļé, šö à ƒàîļéđ ŕüñ ļéàṽéš ñö þàŕţîàļ đéšţîñàţîöñ.
À çàļļéŕ ţĥàţ ķééþš à ŕéçöŕđ öƒ ŵĥàţ à ŕüñ çĥàñĝéđ ƒöļļöŵš éàçĥ đöçüḿéñţ
ţĥŕöüĝĥ FileRunnerConfig.Documents: îţ šééš éṽéŕý ƃļöçķ àš îţ ļéàṽéš ţĥé
ŕéàđéŕ àñđ àš îţ ŕéàçĥéš ţĥé ŵŕîţéŕ, àñđ îţ çöḿḿîţš ţĥé šţàĝéđ đöçüḿéñţ îţšéļƒ.
Ţĥé ķàþî ĥöšţ ŕéçöŕđš éàçĥ đöçüḿéñţ à ƒļöŵ ŵŕîţéš îñ à þŕöĵéçţ àš öñé
content.edit, àþþļîéš ţĥé ŕüñ'š çĥàñĝéš àĝàîñ ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé ŵĥéñ
ţĥé đéšţîñàţîöñ ḿöṽéđ, àñđ, üñđéŕ --print-ops, çöḿḿîţš ţĥŕöüĝĥ à ĥöḿé ţĥàţ
ŵŕîţéš ñöţĥîñĝ àñđ þŕîñţš ţĥé çĥàñĝé šéţ ţĥé ŕüñ ŵöüļđ àþþļý
(É-09). Ţĥé ķàþî ĥöšţ þàššéš ţĥé ĥöḿé îţš
çĥàñĝé šéŕṽîçé çöḿḿîţš ţĥŕöüĝĥ, šö à ƒļöŵ àñđ à çĥàñĝé šéţ ŵŕîţîñĝ öñé ƒîļé
ţàķé ţüŕñš üñđéŕ öñé ļöçķ.
Çöļļéçţöŕš àñđ šţŕéàḿîñĝ çöļļéçţöŕš
Çöļļéçţöŕš àĝĝŕéĝàţé ŕéšüļţš àçŕöšš đöçüḿéñţš (ŵöŕđ çöüñţš, çĥéçķ ŕéþöŕţš, ţéŕḿ
ļîšţš). Ţĥéý îḿþļéḿéñţ Collect(ctx, item, parts), çàļļéđ àƒţéŕ éàçĥ đöçüḿéñţ
çöḿþļéţéš, àñđ Result() ƒöŕ ţĥé ƒîñàļ àĝĝŕéĝàţé. Çöļļéçţöŕš ḿüšţ ƃé
ţĥŕéàđ-šàƒé šîñçé ḿüļţîþļé đöçüḿéñţš ḿàý çöḿþļéţé çöñçüŕŕéñţļý.
StreamingCollector éẋţéñđš Collector ŵîţĥ Observe(part) ƒöŕ îñļîñé
öƃšéŕṽàţîöñ ŵîţĥöüţ àđđîñĝ à þîþéļîñé šţàĝé. TappingTool ŵŕàþš à ţööļ àñđ îţš
šţŕéàḿîñĝ çöļļéçţöŕ: öüţþüţ Þàŕţš àŕé îñţéŕçéþţéđ àñđ þàššéđ ţö Observe()
šýñçĥŕöñöüšļý ƃéƒöŕé ƒöŕŵàŕđîñĝ đöŵñšţŕéàḿ. Ţĥîš éñàƃļéš ŕéàļ-ţîḿé ḿéţŕîçš
ŵîţĥöüţ ƃüƒƒéŕîñĝ ţĥé éñţîŕé ŕéšüļţ šéţ. Ţĥé ḿéţŕîçš, ţŕàçîñĝ àñđ ţàþþîñĝ
ŵŕàþþéŕš šĥàŕé öñé îñţéŕçéþţöŕ: îţš îñþüţ šîđé šţöþš ŵàîţîñĝ ƒöŕ îñþüţ öñçé ţĥé
çöñţéẋţ îš çàñçéļļéđ öŕ ţĥé îññéŕ ţööļ ŕéţüŕñš, îţš öüţþüţ šîđé ķééþš đŕàîñîñĝ
ţĥé îññéŕ ţööļ šö à šéñđ ţĥé îññéŕ ţööļ đöéš ñöţ ĝüàŕđ šţîļļ çöḿþļéţéš, àñđ
ƃöţĥ àŕé ĵöîñéđ ƃéƒöŕé ţĥé ŵŕàþþéŕ ŕéţüŕñš. À çàñçéļļéđ çöñţéẋţ šüŕƒàçéš àš ţĥé
çöñţéẋţ éŕŕöŕ ŵĥéñ ţĥé îññéŕ ţööļ ŕéþöŕţš ñöñé.
Ƒļöŵ ţŕàçîñĝ àñđ ṽîšüàļîžàţîöñ
flow.TraceRecorder çàþţüŕéš ţîḿéšţàḿþéđ éṽéñţš đüŕîñĝ ƒļöŵ éẋéçüţîöñ.
flow.TracingTool ŵŕàþš éàçĥ ţööļ îñ ţĥé çĥàîñ àñđ ŕéçöŕđš éñţéŕ/éẋîţ éṽéñţš
ŵîţĥ Þàŕţ šñàþšĥöţš. Ţĥé --trace path/to/trace.json ƒļàĝ öñ kapi run éñàƃļéš
ţŕàçîñĝ. Ţĥé öüţþüţ îš à FlowTrace ĴŠÖÑ ƒîļé çöñţàîñîñĝ:
- Ñöđéš: ţĥé ţööļ çĥàîñ ŵîţĥ çöñçüŕŕéñçý ḿéţàđàţà
- Éṽéñţš: ţîḿéšţàḿþéđ éñţéŕ/éẋîţ éṽéñţš þéŕ Þàŕţ
- Þàŕţ šñàþšĥöţš: Þàŕţ šţàţé ƃéƒöŕé àñđ àƒţéŕ éàçĥ ñöđé
- Đüŕàţîöñ: ţöţàļ ƒļöŵ éẋéçüţîöñ ţîḿé îñ ḿîçŕöšéçöñđš
À ƃŕöŵšéŕ-ƃàšéđ ṽîšüàļîžàţîöñ ŕéñđéŕš ţĥé ţŕàçé àš àñ àñîḿàţéđ ƒļöŵ đîàĝŕàḿ ŵîţĥ þàŕţîçļéš ḿöṽîñĝ ţĥŕöüĝĥ ñöđéš, çĥàññéļ ƒîļļ îñđîçàţöŕš, àñđ ŵöŕķéŕ ļàñé šéþàŕàţîöñ ƒöŕ þàŕàļļéļ ţööļš. Ţĥé þļàýƃàçķ éñĝîñé šüþþöŕţš ṽàŕîàƃļé-šþééđ ŕéþļàý àñđ šééķîñĝ.
Öƃšéŕṽàţîöñ šéàḿ
Ţŕàçîñĝ ţö à ƒîļé îš öñé çöñšüḿéŕ öƒ à ḿöŕé ĝéñéŕàļ šéàḿ. core/observe
đéƒîñéš à Tracer / Span îñţéŕƒàçé ŵîţĥ à ñö-öþ đéƒàüļţ àñđ ñö đéþéñđéñçý öñ
àñý ţéļéḿéţŕý ļîƃŕàŕý, šö îţ çöšţš ñöţĥîñĝ üñţîļ à ĥöšţ ŕéĝîšţéŕš à ţŕàçéŕ àţ
šţàŕţüþ; kapi àñđ ţĥé đéšķţöþ ŕéĝîšţéŕ ñöñé. flow.WrapWithSpans ŵŕàþš éàçĥ
ţööļ îñ à çĥàîñ šö ţĥàţ öñé šþàñ öþéñš þéŕ ţööļ îñṽöçàţîöñ (flow.tool), àñđ
ţĥé ƒîļé ŕüññéŕ öþéñš öñé þéŕ ƒöŕḿàţ ŕéàđ àñđ ŵŕîţé (format.read,
format.write). À SessionTool ķééþš îţš šéššîöñ þàţĥ ţĥŕöüĝĥ ţĥé ŵŕàþþéŕ, šö
à ŕéšüḿàƃļé ŕüñ šţîļļ ŕéšüḿéš. Ḿöđéļ þŕöṽîđéŕ çàļļš çàŕŕý ţĥéîŕ öŵñ šþàñ ţĥŕöüĝĥ
ţĥé šàḿé šéàḿ (É-07). Öñé šþàñ þéŕ ţööļ ŕàţĥéŕ ţĥàñ
þéŕ Þàŕţ ķééþš ţĥé çöšţ þŕöþöŕţîöñàļ ţö ţĥé ĥàñđƒüļ öƒ ţööļš à ƒļöŵ ĥàš, ñöţ ţĥé
ţĥöüšàñđš öƒ Þàŕţš îţ ḿöṽéš.
Ƒļöŵ đéƒîñîţîöñš
flow.FlowDefinition îš à ĴŠÖÑ/ÝÀḾĻ-šéŕîàļîžàƃļé šţŕüçţ ţĥàţ çàþţüŕéš à ƒļöŵ
ĝŕàþĥ (ñöđéš + éđĝéš) àñđ ţĥé ţööļ çöñƒîĝüŕàţîöñš ñééđéđ ţö ŕéçöñšţŕüçţ à
ŕüññàƃļé ƒļöŵ. Ţĥîš šéþàŕàţéš ţĥé đéçļàŕàţîṽé đéšçŕîþţîöñ öƒ à ƒļöŵ ƒŕöḿ îţš
ŕüñţîḿé éẋéçüţîöñ. Ţĥé ŕüñţîḿé flow.Flow îš ñàŕŕöŵéŕ ţĥàñ ţĥé ĝŕàþĥ: îţ ĥöļđš
àñ öŕđéŕéđ []tool.Tool àñđ çöññéçţš éàçĥ ţööļ ţö ţĥé ñéẋţ, šö à ĥöšţ ţüŕñš à
đéƒîñîţîöñ îñţö ţĥàţ öŕđéŕ ƃéƒöŕé àñýţĥîñĝ ŕüñš.
Éàçĥ FlowNode ĥàš:
- ÎĐ: üñîǫüé îđéñţîƒîéŕ ŵîţĥîñ ţĥé đéƒîñîţîöñ
- Ţýþé:
flow.NodeToolƒöŕ à þŕöçéššîñĝ šţéþ.NodeReaderàñđNodeWriterŕéḿàîñ îñ ţĥéNodeTypeṽöçàƃüļàŕý ƒöŕ ţĥé éđîţöŕ'š ĝŕàþĥ, ƃüţ éṽéŕý ƃüîļţ-îñ àñđ šţéþš-çöḿþîļéđ ƒļöŵ çàŕŕîéš ţööļ ñöđéš öñļý, ƃéçàüšé ţĥé éñđš àŕé ƃîñđîñĝš (É-04) - Ñàḿé: ţĥé ŕéĝîšţéŕéđ ñàḿé öƒ ţĥé ţööļ (é.ĝ.
"pseudo-translate") - Ļàƃéļ: öþţîöñàļ đîšþļàý ļàƃéļ ƒöŕ ÜÎ ŕéñđéŕîñĝ
- Çöñƒîĝ: öþţîöñàļ ķéý-ṽàļüé çöñƒîĝüŕàţîöñ ḿàþ
- Þöšîţîöñ: ẋ/ý çööŕđîñàţéš ƒöŕ ṽîšüàļ ļàýöüţ îñ ţĥé ƒļöŵ éđîţöŕ
Ƃîñđîñĝš (É-04). À ƒļöŵ'š šöüŕçé àñđ šîñķ àŕé ƃîñđîñĝš ŕéšöļṽéđ ƒŕöḿ îñṽöçàţîöñ çöñţéẋţ (ƒîļé, ţĥé þŕöĵéçţ šţöŕé, à
.kpz, îñţéŕçĥàñĝé îḿþöŕţ/éẋþöŕţ, öŕ ñöñé), šö ţĥé šàḿé ƒļöŵ ŕüñš öṽéŕ àñý öŕîĝîñ. Éṽéŕý ƃüîļţ-îñ ƒļöŵ ĝŕàþĥ çàŕŕîéš ţööļ ñöđéš öñļý. Ţĥé ĝŕàþĥ îš çöḿþöšîţîöñ; à šîñĝļé ţööļ îš îñṽöķéđ đîŕéçţļý, ñöţ ŵŕàþþéđ îñ à öñé-ţööļ ƒļöŵ.
Éàçĥ FlowEdge çöññéçţš à šöüŕçé ñöđé ţö à ţàŕĝéţ ñöđé. TopologicalOrder()
öŕđéŕš ţĥé ñöđéš ŵîţĥ Ķàĥñ'š àļĝöŕîţĥḿ àñđ ŕéþöŕţš à çýçļé àš àñ éŕŕöŕ;
Validate() çĥéçķš ñöđé îđéñţîƒîéŕš, ñöđé ţýþéš àñđ éđĝé éñđþöîñţš. Éàçĥ ĥöšţ
þàţĥ đéŕîṽéš ţĥé çĥàîñ îñ îţš öŵñ ŵàý:
- Ţĥé ƃüîļţ-îñ ƒļöŵ þàţĥ çĥéçķš đàţà ƒļöŵ àñđ ţŕàñšƒöŕḿéŕ þļàçéḿéñţ, ţĥéñ
öŕđéŕš ţĥé ţööļ ñöđéš ƃý ţĥéîŕ çàñṽàš Ẋ þöšîţîöñ (
orderedToolNodes). - Ţĥé þŕöĵéçţ ƒļöŵ ŕüññéŕ ƃüîļđš öñé ţööļ þéŕ šţéþ, îñ šţéþ öŕđéŕ, àñđ ŕéƒüšéš
à ƒļöŵ ĥöļđîñĝ à
parallel:šţéþ ƃéƒöŕé îţ ƃüîļđš àñý. - À Ĝö çàļļéŕ ţĥàţ ƒîļļš
Flow.Toolsšüþþļîéš ţĥé öŕđéŕ îţšéļƒ.
Ñö þàţĥ šçĥéđüļéš ƃŕàñçĥéš çöñçüŕŕéñţļý öŕ ĵöîñš ţĥéîŕ ŕéšüļţš, šö à ƒļöŵ ḿéàñţ ţö ŕüñ îš à ļîñéàŕ çĥàîñ.
Ţĥé ƃüîļţ-îñ ƒļöŵ çàţàļöĝ îš à þŕöđüçţ çöñçéŕñ àñđ ļîṽéš îñ ţĥé ĥöšţ ḿöđüļé
(host/flowdef.BuiltInFlows), ñöţ îñ ţĥé éñĝîñé. Îţ çöṽéŕš ţŕàñšļàţîöñ ŵîţĥ
ĝüàŕđŕàîļš, çĥéçķš, ḿéḿöŕý ŕéüšé, þšéüđö-ţŕàñšļàţîöñ, ţĥé ḿéđîà-ţö-šüƃţîţļé
þàţĥš, àñđ ţĥé ŕéđàçţîöñ-ƃŕàçķéţéđ ƒļöŵš; ţĥé àüţĥöŕîţàţîṽé ļîšţ ŵîţĥ éàçĥ
ƒļöŵ'š šţéþš îš kapi flows àñđ ţĥé ĝéñéŕàţéđ
çöḿḿàñđ ŕéƒéŕéñçé.
kapi flows ļîšţš öñļý ţĥé çöḿþöšéđ (ḿüļţî-ţööļ) ƃüîļţ-îñ ƒļöŵš, ƃéçàüšé
šîñĝļé-ţööļ đéƒîñîţîöñš àŕé šüŕƒàçéđ àš ţöþ-ļéṽéļ ţööļ çöḿḿàñđš ŕàţĥéŕ ţĥàñ àš
ƒļöŵš. host/flowdef.FlowStore þéŕšîšţš üšéŕ-çŕéàţéđ ƒļöŵ đéƒîñîţîöñš àš ĴŠÖÑ
ƒîļéš öñ đîšķ, đîšţîñĝüîšĥéđ ƃý šöüŕçé:
built-in: šĥîþš ŵîţĥ ñéöķàþî, îḿḿüţàƃļéuser: çŕéàţéđ ƃý ţĥé üšéŕ, šţöŕéđ îñ ţĥé üšéŕ'š çöñƒîĝ đîŕéçţöŕý
À þŕöĵéçţ'š öŵñ ñàḿéđ ƒļöŵš àŕé đéçļàŕéđ îñ îţš ŕéçîþé'š flows: ƃļöçķ ŕàţĥéŕ
ţĥàñ šţöŕéđ àš ƒîļéš (É-04).
Šţéþš-ƃàšéđ ÝÀḾĻ ƒöŕḿàţ
À ĥüḿàñ-ƒŕîéñđļý šţéþš ƒöŕḿàţ îš ţĥé þŕîḿàŕý àüţĥöŕîñĝ šüŕƒàçé ƒöŕ ƒļöŵš îñ ÝÀḾĻ (É-03):
apiVersion: v1
kind: FlowDefinition
metadata:
name: Production Pipeline
spec:
steps:
- tool: recycle
config: { fuzzyThreshold: 75 }
- tool: translate
config: { provider: anthropic }
- tool: qa
Šţéþš ŕüñ îñ ţĥé öŕđéŕ ļîšţéđ. Ţĥé þàŕšéŕ àüţö-đéţéçţš ţĥé šĥàþé (šţéþš ṽš
ĝŕàþĥ), àñđ StepsToGraph çöḿþîļéš šţéþš ţö à çĥàîñ öƒ ñöđéš àñđ éđĝéš. Îţ àļšö
àççéþţš à parallel: ƃļöçķ àñđ çöḿþîļéš îţ ţö šéṽéŕàļ ñöđéš ƒéđ ƒŕöḿ ţĥé šàḿé
þŕéđéçéššöŕ; ţĥàţ šĥàþé éẋîšţš îñ ţĥé đéƒîñîţîöñ ḿöđéļ öñļý, àñđ ñöñé öƒ ţĥé
ĥöšţ þàţĥš àƃöṽé éẋéçüţéš îţ àš çöñçüŕŕéñţ ƃŕàñçĥéš.
Ţĥé šţéþš çàŕŕý öñļý ţĥé çöḿþöšîţîöñ. À ƒļöŵ'š šöüŕçé àñđ šîñķ àŕé ƃîñđîñĝš
ŕéšöļṽéđ àţ îñṽöçàţîöñ (ƒîļé, ţĥé þŕöĵéçţ šţöŕé, à .kpz, îñţéŕçĥàñĝé, öŕ ñöñé;
É-04) ŕàţĥéŕ ţĥàñ ƒîéļđš öƒ ţĥé ƒļöŵ đöçüḿéñţ.
Ƒàñ-öüţ àñđ ƃàţçĥîñĝ
tool.Tee() îš à çĥàññéļ ĥéļþéŕ ƒöŕ à Ĝö çàļļéŕ: îţ ƒöŕŵàŕđš ţĥé šàḿé Þàŕţ
þöîñţéŕ ţö éṽéŕý öüţþüţ çĥàññéļ, ţàķéš ƃàçķþŕéššüŕé ƒŕöḿ éàçĥ ŕéçéîṽéŕ, àñđ
çļöšéš éṽéŕý öüţþüţ öñçé îţš îñþüţ çļöšéš öŕ îţš çöñţéẋţ îš çàñçéļļéđ. Ţĥé
éẋéçüţöŕ ñéṽéŕ ŵîŕéš îţ ƒŕöḿ ĝŕàþĥ éđĝéš. À çàļļéŕ ţĥàţ üšéš îţ öŵñš ţĥé
ƃŕàñçĥéš' ļîƒéçýçļé, àñđ çöñçüŕŕéñţ ŕéçéîṽéŕš šĥàŕé éàçĥ ḿüţàƃļé Ƃļöçķ, šö ţĥéý
ḿüšţ çööŕđîñàţé àççéšš ţö îţ.
Ţĥé batch ţööļ îš à šţàĝé îñ à ļîñéàŕ çĥàîñ. Îţ ĥöļđš ƃļöçķš üñţîļ îţ ĥàš ţĥé
çöñƒîĝüŕéđ ñüḿƃéŕ, ţĥéñ ƒöŕŵàŕđš ţĥéḿ öñé ƃý öñé; à ñöñ-ƃļöçķ Þàŕţ þàššéš
ţĥŕöüĝĥ àţ öñçé, àĥéàđ öƒ àñý ƃļöçķš îţ ĥöļđš. Ĝŕöüþîñĝ ƃļöçķš îñţö öñé ŕéǫüéšţ
ƒöŕ ƃàţçĥ-çàþàƃļé ŕéḿöţé ÀÞΚ àñđ ĻĻḾ þŕöḿþţš ĥàþþéñš îñšîđé ţĥé ţööļš ţĥàţ çàļļ
ţĥéḿ (Ḿ-05).
Šçŕîþţ šţéþ
Ţĥé script ţööļ ŕüñš üšéŕ-þŕöṽîđéđ ĴàṽàŠçŕîþţ (ÉŠ5) ṽîà ţĥé ĝöĵà ŕüñţîḿé. Éàçĥ
ţööļ îñšţàñçé öŵñš îţš öŵñ goja.Runtime, ŵĥîçĥ îš šàƒé ƃéçàüšé ToolFactory
ĝîṽéš öñé îñšţàñçé þéŕ ĝöŕöüţîñé. Ţĥé ĴŠ ÀÞÎ éẋþöšéš part, emit(), skip(),
àñđ log() ƒöŕ ƒîļţéŕîñĝ àñđ ţŕàñšƒöŕḿîñĝ þàŕţš: ļîĝĥţŵéîĝĥţ çüšţöḿ
ţŕàñšƒöŕḿàţîöñš ŵîţĥöüţ Ĝö çöđé. script îš îñ ţĥé éẋéç çļàšš: à ŕéçîþé
çàññöţ àŕḿ îţ šîļéñţļý (É-06).
Ţéŕḿîñöļöĝý: Öķàþî → ñéöķàþî
Ƒöŕ ŕéàđéŕš ƒàḿîļîàŕ ŵîţĥ ţĥé Öķàþî Ƒŕàḿéŵöŕķ, ţĥé éñĝîñé ḿàþš ţö Öķàþî çöñçéþţš àš ƒöļļöŵš:
| Öķàþî (Ĵàṽà) | ñéöķàþî (Ĝö) |
|---|---|
| Ƒîļţéŕ | ĐàţàƑöŕḿàţ (Ŕéàđéŕ/Ŵŕîţéŕ) |
| Šţéþ | Ţööļ |
| Þîþéļîñé | Ƒļöŵ |
| ÞîþéļîñéĐŕîṽéŕ | Éẋéçüţöŕ |
| Éṽéñţ | Þàŕţ |
| ŢéẋţÜñîţ | Ƃļöçķ |
| ŢéẋţƑŕàĝḿéñţ | Ŕüñ šéǫüéñçé ([]Run) |
| Çöđé | Ŕüñ |
| ŠţàŕţŠüƃĐöçüḿéñţ/ŠţàŕţŠüƃƑîļţéŕ | Çĥîļđ Ļàýéŕ |
Çöñšéǫüéñçéš
- Éàçĥ ţööļ ŕüñš çöñçüŕŕéñţļý; ḿüļţî-çöŕé ÇÞÜš àŕé üţîļîžéđ ŵîţĥîñ à šîñĝļé đöçüḿéñţ'š þîþéļîñé.
- Ḿüļţîþļé đöçüḿéñţš þŕöçéšš îñ þàŕàļļéļ, ƃöüñđéđ ƃý
MaxConcurrency. - Ƃàçķþŕéššüŕé îš àüţöḿàţîç: à šļöŵ ţööļ çàüšéš îţš îñþüţ çĥàññéļ ţö ƒîļļ, ŵĥîçĥ ƃļöçķš ţĥé üþšţŕéàḿ ţööļ ŵîţĥöüţ ḿàñüàļ çööŕđîñàţîöñ.
- Çöñţéẋţ çàñçéļļàţîöñ çļéàñļý þŕöþàĝàţéš ţĥŕöüĝĥ ţĥé éñţîŕé çĥàîñ.
- ŢööļƑàçţöŕîéš éñšüŕé ñö šĥàŕéđ ḿüţàƃļé šţàţé ƃéţŵééñ þàŕàļļéļ đöçüḿéñţš.
- Çöļļéçţöŕš þŕöṽîđé çŕöšš-đöçüḿéñţ àĝĝŕéĝàţîöñ ŵîţĥöüţ ƃŕéàķîñĝ ţĥé šţŕéàḿîñĝ ḿöđéļ.
- Ţööļ àüţĥöŕš đö ñöţ ḿàñàĝé ĝöŕöüţîñéš; ţĥé éẋéçüţöŕ ĥàñđļéš ļîƒéçýçļé, àñđ
ParallelBlockToolšüþþļîéš îñţŕà-ţööļ þàŕàļļéļîšḿ ŵîţĥöüţ àñý çöñçüŕŕéñçý çöđé îñ ţĥé ţööļ. À šļöŵ ƃļöçķ ĥöļđš ƃàçķ àţ ḿöšţ Ñ àđḿîţţéđ ƃļöçķš àñđ 4Ñ öţĥéŕ Þàŕţš, šö à þàŕàļļéļ šţàĝé šţàýš ƃöüñđéđ ŵĥéñ îţš ŵöŕķéŕš ƒîñîšĥ öüţ öƒ öŕđéŕ. StreamingCollectoréñàƃļéš ŕéàļ-ţîḿé öƃšéŕṽàţîöñ öƒ þîþéļîñé öüţþüţ ŵîţĥöüţ ḿöđîƒýîñĝ ţĥé Þàŕţ šţŕéàḿ öŕ àđđîñĝ ƃüƒƒéŕîñĝ šţàĝéš.- Ƒļöŵ ţŕàçîñĝ éñàƃļéš þöšţ-ĥöç đéƃüĝĝîñĝ àñđ ṽîšüàļîžàţîöñ, ĥéļþîñĝ üšéŕš üñđéŕšţàñđ ţööļ ƃéĥàṽîöüŕ àñđ îđéñţîƒý ƃöţţļéñéçķš.
- À ĥöšţ ţĥàţ öŕđéŕš à đéƒîñîţîöñ ŵîţĥ
TopologicalOrderŕéþöŕţš à çýçļé ƃéƒöŕé îţ ƃüîļđš àñý ţööļ. - ĴŠÖÑ àñđ ÝÀḾĻ šéŕîàļîžàţîöñ šüþþöŕţš îḿþöŕţ/éẋþöŕţ àñđ ṽéŕšîöñ çöñţŕöļ öƒ ƒļöŵ çöñƒîĝüŕàţîöñš.
- Šţéþš-ƃàšéđ ÝÀḾĻ ḿàķéš ƒļöŵ àüţĥöŕîñĝ àççéššîƃļé ŵîţĥöüţ Ĝö; ţĥé ṽîšüàļ éđîţöŕ àñđ ţĥé ÝÀḾĻ šĥàŕé öñé ĝŕàþĥ ŕéþŕéšéñţàţîöñ, àñđ ŵĥàţ ŕüñš îš ţĥé öŕđéŕéđ çĥàîñ à ĥöšţ đéŕîṽéš ƒŕöḿ îţ.
Ŕéļàţéđ
- Ƒ-02: Ţĥé çöñţéñţ ḿöđéļ: ţĥé Þàŕţ ţýþéš ţĥàţ šţŕéàḿ
- É-02: Ţĥé ƒöŕḿàţ šýšţéḿ: ŕéàđéŕš ţĥàţ éḿîţ Þàŕţš, ŵŕîţéŕš ţĥàţ çöñšüḿé ţĥéḿ
- É-03: Ţĥé ţööļ šýšţéḿ: ţĥé ţööļš ţĥàţ ḿàķé üþ à ƒļöŵ
- É-04: Ƒļöŵš àñđ Î/Ö ƃîñđîñĝ: ŕéàđéŕ/ŵŕîţéŕ ƃéçöḿé šöüŕçé/šîñķ ƃîñđîñĝš; à ƒļöŵ îš çöḿþöšîţîöñ öñļý
- É-05: Ţĥé þļüĝîñ šýšţéḿ: ŵĥàţ à þļüĝîñ àđđš ţö ţĥé éñĝîñé: ƒöŕḿàţš, šéĝḿéñţéŕš, çöḿḿéñţ ļàñĝüàĝéš àñđ çöññéçţöŕš