Šķîþ ţö ḿàîñ çöñţéñţ

Ç-07: Ṽöîçé þŕöƒîļéš

Šüḿḿàŕý​

Ţĥé ṽöîçé-þŕöƒîļé šüƃšýšţéḿ ķééþš ĝéñéŕàţéđ àñđ ţŕàñšļàţéđ çöñţéñţ îñ ṽöîçé. Îţš çöŕé ţýþé, profile.VoiceProfile, îš à þöŕţàƃļé ÝÀḾĻ đöçüḿéñţ đéšçŕîƃîñĝ ţöñé, šţýļé ḿéàšüŕéš, þàţţéŕñ ŕüļéš, ĝüîđàñçé, éẋàḿþļéš, àñđ ļöçàļé, çĥàññéļ àñđ þéŕšöñà öṽéŕŕîđéš. Ŵöŕđ ŕüļéš ("ŵŕîţé ţĥîš, ñöţ ţĥàţ") àŕé ţéŕḿš (Ç-08), àñđ à þŕöƒîļé ĥöļđš ñöñé. Ţŵö ŕéĝîšţéŕéđ ţööļš éṽàļüàţé ţéẋţ àĝàîñšţ à þŕöƒîļé: à đéţéŕḿîñîšţîç, öƒƒļîñé voice-vocab-check àñđ àñ ĻĻḾ-ƃàšéđ voice-check. Éàçĥ ƒîñđîñĝ šàýš ŵĥéţĥéŕ îţ ƒàîļš à çĥéçķ, çàŕŕîéš à ŕüñ-àñçĥöŕéđ þöšîţîöñ, àñđ ŕöļļš üþ îñţö à ŕéþöŕţéđ 0–100 çöḿþļîàñçé šçöŕé.

Ţĥé kapi voice çöḿḿàñđ ţŕéé éẋþöšéš ţĥîš àš à ţéẋţ-ƒîŕšţ, ĴŠÖÑ-ƒîŕšţ šüŕƒàçé ţĥàţ ŵöŕķš ƒüļļý öƒƒļîñé àĝàîñšţ à šţàŕţéŕ þàçķ, à šţàñđàļöñé ÝÀḾĻ ƒîļé, ţĥé þŕöĵéçţ'š ṽöîçé šţöŕé, öŕ à þŕöƒîļé ƃöüñđ ƃý à þŕöĵéçţ ŕéçîþé. À šḿàļļ ḾÇÞ šüŕƒàçé ḿîŕŕöŕš ţĥé đéţéŕḿîñîšţîç þàţĥ ƒöŕ àĝéñţš.

Çöñţéẋţ​

À ṽöîçé þŕöƒîļé îš ţĥé ñàţüŕàļ üñîţ öƒ à ĝüàŕđŕàîļ öñ ĝéñéŕàţéđ ţéẋţ: à ŕéüšàƃļé đéšçŕîþţîöñ öƒ ĥöŵ à þŕöđüçţ ŵàñţš ţö šöüñđ, àĝàîñšţ ŵĥîçĥ à đŕàƒţ çàñ ƃé šçöŕéđ àñđ ŕéŵŕîţţéñ. Ţĥé šüƃšýšţéḿ ĥàš ţö šàţý šéṽéŕàļ çöñšţŕàîñţš àţ öñçé:

  • Þöŕţàƃļé àñđ ŕéṽîéŵàƃļé. À þŕöƒîļé îš à ÝÀḾĻ đöçüḿéñţ à ţéàḿ çöḿḿîţš àñđ ŕéṽîéŵš, ŵîţĥ ñö ƃàçķîñĝ šţöŕé ŕéǫüîŕéđ, ţĥé šàḿé ŵàý à ŕéçîþé îš þöŕţàƃļé (Ç-01).
  • Öƒƒļîñé ƃý đéƒàüļţ, ÀÎ-öþţîöñàļ. Ţĥé çĥéçķ öƒ ŵöŕđ ŕüļéš àñđ ŕéĝüļàŕ-éẋþŕéššîöñ þàţţéŕñš îš đéţéŕḿîñîšţîç àñđ ñééđš ñö ñéţŵöŕķ. À ḿöđéļ-ƃàçķéđ çĥéçķ ƒöŕ ţĥé šüƃĵéçţîṽé đîḿéñšîöñš îš öþţ-îñ àñđ çŕéđéñţîàļ-ĝàţéđ.
  • Çöḿþöšàƃļé ŵîţĥ ţĥé ŕéšţ öƒ ţĥé éñĝîñé. Ṽöîçé éṽàļüàţîöñ ŕüñš àš ŕéĝîšţéŕéđ ţööļš (É-03) šö îţ çöḿþöšéš îñţö ƒļöŵš, ŕéüšéš ţĥé šçĥéḿà àñđ çöñƒîĝ ḿàçĥîñéŕý, àñđ ŵŕîţéš ƒîñđîñĝš àš ƃļöçķ àññöţàţîöñš öţĥéŕ ţööļš àñđ ţĥé ÜÎ çàñ ŕéàđ.
  • Šéṽéŕàļ šüŕƒàçéš. Ţĥé šàḿé çàþàƃîļîţý îš ŕéàçĥàƃļé ƒŕöḿ ţĥé ÇĻÎ, ƒŕöḿ àñ ḾÇÞ çļîéñţ, àñđ ƒŕöḿ ţĥé ƃüñđļéđ àĝéñţ šķîļļ (Š-03).

Ţéŕḿš (Ç-08) ĥöļđ éṽéŕý ŵöŕđ ŕüļé; à ṽöîçé þŕöƒîļé îš ţĥé ƃŕöàđéŕ, þŕöšé-ļéṽéļ ĝüàŕđŕàîļ. Ţĥé ţŵö ḿééţ îñ ţĥé đéţéŕḿîñîšţîç çĥéçķ, ŵĥîçĥ àþþļîéš ţĥé ţéŕḿš ţĥàţ ĝöṽéŕñ ţĥé ţéẋţ ƃéšîđé ţĥé ṽöîçé'š þàţţéŕñš.

Đéçîšîöñ​

Ţĥé đàţà ḿöđéļ​

VoiceProfile (core/profile) îš ţĥé çàñöñîçàļ ţýþé, ļöàđéđ ƒŕöḿ ÝÀḾĻ ƃý profile.LoadProfileYAML, ţĥé šîñĝļé ļöàđéŕ üšéđ ƃý šţàñđàļöñé ƒîļéš, ţĥé éḿƃéđđéđ šţàŕţéŕ þàçķš àñđ ţĥé ṽöîçé šţöŕé:

  • ToneProfile: þéŕšöñàļîţý àđĵéçţîṽéš, ƒöŕḿàļîţý, éḿöţîöñ, ĥüḿöŕ, àñđ ƒŕéé-ţéẋţ ĝüîđéļîñéš. Ţöñé ṽàļüéš àŕé đéšçŕîƃéđ ŕàţĥéŕ ţĥàñ éñüḿéŕàţéđ: à ŕéĝîšţéŕ öüţšîđé ţĥé çöñṽéñţîöñàļ šéţ ļöàđš, àñđ ṽàļîđàţîöñ ŕéþöŕţš îţ àš àñ àđṽîšöŕý ñöţé.
  • StyleRules: àçţîṽé ṽöîçé, šéñţéñçé ļéñĝţĥ, þöîñţ öƒ ṽîéŵ, çöñţŕàçţîöñš, àñđ þŕöĥîƃîţéđ/ŕéǫüîŕéđ ŕéĝüļàŕ-éẋþŕéššîöñ þàţţéŕñš. À Pattern çàŕŕîéš àñ öþţîöñàļ fails ƒļàĝ àñđ advisory ƒļàĝ, àñ öþţîöñàļ rate (max ḿàţçĥéš þéŕ per_words ŵöŕđš, ŵĥîçĥ ţüŕñš à þŕöĥîƃîţîöñ îñţö à çéîļîñĝ; üñđéŕ ţĥé çéîļîñĝ ñöţĥîñĝ îš ŕéþöŕţéđ, öṽéŕ îţ éṽéŕý ḿàţçĥ îš), àñđ àñ öþţîöñàļ scope (prose, code öŕ heading; éḿþţý ḿéàñš éṽéŕýŵĥéŕé). Ţĥé šţýļé éñüḿš šţàý çļöšéđ, ƃéçàüšé çöđé ŕéàđš ţĥéḿ.
  • VoiceExampleš: ƃéƒöŕé/àƒţéŕ ŕéŵŕîţéš ŵîţĥ éẋþļàñàţîöñš.
  • LocaleOverride, ChannelOverride àñđ þéŕšöñà ḿàþš: àđĵüšţḿéñţš ŕéšöļṽéđ öñ ţöþ öƒ ţĥé ƃàšé þŕöƒîļé, îñ ţĥàţ öŕđéŕ. À ļöçàļé àđĵüšţš ƒöŕḿàļîţý, ĥüḿöüŕ, þöîñţ öƒ ṽîéŵ, çüļţüŕàļ ñöţéš àñđ éẋàḿþļéš; à çĥàññéļ'š öŕ þéŕšöñà'š ţöñé àñđ šţýļé ŕéþļàçé ţĥé ŕéšöļṽéđ öñéš. Ñöñé öƒ ţĥéḿ çàŕŕîéš ŵöŕđ ŕüļéš.

Ţĥé þŕöƒîļé àļšö çàŕŕîéš ṽéŕšîöñîñĝ ƒîéļđš (à ṽéŕšîöñ šñàþšĥöţ þéŕ üþđàţé, àñđ ñàḿéđ ţàĝ ŕéƒéŕéñçéš) ƒöŕ šţöŕéš ţĥàţ ţŕàçķ ĥîšţöŕý.

Ŵöŕđ ŕüļéš àŕé ţéŕḿš​

À ŵöŕđ ŕüļé îš à profile.TermRule: ţĥé ƒöŕḿ ţö ŕéĵéçţ (term àñđ îţš forms), ţĥé ƒöŕḿ ţö üšé (replacement), à ñöţé, advisory, competitor ƒöŕ à ŕîṽàļ'š ñàḿé, case_sensitive (üñšéţ ƃý đéƒàüļţ, šéé ƃéļöŵ), scope (ţĥé šàḿé ṽàļüéš à þàţţéŕñ ţàķéš), do_not_translate (ŵĥàţ ĝîṽéš à ƃàŕé ţéŕḿ ŵîţĥ ñö ŕéþļàçéḿéñţ îţš ḿéàñîñĝ), àñđ concept_id, ŵĥîçĥ ţîéš ţĥé ŕüļé ţö à çöñçéþţ îñ ţĥé ţéŕḿš šţöŕé àñđ ţĥé ĝŕàþĥ. À ŕüļé ŵîţĥ à replacement àñđ ñö term ñàḿéš à þŕéƒéŕŕéđ ƒöŕḿ àñđ ŕéĵéçţš ñöţĥîñĝ. forms àŕé đéçļàŕéđ ŕàţĥéŕ ţĥàñ đéŕîṽéđ: kapi terms expand ƒîļļš ţĥéḿ îñ ƃý àšķîñĝ à ḿöđéļ öñçé îñ ţĥé ţéŕḿ'š öŵñ ļàñĝüàĝé.

Ţĥé ŕüļéš ļîṽé îñ ţĥé ţéŕḿš šţöŕé. À ṽöîçé ƒîļé ḿàý çàŕŕý ŵöŕđ ŕüļéš ƃéšîđé ţĥé ṽöîçé üñđéŕ à ţöþ-ļéṽéļ terms: ļîšţ, àš ţĥé šţàŕţéŕ þàçķš đö. profile.ParseVoiceFile šþļîţš ţĥé ţŵö: ţĥé þŕöƒîļé ĥöļđš ţĥé ṽöîçé, àñđ ţĥé ƒîļé'š ŕüļéš ŕîđé ƃéšîđé îţ îñ ḿéḿöŕý (CarriedTerms, ŵîţĥ ţĥé šöüŕçé ţĥéý çöḿé ƒŕöḿ) àñđ àŕé ñéṽéŕ šţöŕéđ ŵîţĥ ţĥé þŕöƒîļé. kapi voice import àñđ kapi store import ḿöṽé à ƒîļé'š ŕüļéš îñţö ţĥé þŕöĵéçţ'š ţéŕḿš šţöŕé àñđ ŕéþöŕţ ĥöŵ ḿàñý. À ƒîļé ţĥàţ ļîšţš îţš ŵöŕđš üñđéŕ vocabulary: îš ŕéàđ ţĥé šàḿé ŵàý: à ƒöŕƃîđđéñ ţéŕḿ ƃéçöḿéš à ŕüļé, à çöḿþéţîţöŕ ţéŕḿ à ŕüļé ḿàŕķéđ competitor, àñđ à þŕéƒéŕŕéđ ţéŕḿ à þŕéƒéŕŕéđ ƒöŕḿ, öŕ àñ àđṽîšöŕý ŕüļé ŵĥéñ îţ ñàḿéš à đéŕéñţ ŕéþļàçéḿéñţ. À ƃöüñđ šţàŕţéŕ þàçķ'š ţéŕḿš àþþļý ƃéšîđé ţĥé þŕöĵéçţ'š öŵñ, àñđ à ƒîñđîñĝ ţĥéý ŕàîšé ñàḿéš ţĥé þàçķ (pack technical-docs) îñ îţš from ḿéţàđàţà.

profile.TermRule îš àļšö ţĥé öñé šĥàþé éṽéŕý ĝöṽéŕñéđ šţéþ ţàķéš îţš ţéŕḿîñöļöĝý îñ. term-check, translate, recycle àñđ dnt-check àļļ ŕéàđ term_rules: àš []profile.TermRule, ŵĥéţĥéŕ ţĥé ŕüļéš çöḿé ƒŕöḿ ţĥé ţéŕḿš šţöŕé, à ṽöîçé ƒîļé öŕ à ŕéçîþé, àñđ profile.TermRuleMap îš ţĥé šîñĝļé þŕöĵéçţîöñ öƒ ţĥàţ ļîšţ îñţö ţĥé ḿàþ à þŕöḿþţ ŕéñđéŕš àñđ ţĥé çöñţéẋţ ƒîñĝéŕþŕîñţ ĥàšĥéš, šö ţĥé šţàļéñéšš ĝàţé àñđ ţĥé þŕöđüçéŕš çàññöţ đîšàĝŕéé àƃöüţ ŵĥàţ ĝöṽéŕñéđ à ţàŕĝéţ. À ṽîöļàţîöñ öƒ à ţéŕḿ ŕüļé ƒàîļš à çĥéçķ üñļéšš ţĥé ŕüļé îš ḿàŕķéđ advisory: true, ŵĥîçĥ ḿàķéš îţ ŕéþöŕţ; àñ üñšéţ ḿàŕķîñĝ ƒàîļš. À ţéŕḿš-šţöŕé çöñçéþţ çàŕŕîéš ţĥé šàḿé ḿàŕķîñĝ, šö à ŕüļé ŕéšöļṽéđ ƒŕöḿ ţĥé šţöŕé ŕéþöŕţš öñļý ŵĥéñ à þéŕšöñ ḿàŕķéđ ţĥé çöñçéþţ àđṽîšöŕý. À þàţţéŕñ ŕéþöŕţš üñļéšš îţ îš ḿàŕķéđ fails: true. À ŕüļé ŵîţĥ àñ éḿþţý ŕéþļàçéḿéñţ îš šķîþþéđ ƃý ţĥé ţŕàñšļàţîöñ ţööļš üñļéšš îţ îš ḿàŕķéđ đö-ñöţ-ţŕàñšļàţé, ƃéçàüšé "šàý ţĥîš îñšţéàđ" ñééđš à ţĥîš; ţĥé çĥéçķ ŕéàđš ţĥé šàḿé ƃàŕé ţéŕḿ àš "àṽöîđ ţĥîš".

TermRule.MatchesCase đéçîđéš ŵĥéţĥéŕ à ŕüļé ḿàţçĥéš îñ îţš öŵñ çàšîñĝ. À ŕüļé ŵĥöšé þŕéƒéŕŕéđ ƒöŕḿ îš çàþîţàļîšéđ, àš à þŕöđüçţ ñàḿé îš, ḿàţçĥéš çàšé šéñšîţîṽéļý, šö "ŵŕîţé Ǫüîçķçàšţ, ñöţ ǪüîçķÇàšţ" ƒļàĝš QuickCast àñđ ļéàṽéš ţĥé ļöŵéŕ-çàšé šļüĝ quickcast àļöñé. À ŕüļé ŵĥöšé ŕéĵéçţéđ ƒöŕḿ đéŕš ƒŕöḿ ţĥé þŕéƒéŕŕéđ öñé öñļý îñ çàšé (term: Ripgrep, replacement: ripgrep) îš çàšé šéñšîţîṽé ţöö. Éṽéŕý öţĥéŕ ŕüļé ḿàţçĥéš ŕéĝàŕđļéšš öƒ çàšé, àñđ case_sensitive: true|false öṽéŕŕîđéš ţĥé đéƒàüļţ îñ éîţĥéŕ đîŕéçţîöñ. term-check çöḿþàŕéš à šöüŕçé ţéŕḿ ŵîţĥ à ŕéþļàçéḿéñţ îñ àñöţĥéŕ ļàñĝüàĝé, šö îţ ŕéàđš öñļý ţĥé éẋþļîçîţ ƒîéļđ. Ĥöŵ ţĥé šţöŕé àñđ ţĥé ŕüļéš àŕé ļöçàţéđ îñ à ţéẋţ îš Ç-08'š šüƃĵéçţ.

Šĥàŕéđ çöñšţŕàîñţš àñđ ƒàçţüàļ ĝüîđàñçé​

À þŕöƒîļé'š ţöþ-ļéṽéļ constraints ļîšţ îš îñđéþéñđéñţ öƒ îţš ţöñé àñđ šţýļé šéçţîöñš. Çĥàññéļ àñđ þéŕšöñà öṽéŕŕîđéš ŕéþļàçé þŕéšéñţàţîöñ þŕéƒéŕéñçéš; šĥàŕéđ çöñšţŕàîñţš ŕéḿàîñ àţţàçĥéđ ţö ţĥé šéļéçţéđ þŕöƒîļé. Þŕöƒîļé šéļéçţîöñ šţîļļ çĥööšéš öñé ĝöṽéŕñîñĝ þŕöƒîļé, ŵîţĥ ñö îḿþļîçîţ ḿéŕĝé ƃéţŵééñ þŕöƒîļéš.

Éàçĥ çöñšţŕàîñţ çàŕŕîéš àñ ÎĐ, ṽéŕšîöñ, šöüŕçé ŕéƒéŕéñçé àñđ šţàţéḿéñţ. À prohibited_pattern ĥàš àñ ŔÉ2 éẋþŕéššîöñ àñđ éḿîţš ƒàîļîñĝ ƒîñđîñĝš ţĥŕöüĝĥ profile.PatternFindings, ţĥé šĥàŕéđ šţýļé-àñđ-çöñšţŕàîñţ þàţĥ üšéđ ƃý ţĥé ṽöîçé ţööļ àñđ profile.Findings. Ḿéţàđàţà þŕéšéŕṽéš ţĥé çöñšţŕàîñţ'š ÎĐ, ṽéŕšîöñ àñđ šöüŕçé. À guidance ŕéçöŕđ çàŕŕîéš à ƒàçţüàļ ŕéǫüîŕéḿéñţ îñţö ƒüļļ àñđ çöḿþàçţ ĝüîđéš. Đéţéŕḿîñîšţîç çĥéçķš đö ñöţ ṽéŕîƒý îţš ḿéàñîñĝ, àñđ ŕéþöŕţ çöṽéŕàĝé îđéñţîƒîéš šéḿàñţîç àñàļýšîš àš üñšüþþöŕţéđ. À đéţéŕḿîñîšţîç ĝàţé çàñ þàšš ŵĥîļé ƒàçţüàļ ĝüîđàñçé šţîļļ ñééđš ŕéṽîéŵ.

Öþţîöñàļ šçöþé ḿàţçĥéš éẋàçţ ļöçàļé, çĥàññéļ àñđ þéŕšöñà çööŕđîñàţéš. Ļöçàļé šþéļļîñĝ îš ñöŕḿàļîžéđ ŵîţĥöüţ éẋþàñđîñĝ à ļàñĝüàĝé ţö ŕéĝîöñàļ ṽàŕîàñţš. À çöñšţŕàîñţ çàñ çàŕŕý àñ éẋçéþţîöñ ŵîţĥ à ñöñéḿþţý šçöþé, ŕéàšöñ, approved_by àñđ approval_ref. Ţĥéšé ƒîéļđš ŕéçöŕđ ţĥé ļöçàļ àüţĥöŕ'š àššéŕţéđ þŕöṽéñàñçé; ţĥéý đö ñöţ àüţĥéñţîçàţé àñ àþþŕöṽàļ. Éẋçéþţîöñš ƃéļöñĝ ţö ţĥé šĥàŕéđ çöñšţŕàîñţ àñđ çàññöţ ƃé îñţŕöđüçéđ ƃý à þŕéšéñţàţîöñ öṽéŕŕîđé. Çöñţéẋţ ŕéţŕîéṽàļ éẋþöšéš àþþļîçàƃļé, öüţ-öƒ-šçöþé àñđ éẋçéþţéđ ŕéçöŕđš, îñçļüđîñĝ ḿàţçĥîñĝ éẋçéþţîöñš.

Çöñšţŕàîñţ đéçöđîñĝ ŕéĵéçţš üñķñöŵñ ķéýš, àñđ ṽàļîđàţîöñ ŕéĵéçţš đüþļîçàţé ÎĐš, îñṽàļîđ ķîñđš, ḿîššîñĝ þŕöṽéñàñçé, îñṽàļîđ þàţţéŕñš àñđ îñçöḿþļéţé éẋçéþţîöñš. Ļöçàļé šçöþéš çŕöšš ţĥé šĥàŕéđ ļöçàļé ṽàļîđàţîöñ ƃöüñđàŕý; ḿàļƒöŕḿéđ ļöçàļé ṽàļüéš àŕé çöñƒîĝüŕàţîöñ éŕŕöŕš. À ĝüîđàñçé ŕéçöŕđ çàññöţ çàŕŕý à ŕéĝéẋ, àñđ à þŕöĥîƃîţéđ þàţţéŕñ ḿüšţ çöñţàîñ à ṽàļîđ éẋþŕéššîöñ ţĥàţ çàññöţ ḿàţçĥ éḿþţý ţéẋţ. Ţĥé đéţéŕḿîñîšţîç þàţĥ ŕéþöŕţš îñṽàļîđ îñ-ḿéḿöŕý çöñšţŕàîñţš àš çöñƒîĝüŕàţîöñ ƒîñđîñĝš. Šéḿàñţîç đîšàĝŕééḿéñţ ƃéţŵééñ ţŵö ĝüîđàñçé šţàţéḿéñţš ŕéǫüîŕéš ŕéṽîéŵ; ñö çöñƒļîçţ đéţéçţöŕ îš îḿþļîéđ ƃý šţŕüçţüŕàļ ṽàļîđàţîöñ.

ŠǪĻîţé àñđ ÞöšţĝŕéŠǪĻ šţöŕéš þéŕšîšţ çöñšţŕàîñţš îñ ţĥéîŕ öŵñ ĴŠÖÑ çöļüḿñ àñđ îñçļüđé ţĥéḿ îñ àŕçĥîṽéđ þŕöƒîļé ṽéŕšîöñš. Àñ üþđàţé ţĥàţ öḿîţš çöñšţŕàîñţš þŕéšéŕṽéš ţĥé šţöŕéđ ṽàļüé ƒöŕ çļîéñţš ŵîţĥöüţ ţĥé ƒîéļđ. Àñ éẋþļîçîţ éḿþţý àŕŕàý ŕéḿöṽéš îţ. Ţĥé đéšķţöþ þŕöƒîļé-ƒîļé ŵŕîţéŕ ƒöļļöŵš ţĥé šàḿé üþđàţé ŕüļé. Àüţĥöŕ çöñšţŕàîñţš îñ þŕöƒîļé ÝÀḾĻ; à ṽîšüàļ éđîţöŕ ḿàý þŕéšéŕṽé ţĥé ŕéçöŕđš ŵîţĥöüţ éẋþöšîñĝ éđîţîñĝ çöñţŕöļš ƒöŕ ţĥéḿ.

Ƒîñđîñĝš àñđ šçöŕîñĝ​

À ƒîñđîñĝ îš profile.VoiceFinding, à ţýþé àļîàš ţö check.Finding ƒŕöḿ ţĥé ƒŕàḿéŵöŕķ'š çöñţéñţ-ṽéŕîƒîçàţîöñ çöŕé (core/check). Îţ çàŕŕîéš à ƒŕéé-ƒöŕḿ Category (à ṽöîçé ƒîñđîñĝ šéţš îţ ţö öñé öƒ ţĥé ƒîẋéđ đîḿéñšîöñš: ţöñé, šţýļé, ṽöçàƃüļàŕý, çļàŕîţý, çöḿþļîàñçé), Fails, Suggested, à ĥüḿàñ ḿéššàĝé, àñ öþţîöñàļ šüĝĝéšţîöñ, ţĥé öŕîĝîñàļ ţéẋţ, öþţîöñàļ ḿéţàđàţà, àñđ à Position model.Anchor, šö à ƒîñđîñĝ îš àñçĥöŕéđ ţö ţĥé ŕüñš îţ çöñçéŕñš, ţĥé šàḿé ŕüñ-ŕàñĝé ḿöđéļ öṽéŕļàýš àñđ ŕéđàçţîöñ üšé (Ƒ-02).

Ţööļš àţţàçĥ ƒîñđîñĝš ţö à ƃļöçķ àš à VoiceAnnotation (àññöţàţîöñ ţýþé voice), ŵĥîçĥ àļšö çàŕŕîéš ţĥé þŕöƒîļé îđ, ţĥé öṽéŕàļļ šçöŕé àñđ îţš öŵñ þöšîţîöñ.

Fails îš đéçîđéđ ƃý ţĥé ŕüļé ţĥàţ ŕàîšéđ ţĥé ƒîñđîñĝ. À ţéŕḿ ŕüļé ƒàîļš üñļéšš îţ îš ḿàŕķéđ àđṽîšöŕý. À þŕöĥîƃîţéđ öŕ ŕéǫüîŕéđ þàţţéŕñ, àñđ ţĥé ŕàţé çéîļîñĝ öṽéŕ îţ, ŕéþöŕţš üñļéšš îţ îš ḿàŕķéđ fails: true (Pattern.Failing), àñđ advisory: true ƃéšîđé îţ šţîļļ ḿàķéš îţ ŕéþöŕţ. À šĥàŕéđ çöñšţŕàîñţ àļŵàýš ƒàîļš. À ƒîñđîñĝ ŕàîšéđ ƃý à šüĝĝéšţéđ ŕüļé, öñé ŕéçöŕđéđ ƃý kapi context note àñđ ñöţ ýéţ ķéþţ, çàŕŕîéš Suggested àñđ ñéṽéŕ ƒàîļš. Ţĥé šţýļé ḿéàšüŕéš ŕéþöŕţ: ţĥé ṽöîçé-šîḿîļàŕîţý çĥéçķ, ţĥé ḿöđéļ-ƃàçķéđ voice-check, àñđ ţĥé çöḿḿéñţ ļîḿîţš üñđéŕ style.comments, ŵĥîçĥ ƒàîļ öñļý ŵĥéñ ţĥé þŕöƒîļé šéţš style.comments.fails: true.

Àñ éđîţ ḿééţš ţĥé šàḿé ŕüļéš ƃéƒöŕé îţ îš ŵŕîţţéñ. Ţĥé çöḿḿîţ çĥéçķ öƒ ţĥé çĥàñĝé šéŕṽîçé ĥöļđš éàçĥ çĥàñĝéđ šöüŕçé-ļàñĝüàĝé éđîţîöñ ţö ţĥé ṽöîçé îñ ƒöŕçé àţ îţš þöîñţ: ţĥé þŕöĥîƃîţéđ þàţţéŕñš, ţĥé šĥàŕéđ çöñšţŕàîñţš àñđ ţĥé çöḿḿéñţ ļîḿîţš, ŵîţĥ Fails àñđ Suggested àš àƃöṽé (Š-03). Îţ ŕéàđš öñé éđîţîöñ àţ à ţîḿé, šö ţĥé ŕéǫüîŕéđ þàţţéŕñš, ŵĥîçĥ ĥöļđ öṽéŕ à ŵĥöļé đöçüḿéñţ, àñđ ţĥé ḿöđéļ-ƃàçķéđ çĥéçķš ŕüñ îñ kapi check àļöñé.

profile.CalculateScore ŕöļļš ƒîñđîñĝš üþ þéŕ đîḿéñšîöñ üšîñĝ ţĥé ŵéîĝĥţš îñ core/check.Weight: à ƒàîļîñĝ ƒîñđîñĝ ŵéîĝĥš 25, à ŕéþöŕţéđ öñé 1, à šüĝĝéšţéđ öñé 0. Éàçĥ đîḿéñšîöñ šţàŕţš àţ 100 àñđ îš ŕéđüçéđ ƃý îţš þéñàļţý, çļàḿþéđ àţ 0; ţĥé öṽéŕàļļ šçöŕé îš 100 ḿîñüš ţĥé ţöţàļ þéñàļţý. Ţĥé đîḿéñšîöñš àŕé ƒîẋéđ, šö à çöḿþļîàñçé šçöŕé àļŵàýš ĥàš à çöñšîšţéñţ šĥàþé. Ţĥé šçöŕé îš ŕéþöŕţéđ ƃéšîđé ţĥé ƒîñđîñĝš àñđ ĝàţéš ñöţĥîñĝ.

Ţĥîš ƒîñđîñĝ àñđ šçöŕîñĝ þàţĥ îš šĥàŕéđ àçŕöšš éṽéŕý çĥéçķéŕ (ţéŕḿîñöļöĝý, đö-ñöţ-ţŕàñšļàţé, þļàçéĥöļđéŕ, ŕéĝîšţéŕ, ṽöîçé) ŕàţĥéŕ ţĥàñ ƃéîñĝ ƃéšþöķé ţö ṽöîçé. Ṽöîçé îš öñé çĥéçķšéţ öṽéŕ ţĥé ĝéñéŕîç çöŕé.

Ţĥé ţööļš​

  • voice-vocab-check (core/tools): đéţéŕḿîñîšţîç àñđ öƒƒļîñé. Îţ šçàñš šöüŕçé ţéẋţ ƒöŕ ţĥé ƒöŕƃîđđéñ, çöḿþéţîţöŕ àñđ ŕéţîŕéđ ţéŕḿš öƒ à ţéŕḿš šţöŕé, ţĥé ŵöŕđ ŕüļéš à çàļļéŕ ĥöļđš (à šţàŕţéŕ þàçķ'š ţéŕḿš, ţĥé ŕüļéš éšţàƃļîšĥéđ àçŕöšš ţĥé ŵöŕķšþàçé) àñđ ţĥé ṽöîçé'š þŕöĥîƃîţéđ þàţţéŕñš, éḿîţţîñĝ ƒîñđîñĝš ŵîţĥ þöšîţîöñš. Îţ îš àñ àññöţàţé-çļàšš ţööļ: îţ ŵŕîţéš ţĥé àññöţàţîöñ, ñéṽéŕ ţĥé çöñţéñţ. Ţĥîš îš ţĥé ƒàšţ ƒîŕšţ þàšš.
  • voice-check (core/ai/tools): ḿöđéļ-ƃàçķéđ. Îţ àšķš à þŕöṽîđéŕ (É-07) ţö šçöŕé ţĥé šüƃĵéçţîṽé đîḿéñšîöñš àĝàîñšţ ţĥé ŕéñđéŕéđ ṽöîçé ĝüîđé. Îţ đéçļàŕéš ţĥàţ îţ ŕéǫüîŕéš çŕéđéñţîàļš àñđ ĥàš àñ ÀÞÎ-çàļļ šîđé 郃éçţ, þŕöđüçéš ţĥé voice àññöţàţîöñ, àñđ ŕüñš ŵîţĥ ƃöüñđéđ þéŕ-ƃļöçķ þàŕàļļéļîšḿ.
  • voice-infer (core/ai/tools): ḿöđéļ-ƃàçķéđ îñƒéŕéñçé öƒ à þŕöƒîļé ƒŕöḿ éẋîšţîñĝ çöñţéñţ, ƒöŕ à ţéàḿ ţĥàţ ĥàš à ƃöđý öƒ ŵŕîţîñĝ àñđ ñö ŵŕîţţéñ-đöŵñ ṽöîçé.

kapi check ŕéþöŕţš ţĥé ţŵö ĥàļṽéš àš šéþàŕàţé àñàļýžéŕš. Éṽéŕý ŵöŕđ ŕüļé, ŵĥéŕéṽéŕ îţ îš ĥéļđ, îš ţĥé terms àñàļýžéŕ ŵîţĥ ŕüļé îđ terms.vocabulary àñđ öñé ḿéššàĝé šĥàþé (Forbidden term "x" found, Competitor term …, Retired term …); à ƒîñđîñĝ ƒŕöḿ à þàçķ öŕ à ŵöŕķšþàçé ŕüļé çàŕŕîéš metadata.from. Ţĥé ṽöîçé'š þàţţéŕñ ŕüļéš àŕé ţĥé voice.rules àñàļýžéŕ (voice.style àñđ îţš šîƃļîñĝš), àñđ ţĥé ƃîļîñĝüàļ ţéŕḿ çĥéçķ îš terms.target.

Ƃöţĥ çĥéçķš ŕéšöļṽé ţĥéîŕ þŕöƒîļé éàĝéŕļý, ŵĥéñ îţ îš šüþþļîéđ þŕöĝŕàḿḿàţîçàļļý, öŕ ļàžîļý ţĥŕöüĝĥ à ŕéšöļṽéŕ àĝàîñšţ à çöñţéẋţ ĥîéŕàŕçĥý, šö à ĥöšţ çàñ đéƒéŕ þŕöƒîļé šéļéçţîöñ ţö ŕüñţîḿé.

Ƃöţĥ ŕéñđéŕéŕš öƒ à þŕöƒîļé (ţĥé ƒüļļ ĝüîđé àñđ ţĥé çöḿþàçţ ƒöŕḿ ţĥé ţŕàñšļàţîöñ þàţĥ šéñđš) çàŕŕý à þàţţéŕñ'š ŕàţé àñđ šçöþé, àñđ ƃöţĥ çàŕŕý ţĥé þŕöƒîļé'š éẋàḿþļéš. À ŕàţé ţĥé ḿöđéļ ñéṽéŕ ĥéàŕš îš à šţŕîçţéŕ ŕüļé îñ ţĥé þŕöḿþţ ţĥàñ ţĥé çĥéçķ éñƒöŕçéš, àñđ à šçöþé îţ ñéṽéŕ ĥéàŕš îš à ŵîđéŕ öñé.

Þàţţéŕñ šçöþé​

À šţýļé þàţţéŕñ'š šçöþé ƒöļļöŵš ŵĥàţ îţ àššéŕţš. À þŕöĥîƃîţéđ þàţţéŕñ šàýš "ţĥîš ţéẋţ ḿüšţ ñöţ çöñţàîñ Ẋ", ŵĥîçĥ éṽéŕý ƃļöçķ àñšŵéŕš öñ îţš öŵñ, šö profile.Findings ḿàţçĥéš îţ þéŕ ƃļöçķ ƃéšîđé ţĥé ŵöŕđ ŕüļéš. À ŕéǫüîŕéđ þàţţéŕñ šàýš "ţĥîš ţéẋţ ḿüšţ çöñţàîñ Ẋ" (ţĥé çàļļ ţö àçţîöñ, ţĥé ţŕàđéḿàŕķ ļîñé, ţĥé šàƒéţý ñöţîçé), àñđ ţĥàţ îš à çļàîḿ àƃöüţ ţĥé đöçüḿéñţ: ñö þàŕàĝŕàþĥ öƒ à þàĝé çàŕŕîéš îţ, ţĥé þàĝé đöéš. profile.DocumentFindings ţĥéŕéƒöŕé éṽàļüàţéš ţĥé ŕéǫüîŕéđ þàţţéŕñš öñçé öṽéŕ à ƒîļé'š çöñţéñţ àñđ ŕéþöŕţš öñé ƒîñđîñĝ þéŕ üñšàţîéđ ŕüļé àĝàîñšţ ţĥé ƒîļé, ŵîţĥ ñö ƃļöçķ, ƃéçàüšé àñ àƃšéñçé šîţš ñöŵĥéŕé îñ þàŕţîçüļàŕ. À šţŕéàḿîñĝ ţööļ šééš öñé ƃļöçķ àţ à ţîḿé àñđ šö éṽàļüàţéš ţĥé ƃļöçķ-šçöþé ĥàļƒ öñļý.

profile.PatternRuleCount îš ţĥé ñüḿƃéŕ àñý šüŕƒàçé ŕéþöŕţš àš à þŕöƒîļé'š þàţţéŕñ-ŕüļé ţöţàļ, šö ŵĥàţ à þŕöƒîļé çàŕđ çöüñţš îš ŵĥàţ ţĥé ĝàţéš àþþļý.

Öñé ŕéšöļüţîöñ çĥàîñ​

profile.ResolveProfileFromContext îš ţĥé öñļý þļàçé à þŕöƒîļé'š þŕéçéđéñçé îš đéçîđéđ, ḿöšţ šþéçîƒîç ƒîŕšţ:

  1. Éẋþļîçîţ: àñ îđ ƒŕöḿ ţööļ çöñƒîĝ öŕ à çàļļ þàŕàḿéţéŕ.
  2. Çöļļéçţîöñ: à þŕöƒîļé ţĥé çàļļéŕ àļŕéàđý ļöàđéđ, éļšé ţĥé çöļļéçţîöñ'š öŵñ profile.PropertyProfileID þŕöþéŕţý.
  3. Šţŕéàḿ → 4. Þŕöĵéçţ → 5. Ŕööţ.

Ţĥé ţîéŕš ƃéļöŵ ţĥé çöļļéçţîöñ àŕé þŕöþéŕţý ḿàþš ŕéàđ öƒƒ šţöŕéđ ŕöŵš, ŵĥîçĥ îš ĥöŵ à þŕöĵéçţ çŕéàţéđ ƃý à çöññéçţöŕ öŕ àñ éđîţöŕ, ŵîţĥ ñö ŕéçîþé, îš ĝöṽéŕñéđ. À ŕéçîþé-ĝöṽéŕñéđ þŕöĵéçţ ƒîļļš ţĥé šàḿé çöļļéçţîöñ ţîéŕ: à çöļļéçţîöñ'š channel: šéļéçţš ţĥé þŕöƒîļé (Ç-02), ţĥé ĥöšţ ļöàđš îţ (à ŕéçîþé ƃîñđš à þŕöƒîļé îñ ţĥé þŕöĵéçţ'š šţöŕé, öŕ à šţàŕţéŕ þàçķ, ŵĥîçĥ à šţöŕé îđ çàññöţ ñàḿé) àñđ ĥàñđš îţ öṽéŕ àš ţĥé àļŕéàđý-ļöàđéđ çöļļéçţîöñ þŕöƒîļé. Šö ţĥé ţŵö ķîñđš öƒ þŕöĵéçţ đéŕ îñ ŵĥîçĥ ţîéŕš ţĥéý þöþüļàţé, ñéṽéŕ îñ ĥöŵ ţĥé ţîéŕš àŕé ŕàñķéđ, àñđ àñ éẋþļîçîţ þéŕ-çàļļ þŕöƒîļé öüţŕàñķš à ŕéçîþé éẋàçţļý àš îţ öüţŕàñķš à šţöŕéđ ŕöŵ.

Ļöçàļé, çĥàññéļ àñđ þéŕšöñà öṽéŕŕîđéš àŕé àþþļîéđ öñçé, àţ ţĥé éñđ öƒ ţĥàţ çĥàîñ, ƃý ResolveProfile. À çĥàññéļ ƃöüñđ ţö à šçöþé đéšçŕîƃéš ŵĥéŕé ţĥé çöñţéñţ îš þüƃļîšĥéđ; ţĥé ŕéšöļṽé çöñţéẋţ'š öŵñ çĥàññéļ îš ţĥé çàļļéŕ öṽéŕŕîđîñĝ îţ ƒöŕ öñé çàļļ, ŵĥîçĥ îš ţĥé ţîéŕ à --channel ƒļàĝ öççüþîéš.

Àñ îđ ţĥàţ ĥàš ñöŵĥéŕé ţö ŕéšöļṽé ƒŕöḿ îš à çöñƒîĝüŕàţîöñ éŕŕöŕ ŕàţĥéŕ ţĥàñ à šîļéñţ ḿîšš. À šîļéñţ ḿîšš ŵöüļđ ļéàṽé ţĥé çöñţéñţ üñĝöṽéŕñéđ àñđ ŕéàđ àš îƒ ñöţĥîñĝ ŵéŕé ƃöüñđ.

Ţĥé ŕéçîþé àüţĥöŕš; öñé ṽéñüé àþþļîéš​

À ŕéçîþé îš àñ àüţĥöŕîñĝ šüŕƒàçé, ñöţ à šéçöñđ ŕüñţîḿé šöüŕçé. Îţ îš ṽéŕšîöñ-çöñţŕöļļéđ àñđ àüţĥöŕîţàţîṽé öṽéŕ ŵĥàţ ţĥé ĝöṽéŕñàñçé îš; àţ àñý ḿöḿéñţ éẋàçţļý öñé ṽéñüé àþþļîéš îţ: ţĥé ŕéçîþé ŵĥéñ ţĥé þŕöĵéçţ ŕüñš öñ îţš öŵñ, à šéŕṽîçé'š šţöŕéđ ŕöŵš ŵĥéñ îţ ŕüñš çöññéçţéđ. Ţŵö ļîṽé šöüŕçéš ŵöüļđ ḿéàñ à ṽöîçé ţĥàţ đéþéñđš öñ ŵĥéŕé ţĥé ļööþ ĥàþþéñéđ ţö ŕüñ.

Ŵĥàţ çŕöššéš à þüšĥ îš éṽéŕý đéçļàŕéđ çöļļéçţîöñ, ţĥé þöîñţ îţ šîţš àţ àñđ ţĥé ṽöîçé ĝöṽéŕñîñĝ îţ, šö ƃöţĥ ṽéñüéš ŕéšöļṽé ţĥé šàḿé ṽöîçé ƒöŕ ţĥé šàḿé çöñţéñţ. Ŵĥàţ đöéš ñöţ çŕöšš îš à þŕöƒîļé'š termstore:, ŵĥîçĥ ñàḿéš à šţöŕé öñ ţĥîš ḿàçĥîñé, àñđ à ļöçàļ šţöŕé ḿéàñš ñöţĥîñĝ ţö à šéŕṽîçé ţĥàţ ĝöṽéŕñš ţéŕḿîñöļöĝý ƒŕöḿ à šĥàŕéđ ṽöçàƃüļàŕý. Ţĥàţ đîṽéŕĝéñçé îš ŕéàļ àñđ îš ŕéþöŕţéđ ŕàţĥéŕ ţĥàñ ĥîđđéñ: à ŕüñ öṽéŕ à þŕöĵéçţ ţĥàţ ƃîñđš à ţéŕḿš šţöŕé þéŕ þŕöƒîļé àñđ ƃîñđš à ṽéñüé þŕîñţš à ŵàŕñîñĝ ţö šţđéŕŕ àñđ þŕöçééđš. À ŕéçîþé ƒîéļđ ţĥàţ îš ñöţ ŕéàđàƃļé àţ ţĥé öţĥéŕ ṽéñüé îš ñöţ à ŕéàšöñ ţö ŕéƒüšé ţĥé ŕüñ.

Þŕöƒîļé šöüŕçéš àñđ ţĥé çöḿḿàñđ ţŕéé​

kapi voice ŕéšöļṽéš à þŕöƒîļé ƒŕöḿ öñé öƒ ţĥŕéé ḿüţüàļļý éẋçļüšîṽé šöüŕçéš:

  • --profile <name>: à þŕöƒîļé îñ ţĥé ṽöîçé šţöŕé. Îñšîđé à þŕöĵéçţ ţĥàţ šţöŕé îš ţĥé voice_profiles ţàƃļé öƒ ţĥé þŕöĵéçţ'š çöñţéẋţ šţöŕé (Ç-03), šö ţĥé šàḿé ŕéçîþé ŕéšöļṽéš ţĥé šàḿé þŕöƒîļé ƒŕöḿ àñý đîŕéçţöŕý îñ ţĥé ţŕéé; àñ éẋþļîçîţ --name, --local öŕ --file šéļéçţš à šţàñđàļöñé šţöŕé ƒîļé îñšţéàđ, ḿîŕŕöŕîñĝ ţĥé ţéŕḿš šţöŕé àñđ ţĥé çöñţéñţ ḿéḿöŕý, àñđ öüţšîđé à þŕöĵéçţ ţĥé šţàñđàļöñé voice.db îš ţĥé đéƒàüļţ.
  • --profile-file <path>: à šţàñđàļöñé, ŕéṽîéŵàƃļé þŕöƒîļé ÝÀḾĻ.
  • --pack <name>: à ƃüîļţ-îñ šţàŕţéŕ þàçķ.

Ŵîţĥ ñö šöüŕçé ƒļàĝ, ŕéšöļüţîöñ ƒàļļš ƃàçķ ţö ţĥé þŕöĵéçţ îñ šçöþé: ţĥé ṽöîçé ĝöṽéŕñîñĝ ţĥé çöñţéñţ çöļļéçţîöñ ţĥàţ çļàîḿš ţĥé ƒîļé, éļšé ţĥé ŕéçîþé'š defaults.voice. Éṽéŕý ŕüñĝ àñšŵéŕš öüţ öƒ ţĥé þŕöĵéçţ'š ṽöîçé šţöŕé, àñđ kapi voice check DRAFT.md ţĥéŕéƒöŕé ŵöŕķš ƒļàĝ-ƒŕéé îñšîđé à þŕöĵéçţ. Ļöçàļé àñđ çĥàññéļ öṽéŕŕîđéš àþþļý öñ ţöþ ṽîà --locale/--channel; àñ éẋþļîçîţ --channel ŵîñš öṽéŕ ţĥé çĥàññéļ ţĥé ŕéçîþé đéçļàŕéš.

ÇöḿḿàñđÞüŕþöšé
newŠçàƒƒöļđ à çöḿḿéñţéđ, šçĥéḿà-ṽàļîđ þŕöƒîļé ÝÀḾĻ, öþţîöñàļļý šééđéđ ƒŕöḿ à þàçķ.
showŔéñđéŕ à þŕöƒîļé, à þŕöƒîļé ƒîļé öŕ à þàçķ àš à ḿàŕķđöŵñ ṽöîçé ĝüîđé. Îñšîđé à þŕöĵéçţ, kapi context <path> àñšŵéŕš ŵîţĥ ţĥé ṽöîçé îñ ƒöŕçé àţ à ƒîļé.
checkŠçöŕé ţéẋţ àĝàîñšţ ţĥé þŕöƒîļé: îţš þàţţéŕñš àñđ ţĥé ŵöŕđ ŕüļéš îţš ƒîļé çàŕŕîéš àļŵàýš, --ai àđđš ţĥé ḿöđéļ çĥéçķ. Éẋîţš ŵîţĥ ţĥé ǫüàļîţý-ĝàţé çöđé ŵĥéñ à ƒîñđîñĝ ƒàîļš.
rewriteŠüƃšţîţüţé ţĥé ƒöŕƃîđđéñ àñđ çöḿþéţîţöŕ ţéŕḿš ţĥé þŕöƒîļé'š ƒîļé çàŕŕîéš ƒöŕ ţĥéîŕ àþþŕöṽéđ ŕéþļàçéḿéñţš: đéţéŕḿîñîšţîç, öƒƒļîñé, ñö ḿöđéļ. À ŕüļé ţĥàţ ḿàţçĥéš ŵîţĥöüţ à ŕéþļàçéḿéñţ îš ŕéþöŕţéđ üñđéŕ skipped.
validateÇĥéçķ à þŕöƒîļé đöçüḿéñţ àĝàîñšţ ţĥé šçĥéḿà; ƃļöçķîñĝ þŕöƃļéḿš ƒàîļ, àđṽîšöŕý ñöţéš þŕîñţ àƒţéŕ ţĥé ṽéŕđîçţ.
profilesĻîšţ þŕöƒîļéš: ţĥé ṽöîçé šţöŕé þļüš ţĥé ƃüîļţ-îñ þàçķš.
importÎḿþöŕţ à þŕöƒîļé ÝÀḾĻ îñţö ţĥé ṽöîçé šţöŕé, àñđ ţĥé ŵöŕđ ŕüļéš îţ çàŕŕîéš îñţö ţĥé þŕöĵéçţ'š ţéŕḿš šţöŕé.
editÖþéñ à þŕöƒîļé ƒŕöḿ ţĥé þŕöĵéçţ'š šţöŕé àš ÝÀḾĻ îñ àñ éđîţöŕ, ṽàļîđàţé ŵĥàţ îš šàṽéđ, àñđ ŕéçöŕđ îţ àš öñé çĥàñĝé îñ ţĥé ļöĝ.
packÎñšţàļļ à ƃüîļţ-îñ šţàŕţéŕ þàçķ îñţö ţĥé ṽöîçé šţöŕé.

Àñ àššîšţàñţ šţàñđîñĝ îñ à þŕöĵéçţ ĥàš ñö ŕéàšöñ ţö öþéñ kapi.yaml ŵĥéñ îţš ţàšķ îš ţö ŵŕîţé à ĝüîđé, àñđ šö ñéṽéŕ ļéàŕñš ţĥé þŕöĵéçţ ĥàš à ṽöîçé. Ţĥé ṽöîçé îñ ƒöŕçé ţĥéŕéƒöŕé ĝöéš îñţö ţĥé þŕöĵéçţ'š ŕüļéš ƒîļéš: ţĥé ṽöîçé ƃŕîéƒ îñ ţĥé ŕööţ'š AGENTS.md àñđ CLAUDE.md, àñđ îñ à ƒöļđéŕ ŵĥöšé ƒîļéš šîţ üñđéŕ à ṽöîçé öƒ ţĥéîŕ öŵñ, ţĥàţ ṽöîçé ŵîţĥ à ļîñé šàýîñĝ îţ ţàķéš ţĥé þļàçé öƒ ţĥé þŕöĵéçţ'š (Ç-06). kapi init ŵŕîţéš ţĥé ƒîļéš, ţĥé đéšķţöþ ŵŕîţéš ţĥéḿ ŵĥéñ à þŕöƒîļé îš šàṽéđ, àñđ ţĥéý àŕé ŕéƒŕéšĥéđ ŵĥéñ ţĥé çöñţéẋţ çĥàñĝéš, šö à çĥàñĝéđ þŕöƒîļé çĥàñĝéš ţĥé ƒîļéš ŵîţĥ îţ.

check ŕéàđš îţš šüƃĵéçţ ƒŕöḿ --input-text, à þöšîţîöñàļ ƒîļé, öŕ šţđîñ. Îţ ŕéţüŕñš ţĥé ǫüàļîţý-ĝàţé šéñţîñéļ ŵĥéñ àţ ļéàšţ öñé ƒîñđîñĝ ƒàîļš, ŵĥîçĥ ţĥé ÇĻÎ ḿàþš ţö à đîšţîñçţ éẋîţ çöđé (Š-01) šö šķîļļš àñđ ÇÎ çàñ ţéļļ à ƒàîļéđ çĥéçķ ƒŕöḿ àñ öþéŕàţîöñàļ éŕŕöŕ. Éàçĥ ƒîñđîñĝ þŕîñţš àš [fails/<category>] öŕ [reports/<category>], àñđ ţĥé ĴŠÖÑ öüţþüţ çàŕŕîéš passed, failing àñđ score. kapi check --voice îš ţĥé þŕöĵéçţ-ļéṽéļ šţýļé ĝàţé, ŵîţĥ --voice-min šéţţîñĝ ţĥé šîḿîļàŕîţý çüţöƒƒ.

Ƒîẋîñĝ öƒƒ-ṽöîçé çöñţéñţ​

ķàþî đöéš ñöţ šéñđ çöñţéñţ ţö à ḿöđéļ ţö ŕéŵŕîţé îţ. Àñ îñ-ṽöîçé ƒîẋ îš çàļļéŕ-šüþþļîéđ: ţĥé àššîšţàñţ ŕéàđš ŵĥàţ àþþļîéš àţ ţĥé þöîñţ (Ç-06), ŕéŵŕîţéš ţĥé öƒƒ-ṽöîçé ţéẋţ îţšéļƒ, àñđ àþþļîéš ţĥé ŕéšüļţ ţĥŕöüĝĥ kapi apply. Ţĥé éđîţš ļàñđ ţĥŕöüĝĥ ţĥé ƃýţé-ƒàîţĥƒüļ ŕöüñđ-ţŕîþ ŵîţĥ ñö þŕöṽîđéŕ îñṽöļṽéđ: šţŕüçţüŕé àñđ îñļîñé çöđéš àŕé þŕéšéŕṽéđ, éàçĥ éđîţ ñàḿéš ţĥé ŕéṽîšîöñ öƒ ţĥé ƃļöçķ îţ ŕéàđ àñđ îš ŕéƒüšéđ ŵĥéñ ţĥé ƃļöçķ ḿöṽéđ, àñđ àñ éđîţ ţĥàţ ŵöüļđ çöŕŕüþţ ḿàŕķüþ îš ŕéƒüšéđ.

kapi voice rewrite îš à šéþàŕàţé, đéţéŕḿîñîšţîç ĥéļþéŕ: îţ šüƃšţîţüţéš ţĥé ƒöŕƃîđđéñ àñđ çöḿþéţîţöŕ ţéŕḿš öƒ ţĥé ŵöŕđ ŕüļéš à ṽöîçé ƒîļé çàŕŕîéš (à šţàŕţéŕ þàçķ'š ţéŕḿš, à ƒîļé'š terms: ļîšţ) ƒöŕ ţĥéîŕ àþþŕöṽéđ ŕéþļàçéḿéñţš ƃý ŕüļé, öƒƒļîñé, ţĥŕöüĝĥ ţĥé šàḿé ḿàţçĥéŕ àš ţĥé ŵöŕđ-ŕüļé çĥéçķ (profile.RewriteTermRules). À þŕöƒîļé ŕéàđ ƒŕöḿ ţĥé ṽöîçé šţöŕé çàŕŕîéš ñö ŵöŕđ ŕüļéš, šö ţĥé þŕöĵéçţ'š ţéŕḿš àŕé àþþļîéđ ƃý kapi check àñđ ƒîẋéđ ţĥŕöüĝĥ kapi apply. À ŕüļé ţĥàţ ñàḿéš ñö ŕéþļàçéḿéñţ, àñđ à ḿàţçĥ öñ à đéçļàŕéđ îñƒļéçţéđ ƒöŕḿ öƒ à ţéŕḿ, šţàý îñ ţĥé ţéẋţ àñđ àŕé ŕéþöŕţéđ üñđéŕ skipped ŵîţĥ ţĥé ţéŕḿ, îţš ļîšţ, ŵĥéţĥéŕ îţ ƒàîļš, ţĥé šþéļļîñĝš ḿàţçĥéđ àñđ ţĥé ŕéàšöñ, šö à çàļļéŕ çàñ ţéļļ àñ üñçĥàñĝéđ ţéẋţ ŵîţĥ ñöţĥîñĝ ţö ƒîẋ ƒŕöḿ öñé ţĥàţ šţîļļ çàŕŕîéš ṽîöļàţîöñš. Ţĥé éẋîţ çöđé šţàýš 0. Îţ đöéš ñöţ çàļļ à ḿöđéļ àñđ đöéš ñöţ ţöüçĥ ţöñé, šţýļé öŕ þĥŕàšîñĝ; ţĥöšé àŕé ţĥé çàļļéŕ'š ţö ŕéŵŕîţé.

À ŵöŕđ ŕüļé îš à çĥàñĝé-šéţ öþéŕàţîöñ​

Ƒîẋîñĝ à ŕéçüŕŕîñĝ öƒƒ-ṽöîçé ţéŕḿ àţ ţĥé šöüŕçé (àđđîñĝ à ŵöŕđ ŕüļé šö éṽéŕý ƒüţüŕé đŕàƒţ îš çĥéçķéđ àĝàîñšţ îţ) îš à term öþéŕàţîöñ îñ ţĥé šàḿé kapi apply çĥàñĝé šéţ, àļöñĝšîđé ţĥé çöñţéñţ ƒîẋ ţĥàţ ĵüšţîƒîéš îţ:

{"op":"term","action":"upsert","term":"utilize","locale":"en","status":"forbidden","replacement":"use","advisory":true}

Ţĥé öþéŕàţîöñ ŵŕîţéš ţĥé çöñçéþţ îñţö ţĥé þŕöĵéçţ'š ţéŕḿš šţöŕé. advisory ḿàķéš à üšé öƒ ţĥé ţéŕḿ ŕéþöŕţ ŵîţĥöüţ ƒàîļîñĝ, àñđ competitor ŕéçöŕđš ţĥé ţéŕḿ àš à çöḿþéţîţöŕ'š ñàḿé. Ţĥé çöñţéẋţ þöļîçý ŕéƒüšéš ţĥé öþéŕàţîöñ ƃéƒöŕé àñýţĥîñĝ îš ŵŕîţţéñ ŵĥéñ àñ àĝéñţ àþþļîéš îţ, ţĥŕöüĝĥ apply_edits öŕ ƒŕöḿ àñ àĝéñţ'š šĥéļļ. À çĥàñĝé šéţ ĥàš ñö voice öþéŕàţîöñ; àñ éñţŕý ţĥàţ üšéš öñé îš ŕéƒüšéđ ŵîţĥ à ḿéššàĝé ţĥàţ ĝîṽéš ţĥé term ƒöŕḿ.

À ŕüļé šöḿéƃöđý ñöţîçéš ŵĥîļé ŵöŕķîñĝ îš à ţéŕḿ ŕüļé. kapi context note --term use --instead-of utilise ŕéçöŕđš à šüĝĝéšţîöñ, ŵĥîçĥ çĥéçķš ŕéþöŕţ àñđ ƒàîļ ñöţĥîñĝ öñ; à þéŕšöñ ķééþîñĝ îţ ŵŕîţéš ţĥé ŕüļé îñţö ţĥé þŕöĵéçţ'š ţéŕḿš šţöŕé, ŵĥéŕé éṽéŕý çĥéçķ ŕéàđš îţ. Šéé Ç-11.

Àüţĥöŕîñĝ à þŕöƒîļé​

kapi voice new šçàƒƒöļđš à çöḿḿéñţéđ, šçĥéḿà-ṽàļîđ ÝÀḾĻ ƒîļé àñđ kapi voice import ļöàđš îţ îñţö ţĥé þŕöĵéçţ'š ṽöîçé šţöŕé. Üšé kapi voice edit ƒöŕ šüƃšéǫüéñţ çĥàñĝéš: îţ ŵŕîţéš ţĥé šţöŕéđ þŕöƒîļé ţö à ţéḿþöŕàŕý ƒîļé ţĥŕöüĝĥ ţĥé šñàþšĥöţ šéŕîàļîžéŕ, öþéñš $VISUAL öŕ $EDITOR, ṽàļîđàţéš ŵĥàţ çöḿéš ƃàçķ ţĥé ŵàý kapi voice validate ṽàļîđàţéš à ƒîļé, àñđ îḿþöŕţš îţ àš öñé ŕéçöŕđéđ çĥàñĝé. Ţĥé éđîţéđ đöçüḿéñţ ŕéþļàçéš ţĥé ƒüļļ þŕöƒîļé, îñçļüđîñĝ àñý đéļéţéđ šéçţîöñš. Àñ éđîţöŕ éŕŕöŕ öŕ àñ üñçĥàñĝéđ đöçüḿéñţ ļéàṽéš ţĥé šţöŕéđ þŕöƒîļé îñţàçţ.

Ƃîñđîñĝ à þŕöƒîļé​

À ŕéçîþé ƃîñđš à ṽöîçé ƃý ñàḿé àñđ ñéṽéŕ ƃý ƒîļé: voice: {profile: <id>}, öŕ ţĥé šĥöŕţ ƒöŕḿ voice: <id>, ñàḿéš à þŕöƒîļé ţĥé þŕöĵéçţ'š šţöŕé ĥöļđš, àñđ voice: {pack: <name>} à šţàŕţéŕ þàçķ. À ŕéçîþé ţĥàţ ñàḿéš à ƒîļé (profile_file:, öŕ à voice: ţĥàţ îš à þàţĥ) ƒàîļš ţö ļöàđ, àñđ ţĥé ḿéššàĝé îđéñţîƒîéš ţĥé îḿþöŕţ çöḿḿàñđ àñđ ţĥé ŕéǫüîŕéđ ñàḿé ƃîñđîñĝ. Àļļ šüŕƒàçéš ŕéšöļṽé þŕöƒîļéš ƒŕöḿ ţĥé šţöŕé.

kapi store import ŕéàđš ţĥé þŕöƒîļéš à ļàýöüţ çàŕŕîéš: voice.yaml àţ ţĥé ţöþ öƒ ţĥé ļàýöüţ îš ţĥé þŕöĵéçţ'š, àñđ profiles/<name>/voice.yaml ƃéļöñĝš ţö ţĥàţ þŕöƒîļé. Ŵĥéñ ţĥé ŕéçîþé ƃîñđš ñö ṽöîçé üñđéŕ defaults:, ţĥé îḿþöŕţ ƃîñđš ţĥé þŕöĵéçţ'š þŕöƒîļé ţĥéŕé (öŕ ţĥé öñļý þŕöƒîļé ţĥé ļàýöüţ çàŕŕîéš) àñđ šàýš šö. Îţ ŵŕîţéš ţĥé ţŵö ļîñéš öƒ ţĥé ƃîñđîñĝ îñţö kapi.yaml àš à ţéẋţ îñšéŕţîöñ (project.BindVoice), šö éṽéŕý öţĥéŕ ƃýţé öƒ ţĥé ŕéçîþé šţàýš àš àüţĥöŕéđ. Ŵîţĥ šéṽéŕàļ þŕöƒîļéš àñđ ñöñé àţ ţĥé ţöþ, îţ ƃîñđš ñöñé àñđ ļîšţš ţĥéḿ ŵîţĥ ţĥé ļîñé ţö àđđ. À þŕöƒîļé'š öŵñ ṽöîçé ƃîñđš ţĥé šàḿé ŵàý üñđéŕ profiles.<name>.voice ŵĥéñ ţĥé ŕéçîþé đéçļàŕéš ţĥé þŕöƒîļé, ƃîñđš ñö ṽöîçé ţĥéŕé, àñđ ţĥé îđ ţĥé ƒîļé îš šţöŕéđ üñđéŕ îš ñöţ ţĥé þŕöƒîļé'š ñàḿé, ŵĥîçĥ ŵöüļđ öţĥéŕŵîšé šéļéçţ îţ (Ç-02). Àñ àĝéñţ'š îḿþöŕţ îš ŕéƒüšéđ, šîñçé ŕéàđîñĝ çöñţéẋţ îñ îš à þéŕšöñ'š đéçîšîöñ.

À ƃîñđîñĝ ţö à ḿîššîñĝ þŕöƒîļé þŕöđüçéš àñ éŕŕöŕ. Ţĥîš çàñ ĥàþþéñ ŵĥéñ à çļöñé ĥàš ñöţ îḿþöŕţéđ îţš çöñţéẋţ öŕ ŵĥéñ üšîñĝ à ñéŵ đàţà đîŕéçţöŕý. Ţĥé éŕŕöŕ ñàḿéš ţĥé ƃîñđîñĝ àñđ ţĥé ţŵö çöḿḿàñđš ţĥàţ ƃŕîñĝ ţĥé çöñţéẋţ, kapi context sync ŵĥéñ ţĥé þŕöĵéçţ šĥàŕéš îţš çöñţéẋţ àñđ kapi store import îñ à çĥéçķöüţ çàŕŕýîñĝ ţĥé þŕöƒîļé. kapi voice pack <name> îš šüĝĝéšţéđ öñļý ŵĥéñ à šţàŕţéŕ þàçķ çàŕŕîéš ţĥàţ ñàḿé, ƃéçàüšé ƒöŕ àñý öţĥéŕ ñàḿé îţ ŵöüļđ îñšţàļļ šöḿéţĥîñĝ éļšé.

kapi store import ŕéàđš à þŕöƒîļé'š ÝÀḾĻ ƒŕöḿ ţĥé ļàýöüţ þàţĥ à đîŕéçţöŕý ķéýš îţ ƃý (Ç-11). Ţĥé šţöŕé ḿéţàđàţà ķéý context.voiceBindings ţîéš à šţöŕéđ þŕöƒîļé'š îđ ţö ţĥé þàţĥ à ļàýöüţ ķéýš îţ ƃý, šö à šéçöñđ îḿþöŕţ öƒ ţĥé šàḿé ƒîļé ķééþš ţĥé îđ ţĥé ƒîŕšţ çĥöšé. Ţĥé ķéý îš import bookkeeping kept on the machine that ran the import. A pull and a ţŕàñšƒéŕ ƒîļé çàŕŕý ţĥé šţöŕé ŵîţĥöüţ îţ, šö ŕéšöļüţîöñ ŕéàđš öñļý ţĥé ŕéçîþé àñđ ţĥé šţöŕéđ þŕöƒîļéš.

Ƃüîļţ-îñ šţàŕţéŕ þàçķš​

Ţĥé ƒŕàḿéŵöŕķ éḿƃéđš à šḿàļļ šéţ öƒ šţàŕţéŕ þàçķš (core/profile/packs, éḿƃéđđéđ ŵîţĥ //go:embed), éàçĥ à çöḿþļéţé þŕöƒîļé ÝÀḾĻ ļöàđéđ ţĥŕöüĝĥ ţĥé šàḿé þàţĥ àš àñý öţĥéŕ þŕöƒîļé. Þàçķš àŕé àñ öñ-ŕàḿþ, ñöţ à šþéçîàļ çàšé: kapi voice new --pack <name> éḿîţš öñé àš àñ éđîţàƃļé ƃàšé. kapi voice profiles ļîšţš ŵĥàţ îš îñšţàļļéđ.

ḾÇÞ šüŕƒàçé​

host/mcp_voice.go ŕéĝîšţéŕš ţŵö öƒƒļîñé ṽöîçé ţööļš öñ ţĥé šĥàŕéđ kapi mcp šţđîö šéŕṽéŕ (Š-01) šö ñöñ-ÇĻÎ àĝéñţš ĝéţ þàŕîţý: voice_check šçöŕéš ţéẋţ üšîñĝ ţĥé ṽöîçé'š þàţţéŕñš àñđ ţĥé ŵöŕđ ŕüļéš îţš ƒîļé çàŕŕîéš, àñđ voice_rewrite šüƃšţîţüţéš ƒöŕƃîđđéñ àñđ çöḿþéţîţöŕ ţéŕḿš àñđ ŕéþöŕţš üñđéŕ skipped ŵĥàţ îţ ḿàţçĥéđ àñđ ļéƒţ îñ þļàçé.

Ţĥéšé àŕé ĥàñđ-àüţĥöŕéđ ƃéçàüšé éàçĥ ŵŕàþš à ŕéšöüŕçé (à ṽöîçé þŕöƒîļé, à ţéŕḿš šţöŕé, à çöñţéñţ ḿéḿöŕý) ŕàţĥéŕ ţĥàñ à šîñĝļé þŕöçéššîñĝ ţööļ. Ţĥé ŕéñđéŕéđ ĝüîđé îš ñöţ à ţööļ: îţ îš îñ ţĥé ŕüļéš ƒîļéš, àñđ îñ ƒüļļ ţĥŕöüĝĥ context_read öŕ ţĥé context://<path> àñđ context://profile/<name> ŕéšöüŕçéš (Ç-06), ƃéçàüšé ţĥé ĝüîđé îš þàŕţ öƒ ŵĥàţ àþþļîéš àţ à þöîñţ ŕàţĥéŕ ţĥàñ à ţĥîñĝ ţö àšķ ƒöŕ šéþàŕàţéļý.

Çöñšéǫüéñçéš​

  • À ṽöîçé þŕöƒîļé îš à þöŕţàƃļé ÝÀḾĻ đöçüḿéñţ ţĥàţ ŵöŕķš ŵîţĥ öŕ ŵîţĥöüţ à šţöŕé, ŕéṽîéŵàƃļé îñ à đ àñđ ŕéüšàƃļé àçŕöšš ţĥé ÇĻÎ, ḾÇÞ, ƒļöŵš àñđ šķîļļš.
  • Ţĥé đéţéŕḿîñîšţîç ŵöŕđ-ŕüļé àñđ þàţţéŕñ çĥéçķ ĝîṽéš àñ îñšţàñţ, öƒƒļîñé, ŕéþŕöđüçîƃļé šîĝñàļ; ţĥé ḿöđéļ çĥéçķ îš à ƃöüñđéđ, çŕéđéñţîàļ-ĝàţéđ öþţ-îñ ƒöŕ ţĥé šüƃĵéçţîṽé đîḿéñšîöñš.
  • Ƒîñđîñĝš àŕé ŕüñ-àñçĥöŕéđ àñđ àññöţàţîöñ-šĥàþéđ, šö ţĥéý çöḿþöšé ŵîţĥ ţĥé çöñţéñţ ḿöđéļ àñđ šüŕƒàçé üñîƒöŕḿļý ŕàţĥéŕ ţĥàñ ţĥŕöüĝĥ à ƃéšþöķé šîđé çĥàññéļ.
  • Ţĥé ḾǪḾ-šţýļé šçöŕîñĝ îš à šîñĝļé ƒüñçţîöñ öṽéŕ ƒîñđîñĝš, šö éṽéŕý šüŕƒàçé çöḿþüţéš ţĥé šàḿé šçöŕé ţĥé šàḿé ŵàý.
  • Ţĥéŕé îš öñé ŵöŕđ ļîšţ: éṽéŕý ŵöŕđ ŕüļé îš à ţéŕḿ, àñđ öñé ţéŕḿ-ŕüļé šĥàþé šéŕṽéš ţĥé ţéŕḿš šţöŕé, à ṽöîçé ƒîļé àñđ éṽéŕý ĝöṽéŕñéđ šţéþ, šö à ŕüļé đéçļàŕéđ àñýŵĥéŕé îš éñƒöŕçéđ àñđ ƒîñĝéŕþŕîñţéđ ţĥé šàḿé ŵàý.

Šéé àļšö​