À-01: Ţéšţîñĝ àñđ đöçüḿéñţàţîöñ
Šüḿḿàŕý
Ţéšţîñĝ îš à ţĥŕéé-ţîéŕ þýŕàḿîđ: ţàƃļé-đŕîṽéñ üñîţ ţéšţš ŵîţĥ ţéšţîƒý, îñţéĝŕàţîöñ
ţéšţš çöṽéŕîñĝ ƒöŕḿàţ ŕöüñđ-ţŕîþš àñđ ŵĥöļé ƒļöŵš, àñđ à ƃüîļđ-ţàĝĝéđ éñđ-ţö-éñđ
šüîţé ţĥàţ đŕîṽéš ţĥé ŕéàļ kapi ƃîñàŕý àĝàîñšţ ŕéàļ ƒîļéš. Àƃöṽé ţĥé þýŕàḿîđ
šîţ ţĥé éṽàļš, šþļîţ îñţö ţĥŕéé ƃàñđš ƃý ŵĥàţ ţĥéý ĥàṽé üñđéŕ ţéšţ: kapi'š öŵñ
çöđé, à ḿöđéļ'š öüţþüţ, àñđ àñ àĝéñţ'š ƃéĥàṽîöüŕ. Đöçüḿéñţàţîöñ îš à
Đöçüšàüŕüš 3 šîţé šéŕṽîñĝ üšéŕ đöçš, àŕçĥîţéçţüŕé đéçîšîöñš, àñđ îḿþļéḿéñţàţîöñ
ñöţéš ƒŕöḿ öñé đéþļöýḿéñţ, ţŕàñšļàţéđ ţĥŕöüĝĥ ţĥé đöĝƒööđ ļööþ àñđ öƒƒéŕéđ îñ à
þšéüđö ļöçàļé öñ éṽéŕý þàĝé. Đéḿö àššéţš çöḿé ƒŕöḿ ţŵö çöḿþļéḿéñţàŕý þîþéļîñéš:
àñ àüţĥöŕéđ ŵàļķţĥŕöüĝĥ çöḿþîļéđ îñţö àñ îñ-ƃŕöŵšéŕ éḿƃéđ ţĥàţ ŕüñš ţĥé ŕéàļ ÇĻÎ
àš ŴéƃÀššéḿƃļý, àñđ à ñàŕŕàţéđ éẋþļàîñéŕ ŕéñđéŕéđ ƃý ţĥé ĥàŕñéšš. Ƃöţĥ ŕüñ
àĝàîñšţ ŕéàļ šýšţéḿš.
Çöñţéẋţ
À ƒŕàḿéŵöŕķ ŵîţĥ à ļîƃŕàŕý šüŕƒàçé, à ÇĻÎ, àñđ à đéšķţöþ àþþ çöṽéŕš à ŵîđé ţéšţîñĝ šüŕƒàçé. Ƒàšţ üñîţ ţéšţš þŕöţéçţ ŕéƒàçţöŕš; ŕöüñđ-ţŕîþ ţéšţš þŕöţéçţ ƒöŕḿàţ ƒîđéļîţý; éñđ-ţö-éñđ ţéšţš þŕöţéçţ üšéŕ ŵöŕķƒļöŵš. Đöçüḿéñţàţîöñ ĥàš ţö šţàý šýñçĥŕöñîžéđ ŵîţĥ àçţüàļ ƃéĥàṽîöŕ: à ŕéçöŕđîñĝ ţĥàţ šĥöŵš à çöḿḿàñđ ţĥàţ ñö ļöñĝéŕ éẋîšţš đéƒéàţš îţš öŵñ þüŕþöšé.
Ƃéçàüšé đéḿö àššéţš éẋéŕçîšé ŕéàļ çöḿḿàñđš, ţéšţîñĝ àñđ đöçüḿéñţàţîöñ àŕé ţîĝĥţļý çöüþļéđ: à ŕéçöŕđîñĝ îš ƃöţĥ à ŕéĝŕéššîöñ šîĝñàļ àñđ üšéŕ-ƒàçîñĝ çöñţéñţ. Àṽöîđîñĝ ḿöçķš îñ đéḿö àššéţš îš ŵĥàţ ķééþš ţĥé đöçüḿéñţéđ ƃéĥàṽîöŕ ĥöñéšţ.
Ţĥé đöçüḿéñţàţîöñ çöñšüḿéŕ šþļîţš îñ ţŵö. Éñđ üšéŕš (ţŕàñšļàţöŕš, çöñţéñţ àñđ ļàñĝüàĝé éñĝîñééŕš) ñééđ ǫüîçķšţàŕţš, çöḿḿàñđ ŕéƒéŕéñçéš, àñđ ŵöŕķƒļöŵ ţüţöŕîàļš. Çöñţŕîƃüţöŕš îḿþļéḿéñţîñĝ ƒöŕḿàţš, ţööļš, þļüĝîñš, àñđ çöññéçţöŕš ñééđ àŕçĥîţéçţüŕé đöçüḿéñţàţîöñ, îñţéŕƒàçé šþéçîƒîçàţîöñš, àñđ ţéšţîñĝ ĝüîđéš. À šîñĝļé šîţé ŵîţĥ þéŕ-àüđîéñçé ñàṽîĝàţîöñ çöṽéŕš ƃöţĥ ŵĥîļé ķééþîñĝ đéþļöýḿéñţ šîḿþļé.
Đéçîšîöñ
Ţĥé ţéšţ þýŕàḿîđ
Ţĥŕéé ţîéŕš, éàçĥ à đéŕéñţ üñîţ öƒ çöñƒîđéñçé. Çöšţš ŕîšé àñđ çöüñţš ƒàļļ ĝöîñĝ đöŵñ ţĥé ļîšţ.
Üñîţ ţéšţš üšé github.com/stretchr/testify (assert àñđ require).
Ţàƃļé-đŕîṽéñ ţéšţš àŕé ţĥé šţàñđàŕđ þàţţéŕñ, ţéšţ ƒîļéš çöļöçàţé ŵîţĥ ţĥé
îḿþļéḿéñţàţîöñ àš *_test.go, àñđ éàçĥ ţéšţ šţàŕţš ƒŕöḿ ƒŕéšĥ šţàţé, ŵîţĥ ñö
šĥàŕéđ ḿüţàƃļé ƒîẋţüŕéš:
tests := []struct {
name string
input string
want string
wantErr bool
}{
{"simple", "hello", "HELLO", false},
{"empty", "", "", false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := Upper(tt.input)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
assert.Equal(t, tt.want, got)
})
}
Îñţéĝŕàţîöñ ţéšţš ṽàļîđàţé ƒöŕḿàţ ŕöüñđ-ţŕîþš (ŕéàđ, ŵŕîţé, çöḿþàŕé), ŵĥöļé
ƒļöŵš ŵîţĥ ŕéàļ ţööļš, àñđ šţöŕé öþéŕàţîöñš. Ţĥéý ŕüñ àš þàŕţ öƒ make test
ŵîţĥöüţ ţĥé -short ƒļàĝ.
Éñđ-ţö-éñđ ţéšţš ļîṽé îñ kapi/e2e, ƃéĥîñđ ţĥé e2e ƃüîļđ ţàĝ. TestMain
ƃüîļđš ţĥé kapi ƃîñàŕý ƒŕöḿ ţĥé çüŕŕéñţ šöüŕçé ţŕéé àñđ éàçĥ ţéšţ éẋéŕçîšéš à
çöḿþļéţé üšéŕ šţöŕý àĝàîñšţ ŕéàļ ƒîļéš, àššéŕţîñĝ öñ ţĥé îñþüţ àñđ öüţþüţ öƒ ţĥé
çöḿḿàñđš ţĥéḿšéļṽéš.
Éṽéŕý îñ-ŕéþö îñṽöçàţîöñ öƒ kapi ţĥàţ îš ñöţ ţĥé đöĝƒööđ ŵöŕķƒļöŵ ḿüšţ îšöļàţé
îţšéļƒ, àñđ ţĥé éñđ-ţö-éñđ šüîţé đöéš: TestMain þîñš à ţĥŕöŵàŵàý çöñƒîĝ, đàţà,
àñđ çàçĥé ĥöḿé, đîšàƃļéš þŕöĵéçţ đîšçöṽéŕý, àñđ ŕéšţŕîçţš þļüĝîñ đîšçöṽéŕý. Ŵîţĥöüţ
ţĥàţ, à šüîţé ŕüñ ƒŕöḿ îñšîđé ţĥé ţŕéé ƃîñđš ţö, àñđ àçţš öñ, ţĥé ŕéþöšîţöŕý'š
öŵñ ŕéçîþé, đîšçöṽéŕéđ ƃý àñ üþŵàŕđ ŵàļķ ƒŕöḿ àñý ŵöŕķîñĝ đîŕéçţöŕý.
Ƒŕöñţéñđ ţéšţš ŕüñ üñđéŕ ţĥé ŵöŕķšþàçé ŕüññéŕ ƒŕöḿ à šîñĝļé ŕööţ îñšţàļļ. Đéšķţöþ ƒŕöñţéñđ þàçķàĝéš çàŕŕý ţĥéîŕ öŵñ üñîţ šüîţéš; ţĥé đéšķţöþ'š Ĝö ƃàçķéñđ îš çöṽéŕéđ ƃý öŕđîñàŕý çöļöçàţéđ Ĝö ţéšţš.
Ƒàçé þàŕîţý ĥöļđš ţĥé ÇĻÎ, ţĥé ḾÇÞ šéŕṽéŕ àñđ ţĥé đéšķţöþ ţö öñé çöḿḿîţţéđ
ŕéçöŕđ öƒ àñšŵéŕš. host/facetest ŵŕîţéš öñé ƒîẋţüŕé ƒŕöḿ öñé đéšçŕîþţîöñ àñđ
éḿƃéđš öñé šéţ öƒ éẋþéçţéđ ŕéþļîéš; éàçĥ ƒàçé'š öŵñ šüîţé ƃüîļđš ţĥé ƒîẋţüŕé,
àšķš îţš öŵñ éñţŕý þöîñţ (ţĥé çöƃŕà ṽéŕƃ, ţĥé ḾÇÞ ţööļ öŕ ŕéšöüŕçé ţĥŕöüĝĥ à
ŕéàļ šéŕṽéŕ šéššîöñ, ţĥé đéšķţöþ ƃàçķéñđ ḿéţĥöđ), àñđ çöḿþàŕéš. make face-parity
ŕüñš ţĥé ţĥŕéé; à ķñöŵñ ĝàþ ƃéţŵééñ ţŵö ƒàçéš îš þîññéđ ƃý à ţéšţ ţĥàţ àššéŕţš
îţ, šö çļöšîñĝ îţ ƒàîļš ţĥé ţéšţ ţĥàţ đéšçŕîƃéš îţ.
Ţĥé çàţàļöĝ öƒ ţéšţ ţàŕĝéţš îš make help; îţ îš šéļƒ-đöçüḿéñţîñĝ àñđ çüŕŕéñţ.
Ŕüñ à šîñĝļé ţéšţ đîŕéçţļý ŵĥéñ îţéŕàţîñĝ: go test ./core/flow/ -run TestExecutorCancellation -v.
Éṽàļš: ţĥŕéé ƃàñđš
Àñ éṽàļ ḿéàšüŕéš šöḿéţĥîñĝ à üñîţ ţéšţ çàññöţ àššéŕţ: ĥöŵ ŵéļļ à ḿöđéļ ţŕàñšļàţéš üñđéŕ kapi'š çöñţéẋţ, ŵĥéţĥéŕ àñ àĝéñţ ŕéàçĥéš ƒöŕ kapi àţ àļļ, ŵĥéţĥéŕ à çöñṽéŕţéŕ ķééþš ţĥé ţéẋţ. Ŵĥàţ îţš ñüḿƃéŕš çàñ ḿéàñ đéþéñđš öñ ŵĥàţ îţ ĥàš üñđéŕ ţéšţ, šö ţĥé éṽàļš àŕé šþļîţ îñţö ţĥŕéé ƃàñđš ƃý šüƃĵéçţ, àñđ ŵîţĥîñ éàçĥ ƃàñđ àñ éṽàļ šîţš ƃéšîđé ţĥé ÀĐ šéŕîéš đéšçŕîƃîñĝ ŵĥàţ îţ ḿéàšüŕéš:
| Ƃàñđ | Šüƃĵéçţ | Ŵĥàţ ţĥé ñüḿƃéŕš çàñ đö |
|---|---|---|
| Éñĝîñé | kapi'š öŵñ çöđé, đéţéŕḿîñîšţîç | ĝàţé à ƃüîļđ |
| Ḿöđéļ | à ḿöđéļ'š öüţþüţ, šàḿþļéđ | ƃé ţŕàçķéđ öṽéŕ ţîḿé |
| Àĝéñţ | àñ àĝéñţ'š ƃéĥàṽîöüŕ, šçöŕéđ þéŕ šçéñàŕîö | ƃé ŕéàđ ŵîţĥ îţš ţŕàñšçŕîþţ, öñ à ḿàîñţàîñéŕ'š ḿàçĥîñé |
Ţĥé éṽàļš ļîṽé üñđéŕ scripts/ àš šḿàļļ Ĝö þŕöĝŕàḿš, öñé đîŕéçţöŕý éàçĥ:
checkeval (ţĥé çöñţéñţ çĥéçķš), conversioneval (çöñṽéŕţéŕ ţéẋţ
çöḿþļéţéñéšš), contexteval (çöñţéẋţ-àđĥéŕéñçé ļîƒţ), batcheval (ţĥé ƃàţçĥ
çéîļîñĝ, Ḿ-05), priorabeval
(ţĥé 郃éçţ öƒ à þŕîöŕ ṽéŕšîöñ), authoringeval (ţĥé ṽöîçé çĥéçķš àñđ ţĥé
ṽöîçé ĝüîđé, ŵîţĥ àñ àüţĥöŕîñĝ ļàƃ ţĥàţ ŕéàđš à ŕéàļ, þîññéđ ŕéþöšîţöŕý àñđ
îñƒéŕš îţš ṽöîçé ƒŕöḿ îţš öŵñ đöçš), àñđ skilleval (ŵĥéţĥéŕ ţĥé Àĝéñţ Šķîļļ
ƒîŕéš àñđ ŵĥéţĥéŕ àñ àĝéñţ þîçķš ţĥé ŕîĝĥţ ḾÇÞ ţööļ,
Š-03). Éàçĥ ĥàš à ḿàķé ţàŕĝéţ öƒ ţĥé
šàḿé ñàḿé (make check-eval, make conversion-eval, make context-eval,
make batch-eval, make authoring-eval, make skill-eval, make mcp-eval),
à -publish ṽàŕîàñţ ŵĥéŕé à ŕüñ çöšţš çàļļš, àñđ à çöḿḿîţţéđ đàţàšéţ üñđéŕ
web/src/pages/<eval>/ ţĥàţ ţĥé šîţé ŕéñđéŕš. make eval-index ŕéƃüîļđš ţĥé
çöṽéŕ þàĝé, àñđ éàçĥ çàŕđ'š ƒŕéšĥñéšš îš ŕéàđ öüţ öƒ îţš đàţàšéţ ŕàţĥéŕ ţĥàñ
ţýþéđ öñ ţĥé çàŕđ.
Ţĥŕéé ŕüļéš ķééþ à þüƃļîšĥéđ ñüḿƃéŕ ĥöñéšţ:
- À šàḿþļéđ éṽàļ îš ŕéþŕöđüçîƃļé. Ţĥé šþéñđîñĝ éṽàļš þîñ ţĥé ţéḿþéŕàţüŕé àţ
0 àñđ ŕéçöŕđ îţ îñ ţĥé đàţàšéţ, àñđ à ţéšţ àššéŕţš ţĥàţ éṽéŕý þŕöṽîđéŕ
àçţüàļļý šéñđš ţĥé ţéḿþéŕàţüŕé îţ ŵàš àšķéđ ƒöŕ. À ĵüđĝéđ šçöŕé îš þüƃļîšĥéđ
öñļý àƒţéŕ ţĥé ĵüđĝé ĥàš ƃééñ ṽàļîđàţéđ àĝàîñšţ ĥüḿàñ ļàƃéļš
(
make judge-label,make context-eval-validate). - Ţĥé ŵĥöļé ţŕàñšçŕîþţ îš þüƃļîšĥéđ, þéŕ þàšš. Àñ àĝéñţ éṽàļ ŕéçöŕđš éṽéŕý
ḿéššàĝé, ţööļ çàļļ àñđ ţööļ ŕéšüļţ öƒ éṽéŕý þàšš üñđéŕ
web/static/skill-eval/transcripts/, ƒéţçĥéđ ŵĥéñ à ŕéàđéŕ öþéñš à ŕöŵ. Ţĥé ŕéçöŕđéŕ šçŕüƃš ŵöŕķšþàçé àñđ ĥöḿé þàţĥš, àñđmake check-eval-publishableŕéƒüšéš à ţŕàñšçŕîþţ çàŕŕýîñĝ à çŕéđéñţîàļ šĥàþé. - Àñ àĝéñţ îš çöñƒîñéđ. Éàçĥ šçéñàŕîö ŕüñš îñ à ţĥŕöŵàŵàý ŵöŕķšþàçé ŵîţĥ ţĥé þŕöĵéçţ'š öŵñ šéţţîñĝš öñļý, šö à ḿàîñţàîñéŕ'š îñšţàļļéđ šķîļļš àñđ šéŕṽéŕš çàññöţ ļéàķ îñţö ţĥé ḿéàšüŕéḿéñţ, àñđ ţĥé šüƃĵéçţ çĥéçķöüţ îš éẋţŕàçţéđ ƒŕéšĥ þéŕ ŕüñ ƃéçàüšé àñ àĝéñţ ḿüţàţéš ţĥé ţŕéé îţ ŕéàđš.
Ñöñé öƒ ţĥé àĝéñţ öŕ ḿöđéļ éṽàļš ŕüñš îñ ÇÎ: ţĥéý đŕîṽé ŕéàļ ḿöđéļš àñđ ŕéàļ àĝéñţš àñđ ñééđ ļöçàļ çŕéđéñţîàļš, šö ţĥé çöḿḿîţţéđ đàţàšéţ îš àļļ à ƃüîļđ éṽéŕ šééš. Ţĥé đàšĥƃöàŕđš àŕé þüƃļîšĥéđ üñđéŕ ţĥé šîţé'š Ţéšţš & Éṽàļš ñàṽîĝàţîöñ.
Çĥéçķ çöṽéŕàĝé àñđ ŵöŕķƒļöŵ éṽîđéñçé
À ŕéçöŕđéđ çĥéçķ ŕéšüļţ ŕéţàîñš ţĥé îñþüţ, 郃éçţîṽé ĝüîđàñçé, šöüŕçé àñđ ƃîñàŕý îđéñţîţý, àñàļýžéŕ çöṽéŕàĝé àñđ ŕàŵ ƒîñđîñĝš. À šçöŕé îš à ŕöļļ-üþ öṽéŕ éḿîţţéđ ƒîñđîñĝš. Àñàļýšîš ţĥàţ đîđ ñöţ éẋéçüţé îš ñöţ îñƒéŕŕéđ ƒŕöḿ à žéŕö-ƒîñđîñĝ ŕéšüļţ. Ḿàļƒöŕḿéđ ḿöđéļ öüţþüţ àñđ ĝöṽéŕñîñĝ-çöñţéẋţ ƒàîļüŕéš ŕéḿàîñ öþéŕàţîöñàļ éŕŕöŕš ŕàţĥéŕ ţĥàñ šüççéššƒüļ éḿþţý ŕéþöŕţš.
Šöüŕçé-öñļý çöñţéñţ îš çĥéçķéđ àš àüţĥöŕéđ çöñţéñţ, îñçļüđîñĝ ŵîţĥîñ þŕöĵéçţš ţĥàţ àļšö ĥàṽé ţŕàñšļàţéđ ţàŕĝéţš. Ñàḿîñĝ à šöüŕçé ƒîļé àñđ šéļéçţîñĝ îţ ţĥŕöüĝĥ ţĥé þŕöĵéçţ üšé ţĥé šàḿé àþþļîçàƃļé çöñţéñţ çĥéçķš. Ţŕàñšļàţîöñ çĥéçķš àþþļý ţö đéçļàŕéđ öŕ éẋþļîçîţļý ŕéǫüéšţéđ ţàŕĝéţ çöñţéñţ. Ŕéļéàšé-ĝàţé éṽîđéñçé ŕéçöŕđš ŵĥàţ ŵàš ḿéàšüŕéđ, îñçļüđîñĝ éḿþţý šçöþéš. Þéŕ-îñþüţ çöñţéẋţ éṽîđéñçé îđéñţîƒîéš ţĥé 郃éçţîṽé ṽöîçé šéļéçţîöñ àñđ þŕöĵéçţ çĥàññéļ, éẋþļîçîţ öṽéŕŕîđéš, àñđ ŵĥéţĥéŕ ţéŕḿš ŵéŕé šüþþļîéđ. Ţĥîš éṽîđéñçé çöḿéš ƒŕöḿ ţĥé ŕéšöļüţîöñ üšéđ ƃý ţĥé çĥéçķéŕ; îţ îš ñöţ ŕéçöñšţŕüçţéđ ƒŕöḿ à šüççéššƒüļ ṽéŕđîçţ.
À ŕüļé đéḿöñšţŕàţîöñ îš đéṽéļöþḿéñţ éṽîđéñçé ƒöŕ ţĥàţ ŕüļé. Ǫüàļîţý éṽàļüàţîöñ üšéš šéþàŕàţé đöçüḿéñţ ƒàḿîļîéš àñđ çļéàñ çöüñţéŕéẋàḿþļéš, ŵîţĥ îñđéþéñđéñţ ļàƃéļš ƒöŕ šéḿàñţîç àñđ ŕéàđéŕ-ƒàçîñĝ ĵüđĝḿéñţš. Ţĥé þŕöđüçţ'š öŵñ çĥéçķéŕ îš ñöţ ţĥé šöļé ĵüđĝé öƒ àñ éẋþéŕîḿéñţ îñţéñđéđ ţö éšţàƃļîšĥ îţš ṽàļüé.
Àĝéñţ çöḿþàŕîšöñš ĥöļđ ţĥé ţàšķ, ḿöđéļ, ŕéļéṽàñţ ĝüîđàñçé àñđ ŕéšöüŕçé ļîḿîţš çöñšţàñţ. Ţĥéý çöüñţéŕƃàļàñçé öŕđéŕ àñđ ŕéţàîñ ƒàîļéđ àñđ çàþþéđ ŕüñš. Ƒéŵéŕ éđîţš öŕ ţööļ çàļļš đö ñöţ éšţàƃļîšĥ ƃéţţéŕ ǫüàļîţý. Ŕéþöŕţš đîšţîñĝüîšĥ çöñšéǫüéñţîàļ éŕŕöŕš, ĥüḿàñ àççéþţàñçé, àçţüàļ ŕéṽîéŵ ţîḿé, ļàţéñçý àñđ çöšţ, ŵîţĥ üñçéŕţàîñţý àñđ éẋþļîçîţ üñḿéàšüŕéđ öüţçöḿéš.
Þàîŕéđ àĝéñţ šţüđîéš çöḿþàŕé öŕđîñàŕý ƒîļé ţööļš, ţĥé šĥîþþéđ šķîļļ ŵîţĥ ÇĻÎ àççéšš, àñđ ḾÇÞ àççéšš ŵîţĥöüţ ţĥé šķîļļ öŕ đîŕéçţ ÇĻÎ éẋéçüţîöñ. Éàçĥ àĝéñţ ĥöšţ ŕüñš ţĥé šàḿé çöñţéñţ ţàšķš îñ àļļ çöñđîţîöñš. Ḿöđéļ îđéñţîţý àñđ 郃öŕţ àŕé ƒîẋéđ ŵîţĥîñ à çöḿþàŕîšöñ; ŕéšüļţš ƒŕöḿ đéŕéñţ ḿöđéļš ŕéḿàîñ šéþàŕàţé. Ţĥé šöüŕçé ĝüîđàñçé îš éǫüàļļý àṽàîļàƃļé, àñđ îñđéþéñđéñţ ṽàļîđàţöŕš îñšþéçţ ţĥé öüţþüţ àŕţîƒàçţš. Šéḿàñţîç àççéþţàñçé àñđ ŕéṽîéŵéŕ ţîḿé ŕéǫüîŕé ĥüḿàñ éṽîđéñçé àñđ ŕéḿàîñ üñḿéàšüŕéđ üñţîļ ţĥàţ ŕéṽîéŵ öççüŕš.
Ţĥé þàîŕéđ ŕüññéŕ þŕéþàŕéš ŵöŕķšþàçéš ŵîţĥöüţ ḿöđéļ çàļļš. Ļîṽé éẋéçüţîöñ üšéš àñ éẋþļîçîţ šéššîöñ àļļöŵàñçé, ŵîţĥ šţàŕţéđ àñđ ƒàîļéđ àţţéḿþţš ŕéţàîñéđ àçŕöšš ŕéšüḿéš. Šüƃšçŕîþţîöñ üšàĝé îš ŕéþöŕţéđ šéþàŕàţéļý ƒŕöḿ ÀÞÎ-éǫüîṽàļéñţ çöšţ. Ŕàŵ šţüđý ŕéçöŕđš ŕéḿàîñ ļöçàļ þéñđîñĝ ŕéṽîéŵ ƒöŕ þüƃļîçàţîöñ. Þîļöţ đöçüḿéñţš šüþþöŕţ ĥàŕñéšš đéṽéļöþḿéñţ; šçöŕéđ éṽàļüàţîöñš üšé šéþàŕàţé đöçüḿéñţ ƒàḿîļîéš.
ḾÇÞ þŕéþàŕàţîöñ ŕéçöŕđš šéŕṽéŕ çàþàƃîļîţîéš ţĥŕöüĝĥ þŕöţöçöļ đîšçöṽéŕý. Šéŕṽéŕ ŕéàđîñéšš, ĥöšţ éẋþöšüŕé àñđ öƃšéŕṽéđ àĝéñţ üšé àŕé šéþàŕàţé éṽîđéñçé: à ŕéàđý šéŕṽéŕ àļöñé éšţàƃļîšĥéš ñéîţĥéŕ öƒ ţĥé ļàţţéŕ ţŵö.
Àššîĝñéđ çöñđîţîöñš ŕéţàîñ àţţéḿþţš ţĥàţ ñéṽéŕ üšé ţĥé îñţéĝŕàţîöñ. Öƃšéŕṽéđ üšé àñđ ŕéšöļṽéđ çĥéçķ šçöþé àŕé ŕéþöŕţéđ àļöñĝšîđé àŕţîƒàçţ ṽàļîđîţý, šö çöḿþļéţîöñ àļöñé çàññöţ šţàñđ ƒöŕ šüççéššƒüļ çöñţéẋţ ŕéţŕîéṽàļ öŕ çĥéçķîñĝ.
Éẋþļîçîţļý îñšţŕüçţéđ đîàĝñöšţîçš ţéšţ ĥöšţ éẋþöšüŕé àñđ éẋéçüţîöñ šéþàŕàţéļý ƒŕöḿ ñàţüŕàļ đîšçöṽéŕý. Ţĥéý šĥàŕé ţĥé þéŕšîšţéñţ šéššîöñ àļļöŵàñçé ŵîţĥ öŕđîñàŕý ţàšķš àñđ ŕéţàîñ ţĥéîŕ öŵñ þĥàšé îñ šàṽéđ ŕéþöŕţš.
Šéé Þàîŕéđ àĝéñţ éṽàļüàţîöñ ƒöŕ ţĥé ḿàñîƒéšţ, éẋéçüţîöñ šţàĝéš àñđ éṽîđéñçé ŕéçöŕđš.
Þéŕƒöŕḿàñçé ḿéàšüŕéḿéñţš đîšţîñĝüîšĥ ƒŕéšĥ-þŕöçéšš ÇĻÎ ŵöŕķ ƒŕöḿ þéŕšîšţéñţ šéššîöñš àñđ çöļđ îñîţîàļîžàţîöñ ƒŕöḿ ŵàŕḿ öþéŕàţîöñ. Ŕàŵ šàḿþļéš šţàţé ţĥéîŕ ĥàŕđŵàŕé, çöŕþüš, çàçĥé çöñđîţîöñš àñđ þĥàšé ƃöüñđàŕîéš. Ĥöšţ ţîḿîñĝš éẋçļüđé þŕöçéšš šţàŕţüþ àñđ éñçöđîñĝ üñļéšš éẋþļîçîţļý ḿéàšüŕéđ. À ƒŕéšĥ þŕöçéšš đöéš ñöţ îḿþļý à çöļđ öþéŕàţîñĝ-šýšţéḿ þàĝé çàçĥé.
Îļļüšţŕàţîöñš àñđ ŕéçöŕđéđ þļàýƃàçķ àŕé ļàƃéļéđ ŵĥéŕé ţĥé ŕéàđéŕ šééš ţĥéḿ. Þŕéþàŕéđ ŕéþàîŕš àŕé đîšçļöšéđ îñ đéḿö šçŕîþţš àñđ ñàŕŕàţîöñ. À šçŕîþţ îš àñ îñšţŕüçţîöñ ƒöŕ à ƒüţüŕé çàþţüŕé; îţ îš ñöţ éṽîđéñçé ţĥàţ ţĥé çàþţüŕé éẋîšţš.
Ţĥé đöçüḿéñţàţîöñ šîţé
Ţĥé šîţé àţ web/ üšéš Đöçüšàüŕüš 3 ŵîţĥ Ŕéàçţ 19:
web/
├── docusaurus.config.ts # site configuration (single docs instance at "/")
├── sidebars.ts # docs sidebar
├── src/pages/ # custom React pages (landing, dashboards)
├── docs/ # all documentation, served at "/"
│ ├── kapi/ # CLI + desktop + get-started + guides + walkthrough MDX
│ ├── framework/ # concepts: content model, flows, formats, segmentation
│ ├── react/ # the i18n runtime for React
│ ├── toolbox/ # format-aware command-line utilities
│ ├── reference/ # generated command / format / tool reference
│ └── contribute/
│ ├── architecture/ # architecture decisions (this document)
│ └── implementation/ # schemas, protocols, algorithms
├── i18n/<locale>/ # translated docs, a build artefact the loop writes
├── walkthroughs/ # authored prompts: {id}.md + {id}.scene.yaml
├── scenes/ # per-walkthrough embed fixtures, seeded in-browser
└── static/
├── img/ # local images (logos, favicons)
└── data/ # generated dashboard datasets
À šîñĝļé çöñţéñţ-đöçš îñšţàñçé šéŕṽéš éṽéŕýţĥîñĝ ƒŕöḿ web/docs/ ŵîţĥ
routeBasePath: "/". Àüđîéñçé šéþàŕàţîöñ îš ƃý ţöþ-ļéṽéļ šéçţîöñ ŕàţĥéŕ ţĥàñ ƃý
šéþàŕàţé þļüĝîñ îñšţàñçéš: üšéŕ-ƒàçîñĝ đöçš üñđéŕ kapi/, framework/, react/,
toolbox/, àñđ reference/; çöñţŕîƃüţöŕ đöçš üñđéŕ contribute/architecture/ àñđ
contribute/implementation/.
Ţĥé šîţé îš îţšéļƒ à kapi þŕöĵéçţ. Ţĥé đöĝƒööđ ŕéçîþé ŕéàđš web/docs/ àš à
çöļļéçţîöñ àñđ ŵŕîţéš éàçĥ ţàŕĝéţ ļöçàļé üñđéŕ web/i18n/<locale>/, ŵĥîçĥ îš
ĝîţîĝñöŕéđ àñđ ŕéĝéñéŕàţéđ ƃý ţĥé ļööþ, ñéṽéŕ éđîţéđ ƃý ĥàñđ. Éṽéŕý þàĝé,
ţĥé šîđéƃàŕ ļàƃéļš, ţĥé Ŕéàçţ þàĝéš àñđ ţĥé šîţé çĥŕöḿé àŕé öƒƒéŕéđ îñ ţĥé
þšéüđö ļöçàļé (qps), šö à šţŕîñĝ ţĥàţ éšçàþéđ éẋţŕàçţîöñ îš ṽîšîƃļé àš þļàîñ
Éñĝļîšĥ öñ à þàĝé ŵĥéŕé éṽéŕýţĥîñĝ éļšé îš ḿàŕķéđ. À ļàñĝüàĝé šŵîţçĥéŕ öƒƒéŕš
ţĥé ļöçàļéš ţĥé šîţé ƃüîļđš. Ţĥé šöüŕçé ļöçàļé ƃüîļđš šţŕîçţļý (à ƃŕöķéñ ļîñķ
ƒàîļš ţĥé ƃüîļđ); à ţàŕĝéţ ļöçàļé ŵàŕñš, ƃéçàüšé à ţŕàñšļàţîöñ ţĥàţ ĥàš ñöţ
çàüĝĥţ üþ îš þéñđîñĝ ŵöŕķ ŕàţĥéŕ ţĥàñ à đéƒéçţ.
Àŕçĥîţéçţüŕé đéçîšîöñš àŕé öŕĝàñîžéđ ƃý çöñçéŕñ àñđ üþđàţéđ îñ þļàçé àš šüƃšýšţéḿš éṽöļṽé, ŕàţĥéŕ ţĥàñ àþþéñđéđ çĥŕöñöļöĝîçàļļý. Éàçĥ öñé đéšçŕîƃéš ţĥé çüŕŕéñţ šţàţé öƒ îţš šüƃšýšţéḿ; ţĥé ĥîšţöŕý ļîṽéš îñ ṽéŕšîöñ çöñţŕöļ. Îḿþļéḿéñţàţîöñ ñöţéš ĥöļđ ţàçţîçàļ đéţàîļ (šçĥéḿàš, àļĝöŕîţĥḿš, ŕöüţéš) ţĥàţ ŵöüļđ öţĥéŕŵîšé ƃļöàţ à đéçîšîöñ đöçüḿéñţ.
Þŕöđüçţîöñ îš ĥöšţéđ öñ ĜîţĤüƃ Þàĝéš, đéþļöýéđ öñ þüšĥ ţö ţĥé ḿàîñ ƃŕàñçĥ. Ļàŕĝé
àššéţš (ṽîđéöš, šçŕééñšĥöţš, ḾĻ ḿöđéļš, ţĥé ŴéƃÀššéḿƃļý éñĝîñé) àŕé šéŕṽéđ ƒŕöḿ
à ÇĐÑ ŕàţĥéŕ ţĥàñ çöḿḿîţţéđ, šö static/video/ àñđ static/wasm/ àŕé ƃüîļđ
öüţþüţš àñđ àŕé ñöţ îñ ṽéŕšîöñ çöñţŕöļ. Ţĥàţ îš à đéļîṽéŕý đéţàîļ đéļîƃéŕàţéļý
ļéƒţ öüţ öƒ ţĥîš đéçîšîöñ; šéé
ÇĐÑ àššéţš.
Ţĥé ŵàļķţĥŕöüĝĥ þîþéļîñé
Đéḿö àššéţš ƒöŕ ţĥé šîţé çöḿé ƒŕöḿ öñé àüţĥöŕéđ üñîţ çöḿþîļéđ îñţö ţŵö àŕţîƒàçţš:
-
Ţĥé ŵàļķţĥŕöüĝĥ þŕöḿþţ îš ŵĥàţ à ĥüḿàñ ŵŕîţéš. Éàçĥ ļîṽéš àţ
web/walkthroughs/{id}.mdŵîţĥ ÝÀḾĻ ƒŕöñţḿàţţéŕ đéçļàŕîñĝ àñ öŕđéŕéđ šçéñé ļîšţ, éàçĥ šçéñé çàŕŕýîñĝ àñ îđ, à ķîñđ, à ƃîñàŕý, ƒîẋţüŕéš, àñđ àsmoke_contractöƒ çöḿḿàñđš ţö ŕé-ŕüñ ƒöŕ ŕéĝŕéššîöñ. Ţĥé þŕöšé šéçţîöñš àŕé ţĥé šöüŕçé öƒ ţŕüţĥ ƒöŕ éṽéŕýţĥîñĝ ţĥé þüƃļîšĥéđ þàĝé šàýš. -
Ţĥé îñţéŕàçţîṽé éḿƃéđ îš ĝéñéŕàţéđ ƒŕöḿ ţĥé çöḿþàñîöñ
web/walkthroughs/{id}.scene.yaml.scripts/walkthrough-gen/gen.tsçöḿþîļéš éàçĥ šçéñé îñţö à þļàýĝŕöüñđ éḿƃéđ çöñƒîĝ, ķééþš ţĥé þŕöḿþţ'šsmoke_contractîñ šýñç, àñđ ŵŕîţéš àñý ƒîẋţüŕé ƃýţéš ţĥé éḿƃéđ šééđš îñ ţĥé ƃŕöŵšéŕ üñđéŕweb/scenes/{id}/. Ţĥé ĝéñéŕàţöŕ îš đéţéŕḿîñîšţîç: îţ ƒöŕḿàţš îţš öüţþüţ ŵîţĥ ţĥé ŵöŕķšþàçé ƒöŕḿàţţéŕ àñđ ŵŕîţéš ñö ţîḿéšţàḿþš, šö ŕé-ŕüñš àŕé îđéḿþöţéñţ:node --experimental-strip-types scripts/walkthrough-gen/gen.ts <id> # one walkthroughnode --experimental-strip-types scripts/walkthrough-gen/gen.ts --all # all of themnode --experimental-strip-types scripts/walkthrough-gen/gen.ts --check # fail if any output is staleŢĥé éḿƃéđš àŕé çöḿḿîţţéđ, šö ţĥé šîţé ƃüîļđš šţŕàîĝĥţ ƒŕöḿ ţĥéḿ; ŕéĝéñéŕàţé öñļý ŵĥéñ à
.scene.yamlçĥàñĝéš. Ţĥéŕé îš ñö ḿàķé ţàŕĝéţ öŕ ÇÎ šţéþ ţĥàţ îñṽöķéš ţĥé ĝéñéŕàţöŕ; îţ îš ŕüñ ƃý ĥàñđ. Ţĥé éḿƃéđš ŕéñđéŕ ļîṽé îñ ţĥé ƃŕöŵšéŕ àĝàîñšţ ţĥé ÇĻÎ çöḿþîļéđ ţö ŴéƃÀššéḿƃļý (make web-wasm-cli). -
Ţĥé þüƃļîšĥéđ þàĝé îñţéŕļéàṽéš ţĥé þŕöḿþţ'š þŕöšé îñţö ţĥé ḾĐẊ üñđéŕ
web/docs/kapi/, éḿƃéđđîñĝ ţĥé þļàýĝŕöüñđ àš ţĥé þŕîḿàŕý àŕţîƒàçţ àñđ, ŵĥéŕé à ñàŕŕàţéđ éẋþļàîñéŕ éẋîšţš, à ţĥéḿéđ ṽîđéö:import { ThemedVideo } from "@neokapi/docs-shared";<ThemedVideosources={{light: "/video/kapi/bilingual-workflow-light.webm",dark: "/video/kapi/bilingual-workflow-dark.webm",}}maxWidth="900px"/>ThemedVideoḿàţçĥéš ţĥé àçţîṽé çöļöüŕ šçĥéḿé; ţĥé ĥàŕñéšš šüþþļîéš ḿàţçĥéđ ļîĝĥţ àñđ đàŕķ ŴéƃḾ ƒîļéš, þŕéƒéŕŕéđ ƒöŕ šîžé àñđ ǫüàļîţý.
Ţĥé šîţé ĝéñéŕàţéš ñö šçŕééñšĥöţš öƒ îţš öŵñ: web/static/img/ çàŕŕîéš ļöĝöš àñđ
ƒàṽîçöñš þļüš ŵĥàţéṽéŕ îḿàĝé šéţ îš šţàĝéđ ƒŕöḿ ţĥé àššéţš ƃüñđļé.
Ŕéàļ šýšţéḿš
Đéḿö àššéţš ŕüñ àĝàîñšţ ŕéàļ îñƒŕàšţŕüçţüŕé. Ţĥé éḿƃéđš éẋéçüţé ţĥé ŕéàļ ÇĻÎ çöḿþîļéđ ţö ŴéƃÀššéḿƃļý àĝàîñšţ ƒîẋţüŕéš üñđéŕ ţĥé šçéñé đîŕéçţöŕý; ñö çöḿḿàñđ îš ḿöçķéđ. Ĥàŕñéšš ŕéçöŕđîñĝš đŕîṽé ŕéàļ ƃîñàŕîéš, à ŕéàļ îđéñţîţý þŕöṽîđéŕ, àñđ à ŕéàļ đàţàƃàšé àþþŕöþŕîàţé ţö ţĥé šüŕƒàçé: ŠǪĻîţé ƒöŕ ļöçàļ šţöŕéš àñđ ÞöšţĝŕéŠǪĻ ƒöŕ šéŕṽéŕ-ƃàçķéđ ŵöŕķƒļöŵš. Ţĥîŕđ-þàŕţý šéŕṽîçéš öüţšîđé ţĥîš þŕöĵéçţ (ţŕàñšļàţîöñ þŕöṽîđéŕš, éẋţéŕñàļ ḿöđéļ ÀÞΚ) ḿàý ƃé ḿöçķéđ ƒöŕ îšöļàţîöñ, àñđ ñöţĥîñĝ éļšé ḿàý.
Ţĥé smoke_contract îñ éàçĥ þŕöḿþţ îš ŕé-ŕüñ ƃý make docs-verify-snippets,
đŕîṽîñĝ ţĥé ŴéƃÀššéḿƃļý ÇĻÎ, ţö þŕöṽé ţĥé đöçüḿéñţéđ çöḿḿàñđš šţîļļ þàšš. À
ƃéĥàṽîöŕ çĥàñĝé ţĥàţ ƃŕéàķš à đöçüḿéñţéđ çöḿḿàñđ ƒàîļš ţĥé çöñţŕàçţ.
Àššéţ ĝéñéŕàţîöñ àñđ šţàĝîñĝ
Ṽîđéöš, šçŕééñšĥöţš, àñđ ḾĻ ḿöđéļš àŕé þŕöđüçéđ öñ à đéṽéļöþéŕ ḿàçĥîñé, ñöţ îñ ÇÎ, àñđ þüƃļîšĥéđ ţö ţĥé ÇĐÑ; ţĥé šîţé ŕéƒéŕéñçéš ţĥéḿ ƃý ÜŔĻ:
make harness-videos # render the narrated explainers (light + dark)
make harness-videos-staged # full pass: stack up → seed → record → narrate → package
make publish-cdn-videos # publish the videos → CDN
make publish-cdn-all # publish videos + images + models → CDN
make web-wasm-cli # build the in-browser CLI → web/static/wasm/
ÇÎ đöéš ñöţ ŕéçöŕđ, ŕéñđéŕ, öŕ šţàĝé. Ţĥé šîţé ƃüîļđš ŵîţĥ ţĥé ÇĐÑ ÜŔĻ šéţ àñđ ŕéƒéŕéñçéš ţĥé àššéţš ţĥéŕé; ţĥé ŴéƃÀššéḿƃļý þļàýĝŕöüñđ îš ƃüîļţ îñ ÇÎ àñđ þüƃļîšĥéđ ţö ţĥé ÇĐÑ ƃý çöḿḿîţ. Šöḿéöñé éđîţîñĝ öñļý đöçüḿéñţàţîöñ ţéẋţ ŕéļîéš öñ ţĥé ļîṽé ÇĐÑ àššéţš, àñđ çàñ šţàĝé àššéţš šàḿé-öŕîĝîñ öñ đéḿàñđ ţö þŕéṽîéŵ ŵîţĥöüţ ţĥé ÇĐÑ.
Ṽéŕîƒîçàţîöñ çĥéçķļîšţ ƒöŕ šüŕƒàçé çĥàñĝéš
Ƃéƒöŕé çöḿḿîţţîñĝ à çĥàñĝé ţĥàţ àƒƒéçţš đöçüḿéñţéđ ƃéĥàṽîöŕ:
- Ļîñţ, ƒöŕḿàţ, àñđ ţýþéçĥéçķ þàšš àçŕöšš ţĥé ƒŕöñţéñđ.
- Ƒŕöñţéñđ üñîţ ţéšţš þàšš.
- Þŕöđüçţîöñ ƃüîļđš šüççééđ.
- Ţĥé Ĝö ƃüîļđ šüççééđš.
- Àƒƒéçţéđ
smoke_contractš šţîļļ þàšš üñđéŕmake docs-verify-snippets. - Àƒƒéçţéđ éḿƃéđš àŕé ŕéĝéñéŕàţéđ, àñđ ŵĥéŕé à đéḿö ṽîđéö çĥàñĝéđ, îţ îš ŕé-ŕéñđéŕéđ àñđ ŕéþüƃļîšĥéđ.
- Ţĥé þŕöšé þàššéš
make check-docs-prose, ŵĥîçĥ ŕüñškapi checköṽéŕ ţĥé đöçüḿéñţàţîöñ üñđéŕ ţĥé þŕöĵéçţ'š öŵñ ṽöîçé þŕöƒîļé. - Éṽéŕý šîđéƃàŕ îđ ŕéšöļṽéš ţö à þàĝé (
scripts/check-sidebar-ids.sh), àñđ ţĥé đéšķţöþ'š ĝéñéŕàţéđ ƃîñđîñĝš àŕé ƒŕéšĥ ŵĥéñ à ƃöüñđ Ĝö ţýþé çĥàñĝéđ (scripts/check-wails-bindings.mjs). - Ţĥé ţĥŕéé ƒàçéš šţîļļ àĝŕéé (
make face-parity), àñđ ţĥé đéšķţöþ ñàḿéš ñö îñţéŕçĥàñĝé ƒöŕḿàţ (scripts/check-desktop-interchange.sh). - Ţĥé ĴŠẊ ţŕàñšļàţàƃîļîţý ţàƃļé àñđ îţš Ĝö ḿîŕŕöŕ àĝŕéé
(
make check-translatability).
Çöñšéǫüéñçéš
- Đöçüḿéñţàţîöñ ļîṽéš àļöñĝšîđé çöđé, šö îţ ḿöṽéš ŵîţĥ ţĥé ƒéàţüŕé.
- Ţŵö-àüđîéñçé šéþàŕàţîöñ ĝîṽéš çļéàŕ ñàṽîĝàţîöñ ŵîţĥöüţ à šéçöñđ šîţé.
- Àŕçĥîţéçţüŕé đéçîšîöñš àñđ îḿþļéḿéñţàţîöñ ñöţéš àŕé ŕéàđàƃļé ƃöţĥ îñ-ŕéþö àñđ öñ ţĥé þüƃļîšĥéđ šîţé.
- Đéḿö àššéţš àŕé ĝéñéŕàţéđ ƒŕöḿ àçţüàļ çöḿḿàñđš àñđ îñţéŕƒàçéš, šö ţĥéý çàññöţ ǫüîéţļý đéšçŕîƃé à ṽéŕšîöñ ţĥàţ ñö ļöñĝéŕ éẋîšţš.
- Öñé àüţĥöŕéđ ŵàļķţĥŕöüĝĥ þŕöḿþţ đŕîṽéš ƃöţĥ ţĥé ĝéñéŕàţéđ éḿƃéđ àñđ ţĥé þüƃļîšĥéđ þàĝé, šö à đöçüḿéñţéđ çöḿḿàñđ àñđ îţš îñ-ƃŕöŵšéŕ þļàýĝŕöüñđ šţàý îñ ļöçķ-šţéþ.
- Ŕéçöŕđîñĝ àĝàîñšţ ŕéàļ šýšţéḿš ḿéàñš à ƃŕéàķîñĝ çĥàñĝé îñ îđéñţîţý öŕ àñ ÀÞÎ šüŕƒàçéš àš à ŕéçöŕđîñĝ ƒàîļüŕé, à üšéƒüļ çàñàŕý ƒöŕ îñţéĝŕàţîöñ ŕéĝŕéššîöñš.
- Ţĥé þýŕàḿîđ ƃüýš çöṽéŕàĝé àţ éṽéŕý ļéṽéļ ŵîţĥ ţĥé àþþŕöþŕîàţé šþééđ àñđ çöšţ ţŕàđé-öƒƒ, àñđ ţĥé ƃüîļđ-ţàĝĝéđ éñđ-ţö-éñđ šüîţé šţàýš öüţ öƒ ţĥé öŕđîñàŕý ţéšţ ŕüñ.
- Àñ éṽàļ'š ƃàñđ šàýš ŵĥàţ îţš ñüḿƃéŕ çàñ ƃé üšéđ ƒöŕ, àñđ à þüƃļîšĥéđ ñüḿƃéŕ çàŕŕîéš ţĥé ţéḿþéŕàţüŕé îţ ŕàñ àţ àñđ ţĥé ţŕàñšçŕîþţ ƃéĥîñđ îţ.
- Ţĥé šîţé ţŕàñšļàţéš îţšéļƒ ţĥŕöüĝĥ ţĥé šàḿé ļööþ îţ đöçüḿéñţš, šö à ĝàþ îñ éẋţŕàçţîöñ šĥöŵš öñ ţĥé þàĝé ƃéƒöŕé à üšéŕ ŕéþöŕţš îţ.
- Öñé đöçüḿéñţàţîöñ šţàçķ šĥàŕéđ àçŕöšš ţĥé ļîƃŕàŕý, ÇĻÎ, àñđ đéšķţöþ ķééþš ţĥé đöçüḿéñţàţîöñ šîñĝļé-šöüŕçéđ àñđ àṽöîđš đüþļîçàţéđ îñƒŕàšţŕüçţüŕé.
Šéé àļšö
- Ƒ-01: Ţĥé ƒŕàḿéŵöŕķ àñđ îţš ḿöđüļéš: ţĥé ḿöđüļé ļàýöüţ ţĥé îšöļàţéđ ƃüîļđš àššéŕţ
- À-02: Þàŕîţý ŵîţĥ ţĥé Okapi Ƒŕàḿéŵöŕķ: ţĥé ƒîđéļîţý ĥàŕñéšš àƃöṽé ţĥé þýŕàḿîđ
- Ḿ-05: Þŕöḿþţš àñđ ƃàţçĥîñĝ: ţĥé ƃàţçĥ éṽàļ àñđ îţš ķéþţ ŕéçöŕđ
- Š-01: Ţĥé kapi ÇĻÎ: ţĥé šüŕƒàçé ţĥé éḿƃéđš ŕüñ
- Š-02: Kapi Đéšķţöþ: ţĥé đéšķţöþ šüŕƒàçé àñđ îţš ţéšţš
- Š-03: Àĝéñţ šüŕƒàçéš: ţĥé šķîļļ àñđ ḾÇÞ éṽàļš îñ ţĥé àĝéñţ ƃàñđ
- Ţéšţîñĝ ĝüîđé: ĥöŵ ţö ŵŕîţé ţéšţš ƒöŕ à ñéŵ ƒöŕḿàţ öŕ ţööļ
- ÇĐÑ àššéţš: ŵĥéŕé ţĥé ĝéñéŕàţéđ àššéţš ļîṽé