Add seven stage 0 frames and tighten three more (V-720)

MavenHelpGrammar keeps "как отменить напоминание" on SourceSelf, where the
answer names the command Maven accepts, instead of leaking to search.
PublicCurrentVersionGrammar anchors an explicitly current release on
SourceWorld and declines first-person ownership.

AmbiguousFragmentGrammar refuses filler plus an unresolved demonstrative
rather than letting a statistical head invent context.
ImplicitElapsedQueryGrammar reads Russian question word order in "давно я
не тренировался" as recall; the declarative order stays a statement.
ReminderCancellationReportGrammar keeps "я отменил напоминание" in the
non-mutating chat lane.

CommandProhibitionGrammar routes a direct negative command to a sentinel
fn that can never collide with an enabled tool. ActHasEntityTarget stops a
bare verb or a demonstrative-only tail from crossing into Nexus.

Praxis attention now accepts "что там с X" for the four service names only.
taskstatus separates command mood from result words so a first-person
report cannot mutate the board. question.go exports the open-question and
locative shapes the recall gate reads.

--no-verify: master is the working branch this session by the owner's call.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 17:18:48 +04:00
parent 9944ec8c58
commit a97764c5f7
30 changed files with 1616 additions and 78 deletions
+4 -4
View File
@@ -118,12 +118,12 @@ var PraxisAliases = map[string]string{
// three are configured. It mirrors actionAct in cmd/mavend/actions_act.go and
// hexisBeforeClarify in cmd/mavend/ecosystem_acts.go, in their order:
//
// 1. A clarified act with text and no fn reaches Hexis before the clarify
// 1. A clarified act with a named entity target and no fn reaches Hexis before the clarify
// question is ever asked. That path runs on the raw slots, so the matcher
// does not get to fill fn first.
// 2. Otherwise the act matcher may earn a fn from the text slot.
// 3. A fn that is a Praxis capability alias dispatches to Praxis.
// 4. Non-empty text reaches Hexis.
// 4. An act with a named entity target reaches Hexis.
// 5. Anything else stays inside Maven.
//
// It returns the service and, for Praxis, the capability the fn landed on.
@@ -132,7 +132,7 @@ func Reach(d router.Decision, m router.ActMatcher) (Service, string) {
return ServiceNone, ""
}
if d.Clarify {
if !d.Slots.HasFn && d.Slots.Text != "" {
if !d.Slots.HasFn && router.ActHasEntityTarget(d) {
return ServiceHexis, ""
}
return ServiceNone, ""
@@ -148,7 +148,7 @@ func Reach(d router.Decision, m router.ActMatcher) (Service, string) {
return ServicePraxis, capability
}
}
if d.Slots.Text != "" {
if router.ActHasEntityTarget(d) {
return ServiceHexis, ""
}
return ServiceNone, ""
+7 -2
View File
@@ -107,10 +107,15 @@ func TestReachDerivation(t *testing.T) {
want: ServiceNone,
},
{
name: "a clarified act with text still reaches hexis",
dec: router.Decision{Intent: router.IntentAct, Clarify: true, Slots: router.Slots{Text: "выключи это"}},
name: "a clarified act with a named entity still reaches hexis",
dec: router.Decision{Intent: router.IntentAct, Clarify: true, Slots: router.Slots{Text: "перезапусти muzick indexer"}},
want: ServiceHexis,
},
{
name: "a clarified act with only an unresolved reference stays local",
dec: router.Decision{Intent: router.IntentAct, Clarify: true, Slots: router.Slots{Text: "выключи это"}},
want: ServiceNone,
},
{
name: "a clarified act that already has a fn does not",
dec: router.Decision{Intent: router.IntentAct, Clarify: true, Slots: router.Slots{Fn: "restart", HasFn: true, Text: "перезапусти"}},