Ç-03: Ţĥé çöñţéẋţ šţöŕé àñđ ĝŕàþĥ
Šüḿḿàŕý
À þŕöĵéçţ ķééþš ţŵö đàţàƃàšéš, šþļîţ ƃý ŵĥàţ þŕöđüçéš ţĥé ŕöŵš.
Ţĥé þŕöĵéçţîöñ šţàýš îñ ţĥé çĥéçķöüţ, àţ .kapi/work/store.db: ţĥé ƃļöçķ
çàçĥé, ţĥé öṽéŕļàýš à ƒļöŵ ŵŕöţé, ţĥé éẋţŕàçţîöñ šţàḿþš. Éṽéŕýţĥîñĝ îñ îţ îš
đéŕîṽéđ ƒŕöḿ ţĥé ŵöŕķîñĝ ţŕéé ƃý ļöñĝ ţŕàñšàçţîöñš ţĥàţ ŕéŵŕîţé ļàŕĝé þàŕţš öƒ
îţ, šö îţ ƃéļöñĝš ƃéšîđé ţĥé ţŕéé îţ đéšçŕîƃéš àñđ à šéçöñđ çĥéçķöüţ öƒ ţĥé šàḿé
þŕöĵéçţ ķééþš öñé öƒ îţš öŵñ.
Ţĥé çöñţéẋţ šţöŕé ļîṽéš îñ à ŵöŕķšþàçé, öüţšîđé éṽéŕý çĥéçķöüţ: ţĥé
ţéŕḿš, ţĥé ṽöîçé þŕöƒîļéš, ţĥé çöñţéñţ ḿéḿöŕý, ţĥé đéçîšîöñ ļéđĝéŕ àñđ ţĥé
đöçüḿéñţ àđöþţîöñš (Ç-04), ţĥé ƃļöçķ
ĥîšţöŕý öƒ éṽéŕý ŕéçöŕđéđ éđîţ, àñđ ţĥé þŕöĵéçţ'š šéţţîñĝš: ţéàḿ
çĥöîçéš àƃöüţ ţĥé þŕöĵéçţ ţĥàţ àŕé ñéîţĥéŕ çöñţéñţ ñöŕ ĝöṽéŕñàñçé, šüçĥ àš ţĥé
šàṽéđ ƒîļţéŕš à ţéàḿ šĥàŕéš (projectdb.DB.Setting). Îţ îš àüţĥöŕéđ ŕàţĥéŕ ţĥàñ đéŕîṽéđ,
ŵŕîţţéñ à ļîţţļé àţ à ţîḿé, àñđ ţŕüé ŵĥéŕéṽéŕ ţĥé þŕöĵéçţ îš çĥéçķéđ öüţ. Ţŵö
çĥéçķöüţš öƒ öñé þŕöĵéçţ, à šéçöñđ çļöñé àñđ à ĝîţ ŵöŕķţŕéé, šĥàŕé îţ, àñđ éàçĥ
ķééþš îţš öŵñ ṽîéŵ öƒ ţĥé öñé ļéđĝéŕ.
Ţĥé ŵöŕķšþàçé àļšö ĥöļđš ŵĥàţ šþàñš þŕöĵéçţš: ţĥé þŕöĵéçţ ŕéĝîšţŕý, ţĥé çöñţéẋţ ĝŕàþĥ, ŵĥöšé ñöđé îđš àļŕéàđý çàŕŕý ţĥé þŕöĵéçţ ţĥéý ƃéļöñĝ ţö, àñđ ţĥé öþéŕàţîöñ ļöĝ.
Éṽéŕý çĥàñĝé ţö à þŕöĵéçţ'š ţéŕḿš, ṽöîçé þŕöƒîļéš, çöñţéñţ ḿéḿöŕý àñđ đéçîšîöñ
ļéđĝéŕ, éṽéŕý đöçüḿéñţ àđöþţîöñ àñđ éṽéŕý ŕéçöŕđéđ éđîţ, àñđ éṽéŕý çĥàñĝé ţö ţĥé
ŕüļéš ŵîđéñéđ ţö ţĥé ŵĥöļé ŵöŕķšþàçé, îš àñ öþéŕàţîöñ îñ ţĥàţ ļöĝ çàŕŕýîñĝ ţĥé
ŕöŵš îţ ŵŕöţé. Ţĥöšé šţöŕéš àŕé þŕöĵéçţîöñš öƒ ţĥé ļöĝ:
core/projector îš ţĥéîŕ öñļý ŵŕîţéŕ, àñđ kapi store rebuild éḿþţîéš ţĥéḿ
àñđ ŕéþļàýš ţĥé ļöĝ îñţö ţĥé šàḿé ŕöŵš, šţàŕţîñĝ ƒŕöḿ ţĥé ļàţéšţ çĥéçķþöîñţ.
À ǫüéšţîöñ ţĥàţ ŕéàçĥéš àçŕöšš ţĥé ţŵö ƒîļéš îš öñé ǫüéŕý. projectdb.DB.Join
öþéñš ţĥé çöñţéẋţ šţöŕé ƃéšîđé ţĥé þŕöĵéçţîöñ öñ öñé ŕéàđ-öñļý çöññéçţîöñ, šö
ŵĥîçĥ ƃļöçķš üšé ţĥîš ţéŕḿ, îñ ŵĥîçĥ çöļļéçţîöñ, àţ ŵĥîçĥ çööŕđîñàţé, àñđ ŵĥîçĥ
öƒ ţĥéḿ àŕé éšţàƃļîšĥéđ? îš àñšŵéŕéđ îñ öñé þàšš.
Çöñţéẋţ
Çöñţéẋţ îš ŕéļàţîöñàļ. À ţéŕḿ öççüŕš îñ ƃļöçķš; ƃļöçķš ƃéļöñĝ ţö çöļļéçţîöñš àñđ šîţ àţ à þöîñţ îñ ţĥé çöñţéẋţ šþàçé (Ç-02); à đéçîšîöñ àþþŕöṽéš à ƃļöçķ'š ţŕàñšļàţîöñ àţ à ŕéṽîšîöñ; à ḿéḿöŕý éñţŕý ŕéçýçļéš îñţö à ƃļöçķ. Ŕéţŕîéṽàļ (Ç-06) àñđ ĝöṽéŕñàñçé (Ç-02) ƃöţĥ ţŕàṽéŕšé ţĥöšé ŕéļàţîöñš ŕàţĥéŕ ţĥàñ ŕéàđîñĝ öñé šţöŕé îñ îšöļàţîöñ.
Àüţĥöŕéđ çöñţéẋţ ḿüšţ šüŕṽîṽé çĥéçķöüţ đéļéţîöñ àñđ ŕéḿàîñ àṽàîļàƃļé àçŕöšš çļöñéš àñđ ŵöŕķţŕééš. Þàŕšéđ ƃļöçķš, öṽéŕļàýš àñđ éẋţŕàçţîöñ šţàḿþš ƃéļöñĝ ţö à šþéçîƒîç ŵöŕķîñĝ ţŕéé àñđ çàñ ƃé ŕéƃüîļţ. Šéþàŕàţé đàţàƃàšéš ĝîṽé ţĥéšé đàţà šéţš îñđéþéñđéñţ ļîƒéţîḿéš àñđ ŵŕîţé ļöçķš.
Ƃöţĥ ļöçàļ àñđ ĥöšţéđ šţöŕàĝé šüþþöŕţ ǫüéŕîéš àçŕöšš çöñţéẋţ ŕéļàţîöñšĥîþš. Ţĥé ļöçàļ îḿþļéḿéñţàţîöñ þŕöṽîđéš ţĥéšé çàþàƃîļîţîéš ŵîţĥöüţ à šéŕṽéŕ.
Đéçîšîöñ
Ţĥé ŵöŕķšþàçé
Éṽéŕý ḿàçĥîñé àççöüñţ ĥàš öñé îḿþļîçîţ đéƒàüļţ ŵöŕķšþàçé, çŕéàţéđ öñ ƒîŕšţ
üšé üñđéŕ ţĥé đàţà ŕööţ (ĥöšţ.ĐàţàĐîŕ) àţ
<DataDir>/workspaces/default/. À ŕéçîþé çàŕŕîéš ñö ƃîñđîñĝ ţö îţ. À þŕöĵéçţ îš
ķéýéđ ƃý project.KapiProject.Identity(): ţĥé šţàƃļé id: ţĥé ŕéçîþé çàŕŕîéš,
öŕ îţš name: ŵĥéŕé îţ çàŕŕîéš ñöñé.
Çöñšéǫüéñçéš öƒ ţĥàţ ķéý, ƃöţĥ îñţéñđéđ:
- Ţŵö çĥéçķöüţš öƒ à þŕöĵéçţ ŵîţĥ àñ
id:ŕéàçĥ öñé çöñţéẋţ šţöŕé, ŵĥéŕéṽéŕ ţĥéý šîţ àñđ ŵĥàţéṽéŕ ţĥéý àŕé çàļļéđ öñ đîšķ. - Ţŵö üñŕéļàţéđ þŕöĵéçţš ŵîţĥ ñö
id:àñđ ţĥé šàḿéname:ŵöüļđ ŕéàçĥ öñé šţöŕé, šö à þŕöĵéçţ šţàţîñĝ ñéîţĥéŕ àñ îđ ñöŕ à ñàḿé îš ķéýéđ ƃý ţĥé çĥéçķöüţ îţ ŵàš ƒöüñđ àţ îñšţéàđ.kapi initḿîñţš àñid:, ŵĥîçĥ îš ŵĥàţ ḿàķéš ţĥé ƒîŕšţ çàšé ţĥé ñöŕḿàļ öñé.
À đîŕéçţöŕý þéŕ ŵöŕķšþàçé, à đàţàƃàšé þéŕ þŕöĵéçţ
<DataDir>/workspaces/default/
workspace.db the project registry, the context graph,
the operation log
projects/
prj_9f2k…q7.db one project's context store
prj_4c8m…b1.db
À šéþàŕàţé đàţàƃàšé þéŕ þŕöĵéçţ þŕéšéŕṽéš ţĥé ţéŕḿš, çöñţéñţ-ḿéḿöŕý àñđ ṽöîçé šçĥéḿàš ŵîţĥöüţ àđđîñĝ þŕöĵéçţ çöļüḿñš ţö éàçĥ ţàƃļé. Îţ àļšö ļîḿîţš ŵŕîţé çöñţéñţîöñ àñđ ƒîļé çöŕŕüþţîöñ ţö öñé þŕöĵéçţ àñđ šüþþöŕţš ƒîļé-ļéṽéļ éẋþöŕţ, çöþýîñĝ àñđ đéļéţîöñ.
Çŕöšš-þŕöĵéçţ ĝŕàþĥ ǫüéŕîéš üšé workspace.db, ŵĥéŕé ñöđé îđéñţîţîéš îñçļüđé
þŕöĵéçţ šçöþé (Ñöđé îđéñţîţý çàŕŕîéš ţĥé šçöþé ţüþļé).
Ǫüéŕîéš ƒöŕ đàţà öüţšîđé ţĥé ĝŕàþĥ ŕéàđ ţĥé ŕéļéṽàñţ þŕöĵéçţ đàţàƃàšéš.
Ŵĥéŕé ţĥé àüţĥöŕîţàţîṽé çöþý ļîṽéš îš à ƃàçķéñđ
core/workspace.Backend îš ŵĥéŕé à ŵöŕķšþàçé'š àüţĥöŕîţàţîṽé çöþý ļîṽéš:
| Ḿéţĥöđ | Ŵĥàţ îţ àñšŵéŕš |
|---|---|
Describe | ŵĥîçĥ ƃàçķéñđ ţĥîš îš, ŵĥéŕé ţĥé ŵöŕķšþàçé îš, ŵĥéţĥéŕ îţ çàñ ƃé ŵŕîţţéñ |
Registry | ţĥé ŵöŕķšþàçé-ŵîđé đàţàƃàšé: ŕéĝîšţŕý, ĝŕàþĥ, öþéŕàţîöñ ļöĝ, ŵîđéñéđ ŕüļéš, àĝéñţ šéššîöñš |
Project | öñé þŕöĵéçţ'š çöñţéẋţ šţöŕé, çŕéàţéđ öñ ƒîŕšţ üšé |
Forget | đŕöþ öñé þŕöĵéçţ'š çöñţéẋţ šţöŕé |
Record | àþþéñđ öþéŕàţîöñš, ḿîñţîñĝ àñ îđ ƒöŕ éàçĥ ţĥàţ àŕŕîṽéš ŵîţĥöüţ öñé; àñ îđ öŕ çöñţéñţ àđđŕéšš ţĥé ļöĝ ĥöļđš îš ñöţ ŵŕîţţéñ ţŵîçé |
RecordIf | Record, àþþéñđîñĝ öñļý ŵĥîļé éàçĥ ñàḿéđ šüƃĵéçţ'š ļàšţ öþéŕàţîöñ îš šţîļļ àţ ţĥé þöšîţîöñ ţĥé ŵŕîţéŕ ŕéàđ (ErrHeadMoved öţĥéŕŵîšé) |
SubjectHead | ţĥé ļöçàļ þöšîţîöñ öƒ ţĥé ļàšţ öþéŕàţîöñ öñ öñé šüƃĵéçţ öƒ öñé þŕöĵéçţ |
Since | ŕéàđ öþéŕàţîöñš ƃàçķ ƒŕöḿ à ļöçàļ àŕŕîṽàļ þöšîţîöñ |
Select | ŕéàđ öñé þŕöĵéçţ'š öþéŕàţîöñš, öŕ öñé ķîñđ'š, ƒŕöḿ à þöšîţîöñ |
PutBlob, Blob | ķééþ ţĥé ƃýţéš àñ öþéŕàţîöñ ñàḿéš üñđéŕ ţĥé đîĝéšţ öƒ ţĥöšé ƃýţéš, üþ ţö 64 ḾîƂ éàçĥ |
Head | ţĥé àŕŕîṽàļ þöšîţîöñ öƒ ţĥé ļàšţ öþéŕàţîöñ, ŕéçöŕđéđ ĥéŕé öŕ ḿéŕĝéđ îñ |
Close | ŕéļéàšé éṽéŕý ĥàñđļé ţĥé ƃàçķéñđ öŵñš |
Registry àñđ Project àñšŵéŕ ŵîţĥ ĥàñđļéš ţĥé ƃàçķéñđ öŵñš: à çàļļéŕ ŕéàđš
àñđ ŵŕîţéš ţĥŕöüĝĥ öñé àñđ çļöšéš ţĥé ƃàçķéñđ, ñéṽéŕ à ĥàñđļé.
Öñé àđàþţéŕ šĥîþš: workspace.LocalBackend, ţĥé đîŕéçţöŕý öƒ ŠǪĻîţé ƒîļéš àƃöṽé.
Éṽéŕý ḿàçĥîñé ķééþš îţš ŵöŕķšþàçé ļöçàļļý; à þŕöĵéçţ ŵĥöšé çöñţéẋţ îš šĥàŕéđ
éẋçĥàñĝéš öþéŕàţîöñš ŵîţĥ à ŕéḿöţé, ƃéļöŵ, ŕàţĥéŕ ţĥàñ ŕéàđîñĝ ţĥŕöüĝĥ öñé.
core/workspace/workspacetest.RunConformance îš ţĥé šüîţé éṽéŕý àđàþţéŕ þàššéš:
öñé ţàƃļé öƒ ƃéĥàṽîöüŕš, đŕîṽéñ àĝàîñšţ ŵĥàţéṽéŕ ƃàçķéñđ à ƒàçţöŕý ĥàñđš ƃàçķ.
Îţ šţàţéš ŵĥàţ ţĥé ļàýéŕš àƃöṽé àŕé éñţîţļéđ ţö àššüḿé, îñ à ƒöŕḿ àñ àđàþţéŕ
àüţĥöŕ àñđ à ŕéṽîéŵéŕ çàñ ƃöţĥ ŕüñ.
À þŕöĵéçţ'š çöñţéẋţ îš šĥàŕéđ ţĥŕöüĝĥ à ŕéḿöţé
À ŕéçîþé đéçļàŕéš ŵĥéŕé à þŕöĵéçţ'š çöñţéẋţ îš šĥàŕéđ (context.backend:
local, file, git öŕ s3). Ţĥé ŕéçîþé îš ţĥé öñļý þļàçé îţ îš šéţ, šö
éṽéŕý çĥéçķöüţ öƒ ţĥé þŕöĵéçţ šĥàŕéš ţĥŕöüĝĥ ţĥé šàḿé ƃàçķéñđ.
kapi context sync þüļļš, šéţţļéš à ḿéŕĝé ŵĥéñ --merged ñàḿéš öñé, àñđ
þüšĥéš (host.App.SyncProjectContext); kapi context sync --status ŕéþöŕţš
ţĥé ƃàçķéñđ àñđ ţĥé ļàšţ ķñöŵñ đîšţàñçé ŵîţĥöüţ çöñţàçţîñĝ îţ. Éṽéŕý šĥàŕéđ
ƃàçķéñđ îš à workspace.Remote ĥöļđîñĝ ţĥé šàḿé ļàýöüţ:
| Þàţĥ | Ĥöļđš |
|---|---|
log/<writer>/<first-op-id>.jsonl | ţĥé öþéŕàţîöñš öñé ŵöŕķšþàçé þüšĥéđ, öñé ĴŠÖÑ öƃĵéçţ à ļîñé, îñ îđ öŕđéŕ |
blobs/<sha256> | ţĥé þàýļöàđš ţĥöšé öþéŕàţîöñš ñàḿé |
checkpoints/<op-id>.kpz | ţĥé þŕöĵéçţîöñš àš öƒ öñé öþéŕàţîöñ (kpz.KindCheckpoint) |
<writer> îš àñ îđ éàçĥ ŵöŕķšþàçé ḿîñţš öñçé (Workspace.WriterID), šö à
ḿàçĥîñé öñļý àđđš ƒîļéš üñđéŕ îţš öŵñ ñàḿé, ţŵö ḿàçĥîñéš ñéṽéŕ ŵŕîţé öñé öƃĵéçţ,
àñđ ñö ļöçķ îš ţàķéñ. À ŕéḿöţé öŵéš ţĥŕéé ţĥîñĝš, šţàţéđ ƃý
workspacetest.RunRemoteConformance: ļîšţ à đîŕéçţöŕý, ŕéàđ àñ öƃĵéçţ, àñđ
çŕéàţé àñ öƃĵéçţ ţĥàţ îš ñöţ ţĥéŕé (à šéçöñđ çŕéàţé öƒ ţĥé šàḿé ƃýţéš îš
ñöţĥîñĝ; öƒ öţĥéŕ ƃýţéš, ErrObjectExists).
| Àđàþţéŕ | Çŕéàţé-öñļý ŵŕîţé | Àççéšš |
|---|---|---|
FileRemote | à ţéḿþöŕàŕý ƒîļé ļîñķéđ îñţö þļàçé | ţĥé ƒîļéšýšţéḿ'š |
GitRemote | öñé çöḿḿîţ þéŕ þüšĥ öñ ţĥé ŕéƒ, þüšĥéđ ŵîţĥöüţ ƒöŕçé; à þüšĥ ţĥàţ ļöšéš à ŕàçé ƒéţçĥéš ţĥé ñéŵ ţîþ, ļàýš îţš ƒîļéš öṽéŕ îţ àñđ þüšĥéš àĝàîñ | ţĥé ŕéþöšîţöŕý'š ŕéḿöţé |
host/s3remote | PutObject ŵîţĥ If-None-Match: * | ţĥé ÀŴŠ çŕéđéñţîàļ çĥàîñ |
MemoryRemote | à ḿàþ, þàçķéđ îñţö à ţŕàñšƒéŕ ƒîļé | ñöñé |
ţĥé ƃŕöŵšéŕ éñĝîñé'š ƒöļđéŕ ŕéḿöţé (kapiSyncContext) | ţĥé FileRemote ļàýöüţ îñ à ƒöļđéŕ ţĥé þàĝé ĥöļđš, éàçĥ ƒîļé ŵŕîţţéñ üñđéŕ à đöţ-ñàḿé àñđ ḿöṽéđ îñţö þļàçé | ţĥé ƒöļđéŕ ţĥé þéŕšöñ ĝŕàñţéđ ţĥé þàĝé |
workspace.Sync ḿöṽéš öñé þŕöĵéçţ'š öþéŕàţîöñš. À þüļļ ļîšţš log/, ŕéàđš
ţĥé šéĝḿéñţš ţĥîš ŵöŕķšþàçé ĥàš ñöţ šééñ, ḿéŕĝéš ţĥéîŕ öþéŕàţîöñš îñţö ţĥé ļöĝ
ƃý îđ (workspace.Merge) àñđ ĥàñđš ţĥéḿ ţö ţĥé þŕöĵéçţöŕ: à çàţçĥ-üþ ŵĥéñ éṽéŕý
ḿéŕĝéđ öþéŕàţîöñ šöŕţš àƒţéŕ ţĥé öñéš àþþļîéđ, à ŕéƃüîļđ îñ îđ öŕđéŕ ŵĥéñ öñé
šöŕţš ƃéƒöŕé. À þüšĥ ŵŕîţéš ţĥé þŕöĵéçţ'š öþéŕàţîöñš ţĥé ŕéḿöţé îš ñöţ
ķñöŵñ ţö ĥöļđ àš ñéŵ šéĝḿéñţš, ŵîţĥ ţĥé ƃļöƃš ţĥéý ñàḿé, àñđ à çĥéçķþöîñţ öñçé
ţĥé ŕéḿöţé ĥàš ĝàîñéđ CheckpointEvery öþéŕàţîöñš šîñçé îţš ļàšţ. Àñ öþéŕàţîöñ
ñàḿéš îţš ƃļöƃš îñ îţš þàýļöàđ'š ţöþ-ļéṽéļ blob ƒîéļđ àñđ blobs ļîšţ
(workspace.BlobRefs), šö àñ éđîţ'š ķéþţ ŕüñš ţŕàṽéļ ŵîţĥ îţ. À ƒîŕšţ þüļļ
îñţö à ļöĝ ţĥàţ ĥöļđš ñöţĥîñĝ öƒ ţĥé þŕöĵéçţ šţàŕţš ƒŕöḿ ţĥé ñéŵéšţ çĥéçķþöîñţ
ŵĥöšé šéĝḿéñţ ļîšţ çöṽéŕš éṽéŕý öþéŕàţîöñ üþ ţö îţ, àñđ šţîļļ ḿéŕĝéš éṽéŕý
šéĝḿéñţ, šö ţĥé ĥîšţöŕý ţŕàṽéļš. Ţĥé ķîñđš projector.LocalKinds ñàḿéš ñéṽéŕ
ļéàṽé ţĥé ḿàçĥîñé: ţĥé þŕöĵéçţ'š ŕéĝîšţŕàţîöñ àñđ îţš ŕéḿöṽàļ
(project.register, project.forget) àñđ îţš çĥéçķþöîñţš. À ŕüļé à þéŕšöñ
ŵîđéñéđ ţö ţĥé ŵĥöļé ŵöŕķšþàçé îš à rules.write öþéŕàţîöñ ŕéçöŕđéđ üñđéŕ ţĥé
þŕöĵéçţ ţĥàţ đéçîđéđ îţ, šö îţ ţŕàṽéļš ŵîţĥ ţĥé þŕöĵéçţ àñđ éṽéŕý ḿàçĥîñé ţĥàţ
þüļļš îţ ĥöļđš ţĥé ŕüļé îñ îţš öŵñ ŵöŕķšþàçé.
Ŵĥàţ ţĥé ŵöŕķšþàçé ķñöŵš àƃöüţ à ŕéḿöţé îš ķéþţ îñ workspace.db, ķéýéđ ƃý ţĥé
þŕöĵéçţ àñđ ţĥé ŕéḿöţé: ţĥé öþéŕàţîöñ îđš ţĥé ŕéḿöţé ĥöļđš, ţĥé šéĝḿéñţš ŕéàđ
àñđ ŵĥéţĥéŕ ţĥéý àŕé ḿéŕĝéđ, àñđ ţĥé ļàšţ çöñţàçţ. Ţĥàţ îš ŵĥàţ ţĥé šýñç ļîñé
éṽéŕý çöñţéẋţ àñšŵéŕ àñđ kapi status çàŕŕý îš çöüñţéđ ƒŕöḿ (N to push, M to pull), ŵîţĥöüţ ŕéàçĥîñĝ ţĥé ŕéḿöţé. Ţĥé þüšĥ çöüñţ šþļîţš öƒƒ ţĥé çöñţéẋţ
öþéŕàţîöñš (context.* ķîñđš, ţĥé öñéš à çöñţéẋţ ļöĝ ļîšţš) ƒŕöḿ ţĥé šţöŕé
ŵŕîţéš ƃéšîđé ţĥéḿ, àñđ à ŕéḿöţé ñéṽéŕ çöñţàçţéđ ŕéþöŕţš ñö þüļļ çöüñţ. À ŕéḿöţé ţĥàţ çàññöţ ƃé ŕéàçĥéđ îš
ErrRemoteUnreachable, àñđ ţĥé ÇĻÎ éẋîţš ŵîţĥ šţàţüš 5.
À ţŕàñšƒéŕ ƒîļé îš ţĥé šàḿé ļàýöüţ îñ öñé .kpz (kpz.KindContext):
kapi store export þüšĥéš ţĥé þŕöĵéçţ îñţö à MemoryRemote àñđ þàçķš îţ, àñđ
kapi store import <file>.kpz üñþàçķš öñé àñđ þüļļš ƒŕöḿ îţ.
Ñö đàéḿöñ
Éṽéŕý þŕöçéšš öþéñš ţĥé ļöçàļ đàţàƃàšéš đîŕéçţļý: ţĥé ÇĻÎ, àñ àĝéñţ'š ḾÇÞ šéŕṽéŕ, ţĥé đéšķţöþ. Ţĥéŕé îš ñö ƃŕöķéŕ îñ ƃéţŵééñ, àñđ ñöţĥîñĝ ĥàš ţö ƃé ŕüññîñĝ ƒöŕ à þŕöĵéçţ ţö ƃé öþéñéđ.
Þŕöĵéçţš ŕéĝîšţéŕ öñ ƒîŕšţ üšé
Öþéñîñĝ à þŕöĵéçţ ŕéçöŕđš îţ îñ workspace.db: îţš ķéý, ţĥé đîšþļàý ñàḿé ţĥé
ŕéçîþé çàŕŕîéš, ţĥé çĥéçķöüţ þàţĥš îţ ĥàš ƃééñ šééñ àţ öñ ţĥîš ḿàçĥîñé, àñđ ŵĥéñ
îţ ŵàš ļàšţ àçţîṽé. Ŕé-öþéñîñĝ ŕéþļàçéš ţĥé đîšþļàý ñàḿé (à name: îš à ļàƃéļ à
þéŕšöñ éđîţš), àđđš ţĥé çĥéçķöüţ ŕàţĥéŕ ţĥàñ ŕéþļàçîñĝ ţĥé ļîšţ, àñđ ḿöṽéš ţĥé
ļàšţ-àçţîṽé ţîḿé ƒöŕŵàŕđ.
Çĥéçķöüţ þàţĥš àŕé ĥîñţš, ḿàçĥîñé-ļöçàļ àñđ ñöŕḿàļîžéđ ţĥŕöüĝĥ
host.NormalizeCheckoutPath, šö à đîŕéçţöŕý ŕéàçĥéđ ţĥŕöüĝĥ à šýḿļîñķéđ þàŕéñţ
àñđ ţĥé šàḿé đîŕéçţöŕý ŕéàçĥéđ đîŕéçţļý àŕé öñé éñţŕý. Ţĥéý àŕé ŵĥàţ à šüŕƒàçé
ļîšţîñĝ þŕöĵéçţš öƒƒéŕš ţö öþéñ; à çĥéçķöüţ ţĥàţ ĥàš ḿöṽéđ šţàýš îñ ţĥé ļîšţ
üñţîļ ţĥé þŕöĵéçţ îš öþéñéđ šöḿéŵĥéŕé éļšé.
Ŵĥàţ îš îñ ŵĥîçĥ ƒîļé
| Ţàƃļéš | Šüƃšýšţéḿ | Þööļ | Đéŕîṽéđ ƒŕöḿ |
|---|---|---|---|
| ƃļöçķ çàçĥé, öṽéŕļàýš | core/blockstore (Ç-01) | þŕöĵéçţîöñ | ţĥé çöñţéñţ ƒîļéš |
store_meta | core/projectdb | þŕöĵéçţîöñ | ţĥé ļàšţ éẋţŕàçţîöñ |
| ţéŕḿš | terms/ (Ç-08) | çöñţéẋţ | ţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector |
| çöñţéñţ ḿéḿöŕý | memory/ (Ç-09) | çöñţéẋţ | ţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector |
| ṽöîçé þŕöƒîļéš | voice/ (Ç-07) | çöñţéẋţ | ţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector |
projector_cursor | core/projector | çöñţéẋţ | ţĥé þöšîţîöñ öƒ ţĥé ļàšţ öþéŕàţîöñ àþþļîéđ |
| đéçîšîöñ ļéđĝéŕ, đöçüḿéñţ àđöþţîöñš | core/state (Ç-04) | çöñţéẋţ | ţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector |
| öñé ṽîéŵ öƒ ţĥé ļéđĝéŕ àñđ öƒ ţĥé đöçüḿéñţš ŕéàđ, þéŕ çĥéçķöüţ | core/state | çöñţéẋţ | ţĥé çĥéçķöüţ'š ƒîļéš |
| ƃļöçķ ĥîšţöŕý | core/history | çöñţéẋţ | ţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector |
edition_head, edition_subject_head, document_head: ţĥé ŵöŕķšþàçé ĥöḿé | core/workhome | çöñţéẋţ | ţĥé öþéŕàţîöñ ļöĝ, ţĥŕöüĝĥ core/projector |
graph_nodes, graph_edges | host/storage/graph, ṽöçàƃüļàŕý îñ core/contextgraph | ŵöŕķšþàçé | ţĥé ŕöŵš àƃöṽé, þļüš ţĥé ŕéçîþé |
workspace_projects, workspace_checkouts | core/workspace | ŵöŕķšþàçé | ŵĥàţ ĥàš ƃééñ öþéñéđ |
workspace_ops | core/workspace | ŵöŕķšþàçé | îţš öŵñ ļöĝ |
workspace_blobs | core/workspace | ŵöŕķšþàçé | ţĥé ļàŕĝé þàýļöàđš öþéŕàţîöñš ñàḿé |
workspace_rules | core/workspace | ŵöŕķšþàçé | ţĥé öþéŕàţîöñ ļöĝ: ţĥé ŕüļéš à þéŕšöñ ŵîđéñéđ (Ç-11) |
workspace_agent_sessions | core/workspace | ŵöŕķšþàçé | ŵĥîçĥ àĝéñţš àŕé àţ ŵöŕķ (Š-03) |
Éàçĥ šüƃšýšţéḿ öŵñš îţš öŵñ šçĥéḿà àñđ îţš öŵñ ḿîĝŕàţîöñ ļéđĝéŕ, šö à šüƃšýšţéḿ éṽöļṽéš ŵîţĥöüţ ŕéþļàýîñĝ àñýöñé éļšé'š ḿîĝŕàţîöñš, ŵĥîçĥéṽéŕ þööļ îţ ƃîñđš ţö.
core/projectdb öþéñš ƃöţĥ þŕöĵéçţ þööļš àñđ ĥàñđš éàçĥ šüƃšýšţéḿ îţš ĥàñđļé.
Çàļļéŕš ñàḿé à çàþàƃîļîţý ŕàţĥéŕ ţĥàñ à ƒîļé: Blocks() àñđ
BlocksAutocommit() çöḿé ƒŕöḿ ţĥé þŕöĵéçţîöñ, Memory(), Terms(), Voice(),
Work(), History(), Heads() àñđ Raw() ƒŕöḿ ţĥé çöñţéẋţ šţöŕé, àñđ ñöţĥîñĝ
àƃöṽé ĥàš ţö ķñöŵ ŵĥîçĥ îš ŵĥîçĥ. Ţĥé ţàƃļé-ƃý-ţàƃļé ļàýöüţ îš îñ
Ñöţé: Ŵöŕķšþàçé šţöŕàĝé.
Öþéñîñĝ ŵîţĥöüţ à ŵöŕķšþàçé
projectdb.Open ŵîţĥ ñö ŵöŕķšþàçé öþţîöñ þüţš ţĥé çöñţéẋţ ţàƃļéš ƃéšîđé ţĥé
þŕöĵéçţîöñ îñ .kapi/work/store.db, ŵĥîçĥ îš ţĥé éḿƃéđđéđ ļàýöüţ. Ţĥé
ŵöŕķšþàçé ļöçàţîöñ îš àñ éẋþļîçîţ öþţîöñ ţĥé ĥöšţ ļàýéŕ šüþþļîéš
(host/projectstore.go, ƒŕöḿ host.DataDir()), àñđ ţĥé ƒŕàḿéŵöŕķ ĥöļđš ñö
đéƒàüļţ ƒöŕ îţ.
Ţĥàţ îš ŵĥàţ ķééþš core/ ĥéŕḿéţîç: à ƒŕàḿéŵöŕķ ţéšţ öþéñš à þŕöĵéçţ îñ à
ţéḿþöŕàŕý đîŕéçţöŕý àñđ çàññöţ ŕéàçĥ à ŕéàļ ŵöŕķšþàçé, ƃéçàüšé ţĥéŕé îš ñö þàţĥ
îñšîđé ţĥé ƒŕàḿéŵöŕķ ţĥàţ ñàḿéš öñé.
Ĵöîñîñĝ àçŕöšš ţĥé ţŵö ƒîļéš
projectdb.DB.Join ŕüñš à ƒüñçţîöñ öñ öñé çöññéçţîöñ ŵîţĥ ƃöţĥ ƒîļéš ṽîšîƃļé:
ţĥé þŕöĵéçţîöñ àñđ ţĥé çöñţéẋţ šţöŕé, ţĥé šéçöñđ àţţàçĥéđ üñđéŕ ţĥé šçĥéḿà ñàḿé
context. Ţĥé çöññéçţîöñ îš ŕéàđ-öñļý ƒöŕ ţĥé ļéñĝţĥ öƒ ţĥé çàļļ.
À ĵöîñ ŕéàđš. À ŵŕîţé šþàññîñĝ ƃöţĥ þööļš îš ţŵö ţŕàñšàçţîöñš, àñđ ţĥé þàîŕîñĝ ţĥàţ ḿüšţ ƃé àţöḿîç, à đéçîšîöñ àñđ ţĥé ŵöŕđîñĝ ţĥé çöñţéñţ ḿéḿöŕý ļéàŕñš ƒŕöḿ îţ, îš ŵĥý ţĥé đéçîšîöñ ļéđĝéŕ àñđ ţĥé çöñţéñţ ḿéḿöŕý àŕé îñ ţĥé šàḿé þööļ.
Ŵŕîţéš àŕé öŕđéŕéđ; ŕéàđš àŕé ñéṽéŕ ĝàţéđ
Éṽéŕý þööļ îš öþéñéđ ŵîţĥ storage.ProjectOptions(): àñ îḿḿéđîàţé ţŕàñšàçţîöñ,
àñ îñ-þŕöçéšš ƑÎƑÖ þéŕḿîţ, àñđ à çŕöšš-þŕöçéšš àđṽîšöŕý ļöçķ öñ à ƒîļé ƃéšîđé
ţĥé đàţàƃàšé. Ţĥé ƒîŕšţ þüţš ţĥé ŵàîţ ŵĥéŕé ŠǪĻîţé'š ƃüšý ĥàñđļéŕ àþþļîéš, ţĥé
šéçöñđ öŕđéŕš ŵŕîţéŕš ţĥàţ šĥàŕé à ĥàñđļé, àñđ ţĥé ţĥîŕđ öŕđéŕš ţĥé šéṽéŕàļ
þŕöçéššéš ţĥàţ ŵŕîţé öñé çöñţéẋţ šţöŕé àƒţéŕ îţ ļéàṽéš ţĥé çĥéçķöüţ.
Ţĥé þéŕḿîţ àñđ ţĥé ļöçķ àŕé þéŕ ƒîļé, ŵĥîçĥ îš ŵĥàţ ţĥé šþļîţ ƃüýš ƃàçķ: à ƃļöçķ šéššîöñ'š ļöñĝ ţŕàñšàçţîöñ ĥöļđš ţĥé þŕöĵéçţîöñ'š àñđ ļéàṽéš ţĥé çöñţéẋţ šţöŕé'š àļöñé, šö à ŕéṽîéŵ ļööþ ŕéçöŕđîñĝ đéçîšîöñš ŕüñš ƃéšîđé àñ éẋţŕàçţîöñ ŕàţĥéŕ ţĥàñ ƃéĥîñđ îţ. Ŕéàđš ţàķé ñéîţĥéŕ, ƃéçàüšé üñđéŕ ŴÀĻ à ŕéàđéŕ ñéîţĥéŕ ƃļöçķš à ŵŕîţéŕ ñöŕ ŵàîţš ƒöŕ öñé.
Ţĥé šéţţîñĝš, ţĥé ḿéàšüŕéḿéñţš ƃéĥîñđ ţĥéḿ àñđ ţĥé đéàđļöçķ à ŕééñţŕàñţ ŵŕîţé ŕéþöŕţš àŕé îñ Ñöţé: Ŵöŕķšþàçé šţöŕàĝé.
Ŕéàđîñĝ ƒŕöḿ à ŵŕîţé-ŕéšţŕîçţéđ šàñđƃöẋ
À çĥéçķ ḿàý ŕüñ ŵĥéŕé îţ çàñ ŕéàđ ţĥé ŵöŕķšþàçé àñđ ñöţ ŵŕîţé îţ: à ŕéšţŕîçţéđ šàñđƃöẋ, à ŕéàđ-öñļý ḿöüñţ, à ŵöŕķšþàçé öŵñéđ ƃý àñöţĥéŕ àççöüñţ. Üñđéŕ ŴÀĻ ţĥàţ çöüñţš àš à ŵŕîţé, ƃéçàüšé ŠǪĻîţé çŕéàţéš ţĥé ŵŕîţé-àĥéàđ ļöĝ'š šĥàŕéđ-ḿéḿöŕý îñđéẋ ƃéšîđé ţĥé đàţàƃàšé öñ ţĥé ƒîŕšţ çöññéçţîöñ.
storage.OpenReadOnly àñšŵéŕš îţ: ţĥé đàţàƃàšé îš öþéñéđ ŵĥéŕé îţ îš ŵîţĥ
ŵŕîţéš đîšàƃļéđ, àñđ ŵĥéŕé ŠǪĻîţé ŕéƒüšéš ţĥàţ, îţ àñđ îţš ļöĝ àŕé çöþîéđ ţö à
ŵŕîţàƃļé ţéḿþöŕàŕý đîŕéçţöŕý ţĥàţ îš đéļéţéđ ŵĥéñ ţĥé ĥàñđļé çļöšéš. Ţĥé
ŵöŕķšþàçé ţĥéñ ŕéþöŕţš îţšéļƒ ŕéàđ-öñļý, àñšŵéŕš ŕéàđš, àñđ ŕéƒüšéš à ŵŕîţé ŵîţĥ
workspace.ErrReadOnly ŕàţĥéŕ ţĥàñ ļöšîñĝ îţ šöḿéŵĥéŕé ţĥé çàļļéŕ çàññöţ šéé.
À šýñçĥŕöñîžéđ ƒöļđéŕ îš ŕéƒüšéđ
À ŵöŕķšþàçé îñšîđé à ƒöļđéŕ à đéšķţöþ šýñç çļîéñţ ķééþš îš ŕéƒüšéđ àţ öþéñ, ƃý
þàţĥ þàţţéŕñ: îÇļöüđ Đŕîṽé, Đŕöþƃöẋ, ÖñéĐŕîṽé àñđ Ĝööĝļé Đŕîṽé, ḿàţçĥéđ à þàţĥ
šéĝḿéñţ àţ à ţîḿé. Ţĥé ḿéššàĝé ñàḿéš ţĥé ƒöļđéŕ, ţĥé þŕöđüçţ àñđ ţĥé ŵàý öüţ,
ŵĥîçĥ îš ţö šéţ KAPI_DATA_DIR ţö à đîŕéçţöŕý öüţšîđé îţ.
ŠǪĻîţé ķééþš à đàţàƃàšé, à ŵŕîţé-àĥéàđ ļöĝ àñđ à šĥàŕéđ-ḿéḿöŕý îñđéẋ çöñšîšţéñţ ŵîţĥ éàçĥ öţĥéŕ ţĥŕöüĝĥ ƃýţé-ŕàñĝé ļöçķš ţĥé öþéŕàţîñĝ šýšţéḿ éñƒöŕçéš; à šýñç çļîéñţ çöþîéš éàçĥ öƒ ţĥé ţĥŕéé ŵĥéñéṽéŕ îţ ñöţîçéš à çĥàñĝé, ţàķéš ñö ļöçķ, àñđ ŕéþļàçéš à ƒîļé üñđéŕ àñ öþéñ ĥàñđļé ŵĥéñ à šéçöñđ ḿàçĥîñé ŵŕîţéš. Ţĥé ŕéšüļţ îš à đàţàƃàšé ŵĥöšé ļöĝ đéšçŕîƃéš à šţàţé ţĥé ḿàîñ ƒîļé îš ñöţ îñ, ŕéþöŕţéđ àš çöŕŕüþţîöñ ļöñĝ àƒţéŕ ţĥé çöþý, îñ à þŕöçéšš ţĥàţ đîđ ñöţĥîñĝ ŵŕöñĝ. Ţĥé çöšţ öƒ ţĥé ŕüļé îš à ƒàļšé þöšîţîṽé öñ à đîŕéçţöŕý ţĥàţ ḿéŕéļý çàŕŕîéš öñé öƒ ţĥöšé ñàḿéš.
Öñé þööļ îš đéŕîṽéđ àñđ öñé îš àüţĥöŕéđ
Ţĥé þŕöĵéçţîöñ îš àñ îñđéẋ. Éṽéŕý ŕöŵ îñ îţ îš à ŕéàđîñĝ öƒ ţĥé çöñţéñţ ƒîļéš, šöüŕçé àñđ ţàŕĝéţ, šö đéļéţîñĝ îţ çöšţš à ŕé-éẋţŕàçţîöñ àñđ ñöţĥîñĝ éļšé.
Ţĥé çöñţéẋţ šţöŕé ĥöļđš ţĥé þŕöĵéçţ'š ţéŕḿš (Ç-08), îţš
ṽöîçé þŕöƒîļéš (Ç-07), îţš çöñţéñţ ḿéḿöŕý
(Ç-09), îţš đéçîšîöñ ļéđĝéŕ àñđ đöçüḿéñţ àđöþţîöñš
(Ç-04), îţš ƃļöçķ ĥîšţöŕý àñđ ţĥé
éđîţîöñš ţĥé ŵöŕķšþàçé ĥöḿé ķééþš, éàçĥ à þŕöĵéçţîöñ öƒ ţĥé ŵöŕķšþàçé'š
öþéŕàţîöñ ļöĝ, đéšçŕîƃéđ ƃéļöŵ. Ñö ŕéàđ þàţĥ öþéñš à ƒîļé îñ ţĥé
çĥéçķöüţ ţö àñšŵéŕ ƒöŕ àñý öƒ ţĥéḿ. À çĥéçķöüţ ḿàý çàŕŕý à ţéŕḿš ƃüñđļé öŕ à
ṽöîçé þŕöƒîļé à þéŕšöñ àüţĥöŕéđ üñđéŕ .kapi/; kapi store import îš ţĥé öñé
çöḿḿàñđ ţĥàţ ŕéàđš ţĥéḿ (Ç-11). Ţĥé šţöŕé ḿöṽéš ƃéţŵééñ
ḿàçĥîñéš ţĥŕöüĝĥ à çöñţéẋţ ƃàçķéñđ öŕ à ţŕàñšƒéŕ ƒîļé, ƃéļöŵ.
Ƃŕàñçĥéš üšé ţĥé çüŕŕéñţ çöñţéẋţ šţöŕé éṽéñ ŵĥéñ ţĥéý çöñţàîñ öļđéŕ šñàþšĥöţ ƒîļéš. Ĝöṽéŕñàñçé îš ţĥéŕéƒöŕé îñđéþéñđéñţ öƒ ŵĥéţĥéŕ à ţéàḿ çöḿḿîţš šñàþšĥöţš.
Ţĥé šţöŕéš àŕé þŕöĵéçţîöñš öƒ ţĥé ļöĝ
À ŵŕîţé ţö ţĥé ţéŕḿš, ţĥé çöñţéñţ ḿéḿöŕý, ţĥé ṽöîçé þŕöƒîļéš öŕ ţĥé ŵîđéñéđ
ŕüļéš ĝöéš ţĥŕöüĝĥ core/projector, ŵĥîçĥ đöéš ţŵö ţĥîñĝš üñđéŕ öñé ļöçķ þéŕ
çöñţéẋţ šţöŕé. Îţ ŕéçöŕđš àñ öþéŕàţîöñ çàŕŕýîñĝ ţĥé ŕöŵš ţĥé ŵŕîţé þüţš öŕ
ŕéḿöṽéš: terms.write, memory.write, voice.write öŕ rules.write, ŵîţĥ ţĥé
šţéþš îñ ţĥé öŕđéŕ ţĥé šţöŕé çàļļš ḿàđé ţĥéḿ. Ţĥéñ îţ àþþļîéš éṽéŕý öþéŕàţîöñ
ţĥé šţöŕé ĥàš ñöţ ýéţ šééñ, îñ ţĥé öŕđéŕ ţĥé ļöĝ ŕéçéîṽéđ ţĥéḿ, àñđ ḿöṽéš ţĥé
šţöŕé'š çüŕšöŕ (projector_cursor) þàšţ ţĥéḿ. À ŵŕîţé àñöţĥéŕ þŕöçéšš ḿàđé, öŕ
àñ öþéŕàţîöñ ḿéŕĝéđ îñ ƒŕöḿ àñöţĥéŕ ḿàçĥîñé, îš àþþļîéđ ƃý ţĥé ñéẋţ ŵŕîţé, àñđ
à þŕöĵéçţöŕ öþéñîñĝ à šţöŕé àþþļîéš ŵĥàţéṽéŕ ţĥé ļöĝ ĥöļđš ƃéýöñđ ţĥé çüŕšöŕ.
Workspace.Forget ŕéçöŕđš à project.forget öþéŕàţîöñ ŵĥéñ îţ ŕéḿöṽéš à
þŕöĵéçţ'š çöñţéẋţ šţöŕé, àñđ à šţöŕé ţĥàţ ĥàš àþþļîéđ ñöţĥîñĝ šţàŕţš àƒţéŕ ţĥé
þŕöĵéçţ'š ļàţéšţ öñé, šö à þŕöĵéçţ ŕéĝîšţéŕéđ àĝàîñ ƃéĝîñš ŵîţĥ àñ éḿþţý
çöñţéẋţ. À ŕéƃüîļđ šţàŕţš ţĥéŕé ţöö. Ţĥé öþéŕàţîöñš ƃéƒöŕé ţĥé ŕéḿöṽàļ šţàý îñ
ţĥé ļöĝ ƒöŕ ĥîšţöŕý àñđ çöüñţ àš ñöţ ĥéļđ: ţĥé ļöĝ ŕéçöŕđš öñé àĝàîñ àƒţéŕ ţĥé
ŕéḿöṽàļ ŵĥéñ îţ àŕŕîṽéš àĝàîñ (Record, ƃý îđ öŕ çöñţéñţ àđđŕéšš), à þüļļ
çöüñţš îţ àš ñéŵ, àñđ à þüšĥ ļéàṽéš öüţ éṽéŕýţĥîñĝ ƃéƒöŕé ţĥé ŕéḿöṽàļ. Ţĥé
ŕéḿöṽàļ àļšö çļéàŕš ŵĥàţ ţĥé ŵöŕķšþàçé ķñéŵ àƃöüţ ţĥé þŕöĵéçţ'š ŕéḿöţéš, šö à
þŕöĵéçţ îḿþöŕţéđ öŕ þüļļéđ àĝàîñ àƒţéŕ à ŕéšéţ ĝéţš îţš çöñţéẋţ ƃàçķ.
Éàçĥ šţéþ çàŕŕîéš îţš ŕöŵš ŵîţĥ éṽéŕý ţîḿéšţàḿþ ţĥé šţöŕé ŵöüļđ ţàķé ƒŕöḿ ţĥé çļöçķ ƒîļļéđ îñ ƒŕöḿ ţĥé öþéŕàţîöñ'š îñšţàñţ, àñđ à ŵŕîţé ţĥàţ ŵöüļđ ļéàṽé ţĥé šţöŕé àš îţ îš ŕéçöŕđš ñöţĥîñĝ. Àñ öþéŕàţîöñ ļàŕĝéŕ ţĥàñ 32 ĶîƂ ķééþš îţš šţéþš îñ à ƃļöƃ îţ ñàḿéš; à ƃàţçĥ öƒ éñţŕîéš öŕ çöñçéþţš îš šþļîţ šö éàçĥ ƃļöƃ šţàýš ŵéļļ îñšîđé ţĥé 64 ḾîƂ ƃöüñđ. À þàšš ţĥàţ ŵŕîţéš ḿàñý ŕöŵš (àñ îḿþöŕţ, à çöñṽéŕĝéñçé ŕüñ'š àƃšöŕƃéđ ŕéçöŕđ) çöļļéçţš ţĥéḿ îñţö öñé ƃàţçĥ, ŕéçöŕđéđ àš öñé öþéŕàţîöñ þéŕ šţöŕé.
Projector.Rebuild, ƃéĥîñđ kapi store rebuild, éḿþţîéš ţĥé þŕöĵéçţîöñ ţàƃļéš
àñđ ţĥé ŕüļéš ţĥé þŕöĵéçţ ŵîđéñéđ, àñđ ŕéþļàýš ţĥé þŕöĵéçţ'š öþéŕàţîöñš îñ îđ
öŕđéŕ. Öñ à ļöĝ öñé ḿàçĥîñé ŵŕöţé, ţĥé ŕöŵš îţ ļéàṽéš éǫüàļ ţĥé ŕöŵš ţĥé ŵŕîţéš
ļéƒţ; ţĥé ṽöîçé šţöŕé šţàḿþš àñ éđîţ àñđ ţĥé ṽéŕšîöñ îţ àŕçĥîṽéš ƒŕöḿ ţĥé
çļöçķ, šö ţĥöšé ţŵö çöļüḿñš àŕé ţĥé éẋçéþţîöñ. À ŕüñ öƒ šîñĝļé çöñţéñţ-ḿéḿöŕý
ŵŕîţéš îš ŕéþļàýéđ îñ öñé ţŕàñšàçţîöñ ŵîţĥ ţĥé šéàŕçĥ îñđéẋéš ŕéƃüîļţ öñçé,
ŵĥîçĥ ķééþš à đöĝƒööđ-šîžéđ ļöĝ (16,000 éñţŕîéš, 1,000 çöñçéþţš) ţö àƃöüţ ţĥŕéé
šéçöñđš.
Ţĥé đéçîšîöñ ļéđĝéŕ ŕéçöŕđš ţĥŕöüĝĥ ţĥé šàḿé þŕöĵéçţöŕ: state.WorkStore
ţàķéš à ĵöüŕñàļ (projector.Decisions), àñđ éàçĥ éñţŕý îš à decision.record
öþéŕàţîöñ àđđŕéššéđ ƃý ţĥé éñţŕý'š öŵñ çöñţéñţ àđđŕéšš, šö à đéçîšîöñ ŕéçöŕđéđ
ţŵîçé îš öñé öþéŕàţîöñ (Ç-04).
Éàçĥ đöçüḿéñţ à çĥéçķöüţ ŕéšöļṽéš îš à document.adopt öþéŕàţîöñ çàŕŕýîñĝ îţš
ķéý, îţš þàţĥ àñđ ŵĥàţ îţ ĥéļđ, ŵĥîçĥ éṽéŕý öţĥéŕ çĥéçķöüţ öƒ ţĥé þŕöĵéçţ
çöñšüļţš ƃéƒöŕé ḿîñţîñĝ à ķéý öƒ îţš öŵñ
(Ç-04).
Éàçĥ çĥéçķöüţ'š ṽîéŵ öƒ ţĥé ļéđĝéŕ, àñđ îţš öŵñ ļîšţ öƒ ţĥé đöçüḿéñţš îţ ĥàš
ŕéàđ, šţàý ŕéàđîñĝš öƒ îţš ƒîļéš.
À çĥéçķþöîñţ ķééþš à ŕéƃüîļđ šĥöŕţ. Projector.Checkpoint, ƃéĥîñđ
kapi store rebuild --checkpoint, ŵŕîţéš éṽéŕý þŕöĵéçţîöñ ţàƃļé àš îţ šţàñđš
(ŕöŵš, ţĥéîŕ ŕöŵîđš àñđ ţĥé ÀÜŢÖÎÑÇŔÉḾÉÑŢ ñüḿƃéŕîñĝ), ŵîţĥ ţĥé þŕöĵéçţ'š ŵîđéñéđ
ŕüļéš, îñţö à .kpz öƒ ķîñđ kapi-checkpoint, šţöŕéš îţ àš à ƃļöƃ àñđ ŕéçöŕđš
à checkpoint.write öþéŕàţîöñ ñàḿîñĝ îţ àñđ ţĥé ļàšţ öþéŕàţîöñ îţ îñçļüđéš. À
ţàƃļé ŵĥöšé ŕöŵš ŕüñ þàšţ 1 ḾîƂ, ţĥé ƃļöçķ ĥîšţöŕý àƃöṽé àļļ, ţŕàṽéļš îñ þàŕţš
îñšţéàđ: ƃļöƃš öƒ àţ ḿöšţ 16 ḾîƂ ţĥé çĥéçķþöîñţ ñàḿéš (kpz.CheckpointPart),
šö ñö ƒîļé à çĥéçķþöîñţ îš ḿàđé öƒ ĝŕöŵš ŵîţĥ ţĥé þŕöĵéçţ'š ĥîšţöŕý. À þüšĥ
ŵŕîţéš ţĥé þàŕţš ţö ţĥé ŕéḿöţé'š blobs/ ƃéƒöŕé ţĥé çĥéçķþöîñţ, àñđ à ƒîŕšţ
þüļļ ƒéţçĥéš ţĥéḿ ƃéƒöŕé îţ îñšţàļļš ţĥé çĥéçķþöîñţ. À
ŕéƃüîļđ ļöàđš ţĥé ñéŵéšţ çĥéçķþöîñţ ţĥàţ šţîļļ šţàñđš àñđ ŕéþļàýš öñļý ţĥé
öþéŕàţîöñš àƒţéŕ îţ. À çĥéçķþöîñţ šţöþš šţàñđîñĝ ŵĥéñ ţĥé ļöĝ ŕéçéîṽéš, àƒţéŕ
îţ ŵàš ţàķéñ, àñ öþéŕàţîöñ ŵĥöšé îđ šöŕţš ƃéƒöŕé îţš ļàšţ öñé, ŵĥîçĥ îš ŵĥàţ à
ḿéŕĝé öƒ àñ öļđéŕ öþéŕàţîöñ ƒŕöḿ àñöţĥéŕ ḿàçĥîñé đöéš; ţĥé ŕéƃüîļđ ţĥéñ ƒàļļš
ƃàçķ ţö àñ éàŕļîéŕ çĥéçķþöîñţ öŕ ţö ţĥé ŵĥöļé ļöĝ. À çĥéçķþöîñţ ţĥàţ çàññöţ ƃé
ļöàđéđ, à þàŕţ öƒ îţ ḿîššîñĝ, çöšţš à ŕéþļàý öƒ ţĥé ŵĥöļé ļöĝ, àñđ ţĥé ŕéƃüîļđ
ŕéþöŕţš îţ.
À ļöĝ ŵŕîţţéñ ƃéƒöŕé àñ öþéŕàţîöñ ķîñđ ŵàš ŕéţîŕéđ šţîļļ ĥöļđš öþéŕàţîöñš öƒ
ţĥàţ ķîñđ, ƃéçàüšé ţĥé þŕöĵéçţ ŕéšéţš đàţà ŕàţĥéŕ ţĥàñ ḿîĝŕàţîñĝ îţ. À ŕéƃüîļđ
ļéàṽéš ţĥéḿ öüţ àñđ çöüñţš ţĥéḿ (RebuildReport.Retired, ƒŕöḿ
projector.RetiredKinds), àñđ kapi store rebuild šàýš ĥöŵ ḿàñý îţ ļéƒţ
öüţ: unit.record, ţĥé ļéđĝéŕ'š éñţŕîéš ƃéƒöŕé ţĥéý ŵéŕé decision.record,
îš öñé, àñđ kapi store import ŕéàđš ţĥé đéçîšîöñš îñ àĝàîñ ƒŕöḿ ţĥé šĥàŕđš.
Çàļļéŕš ŕéàçĥ ţĥé šţöŕéš ţĥŕöüĝĥ ţĥé þŕöĵéçţöŕ: App.Projector îñ ĥöšţ ĥàñđš
öüţ projector.Terms, projector.Memory àñđ projector.Voice, ŵĥîçĥ àñšŵéŕ
ŕéàđš ƒŕöḿ ţĥé þŕöĵéçţîöñ àñđ ŕéçöŕđ éṽéŕý ŵŕîţé. Çöđé ţĥàţ öñļý ŕéàđš ţàķéš à
ṽîéŵ (projector.TermsView, MemoryView, VoiceView) ŵĥöšé ŵŕîţéš àŕé
ŕéƒüšéđ. make check-projection-writes ţýþé-çĥéçķš ţĥé Àþàçĥé ḿöđüļéš àñđ
ƒàîļš öñ à šţöŕé ŵŕîţé, öŕ à šţöŕé ĥàñđéđ ţö àñ îñţéŕƒàçé ţĥàţ çàñ ŵŕîţé îţ,
àñýŵĥéŕé öüţšîđé ţĥé þŕöĵéçţöŕ, history.Store.Put àñđ ţĥé ŵöŕķšþàçé ĥöḿé'š
workhome.Store.Apply àñđ Replace àḿöñĝ ţĥéḿ. À ŵŕîţé ḿéţĥöđ
ŕéàçĥéđ ţĥŕöüĝĥ à ţýþé ţĥàţ
éḿƃéđš ţĥé šţöŕé çöüñţš àš à đîŕéçţ çàļļ, šö à ḿéţĥöđ à þŕöĵéçţöŕ šţöŕé ļéàṽéš
ţö îţš éḿƃéđđéđ šţöŕé îš çàüĝĥţ ţöö. Ţĥé ĝüàŕđ àļšö ŕéàđš ţĥé šţöŕé þàçķàĝéš:
àñ éẋþöŕţéđ ḿéţĥöđ ţĥàţ ŵŕîţéš ţĥé đàţàƃàšé ḿüšţ ƃé îñ îţš ļîšţ öƒ ŵŕîţéš öŕ
îñ îţš ļîšţ öƒ ŵŕîţéš ţĥé ļöĝ đöéš ñöţ þŕöĵéçţ (à šéàŕçĥ-îñđéẋ ŕéƃüîļđ, ţĥé
ŵöŕķšþàçé'š þŕöĵéçţ ŕéĝîšţŕý). Ţĥé ƒéŵ ƒüñçţîöñš ţĥàţ öþéñ à šţöŕé à þéŕšöñ
ñàḿéđ öñ ţĥé çöḿḿàñđ ļîñé àŕé ļîšţéđ ŵîţĥ ţĥé ŕéàšöñ.
Éđîţš àŕé ŕéçöŕđéđ àš çöñţéñţ.éđîţ
Ţéẋţ ļîṽéš îñ îţš ĥöḿé: ţĥé ƒîļé îñ à çĥéçķöüţ. Ŵĥàţ ĥàþþéñéđ ţö îţ ļîṽéš îñ
ţĥé ļöĝ. Àñ àþþļîéđ éđîţ îš à content.edit öþéŕàţîöñ þéŕ đöçüḿéñţ îţ
çĥàñĝéđ, àñđ ţĥé þŕöĵéçţöŕ ŵŕîţéš îţ îñţö ţĥé ƃļöçķ ĥîšţöŕý
(core/history, ţĥé block_history ţàƃļé): öñé ŕöŵ þéŕ éđîţîöñ ţĥé éđîţ
çĥàñĝéđ, ŵîţĥ ţĥé éđîţîöñ ŕéṽîšîöñš ƃéƒöŕé àñđ àƒţéŕ, ţĥé ƃàšîš à đéŕîṽéđ
éđîţîöñ ŵàš ḿàđé ƒŕöḿ, ţĥé ƃļöçķ'š ķéý, çöñţéñţ ĥàšĥ àñđ çöñţéẋţ ĥàšĥ, ţĥé
ķîñđš öƒ ţĥé öþéŕàţîöñš ţĥàţ çĥàñĝéđ îţ àñđ, ƒöŕ à ƒļöŵ, ţĥé ţööļ ţĥàţ çĥàñĝéđ
îţ, ŵĥö ḿàđé ţĥé çĥàñĝé (þéŕšöñ, àĝéñţ öŕ ţööļ, ŵîţĥ à ñàḿé àñđ à šéššîöñ, öŕ
external ƒöŕ àñ éđîţ ḿàđé öüţšîđé ķàþî) àñđ ţĥŕöüĝĥ ŵĥîçĥ šüŕƒàçé (apply,
ksed, mcp, browser, desktop, extract, context, flow:<name>,
merge, pull, observed). history.Store.Wrote àñšŵéŕš ŵĥö ŵŕöţé ţĥé çöñţéñţ àñ éđîţîöñ
ĥöļđš, ƒöŕ éṽéŕý ŵŕîţéŕ: ţĥé çĥàñĝé ţĥàţ ļéƒţ ţĥé éđîţîöñ àţ ţĥàţ ŕéṽîšîöñ,
à ŕéçöŕđéđ ŵŕîţé ƃéƒöŕé àñ öƃšéŕṽéđ öñé. LastWrite àñđ Latest ŕéàđ ţĥé
ḿöšţ ŕéçéñţ çĥàñĝé ţö öñé éđîţîöñ öŕ ţö éṽéŕý éđîţîöñ öƒ à đöçüḿéñţ (öŕ ţö
ţĥé éđîţîöñš Latest îš ĝîṽéñ) îñ öñé þàšš öṽéŕ ţĥé đöçüḿéñţ'š ĥîšţöŕý, àñđ
Edition àñđ Document ŕéàđ ţĥé çĥàñĝéš ƃàçķ, ḿöšţ ŕéçéñţ ƒîŕšţ. À ŕéàđ öƒ
ţĥé çĥàñĝé šéŕṽîçé ţĥàţ šĥöŵš àţ ḿöšţ à þàĝé öƒ ƃļöçķš àšķš LastWrite ƒöŕ
éàçĥ éđîţîöñ îţ šĥöŵš, šö îţš çöšţ ƒöļļöŵš ŵĥàţ îţ šĥöŵš; à ļöñĝéŕ ŕéàđ àšķš
Latest öñçé ƒöŕ ţĥé éđîţîöñš îţš ƃļöçķš ĥöļđ. Éîţĥéŕ ŵàý à ŕéàđ àšķš
Wrote öñļý ƒöŕ àñ éđîţîöñ ŵĥöšé ḿöšţ ŕéçéñţ çĥàñĝé đîđ ñöţ ļéàṽé ţĥé
ŕéṽîšîöñ îţ ĥöļđš. Ţĥé ƒîļé šţàýš ţĥé öñļý çöþý öƒ îţš ţéẋţ àñđ ţĥé ļöĝ ķééþš
ƒàçţš àƃöüţ îţ, ķéýéđ ƃý ŕéṽîšîöñš ţĥàţ ĥöļđ öñ éṽéŕý ƃŕàñçĥ ŵĥéŕé ţĥé çöñţéñţ
ḿàţçĥéš, šö à ƃŕàñçĥ šŵîţçĥ ḿöṽéš ñö ŕéçöŕđ: ţĥé ĥîšţöŕý îš šĥàŕéđ ƃý éṽéŕý
ƃŕàñçĥ öƒ à çĥéçķöüţ, àñđ ţĥé çĥàñĝé ţĥàţ ŵŕöţé ŵĥàţ à ƃŕàñçĥ ĥöļđš àñšŵéŕš
ƒöŕ îţ ŵĥàţéṽéŕ ŵàš ŕéçöŕđéđ öñ àñöţĥéŕ ƃŕàñçĥ šîñçé.
core/change đéƒîñéš ţĥé ĥööķ àñ àþþļîéŕ öƒ çĥàñĝé šéţš çàļļš öñçé ţĥé ĥöḿéš
çöḿḿîţţéđ (change.Recorder), àñđ host.App.EditRecorder îš ţĥé þŕöĵéçţ'š
ŕéçöŕđéŕ: îţ ŕéçöŕđš éṽéŕý đöçüḿéñţ öƒ à çĥàñĝé šéţ ţĥŕöüĝĥ öñé
Projector.RecordEdits çàļļ. Éṽéŕý ƒļöŵ ţĥé ĥöšţ ŕüñš ŕéçöŕđš éàçĥ đöçüḿéñţ îţ
ŵŕîţéš ţĥŕöüĝĥ ţĥé šàḿé ŕéçöŕđéŕ, àš öñé content.edit ŵîţĥ ţĥé àçţöŕ
tool:<flow> (É-09); îţš
ţŕàñšîţîöñš çàŕŕý éàçĥ ţŕàñšļàţîöñ'š ƃàšîš, ţĥé ķîñđ öƒ öþéŕàţîöñ ţĥé ŕüñ'š
çĥàñĝé ţö ţĥé éđîţîöñ çöḿéš ţö (àš change.Diff ŵöüļđ šéñđ îţ), ţĥé ţööļ ţĥàţ
ḿàđé îţ (ţĥé ţööļ'š šţàḿþ, öŕ ţĥé ŕüñ'š öñļý ţööļ, ţĥé çöüñţéŕ à çöñṽéŕĝéñçé
þàšš àđđš ļéƒţ öüţ), àñđ, àš ţĥé ŕöŵ'š þŕöđüçéŕ,
ţĥé šţàḿþ ţĥé þŕöđüçîñĝ ţööļ ļéƒţ (þŕöṽîđéŕ, ḿöđéļ, àñđ ţĥé ĝöṽéŕñîñĝ çöñţéẋţ
ƒîñĝéŕþŕîñţ), ŵĥîçĥ à ƒîļé öƒ šţŕîñĝš ĥàš ñöŵĥéŕé ţö ķééþ. Ţĥé ƃļöçķ ĥîšţöŕý îš
ţĥéŕéƒöŕé ŵĥéŕé ţĥé ļööþ'š ƃàšîš ļîṽéš: çöṽéŕàĝé ĝŕàđéš àñ üñđéçîđéđ
ţŕàñšļàţîöñ ƃý ţĥé ţööļ'š ŵŕîţé ţĥàţ ļéƒţ îţ, à đéçîšîöñ öñ šüçĥ à ţŕàñšļàţîöñ
šţàŕţš ƒŕöḿ ţĥàţ ŵŕîţé, ţĥé ŕéṽîéŵ çöñţéẋţ ñàḿéš ţĥé þŕöđüçéŕ öƒ à ţŕàñšļàţîöñ
à ƒļöŵ ŵŕöţé, àñđ ţĥé šţàļéñéšš ĝàţé ŕéàđš ţĥé þŕöđüçéŕ ƒŕöḿ ţĥé ļàţéšţ ŵŕîţé
(Ç-05). Ţĥé ƃàšîš îš ţĥé šöüŕçé ţĥé ŕüñ ŕéàđ ƃéƒöŕé îţ
ŕàñ, šö à šöüŕçé éđîţéđ ŵĥîļé ţĥé ŕüñ ŵöŕķéđ ŕéàđš àš đŕîƒţ. À ŕüñ ţĥàţ
ŕéþŕöđüçéš à þéŕšöñ'š öŕ àñ àĝéñţ'š ŵöŕđîñĝ ŕéçöŕđš ñöţĥîñĝ öṽéŕ ţĥéîŕ ŵŕîţé.
kapi pull ŕéçöŕđš à ṽéñüé'š ţŕàñšļàţîöñ ŵîţĥ à ƃàšîš öñļý ŵĥéŕé ţĥé ṽéñüé'š
ŕéçöŕđ šàýš îţ ŵàš ḿàđé ƒŕöḿ ţĥé šöüŕçé ţĥé çĥéçķöüţ ĥöļđš
(host.WithStatedBases); àñý öţĥéŕ þüļļéđ ţŕàñšļàţîöñ îš ḿàđé ƒŕöḿ ŵöŕđîñĝ
ţĥîš çĥéçķöüţ đöéš ñöţ ĥöļđ, àñđ îš ŕéçöŕđéđ ŵîţĥ ñöñé.
Ķàþî Đéšķţöþ, kapi apply, ķšéđ, ţĥé ḾÇÞ éđîţ ţööļš àñđ ţĥé ƃŕöŵšéŕ éñĝîñé
éđîţ çöñţéñţ ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé, šö ţĥéîŕ éđîţš ŕéàçĥ ţĥé šàḿé
ŕéçöŕđéŕ üñđéŕ ţĥéîŕ öŵñ öŕîĝîñš. Ţĥé đéçîšîöñ ļéđĝéŕ ĥöļđš đéçîšîöñš öñļý
(Ç-04):
ŵĥàţ à þŕöđüçéŕ ḿàđé, àñđ ƒŕöḿ ŵĥîçĥ šöüŕçé, îš îñ ţĥé ƃļöçķ ĥîšţöŕý àñđ
ñöŵĥéŕé éļšé.
Ţĥé ƃļöçķ ĥîšţöŕý îš þàŕţ öƒ ţĥé ŵöŕķšþàçé ļöĝ, šö à çĥéçķöüţ öƒ à þŕöĵéçţ
ţĥàţ šĥàŕéš îţš çöñţéẋţ ţĥŕöüĝĥ à ƃàçķéñđ ŕéàđš îţ ŵîţĥ kapi context sync,
àñđ à ƒŕéšĥ çļöñé ĥöļđš ţĥé ţŕàñšļàţîöñš ţĥé ŕéþöšîţöŕý çàŕŕîéš àñđ ñöñé öƒ ţĥé
ŕéçöŕđ öƒ ĥöŵ ţĥéý ŵéŕé ŵŕîţţéñ. Üñţîļ îţ þüļļš, à ţŕàñšļàţîöñ ŵĥöšé šöüŕçé ŵàš
éđîţéđ ƃéƒöŕé ţĥé çļöñé'š ƒîŕšţ þàšš îš ñöţ ĝŕàđéđ šţàļé ţĥéŕé. kapi up àñđ
kapi status šàý šö îñ öñé ļîñé (host.HistoryNotPulledNote) ŵĥéñ ţĥé þŕöĵéçţ
ñàḿéš à ƃàçķéñđ, ţŕàñšļàţîöñš éẋîšţ öñ đîšķ àñđ ţĥé ĥîšţöŕý ŕéçöŕđš ñöţĥîñĝ. À
þüšĥ ţö à ṽéñüé çàŕŕîéš ţĥé šàḿé ŕéçöŕđ ƒöŕ ţĥé đöçüḿéñţš îţ ŕéàđš
(Š-07).
Àñ éđîţ ḿàđé öüţšîđé ķàþî ŕéçöŕđš ñöţĥîñĝ ŵĥéñ îţ ĥàþþéñš. Ţĥé ñéẋţ ŕéàđ
ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé ƒîñđš îţ: ţĥé šéŕṽîçé šĥöŵš éàçĥ ƃļöçķ îţ ŕéàđš ţö
îţš öƃšéŕṽéŕ (change.Observer), àñđ ţĥé ĥöšţ'š (host/changes_observe.go)
çöḿþàŕéš éṽéŕý éđîţîöñ ŵîţĥ ţĥé çĥàñĝéš ţĥé ĥîšţöŕý ŕéçöŕđš ƒöŕ îţ. Àñ
éđîţîöñ ŵĥöšé ŕéṽîšîöñ ñö ŕéçöŕđéđ çĥàñĝé ļéƒţ ŵàš çĥàñĝéđ ƃý šöḿéţĥîñĝ ţĥàţ
ŕéçöŕđéđ ñöţĥîñĝ, àñđ ţĥé ŕéàđ ŕéçöŕđš îţ àš öñé ĥàšĥ-öñļý content.edit ƒöŕ
ţĥé đöçüḿéñţ, ŵîţĥ ţĥé àçţöŕ external àñđ ţĥé öŕîĝîñ observed, šţàŕţîñĝ
ƒŕöḿ ţĥé ŕéṽîšîöñ ţĥé ĥîšţöŕý ļàšţ ŕéçöŕđéđ. À ŕéṽîšîöñ àñ éàŕļîéŕ çĥàñĝé ļéƒţ
îš éẋþļàîñéđ, šö à çĥéçķöüţ öƒ àñöţĥéŕ ƃŕàñçĥ ŕéçöŕđš ñöţĥîñĝ. Ţĥé ŕéàđ àšķš
ŵĥéñ îţ éñđš ŕàţĥéŕ ţĥàñ ŵĥéñ îţ šţàŕţš (history.Store.Reached), šö à ŵŕîţéŕ
îñ àñöţĥéŕ þŕöçéšš ţĥàţ ŕéçöŕđéđ îţš öŵñ çĥàñĝé ŵĥîļé ţĥé ŕéàđ ŕàñ éẋþļàîñš
îţ; àñđ àñ öƃšéŕṽéđ çĥàñĝé ţĥàţ ļàñđš àƒţéŕ šüçĥ à ŵŕîţéŕ'š ŕéçöŕđ ñéṽéŕ ţàķéš
ţĥé ŕéṽîšîöñ ƒŕöḿ îţ. Àñ éđîţîöñ ţĥé ĥîšţöŕý ĥàš ñéṽéŕ ŕéçöŕđéđ îš ļéƒţ àļöñé.
À ĥîšţöŕý šĥöŵš àñ öƃšéŕṽéđ çĥàñĝé ŵîţĥ ñö àçţöŕ, šîñçé ñöƃöđý ķñöŵš ŵĥö ḿàđé
îţ, àñđ îţ çàŕŕîéš ñö ƃàšîš, šö ţĥé ţŕàñšļàţîöñ ŕéàđš àš ḿàđé ƒŕöḿ ñö ŕéçöŕđéđ
šöüŕçé. À ƒļöŵ'š ŕéàđ öƒ ţĥé đöçüḿéñţ îţ ĥàš ĵüšţ çöḿḿîţţéđ îš ļéƒţ
üñöƃšéŕṽéđ (change.Unobserved), ƃéçàüšé ţĥé ƒļöŵ ŕéçöŕđš ţĥàţ çĥàñĝé îţšéļƒ,
àñđ šö îš éṽéŕý ŕéàđ öƒ à ŕüñ ţĥàţ þŕîñţš îţš çĥàñĝé šéţ îñšţéàđ öƒ ŵŕîţîñĝ
îţ.
À þéŕšöñ'š öŕ àñ àĝéñţ'š éđîţ ķééþš ţĥé ŕüñš àŕöüñđ éàçĥ çĥàñĝé àñđ ţĥé çĥàñĝé šéţ àš šéñţ, îñ ƃļöƃš ţĥé öþéŕàţîöñ ñàḿéš; à ţööļ'š éđîţ ķééþš ţĥé ŕéṽîšîöñš àñđ ĥàšĥéš öñļý, ƃéçàüšé ţĥé ƒîļé ĥöļđš ţĥé ţéẋţ àñđ à ƒļöŵ ŵŕîţéš ţĥöüšàñđš öƒ ţĥéḿ. À ŵŕîţé ţö ţĥé ŵöŕķšþàçé ĥöḿé ķééþš ţĥé éđîţîöñ îţ ļéàṽéš, ŵĥöéṽéŕ ḿàđé îţ, ƃéçàüšé ţĥé ļöĝ îš ţĥàţ ĥöḿé (ƃéļöŵ). À þŕöĵéçţ ţĥàţ đéçļàŕéš ŕéđàçţîöñ (Ç-10) ķééþš ñö ŵîţĥĥéļđ ṽàļüé îñ à ŕéçöŕđ: ţĥé ŕéçöŕđéŕ ŕéđàçţš ţĥé ŕüñš îţ ķééþš àñđ ţĥé ñöţé ŵîţĥ ţĥé þŕöĵéçţ'š ŕüļéš, ţĥé öŕîĝîñàļš ĝöîñĝ ţö ţĥé þŕöĵéçţ ṽàüļţ, àñđ ļéàṽéš ţĥé çĥàñĝé šéţ öüţ. Ţĥé ŵöŕķšþàçé ĥöḿé ŕéđàçţš ŵĥàţ îţ ŕéçöŕđš ţĥé šàḿé ŵàý, àñđ þüţš ţĥé öŕîĝîñàļš ƃàçķ ƒŕöḿ ţĥé ṽàüļţ ŵĥéŕé îţ ŕéàđš àñ éđîţîöñ, šö à ķéþţ đŕàƒţ ŕéàđš ŵĥöļé öñ ţĥé ḿàçĥîñé ţĥàţ ŵîţĥĥéļđ îţš ṽàļüéš àñđ ŵîţĥ þļàçéĥöļđéŕš àñýŵĥéŕé éļšé. À þöļîçý ţĥàţ đéţéçţš éñţîţîéš ñééđš à ŕéàđ'š éñţîţý àññöţàţîöñš, ŵĥîçĥ à ŕéçöŕđ'š ŕüñš đö ñöţ çàŕŕý, šö üñđéŕ öñé à ŕéçöŕđ ķééþš ŕéṽîšîöñš àñđ ĥàšĥéš öñļý, àñđ ţĥé ŵöŕķšþàçé ĥöḿé ķééþš ñö éđîţîöñ àţ àļļ: à çĥàñĝé ţö à ţŕàñšļàţîöñ ŵîţĥ ñö ƒîļé îš ŕéƒüšéđ, àñđ à ĝàţéđ ŕüñ ļéàṽéš îţš ĥéļđ-ƃàçķ đŕàƒţš îñ ţĥé þŕöđüçéŕ'š çàçĥé.
Àñ öþéŕàţîöñ îš àđđŕéššéđ ƃý ţĥé đöçüḿéñţ, ţĥé àçţöŕ àñđ éàçĥ ţŕàñšîţîöñ ŵîţĥ
ţĥé àđđŕéšš öƒ ţĥé öþéŕàţîöñ îţ éẋţéñđš, ţĥé öñé ţĥàţ ḿöšţ ŕéçéñţļý ļéƒţ ţĥé
éđîţîöñ àţ ţĥé ŕéṽîšîöñ ţĥé ţŕàñšîţîöñ šţàŕţš ƒŕöḿ (history.Store.Reached,
ŵĥîçĥ ļööķš üþ öñļý ţĥöšé ŕéṽîšîöñš). Éṽéŕý ļöĝ ĥöļđîñĝ àñ öþéŕàţîöñ àĝŕééš öñ
îţš àđđŕéšš, šö öñé éđîţ ŕéçöŕđéđ ţŵîçé, ƃý à ŕéţŕý öŕ ƃý ţŵö ḿàçĥîñéš ñöţîçîñĝ
öñé çĥàñĝé ḿàđé öüţšîđé ķàþî, îš öñé öþéŕàţîöñ, àñđ šö îš éṽéŕý çĥàñĝé ţĥàţ
éẋţéñđš îţ, ŵĥîļé ţĥé šàḿé çĥàñĝé ḿàđé àĝàîñ àƒţéŕ àñ üñđö îš àñöţĥéŕ. Ţĥé
ĥîšţöŕý ķééþš éàçĥ öþéŕàţîöñ'š àđđŕéšš ƃéšîđé îţš ŕöŵš (block_history_op):
ŵĥéñ ţŵö ļöĝš ţĥàţ ŕéçöŕđéđ öñé éđîţ üñđéŕ đéŕéñţ îđš ḿéŕĝé, ţĥé ļöĝ ķééþš
ţĥé öļđéŕ îđ, àñđ îţš ŕöŵš ţàķé ţĥé þļàçé öƒ ţĥé öñéš ţĥé ñéŵéŕ îđ þŕöĵéçţéđ,
àš à ŕéƃüîļđ ŵŕîţéš ţĥéḿ.
Ţĥé îđéñţîţý éṽîđéñçé öñ éṽéŕý ţŕàñšîţîöñ îš ŵĥàţ ļéţš ĥîšţöŕý ŕé-àţţàçĥ àƒţéŕ
à ŕéöŕđéŕ. À ŕéàđ ŕéþöŕţš ţĥé ķéýš ţĥé ƒöŕḿàţ ĝîṽéš, àñđ ŕéçöñçîļîàţîöñ àĝàîñšţ
ţĥé ĥîšţöŕý'š þŕîöŕš (history.Store.Priors, reconcile.Blocks) ƒîñđš à
ŕéçöŕđéđ ƃļöçķ àḿöñĝ šîƃļîñĝš ŵĥöšé þöšîţîöñš ḿöṽéđ.
Ţĥé ŵöŕķšþàçé ĥöḿé ķééþš ţĥé éđîţîöñš ţĥàţ ĥàṽé ñö ƒîļé
Àñ éđîţîöñ ŵîţĥ ñö ƒîļé ĥàš ţĥé ļöĝ àš îţš ĥöḿé. Üñđéŕ
defaults.materialize: on-converge à ļöçàļé'š ƒîļéš àþþéàŕ öñļý ŵĥéñ îţ çļéàŕš
îţš šĥîþ ĝàţé, šö à ĥéļđ-ƃàçķ ļöçàļé'š đŕàƒţš, ţĥé éđîţš à þéŕšöñ öŕ àñ àĝéñţ ḿàķéš
ţö ţĥéḿ, àñđ ţĥé đŕàƒţš à ĝàţéđ ŕüñ þŕöđüçéđ ţĥàţ kapi merge ĥàš ñöţ
đéļîṽéŕéđ àļļ ļîṽé îñ ţĥé ŵöŕķšþàçé ĥöḿé (core/workhome), öüţšîđé ţĥé
çĥéçķöüţ, üñţîļ à đéļîṽéŕý ŵŕîţéš ţĥéḿ ţö ţĥé ƒîļéš ţĥé ŕéçîþé ñàḿéš.
Éàçĥ ŵŕîţé ţö šüçĥ àñ éđîţîöñ îš öñé content.edit ţĥàţ çàŕŕîéš ţĥé ŕéšüļţ:
ţĥé ŕüñš, šţàţüš àñđ öŕîĝîñ öƒ éàçĥ ƃļöçķ'š éđîţîöñ îţ ļéàṽéš, ţĥé ƃàšîš îţ ŵàš
ḿàđé ƒŕöḿ, ţĥé ƃļöçķ'š îđéñţîţý šîĝñàļš, àñđ ţĥé šţàḿþ îţš þŕöđüçéŕ šéŕṽéš à
đŕàƒţ àĝàîñ ƃý. Îţš ƃļöçķ ĥîšţöŕý ŕöŵš ñàḿé ţĥé ķîñđš öƒ ţĥé öþéŕàţîöñš ţĥàţ
ḿàđé éàçĥ çĥàñĝé àñđ ţĥé ţööļ, àš à ŵŕîţé ţö à ƒîļé'š đö: ţĥé ķîñđš à çĥàñĝé
šéţ šéñţ, ţĥé ķîñđ à ƒļöŵ'š đŕàƒţ çöḿéš ţö (set_content, öŕ replace_text
ƒöŕ ţéẋţ ḿöṽéđ àŕöüñđ ţĥé šàḿé çöđéš) ŵîţĥ ţĥé ţööļ ţĥé ƒļöŵ ñàḿéš, àñđ
remove_edition ƒöŕ à ŕéḿöṽàļ öŕ à đéļîṽéŕý'š ŕéļéàšé. Ţĥé öþéŕàţîöñ ñàḿéš îţš šüƃĵéçţ, ţĥé đöçüḿéñţ'š ķéý àñđ ţĥé
éđîţîöñ (workspace.Op.Subject, îñđéẋéđ), àñđ ţĥé ŵŕîţéŕ àþþéñđš îţ ŵîţĥ à
çöñđîţîöñàļ ŕéçöŕđ (workspace.Backend.RecordIf): îñšîđé ţĥé ÎḾḾÉĐÎÀŢÉ
ţŕàñšàçţîöñ ţĥàţ àþþéñđš, ţĥé šüƃĵéçţ'š ļàšţ ļöçàļ þöšîţîöñ ḿüšţ šţîļļ ƃé ţĥé
öñé ţĥé ŵŕîţéŕ ŕéàđ, öŕ ñöţĥîñĝ îš àþþéñđéđ. Ţĥé þŕöĵéçţöŕ'š ļöçķ îš þéŕ
þŕöçéšš, šö ţĥîš çĥéçķ îš ŵĥàţ ḿàķéš ţŵö þŕöçéššéš ŵŕîţîñĝ öñé éđîţîöñ (Ķàþî
Đéšķţöþ àñđ àñ àĝéñţ'š ḾÇÞ šéŕṽéŕ) ţàķé ţüŕñš. Ţĥé ĥéàđ à ŵŕîţéŕ éẋþéçţš îš ŕéàđ
ƒŕöḿ ţĥé ļöĝ (SubjectHead), ñéṽéŕ ƒŕöḿ à þŕöĵéçţîöñ, ƃéçàüšé à þöšîţîöñ îš
ļöçàļ ţö öñé ļöĝ. À ĥéàđ ţĥàţ ḿöṽéš àƒţéŕ à çĥàñĝé šéţ šéţţļéđ, àñđ ƃéƒöŕé îţš
çöḿḿîţ, ŕéƒüšéš ţĥé çĥàñĝé šéţ doc_changed ŵîţĥ ñöţĥîñĝ ļàñđéđ.
Ţĥé þŕöĵéçţöŕ ƒöļđš éàçĥ šüƃĵéçţ'š ŵŕîţéš îñţö ţŵö ţàƃļéš öƒ ţĥé çöñţéẋţ
šţöŕé: edition_head, öñé ŕöŵ þéŕ ƃļöçķ öƒ éàçĥ ķéþţ éđîţîöñ (ŕéṽîšîöñ, ŕüñš
îñļîñé üþ ţö 16 ĶîƂ àñđ îñ ţĥéîŕ ƃļöƃ àƃöṽé, šţàţüš, öŕîĝîñ, ƃàšîš, šţàḿþ), àñđ
edition_subject_head, öñé ŕöŵ þéŕ šüƃĵéçţ (ţĥé öþéŕàţîöñ îţš ĥéàđ îš àţ, ţĥé
ļàţéšţ öþéŕàţîöñ ƒöļđéđ, àñđ ţĥé ŵŕîţéš ţĥàţ đîđ ñöţ àđṽàñçé îţ). Ţĥé ƒöļđ ŕéàđš
à šüƃĵéçţ'š ŵŕîţéš îñ îđ öŕđéŕ. À ŵŕîţé àđṽàñçéš ţĥé ĥéàđ ŵĥéñ îţ ŵàš šţàĝéđ öñ
ţĥé ĥéàđ îţ ƒîñđš ţĥéŕé (îţš ƃàšé); öţĥéŕŵîšé îţ îš đîṽéŕĝéñţ àñđ çĥàñĝéš
ñöţĥîñĝ. Ţŵö ḿàçĥîñéš ţĥàţ ŵŕöţé öñé éđîţîöñ ƒŕöḿ öñé ĥéàđ ţĥéŕéƒöŕé ŕéàçĥ ţĥé
šàḿé ĥéàđ àƒţéŕ ţĥéîŕ ļöĝš ḿéŕĝé, ŵĥîçĥéṽéŕ ļöĝ ŕéçéîṽéđ ŵĥîçĥ ŵŕîţé ƒîŕšţ: à
ŵŕîţé ţĥàţ àŕŕîṽéš ŵîţĥ àñ îđ ƃéƒöŕé ţĥé ļàţéšţ öñé ƒöļđéđ ḿàķéš ţĥé þŕöĵéçţöŕ
ƒöļđ ţĥé šüƃĵéçţ àĝàîñ ƒŕöḿ éṽéŕý ŵŕîţé ţĥé ļöĝ ĥöļđš ƒöŕ îţ. À þüļļ ţĥéñ
ŕéƃàšéš (Projector.RebaseWorkspace, çàļļéđ ƃý ţĥé þŕöĵéçţöŕ'š šýñçéŕ
àƒţéŕ îţ àþþļîéš ŵĥàţ à þüļļ ḿéŕĝéđ): à đîṽéŕĝéñţ ŵŕîţé éàçĥ öƒ ŵĥöšé ƃļöçķš
šţîļļ ĥöļđš ţĥé ŕéṽîšîöñ îţ šţàŕţéđ ƒŕöḿ, ţĥé çöḿḿöñ çàšé ƒöŕ ŵŕîţéš ţö
đéŕéñţ ƃļöçķš, îš àþþļîéđ öñţö ţĥé ĥéàđ àš à ñéŵ content.edit ñàḿîñĝ îţ àš
îţš çàüšé, àđđŕéššéđ šö ţĥàţ ţŵö ḿàçĥîñéš ŕéƃàšîñĝ öñé ŵŕîţé öñţö öñé ĥéàđ ḿàķé
öñé öþéŕàţîöñ. À đîṽéŕĝéñţ ŵŕîţé ţĥàţ çĥàñĝéđ à ƃļöçķ ţĥé ĥéàđ ĥàš ḿöṽéđ šîñçé
îš à çöñƒļîçţ, ŵĥîçĥ kapi status ñàḿéš àñđ Ķàþî Đéšķţöþ šĥöŵš ŵîţĥ ƃöţĥ
ŵöŕđîñĝš (Š-02). À þéŕšöñ'š öŕ àñ àĝéñţ'š
ŵŕîţé ţĥàţ àđṽàñçéš ţĥé ĥéàđ šéţţļéš ţĥé çöñƒļîçţ ƒöŕ éṽéŕý ƃļöçķ îţ ŵŕîţéš,
šîñçé îţ ŵàš ḿàđé ŵîţĥ ţĥé çöñƒļîçţ îñ ṽîéŵ, àñđ à ŕéƃàšé çàŕŕîéš öṽéŕ öñļý ţĥé
ƃļöçķš à çöñƒļîçţ šţîļļ ļîšţš. Ķééþîñĝ ţĥé ŵöŕđîñĝ ţĥé ĥéàđ ĥöļđš îš šüçĥ à
ŵŕîţé ţöö: à set_content ţĥàţ ļéàṽéš à çöñţéšţéđ ƃļöçķ àš îţ šţàñđš, šéñţ ƃý
à þéŕšöñ öŕ àñ àĝéñţ, îš ŕéçöŕđéđ ŕàţĥéŕ ţĥàñ ŕéþöŕţéđ üñçĥàñĝéđ àñđ ñöţĥîñĝ
ḿöŕé (change.ContestedSession). À đéļîṽéŕý'š ŕéļéàšé öƒ ţĥé ŵĥöļé éđîţîöñ
šéţţļéš éṽéŕý çöñƒļîçţ öñ îţ.
Ţĥé ŕéçîþé þîçķš àñ éđîţîöñ'š ĥöḿé. Ţĥé ƒîļé ĥöḿé ŕéàçĥéš ţĥé ŵöŕķšþàçé ĥöḿé
ţĥŕöüĝĥ à ķééþéŕ (filehome.Keeper): üñđéŕ on-converge à ţŕàñšļàţîöñ ŵĥöšé
ƒîļé đöéš ñöţ éẋîšţ ļîṽéš îñ ţĥé ŵöŕķšþàçé ĥöḿé ŵĥéţĥéŕ öŕ ñöţ ţĥé ŵöŕķšþàçé
ĥöļđš àñýţĥîñĝ öƒ îţ ýéţ, šö à çĥàñĝé šéţ ñéṽéŕ đéļîṽéŕš à ƒîļé ţĥé šĥîþ ĝàţé
ŵîţĥĥöļđš; üñđéŕ manual îţ îš ŵŕîţţéñ ţö îţš ƒîļé, üñļéšš ţĥé ŵöŕķšþàçé šţîļļ
ķééþš à đŕàƒţ öƒ îţ. Îţš ŕéàđš àñđ çĥàñĝé šéţš ĝö ţĥŕöüĝĥ ţĥé ķééþéŕ ŵîţĥ
if_match ļîķé àñý éđîţîöñ (É-09).
Öñçé ţĥé éđîţîöñ'š ƒîļé éẋîšţš, ţĥé ƒîļé îš îţš ĥöḿé àñđ ţĥé ŵöŕķšþàçé'š çöþý
îš ñéṽéŕ ŕéàđ öŕ ŵŕîţţéñ ţĥéŕé, àñđ à ĝàţéđ ŕüñ ķééþš ñö đŕàƒţ öƒ à
ţŕàñšļàţîöñ ŵĥöšé ƒîļé éẋîšţš, šö ţĥé ŵöŕķšþàçé ñéṽéŕ ƃéçöḿéš à šéçöñđ çöþý öƒ
ƒîļé-ƃàçķéđ çöñţéñţ.
Éṽéŕý đéļîṽéŕý (kapi merge, öŕ kapi up ƒöŕ à ļöçàļé ţĥàţ çļéàŕéđ îţš ĝàţé)
ŵŕîţéš ţĥé ƒîļé ƒŕöḿ ŵĥàţ ţĥé ŵöŕķšþàçé ķééþš, ŵîţĥ ţĥé ƃàšîš éàçĥ đŕàƒţ ŵàš
ḿàđé ƒŕöḿ, àñđ ţĥéñ ŕéļéàšéš ƒŕöḿ ţĥé ŵöŕķšþàçé ĥöḿé ŵĥàţ îţ ŕéàđ ţĥéŕé, à
content.edit ţĥàţ ŕéḿöṽéš éàçĥ ƃļöçķ. Ţĥé ŕéļéàšé éẋþéçţš ţĥé ĥéàđ ţĥé
đéļîṽéŕý ŕéàđ, šö àñ éđîţ ţĥàţ ļàñđš îñ ƃéţŵééñ îš đéļîṽéŕéđ ƃý ŕéàđîñĝ àĝàîñ
ŕàţĥéŕ ţĥàñ ŕéļéàšéđ üñŕéàđ. À ŕüñ ţĥàţ đéļîṽéŕš à ļöçàļé ƒîŕšţ ŕéþļàçéš ţĥé
đŕàƒţš ţĥé ŵöŕķšþàçé ķéþţ ƒŕöḿ àñ éàŕļîéŕ ŕüñ ŵîţĥ îţš öŵñ, šö ŵĥàţ îţ ŵŕîţéš
öñ ţöþ öƒ ţĥé ŕüñ'š đŕàƒţš îš ţĥé ŵöŕđîñĝ à þéŕšöñ öŕ àñ àĝéñţ ĝàṽé ţĥé
ļöçàļé, ñéṽéŕ à đŕàƒţ öƒ à šöüŕçé ţĥàţ ĥàš çĥàñĝéđ šîñçé.
À ţŕàñšļàţîöñ'š ƒîļé çàñ àļšö àþþéàŕ ƃý àñöţĥéŕ þàţĥ: à þéŕšöñ ŵŕîţéš îţ,
kapi pull öŕ à çĥéçķöüţ ƃŕîñĝš îţ, öŕ à ŕéçîþé šŵîţçĥéđ ţö manual ĥàš îţš
þàšš ŵŕîţé îţ ƒŕöḿ ţĥé ƒļöŵ'š đŕàƒţš. Ţĥé éñđ öƒ éṽéŕý ŕüñ šéţţļéš šüçĥ àñ
éđîţîöñ: ţĥé ŵöŕķšþàçé ŕéļéàšéš éàçĥ ƃļöçķ ţĥé ƒîļé àļŕéàđý ĥöļđš àñđ éàçĥ
đŕàƒţ à ţööļ ḿàđé, ŵĥîçĥ ţĥé ƒîļé šüþéŕšéđéš, àñđ ķééþš ţĥé ŵöŕđîñĝ à þéŕšöñ öŕ
àñ àĝéñţ ŵŕöţé ţĥàţ ţĥé ƒîļé đöéš ñöţ ĥöļđ. kapi status ļîšţš ţĥàţ ŵöŕđîñĝ
àš à çöñƒļîçţ, àñđ kapi merge ŵŕîţéš îţ îñţö ţĥé ƒîļé. À þéŕšöñ đéçîđîñĝ îţ îñ
Ķàþî Đéšķţöþ ŵŕîţéš ţĥé çĥöšéñ ŵöŕđîñĝ îñţö ţĥé ƒîļé ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé
ŵĥéñ îţ îš ñöţ ţĥé ƒîļé'š, àñđ ţĥé ŵöŕķšþàçé ţĥéñ ŕéļéàšéš îţš çöþý
(host.ReleaseKeptWording).
Ţĥé ŵöŕķšþàçé ĥöḿé àļšö ķééþš ŵĥöļé đöçüḿéñţš: à ñàţîṽé đöçüḿéñţ öþéñéđ
ƒöŕ éđîţîñĝ ţĥàţ ĥàš ñö ƒîļé öƒ îţš öŵñ, šüçĥ àš à šöüŕçé à .kpz çàŕŕîéš.
Éàçĥ îš à ŕöŵ öƒ document_head (ķéý, ŕéṽîšîöñ, ƒöŕḿàţ, ţĥé ƃļöƃ ĥöļđîñĝ îţš
ƃýţéš, àñđ ţĥé öþéŕàţîöñ îţš ĥéàđ îš àţ), ƒöļđéđ ƒŕöḿ content.edit öþéŕàţîöñš
ŵĥöšé šüƃĵéçţ îš ţĥé đöçüḿéñţ (workhome.DocumentSubject) ƃý ţĥé ŕüļé ţĥé
éđîţîöñ ĥéàđš ƒöļļöŵ: à ŵŕîţé šţàĝéđ öñ ţĥé ĥéàđ àđṽàñçéš îţ, àñđ àñý öţĥéŕ îš
đîṽéŕĝéñţ. À çĥàñĝé ŕéàđš ţĥé đöçüḿéñţ àţ îţš ĥéàđ ţĥŕöüĝĥ îţš ƒöŕḿàţ, àþþļîéš
ţĥé öþéŕàţîöñš, ŵŕîţéš îţ ţĥŕöüĝĥ ţĥé šàḿé ƒöŕḿàţ, àñđ çöḿḿîţš ƃý à
çöñđîţîöñàļ ŕéçöŕđ öƒ ţĥé ñéŵ ƃýţéš (workhome.Documents). Ţĥé ţàƃļé îš à
þŕöĵéçţîöñ ļîķé ţĥé öţĥéŕš: à ŕéƃüîļđ ŕéþļàýš îţ àñđ à çĥéçķþöîñţ çàŕŕîéš îţ.
Đéļéţîñĝ đéŕîṽéđ đàţà
Ţĥé þàŕšé çàçĥé, éẋţŕàçţîöñ ƃàţçĥéš, çöļļéçţîöñ öṽéŕļàýš àñđ store.db çàñ ƃé
ŕéƃüîļţ ƒŕöḿ çöñţéñţ ƒîļéš. À ĥéļđ-ƃàçķ ļöçàļé'š đŕàƒţš àŕé ķéþţ îñ ţĥé ŵöŕķšþàçé
ĥöḿé, šö đéļéţîñĝ .kapi/work/ ļöšéš ñöñé öƒ ţĥéḿ: ţĥé ñéẋţ kapi up ŵŕîţéš ţĥé
öṽéŕļàýš à þŕöđüçéŕ šéŕṽéš ţĥéḿ ƒŕöḿ ƃàçķ îñţö ţĥé ƃļöçķ šţöŕé ƒŕöḿ ţĥé šţàḿþš
ţĥé ŵöŕķšþàçé ĥöḿé ķééþš, àñđ ţĥé þàšš çàļļš ñö þŕöṽîđéŕ ƒöŕ ţĥéḿ. À đŕàƒţ à
þéŕšöñ öŕ àñ àĝéñţ ĥàš éđîţéđ šîñçé îš ŕéšţöŕéđ ƒŕöḿ ţĥé ļàţéšţ đŕàƒţ à
þŕöđüçéŕ ŵŕöţé ƒöŕ îţ, ŵĥîçĥ ţĥé ļöĝ ķééþš, šö ţĥé þŕöđüçéŕ šéŕṽéš ţĥàţ đŕàƒţ
àñđ ţĥé éđîţ šţàýš ķéþţ. Ŵĥàţ ñö šöüŕçé ŕéþŕöđüçéš šîţš ƃéšîđé work/: ţĥé
ŕéđàçţîöñ ṽàüļţ àţ .kapi/vault/, ŵĥîçĥ ĥöļđš ŵîţĥĥéļđ öŕîĝîñàļš ţĥàţ àŕé
ñéîţĥéŕ çöḿḿîţţéđ ñöŕ šéñţ ţö à šéŕṽîçé, àñđ à ṽéñüé'š šýñç šţàţé àţ
.kapi/sync/. Đéļéţîñĝ ţĥé ṽàüļţ ļöšéš ţĥöšé ṽàļüéš, îñ ķéþţ đŕàƒţš ţöö
(Ç-10).
Ţĥé çöñţéẋţ šţöŕé ĥàš à šéþàŕàţé ļîƒéţîḿé îñ ţĥé ŵöŕķšþàçé. Đéļéţîñĝ
<DataDir>/workspaces/ ŕéḿöṽéš ţĥé ţéŕḿš, ṽöîçé þŕöƒîļéš, çöñţéñţ ḿéḿöŕý,
đéçîšîöñš, ƃļöçķ ĥîšţöŕý àñđ ķéþţ đŕàƒţš öƒ éṽéŕý ļöçàļ þŕöĵéçţ ţĥàţ ñö
ƃàçķéñđ ĥöļđš. Þüšĥ éàçĥ þŕöĵéçţ ţö
îţš ƃàçķéñđ, öŕ ŵŕîţé îţ ţö à ţŕàñšƒéŕ ƒîļé ŵîţĥ kapi store export, ƃéƒöŕé
đéļéţîñĝ ţĥé ŵöŕķšþàçé.
Ļöçàļéš àŕé ķéýéđ çàñöñîçàļļý
Éṽéŕý šüƃšýšţéḿ ķéýš îţš ŕöŵš ƃý ţĥé çàñöñîçàļ ƂÇÞ-47 ļöçàļé ƃéšîđé ţĥé ţéẋţ:
ţĥé çöñţéñţ ḿéḿöŕý'š ṽàŕîàñţš (Ç-09), ţĥé ţéŕḿš
šţöŕé'š ţéŕḿš (Ç-08), ţĥé ƃļöçķ çàçĥé'š targets/<locale>
öṽéŕļàýš àñđ îţš block_texts ŕöŵš. Ţĥé šţöŕéš àþþļý locale.Normalize öñ
éṽéŕý ŵŕîţé, ŕéàđ àñđ ļîšţ, šö à þŕöđüçéŕ ŵŕîţîñĝ targets/nb_NO àñđ à ŕéàđéŕ
àšķîñĝ ƒöŕ targets/nb-NO àđđŕéšš öñé öṽéŕļàý. Ŕöŵš à šţöŕé ŵŕöţé ƃéƒöŕé îţ
ñöŕḿàļîžéđ ļöçàļéš àŕé ķéýéđ ƃý ŵĥàţéṽéŕ šþéļļîñĝ ţĥé ŕéçîþé üšéđ ţĥéñ, àñđ ñö
ļööķüþ ƒîñđš ţĥéḿ àĝàîñ; projectdb.NonCanonicalLocales ŕéþöŕţš ţĥéḿ àçŕöšš ƃöţĥ
þööļš ŵîţĥ ţĥé þööļ éàçĥ ŕöŵ îš îñ, àñđ kapi status àñđ kapi up þŕîñţ ţĥé
ŕéþöŕţ öñçé ŵîţĥ ţĥé ŕéḿéđý ƒöŕ ţĥàţ þööļ ñàḿéđ.
Ţĥé ţŵö þööļš ţàķé đéŕéñţ ŕéḿéđîéš, ƃéçàüšé à ŕöŵ îñ öñé îš đéŕîṽéđ àñđ à
ŕöŵ îñ ţĥé öţĥéŕ îš àüţĥöŕéđ. Ţĥé þŕöĵéçţîöñ îš à ŕéàđîñĝ öƒ ţĥé ŵöŕķîñĝ ţŕéé,
šö đéļéţîñĝ ţĥé đàţàƃàšé àñđ ŕüññîñĝ kapi up đéŕîṽéš éṽéŕý ŕöŵ îñ îţ àĝàîñ.
Ţĥé çöñţéẋţ šţöŕé îš à þŕöĵéçţîöñ öƒ ţĥé öþéŕàţîöñ ļöĝ, àñđ ţĥé šţöŕéš
ñöŕḿàļîžé àš ţĥéý ŵŕîţé, šö kapi store rebuild ŵŕîţéš îţš ŕöŵš àĝàîñ üñđéŕ
ţĥé çàñöñîçàļ šþéļļîñĝ.
Þŕéšéñçé îš ţàƃļé-ļéṽéļ
Àñ éḿþţý šüƃšýšţéḿ îñšîđé àñ éẋîšţîñĝ đàţàƃàšé ƃéĥàṽéš éẋàçţļý àš àñ àƃšéñţ
šţöŕé đöéš. À đàţàƃàšé'š éẋîšţéñçé îš ñöţ à šîĝñàļ, šö ñöţĥîñĝ ĥàš ţö ĝüàŕđ
àĝàîñšţ à ƒîļé ƃéîñĝ ţĥéŕé: ţĥé ţéŕḿîñöļöĝý ĝàţé éñƒöŕçéš ñöţĥîñĝ öñ à þŕöĵéçţ
ŵĥöšé ţéŕḿš ţàƃļéš àŕé éḿþţý (Ç-08), kapi up --plan ñéṽéŕ
çŕéàţéš šţàţé, àñđ kapi pack
çàŕŕîéš öñļý ñöñ-éḿþţý þàŕţš
(Ḿ-06). projectdb.DB.DetectStoreDrift
ŕéàđš "šţöŕé ḿîššîñĝ" àš ţĥé ƃļöçķ çàçĥé ĥöļđš ñö ƃļöçķš, ñöţ àš ţĥé ƒîļé îš
àƃšéñţ.
Ţĥé ĝŕàþĥ ŕéļàţéš ţĥé šüƃšýšţéḿš
graph_nodes àñđ graph_edges àŕé à þŕöþéŕţý ĝŕàþĥ: ļàƃéļļéđ ñöđéš àñđ
ļàƃéļļéđ, öþţîöñàļļý ţîḿé-ƃöüñđéđ éđĝéš, ƃöţĥ çàŕŕýîñĝ ĴŠÖÑ þŕöþéŕţîéš.
core/contextgraph öŵñš ţĥé ṽöçàƃüļàŕý: ţĥé ļàƃéļš, ţĥé šçöþé ţüþļé, ţĥé îđ
šçĥéḿé, àñđ ţĥé ñöđé àñđ éđĝé çöñšţŕüçţöŕš éṽéŕý ŵŕîţéŕ çàļļš.
Ñöđé ļàƃéļš:
| Ļàƃéļ | Ŵĥàţ îţ îš | Šçöþé |
|---|---|---|
block | à üñîţ öƒ šöüŕçé çöñţéñţ, ķéýéđ ƃý îţš çöñţéñţ ķéý | îñšţàñçé |
collection | à çöñţéñţ çöļļéçţîöñ, ķéýéđ ƃý îţš ļàƃéļ | îñšţàñçé |
unit_state | ţĥé đéçîšîöñ šţàţé öƒ öñé ƃļöçķ îñ öñé đöçüḿéñţ, ƒöŕ öñé éđîţîöñ | îñšţàñçé |
concept | à ţéŕḿîñöļöĝý çöñçéþţ | ṽöçàƃüļàŕý |
coordinate | à þöîñţ öñ ţĥé šţŕüçţüŕàļ àẋéš, à (profile, channel) þàîŕ | ṽöçàƃüļàŕý |
Ţĥé çööŕđîñàţé ñöđé îš ţĥé šţŕüçţüŕàļ þàîŕ öñļý. À çöļļéçţîöñ'š đéçļàŕéđ àẋéš
(ƃŕàñđ, ḿöđé, àñđ ŵĥàţéṽéŕ éļšé à ŕéçîþé ñàḿéš üñđéŕ coordinates:) ţŕàṽéļ öñ
îţš çöñţéẋţ éñţŕý öṽéŕ ţĥé ŵîŕé àñđ àŕé ƒöļđéđ îñţö ţĥàţ éñţŕý'š ĥàšĥ
(Ç-02); ţĥéý àŕé ñöţ þŕöþéŕţîéš öƒ ţĥé
çööŕđîñàţé ñöđé, àñđ ţĥé ĝŕàþĥ'š çööŕđîñàţé ǫüéŕîéš ţàķé ţĥé þŕöƒîļé àñđ ţĥé
çĥàññéļ.
Éđĝé ļàƃéļš:
| Ļàƃéļ | Ŕéļàţéš | Çàŕŕîéš |
|---|---|---|
uses_term | ƃļöçķ → çöñçéþţ | ţĥé ţéŕḿ üšéđ, îţš šţàţüš, ţĥé ļöçàļé, ţĥé đöçüḿéñţ, à üšé çöüñţ, àñđ ţĥé ţéŕḿ'š öŵñ ṽàļîđîţý ŵîñđöŵ |
in_collection | ƃļöçķ → çöļļéçţîöñ | ḿéḿƃéŕšĥîþ |
governed_by | çöļļéçţîöñ → çööŕđîñàţé | ţĥé ĝöṽéŕñîñĝ þŕöƒîļé'š ṽàļîđîţý ŵîñđöŵ |
blesses | üñîţ šţàţé → ƃļöçķ | ţĥé þàîŕîñĝ ţĥé đéçîšîöñ ŵàš ŵŕîţţéñ àĝàîñšţ: ţĥé ţŕàñšļàţîöñ àñđ ţĥé šöüŕçé ƃàšîš, ƃý ŕéṽîšîöñ ŵĥéŕé ţĥé đéçîšîöñ çàŕŕîéš ţĥéḿ àñđ ƃý ĥàšĥ |
host.MaterializeContextGraphInDB ŵŕîţéš àļļ ƒöüŕ öñ ţĥé çöñṽéŕĝéñçé þàţĥ,
àƒţéŕ éẋţŕàçţîöñ çöḿḿîţš îţš ƃļöçķ-ŵŕîţé ţŕàñšàçţîöñ. Ţĥé šüƃĝŕàþĥ îš à þüŕé
þŕöĵéçţîöñ: éàçĥ þàšš çļéàŕš ŵĥàţ îţ îš éñţîţļéđ ţö, ķéýéđ ƃý îţš öŵñ šçöþé
ţüþļé, àñđ ŕéƃüîļđš îţ, šö šéṽéŕàļ þŕöĵéçţš' šüƃĝŕàþĥš çöéẋîšţ îñ öñé
workspace.db ŵîţĥöüţ à þàšš ŕéàçĥîñĝ àñöţĥéŕ þŕöĵéçţ'š ŕöŵš. Öççüŕŕéñçé éđĝéš
çöḿé ƒŕöḿ à ţéŕḿ šéàŕçĥ öṽéŕ ţĥé ƃļöçķ çàçĥé (core/occurrence), ŵĥéŕé ŕéþéàţéđ
üšéš öƒ öñé ţéŕḿ îñ öñé ƃļöçķ ƒöļđ îñţö à count þŕöþéŕţý ŕàţĥéŕ ţĥàñ îñţö
šéþàŕàţé éđĝéš, àñđ ţĥé ţéŕḿ àñđ ţĥé ļöçàļé àŕé ţĥé éđĝé đîšçŕîḿîñàţöŕš;
governed_by çöḿéš ƒŕöḿ ŕéšöļṽîñĝ éàçĥ ñàḿéđ çöļļéçţîöñ'š ĝöṽéŕñàñçé; blesses
ĵöîñš ţĥé đéçîšîöñ ļéđĝéŕ àĝàîñšţ ţĥé ƃļöçķ çàçĥé, šö à ŕéçöŕđ ŵĥöšé ƃļöçķ
ĥàš ļéƒţ ţĥé çàçĥé ķééþš îţš ñöđé àñđ ļöšéš îţš éđĝé. À üñîţ šţàţé ñàḿéš îţš
đöçüḿéñţ ƃý ţĥé đüŕàƃļé ķéý ţĥé ļéđĝéŕ'š ṽîéŵ ŕéçöŕđš
(Ç-04); ţĥé ĝŕàþĥ ŵŕîţéŕ ţüŕñš ţĥàţ ķéý ƃàçķ
îñţö ţĥé þàţĥ ţĥé ƃļöçķ çàçĥé ƒîļéš ƃļöçķš üñđéŕ ƃéƒöŕé ĵöîñîñĝ.
Ţĥé ţéŕḿ îš à đîšçŕîḿîñàţöŕ ƃéçàüšé à çöñçéþţ ĥöļđš šéṽéŕàļ šþéļļîñĝš àñđ à þŕöĵéçţ ŕéàçĥéš ƒöŕ öñé öƒ ţĥéḿ: à ƃļöçķ šţîļļ šàýîñĝ ţĥé đéþŕéçàţéđ ŵöŕđ îš à đéŕéñţ ƒîñđîñĝ ƒŕöḿ öñé šàýîñĝ ţĥé þŕéƒéŕŕéđ ŵöŕđ, àñđ ƒöļđîñĝ ƃöţĥ öñţö öñé éđĝé ŵöüļđ ļéàṽé ţĥé ĝŕàþĥ ŵîţĥ à šţàţüš ţö çĥööšé ƃéţŵééñ. Šö ţĥé éđĝé ŕéçöŕđš ţĥé šţàţüš öƒ ţĥé ţéŕḿ îţ ñàḿéš, àñđ çàŕŕîéš ţĥàţ ţéŕḿ'š öŵñ ŵîñđöŵ, ŵĥîçĥ îš ŵĥàţ ḿàķéš îš ţĥîš đîšçöüŕàĝéđ àñšŵéŕàƃļé àš îš îţ đîšçöüŕàĝéđ ĥéŕé. Ţĥé šţàñđîñĝ îš à þŕöþéŕţý öƒ ţĥé çöñçéþţ àţ à çööŕđîñàţé, ñéṽéŕ öƒ ţĥé ŵöŕđ: ţĥé šàḿé ƃļöçķ àñšŵéŕš đéŕéñţļý ƃéƒöŕé àñđ àƒţéŕ à đéþŕéçàţîöñ đàţé, àñđ îñšîđé ţĥé ḿàŕķéţ à đéþŕéçàţîöñ ŕéàçĥéš ṽéŕšüš öüţšîđé îţ.
Ţĥé governed_by éđĝé îš ŵĥéŕé ĝöṽéŕñàñçé šţöþš ƃéîñĝ ŕé-đéŕîṽéđ. Îţ çàŕŕîéš ţĥé
šàḿé ĥàļƒ-öþéñ ṽàļîđîţý ŵîñđöŵ ţĥé ŕéçîþé đéçļàŕéš
(Ç-02), šö ŵĥàţ ĝöṽéŕñéđ ĥéŕé öñ ţĥàţ
đàţé îš àñšŵéŕéđ ƃý ţĥé ĝŕàþĥ üñđéŕ ţĥé šàḿé ţéḿþöŕàļ ḿöđéļ, ñöţ ƃý à šéçöñđ
îḿþļéḿéñţàţîöñ öƒ ţĥé ļàđđéŕ.
Ñöđé îđéñţîţý çàŕŕîéš ţĥé šçöþé ţüþļé
Àñ îđ îš <label>:<workspace>/<project>/<stream>:<local>, ŵîţĥ ţĥé šéþàŕàţöŕš
þéŕçéñţ-éšçàþéđ îñšîđé éàçĥ çöḿþöñéñţ šö ţŵö đéŕéñţ ţüþļéš çàñ ñéṽéŕ ŕéñđéŕ ţö
öñé îđ. Ţĥé šçöþé šéĝḿéñţ îš àļŵàýš ţĥŕéé ƒîéļđš, šö îţ šàýš ŵĥîçĥ đîḿéñšîöñš ţĥé
ñöđé îš ǫüàļîƒîéđ ƃý ŕàţĥéŕ ţĥàñ ļéàṽîñĝ ţĥàţ ţö ƃé îñƒéŕŕéđ ƒŕöḿ ţĥé ļàƃéļ.
Ţŵö ķîñđš öƒ ñöđé, àñđ ţĥé šþļîţ đéçîđéš ŵĥàţ çàñ ƃé àšķéđ:
- Ṽöçàƃüļàŕý ñöđéš (çöñçéþţš, çööŕđîñàţéš) đŕöþ ţĥé îñšţàñçé đîḿéñšîöñš. Öñé çöñçéþţ îš öñé ñöđé ĥöŵéṽéŕ ḿàñý þŕöĵéçţš üšé îţ, ŵĥîçĥ îš ŵĥàţ ḿàķéš ŵĥîçĥ þŕöĵéçţš üšé ţĥîš çöñçéþţ à ţŵö-ĥöþ ţŕàṽéŕšàļ îñšţéàđ öƒ à ĵöîñ àçŕöšš þŕöĵéçţ ƃöüñđàŕîéš. À çööŕđîñàţé îš ṽöçàƃüļàŕý ƒöŕ ţĥé šàḿé ŕéàšöñ: à šéţ öƒ þŕöĵéçţš ƃîñđš ţö öñé çööŕđîñàţé ṽöçàƃüļàŕý ŕàţĥéŕ ţĥàñ éàçĥ îñṽéñţîñĝ îţš öŵñ.
- Îñšţàñçé ñöđéš (ƃļöçķš, çöļļéçţîöñš, üñîţ šţàţéš) çàŕŕý
(project, stream). Ţŵö þŕöĵéçţš'docsçöļļéçţîöñš àŕé ţŵö ñöđéš. Ţŵö þŕöĵéçţš ĥöļđîñĝ îđéñţîçàļ ŵöŕđîñĝ ĥöļđ ţŵö ƃļöçķ ñöđéš çàŕŕýîñĝ ţĥé šàḿé çöñţéñţ ķéý, àñđ šàḿé ŵöŕđîñĝ îš à çöñţéñţ-ķéý éǫüàļîţý ǫüéŕý: öñé šĥàŕéđ ñöđé ŵöüļđ šàý ţĥé ţŵö îñšţàñçéš àŕé ĝöṽéŕñéđ ţöĝéţĥéŕ, àñđ àñ îñšţàñçé šîţš šöḿéŵĥéŕé.
Ţĥîš îš ŵĥàţ ļéţš öñé workspace.db ĥöļđ éṽéŕý þŕöĵéçţ'š šüƃĝŕàþĥ: ţĥé þŕöĵéçţ
đîḿéñšîöñ îš îñ ţĥé îđ, šö ţĥé þàšš ţĥàţ ŕéƃüîļđš öñé þŕöĵéçţ'š ŕöŵš ñàḿéš ţĥéḿ
àñđ ŕéàçĥéš ñöţĥîñĝ éļšé.
Đîḿéñšîöñš àŕé ƒîéļđš, ñöţ çöñţàîñḿéñţ éđĝéš. Éṽéŕý ñöđé çàŕŕîéš ţĥé ñöñ-éḿþţý çöḿþöñéñţš öƒ îţš šçöþé ţüþļé àš þŕöþéŕţîéš àš ŵéļļ àš îñ îţš îđ, šö šļîçîñĝ à ṽîéŵ ƃý þŕöĵéçţ öŕ šţŕéàḿ îš à ƒîļţéŕ ŕàţĥéŕ ţĥàñ à ţŕàṽéŕšàļ. Àñ éḿþţý đîḿéñšîöñ îš ŵŕîţţéñ àš àñ àƃšéñţ ķéý ŕàţĥéŕ ţĥàñ àñ éḿþţý šţŕîñĝ, ƃéçàüšé à þŕöþéŕţý ƒîļţéŕ çöḿþàŕéš àĝàîñšţ à ṽàļüé àñđ àƃšéñçé îš ñöţ ţĥé éḿþţý šţŕîñĝ. Ļöçàļļý ţĥé ŵöŕķšþàçé đîḿéñšîöñ îš àƃšéñţ, ŵĥîçĥ îš çöŕŕéçţ: ţĥé îḿþļîçîţ ŵöŕķšþàçé îš ţĥîš ḿàçĥîñé àççöüñţ'š àñđ ĥàš ñö ñàḿé ţö çàŕŕý. Ţĥéŕé îš ñö þŕöĵéçţ→þŕöĵéçţ éđĝé àñđ ţĥéŕé ŵîļļ ñöţ ƃé öñé: þŕöĵéçţš ŕéļàţé ƃý çö-öççüŕŕéñçé ţĥŕöüĝĥ ţĥé ṽöçàƃüļàŕý ţĥéý šĥàŕé.
Ŵîţĥîñ à šçöþé, îđéñţîţý îš đüŕàƃļé: à ƃļöçķ îš îţš çöñţéñţ ķéý (Ƒ-03), àñđ à üñîţ šţàţé îš îţš đöçüḿéñţ, ƃļöçķ àñđ éđîţîöñ (ţĥé ļéđĝéŕ'š üñîţ àñđ ṽàŕîàñţ), ñöţ à ŕéàđéŕ'š þöšîţîöñàļ îđ, šö à ŕé-þàŕšé ţĥàţ ŕéñüḿƃéŕš à đöçüḿéñţ ŕéŵŕîţéš ţĥé šàḿé ŕöŵš ŕàţĥéŕ ţĥàñ öŕþĥàñîñĝ ţĥéḿ. Ţĥé đöçüḿéñţ îš þàŕţ öƒ à üñîţ šţàţé'š îđéñţîţý ƒöŕ ţĥé ŕéàšöñ Ç-04 ĝîṽéš: à ƃļöçķ îđ îš üñîǫüé îñšîđé îţš đöçüḿéñţ àñđ ñöŵĥéŕé ŵîđéŕ, šö ŵîţĥöüţ îţ ţŵö þàĝéš öƒ öñé çöļļéçţîöñ àŕé öñé ñöđé àñđ ţĥé đéçîšîöñ ŵŕîţţéñ ļàšţ àñšŵéŕš ƒöŕ ƃöţĥ.
Çĥàñĝîñĝ à šçöþé ṽàļüé çĥàñĝéš ţĥé îđ, šö à ŕéñàḿé îš à đéţéŕḿîñîšţîç
ŕé-ķéý. Ţĥàţ îš šàƒé ƃéçàüšé à ŵŕîţéŕ çļéàŕš ţĥé šçöþé îţ îš àƃöüţ ţö ŵŕîţé îñ
ţĥé šàḿé þàšš: ñö ŕöŵ šüŕṽîṽéš üñđéŕ ţĥé öļđ ķéý. Ŵĥéŕé ţĥé þŕöĵéçţ đîḿéñšîöñ îš
ţĥé ŕéçîþé'š id:, à ŕéñàḿé đöéš ñöţ ţöüçĥ îţ àñđ ţĥé đîšþļàý ñàḿé ŕîđéš àš ţĥé
project_name þŕöþéŕţý.
Ƒîñđîñĝ à ţéŕḿ îñšîđé ƃļöçķš
Ţéŕḿ öççüŕŕéñçé ĥàš ţö šéàŕçĥ ţéẋţ ţĥàţ ļîṽéš îñšîđé à ĴŠÖÑ þàýļöàđ ñö ŠǪĻ çàñ
ŕéàđ, šö ţĥé ƃļöçķ çàçĥé ķééþš block_texts: à ŕöŵ þéŕ ƃļöçķ þéŕ ļöçàļé (ţĥé
šöüŕçé üñđéŕ ţĥé éḿþţý ļöçàļé, éàçĥ ţàŕĝéţ üñđéŕ îţš öŵñ) ŵîţĥ à çöñţéñţļéšš
ƑŢŠ5 ţŕîĝŕàḿ îñđéẋ öṽéŕ îţ. Ƃöţĥ ļîṽé îñ ţĥé þŕöĵéçţîöñ, ƃéšîđé ţĥé ƃļöçķš ţĥéý
đéšçŕîƃé.
Ţĥé îñđéẋ îš ƃüîļţ ƃéƒöŕé à šéàŕçĥ, ñöţ đüŕîñĝ à ŵŕîţé. Ḿàîñţàîñîñĝ îţ îñšîđé éṽéŕý ƃļöçķ ŵŕîţé çöšţš ŕöüĝĥļý šéṽéñ ţîḿéš ţĥé ŵŕîţé: éẋţŕàçţîöñ ŵŕîţéš éṽéŕý ƃļöçķ îñ ţĥé þŕöĵéçţ, ŵĥîçĥ îš ţöö ḿüçĥ ţö ļéṽý ƒöŕ à ǫüéŕý ţĥàţ ḿàý ñéṽéŕ ƃé àšķéđ. À ŵŕîţé öñļý ḿàŕķš ţĥé ƃļöçķ šţàļé, àñđ ţĥé ƒîŕšţ šéàŕçĥ ŕéçöñçîļéš éẋàçţļý ŵĥàţ çĥàñĝéđ. Ţĥé îñđéẋ šéļéçţš çàñđîđàţé ḿàţçĥéš; Ĝö çöđé ṽéŕîƒîéš ţĥéḿ. Ţĥé ƃŕöŵšéŕ ƃüîļđ üšéš ţĥé šàḿé ḿàţçĥéŕ ŵîţĥ à šçàñ îñšţéàđ öƒ àñ îñđéẋ.
kapi terms occurrences îš ţĥé šüŕƒàçé ţĥàţ ļîšţš üšéš ļîṽé ƒŕöḿ ţĥîš îñđéẋ,
ŵîţĥ ţĥéîŕ þöšîţîöñš. Ţĥé üšàĝé çöüñţ îš à đéŕéñţ ŕéàđîñĝ: kapi context search, ţĥé context_search ţööļ, ţĥé đéšķţöþ éẋþļöŕéŕ'š šéàŕçĥ àñđ ŕéļàţîöñš
þàñéš àñđ ţĥé þļàţƒöŕḿ'š çöñçéþţ þàĝé àļļ ŕéþöŕţ ĥöŵ öƒţéñ à ţéŕḿ îš üšéđ, àñđ
àļļ öƒ ţĥéḿ ŕéàđ îţ ƒŕöḿ ţĥé uses_term éđĝéš ţĥŕöüĝĥ contextgraph.UsesByProject
ŕàţĥéŕ ţĥàñ ĵöîñîñĝ ţĥé ţéŕḿš šţöŕé àĝàîñšţ ţĥé ƃļöçķ çàçĥé ŵĥéñ àšķéđ. Öñé
þŕöđüçéŕ ḿéàñš öñé ñüḿƃéŕ ŵĥéŕéṽéŕ ţĥé ǫüéšţîöñ îš àšķéđ, àñđ ƃéçàüšé ţĥàţ
þŕöđüçéŕ îš éẋţŕàçţîöñ, ţĥé ñüḿƃéŕ îš àš öƒ ţĥé ļàšţ éẋţŕàçţîöñ ŕàţĥéŕ ţĥàñ öƒ
ţĥé ŵöŕķîñĝ ţŕéé. Éàçĥ šüŕƒàçé šàýš šö ƃéšîđé ţĥé çöüñţ. Ţĥé þàššàĝé à üšé šîţš
îñ îš ŕéàđ ƒŕöḿ ţĥé ƃļöçķ çàçĥé ƃý ţĥé çöñţéñţ ķéý ţĥé éđĝé ñàḿéš, šö à ƃļöçķ
ḿîššîñĝ ƒŕöḿ ţĥé çàçĥé çöšţš ţĥé šñîþþéţ àñđ ñéṽéŕ ţĥé çöüñţ.
Ţĥé ǫüéŕý šĥàþéš àŕé ŵŕîţţéñ öñçé
À šţöŕé šþàññîñĝ ḿàñý þŕöĵéçţš àñšŵéŕš ţĥé šàḿé ǫüéšţîöñš ŵîţĥ ţĥé đîḿéñšîöñš
ƒŕéé; à ļöçàļ þŕöĵéçţ àñšŵéŕš ţĥéḿ ŵîţĥ ţĥé đîḿéñšîöñš þîññéđ ţö öñé ṽàļüé. Çöđé
éñƒöŕçéš îţ. Ţĥé ǫüéŕîéš ļîṽé îñ core/contextgraph/query.go
àĝàîñšţ ţŵö ñàŕŕöŵ ŕéàđ îñţéŕƒàçéš, EdgeReader àñđ NodeFinder, ţĥàţ ƃöţĥ
ƃàçķîñĝ šţöŕéš šàţý, šö ţĥéŕé îš öñé îḿþļéḿéñţàţîöñ:
| Ǫüéŕý | Ǫüéšţîöñ |
|---|---|
Uses | ţéŕḿ → ƃļöçķš → çöļļéçţîöñ, ƃý ţŕàṽéŕšàļ |
ProjectsUsingConcept | ŵĥîçĥ þŕöĵéçţš üšé ţĥîš çöñçéþţ |
UsesByProject | ĥöŵ ḿüçĥ öƒ îţ šîţš îñ éàçĥ, îñ ŵĥîçĥ ŵöŕđš, àñđ ĥöŵ îţ šţàñđš ţĥéŕé àţ ţĥîš þöîñţ |
CollectionsAtCoordinate | ŵĥàţ îš ĝöṽéŕñéđ àţ ţĥîš þöîñţ, àţ ţĥîš îñšţàñţ |
BlessingsOfBlock | ŵĥîçĥ đéçîšîöñ çöṽéŕš ţĥîš ƃļöçķ, àţ ŵĥîçĥ ƃàšîš |
BlocksWithContentKey | ŵĥö éļšé ĥöļđš ţĥîš šàḿé ŵöŕđîñĝ |
core/contextgraph/graphtest îš ţĥé šĥàŕéđ ǫüéŕý-šĥàþé šüîţé: öñé ƒîẋţüŕé öƒ ţŵö
þŕöĵéçţš šĥàŕîñĝ à çöñçéþţ, öñé ţàƃļé öƒ éẋþéçţéđ àñšŵéŕš, ŕüñ àĝàîñšţ éṽéŕý
šţöŕé ţĥàţ çļàîḿš ţö ĥöļđ ţĥîš ṽöçàƃüļàŕý. À ǫüéŕý àđđéđ ƒöŕ à ŵîđéŕ šçöþé îš
éẋþŕéššîƃļé àţ à ñàŕŕöŵéŕ öñé, àñđ à ļöçàļ ǫüéŕý đöéš ñöţ ĥàṽé ţö ƃé ŕéîñṽéñţéđ
ŵĥéñ ţĥé šçöþé ŵîđéñš.
Šçöþé ƒîļţéŕîñĝ îš öñé þŕéđîçàţé, Scope.Contains, ţŕéàţîñĝ àñ éḿþţý đîḿéñšîöñ
àš àñý, ŵĥîçĥ îš ĥöŵ ţĥé šàḿé çàļļ šéŕṽéš ƃöţĥ à þŕöĵéçţ-šçöþéđ šüŕƒàçé àñđ à
ŕöļļüþ àçŕöšš þŕöĵéçţš.
Ƃŕöŵšéŕ àñđ ŵàšḿ
Ţĥé ƃŕöŵšéŕ ƃüîļđ ŕüñš ţĥé šàḿé šţöŕéš. core/storage ĥàš à đŕîṽéŕ ƒöŕ éṽéŕý
ƃüîļđ, àñđ ţĥé ƃŕöŵšéŕ'š (core/storage/driver_js.go) ŕüñš ţĥé ŠǪĻ öñ ţĥé
öƒƒîçîàļ ŠǪĻîţé ŴéƃÀššéḿƃļý ƃüîļđ, ŕéàçĥéđ ţĥŕöüĝĥ à ƃŕîđĝé ţĥé þàĝé îñšţàļļš
ƃéƒöŕé ţĥé éñĝîñé šţàŕţš. Ţĥé ŵöŕķšþàçé, îţš öþéŕàţîöñ ļöĝ, ţĥé þŕöĵéçţöŕ, ţĥé
çöñţéñţ ḿéḿöŕý, ţĥé ţéŕḿš šţöŕé, ţĥé ṽöîçé šţöŕé, ţĥé đéçîšîöñ ļéđĝéŕ, ţĥé
çöñţéẋţ ĝŕàþĥ àñđ ţĥé ƃļöçķ çàçĥé àŕé ţĥé ñàţîṽé çöđé ţĥéŕé, à ļàƃ'š ŵŕîţéš
àŕé öþéŕàţîöñš îñ ţĥé ļöĝ, àñđ ţĥé þŕöĵéçţöŕ îš ţĥéîŕ öñé ŵŕîţéŕ. Ţĥé ŵöŕķšþàçé
šîţš üñđéŕ ţĥé éñĝîñé'š đàţà ŕööţ, /.kapi-data.
Ţĥé đŕîṽéŕ đéçļàŕéš ŵĥàţ îţ ĝîṽéš à šţöŕé îñ à þŕöƒîļé
(storage.DriverProfile): öñé çöññéçţîöñ þéŕ ƒîļé, ñö ŴÀĻ àñđ ñö ļöçķ àñöţĥéŕ
þŕöçéšš ĥöñöüŕš. Ţĥé éñĝîñé ŕüñš îñ à đéđîçàţéđ Ŵöŕķéŕ, ŵĥéŕé ţĥé đàţàƃàšéš àñđ
ţĥé éñĝîñé'š ƒîļéš ļîṽé îñ ţĥé öŕîĝîñ þŕîṽàţé ƒîļé šýšţéḿ (ŠǪĻîţé'š
opfs-sahpool ṼƑŠ) àñđ šüŕṽîṽé à ŕéļöàđ; öñé ţàƃ ĥöļđš ţĥéḿ, àñđ à þàĝé ţĥàţ
çàññöţ (àñöţĥéŕ ţàƃ ĥöļđš ţĥéḿ, öŕ ţĥé ƃŕöŵšéŕ ļàçķš ţĥé ÀÞÎ) ķééþš ţĥéḿ îñ
ḿéḿöŕý, àñđ ţĥé þŕöƒîļé ŕéþöŕţš đüŕàƃîļîţý àççöŕđîñĝļý. À ţàƃ ţàķéš ţĥé
ŵöŕķšþàçé öṽéŕ ƃý šţéàļîñĝ ţĥé Ŵéƃ Ļöçķ ţĥàţ ñàḿéš îţš öŵñéŕ; ţĥé öŵñéŕ'š
Ŵöŕķéŕ ļéàŕñš öƒ îţ ŵĥéñ îţš ļöçķ ŕéǫüéšţ îš ŕéĵéçţéđ, àñđ îţš þàĝé çàŕŕîéš öñ
îñ ḿéḿöŕý. Ţĥé ƃŕöŵšéŕ çöþý îš à çàçĥé öƒ ţĥé ļöĝ, šö à þàĝé éẋþöŕţš ţĥé
ŵöŕķšþàçé àš à .kpz àñđ îḿþöŕţš îţ ƃàçķ, à ţéŕḿš šţöŕé öüţšîđé éṽéŕý þŕöĵéçţ
ţŕàṽéļļîñĝ àš à ţéŕḿš ƃüñđļé, àñđ šýñçš à þŕöĵéçţ'š çöñţéẋţ ţĥŕöüĝĥ à ƒöļđéŕ
îţ ŵàš ĝîṽéñ, à workspace.Remote ŵîţĥ ţĥé ļàýöüţ FileRemote ķééþš. Àñ
öþéŕàţîöñ ĥéļđ öñļý ƃéƒöŕé îţš þŕöĵéçţ'š ŕéḿöṽàļ ƒŕöḿ ţĥé ŵöŕķšþàçé çöüñţš àš
ñöţ ĥéļđ, ŵĥîçĥ ļéţš à þŕöĵéçţ ƒöŕĝöţţéñ ƃý à ŕéšéţ ţàķé îţš ļöĝ ƃàçķ ƒŕöḿ à
þàçķàĝé öŕ à ŕéḿöţé. Ţŵö ŕüļéš ƒöļļöŵ ƒöŕ éṽéŕý šţöŕé, ñàţîṽéļý
ţöö. Ñö çöŕŕéçţñéšš ŕüļé đéþéñđš öñ à ŕéàđéŕ ŕüññîñĝ ƃéšîđé à ŵŕîţéŕ, àñđ ñö
çöđé ĥöļđš à ţŕàñšàçţîöñ öŕ öþéñ ŕöŵš öñ à þööļ àñđ ţĥéñ ŵàîţš ƒöŕ à šéçöñđ
šéššîöñ öñ ţĥé šàḿé þööļ; make test-stores-oneconn ŕüñš ţĥé šţöŕé šüîţéš
ñàţîṽéļý ŵîţĥ éṽéŕý þööļ ĥéļđ ţö öñé çöññéçţîöñ àñđ ŴÀĻ öƒƒ ţö ķééþ îţ šö. À
đàţàƃàšé ƒîļé ƃéļöñĝš ţö îţš đŕîṽéŕ, šö çöđé àšķš storage.Exists,
storage.Remove, storage.Rename àñđ storage.List àƃöüţ öñé ŕàţĥéŕ ţĥàñ ţĥé
ƒîļé šýšţéḿ. À ŠǪĻîţé ƒîļé ţĥé þàĝé'š ƒîļé šýšţéḿ ĥöļđš îš ŕéàđ îñţö ḿéḿöŕý ţĥé
ƒîŕšţ ţîḿé à šţöŕé öþéñš îţš þàţĥ. ƑŢŠ5
ŵöŕđ šéàŕçĥ üšéš unicode61 ţĥéŕé, ţĥé ḿöđüļé ĥàṽîñĝ ñö ÎÇÜ ţöķéñîžéŕ.
make test-wasm-stores ŕüñš ţĥé šţöŕé šüîţéš üñđéŕ GOOS=js öṽéŕ ţĥé šàḿé
đŕîṽéŕ. Ţĥé ŴÀŠḾ Éñĝîñé ÀƂÎ
ñöţé ĥàš ţĥé ḿéçĥàñîçš.
Ŵĥéŕé ţĥé ŵöŕķšþàçé ļîṽéš
Ţĥé đàţà ŕööţ îš host.DataDir(), ŕéšöļṽéđ îñ öŕđéŕ:
$KAPI_DATA_DIR the whole path, used as given
$XDG_DATA_HOME/kapi on every platform, when the variable is set
macOS ~/Library/Application Support/kapi
Linux and the rest ~/.local/share/kapi
Windows %LocalAppData%\kapi
Îñšîđé à go test ƃîñàŕý ţĥé ŕéšöļüţîöñ îš đéŕéñţ: üñļéšš $KAPI_DATA_DIR
ñàḿéš à ŕööţ öüţŕîĝĥţ, ţĥé àñšŵéŕ îš à đîŕéçţöŕý öƒ ţĥàţ þŕöçéšš'š öŵñ üñđéŕ ţĥé
šýšţéḿ ţéḿþöŕàŕý đîŕéçţöŕý. À ţéšţ ţĥàţ öþéñéđ à þŕöĵéçţ ŵöüļđ öţĥéŕŵîšé ŵŕîţé
îñţö ţĥé đéṽéļöþéŕ'š öŵñ çöñţéẋţ àñđ ŕéàđ îţ ƃàçķ öñ ţĥé ñéẋţ ŕüñ. Ţĥé ƒîŕšţ
ŕéšöļüţîöñ îñ à ţéšţ ƃîñàŕý ŕéḿöṽéš ţĥé ŕööţš öƒ ţéšţ ƃîñàŕîéš ţĥàţ àŕé ñö
ļöñĝéŕ ŕüññîñĝ. À ŕööţ îš ñàḿéđ ƃý îţš þŕöçéšš îđ, àñđ öñ ḿàçÖŠ, ŵĥéŕé îđš ŵŕàþ
àţ 99999, à ŕööţ ļàšţ ŵŕîţţéñ ƃéƒöŕé ţĥé þŕöçéšš ñöŵ ĥöļđîñĝ îţš îđ šţàŕţéđ
îš ŕéḿöṽéđ àš ŵéļļ. À þàçķàĝé ŵĥöšé TestMain ŕüñš ţĥŕöüĝĥ
devenvtest.Main(m, host.RemoveTestDataDir) ŕéḿöṽéš îţš öŵñ ŕööţ ŵĥéñ îţš ţéšţš
ƒîñîšĥ, šö ţéšţ ŕüñš đö ñöţ àççüḿüļàţé ţĥéḿ. À ŕéļéàšéđ
ƃîñàŕý îš ñöţ à ţéšţ ƃîñàŕý, ŵĥîçĥ îš ŵĥý éṽéŕý îñ-ŕéþö šüŕƒàçé ţĥàţ ļàüñçĥéš öñé
šéţš $KAPI_DATA_DIR àš þàŕţ öƒ ţĥé îšöļàţîöñ çöñţŕàçţ.
Çöñšéǫüéñçéš
- Çļöñéš šĥàŕé þŕöĵéçţ çöñţéẋţ. À šéçöñđ
çļöñé öƒ à þŕöĵéçţ ŵîţĥ àñ
id:öþéñš ŵîţĥ îţš ţéŕḿš, îţš ṽöîçé þŕöƒîļéš, îţš çöñţéñţ ḿéḿöŕý àñđ îţš đéçîšîöñš àļŕéàđý îñ ƒöŕçé, àñđ ŕé-éẋţŕàçţš îţš öŵñ þŕöĵéçţîöñ. - Ŵöŕķţŕééš šĥàŕé ţĥé đéçîšîöñ ļéđĝéŕ. Đéçîšîöñš ŕéçöŕđéđ îñ öñé àŕé îñ ƒöŕçé îñ ţĥé öţĥéŕ, àñđ šŵîţçĥîñĝ ƃŕàñçĥéš ḿöṽéš ñö àüţĥöŕéđ çöñţéẋţ.
- Çŕöšš-šüƃšýšţéḿ ǫüéšţîöñš àŕé öñé ǫüéŕý ŵîţĥîñ à þööļ, àñđ öñé ĵöîñ àçŕöšš ţĥéḿ. Ţéŕḿ çöṽéŕàĝé þéŕ çöļļéçţîöñ, ţĥé ƃļöçķš ƃéĥîñđ à çööŕđîñàţé, ţĥé ƃļöçķš à ţéŕḿ çĥàñĝé þüţš àţ ŕîšķ.
- Öñé ţŕàñšàçţîöñ šţîļļ çöṽéŕš à đéçîšîöñ àñđ ţĥé ŵöŕđîñĝ îţ àþþŕöṽéš. Ƃöţĥ àŕé îñ ţĥé çöñţéẋţ þööļ, ŵĥîçĥ îš ŵĥý ţĥéý àŕé îñ ţĥé šàḿé ƒîļé.
- Šţöŕé þàţĥš àŕé ñöţ à üšéŕ šüŕƒàçé. Ţĥé ŕéçîþé ƃîñđš ŵĥàţ ĝöṽéŕñš à þöîñţ
ƃý ñàḿé àñđ ñàḿéš ñö đàţàƃàšé öŕ çöñţéẋţ ƒîļé, àñđ îţ çàŕŕîéš ñö ŵöŕķšþàçé
ƃîñđîñĝ. Šţàñđàļöñé šţöŕéš öüţšîđé à þŕöĵéçţ ķééþ
ţĥéîŕ öŵñ šéļéçţöŕš (
--termstore,--memory); ţĥöšé àđđŕéšš à ƒîļé ţĥé üšéŕ öŵñš, ŵĥîçĥ îš à đéŕéñţ ţĥîñĝ. - ÇÎ çàçĥéš
.kapi/work/cache/docs, àñđ ñöţĥîñĝ éļšé üñđéŕwork/. Ţĥé þàŕšé çàçĥé îš ķéýéđ ƃý çöñţéñţ, çöñƒîĝüŕàţîöñ àñđ ƃüîļđ, šö à ŕéšţöŕéđ éñţŕý çĥàñĝéš ñö ŕéšüļţ, àñđsetup-kapiçàŕŕîéš îţ ƃý đéƒàüļţ. Ţĥé ŕéḿàîñîñĝ éñţŕîéš üñđéŕcache/ƃéļöñĝ ţö ţĥé çĥéçķöüţ ţĥàţ ŵŕöţé ţĥéḿ (Çöñṽéŕĝéñçé îñ ÇÎ). - À ḿàçĥîñé'š çöñţéẋţ îš öñé đîŕéçţöŕý. Ƃàçķîñĝ üþ
<DataDir>/workspaces/default/ƃàçķš üþ éṽéŕý þŕöĵéçţ'š àüţĥöŕéđ çöñţéẋţ, àñđkapi store exportŵŕîţéš öñé þŕöĵéçţ'š àš öñé ƒîļé. Đéļéţîñĝ îţ çöšţš éṽéŕý þŕöĵéçţ'š ţéŕḿš, ṽöîçé þŕöƒîļéš, çöñţéñţ ḿéḿöŕý, đéçîšîöñš àñđ ƃļöçķ ĥîšţöŕý.
Šéé àļšö
- Ç-01: Ţĥé þŕöĵéçţ ḿöđéļ: ţĥé ļàýöüţ ţĥé þŕöĵéçţîöñ šîţš îñ.
- Ç-04: Ƃļöçķ šţàţé àñđ ţĥé đéçîšîöñ ŕéçöŕđ: ţĥé đéçîšîöñ ļéđĝéŕ îñšîđé ţĥé çöñţéẋţ šţöŕé.
- Ç-08: Ţéŕḿš àñđ Ç-09: Çöñţéñţ ḿéḿöŕý: ţĥé ţŵö šüƃšýšţéḿš ŵĥöšé šöüŕçé-ṽéŕšüš-þŕöĵéçţîöñ šþļîţ ţĥîš šţöŕé îḿþļéḿéñţš.
- Ç-06: Çöñţéẋţ ŕéţŕîéṽàļ: ţĥé þŕîḿîţîṽéš ţĥéšé ţàƃļéš àñšŵéŕ.
- Ç-11: Çöñţéẋţ öþéŕàţîöñš: ţĥé öþéŕàţîöñ ļöĝ àñđ ţĥé ŵîđéñéđ ŕüļéš ţĥé ŵöŕķšþàçé ĥöļđš.
- Ñöţé: Ŵöŕķšþàçé šţöŕàĝé: ţĥé ƒîļéš, ţĥé ţàƃļéš, ţĥé ŵŕîţé šéţţîñĝš àñđ ţĥé çöñţéñţîöñ ḿéàšüŕéḿéñţš.
- Ţĥé þŕöĵéçţ šţöŕé: ţĥé éñđ-üšéŕ ṽîéŵ.