Skip to content

Release 0.12.56a1 - #471

Closed
github-actions[bot] wants to merge 516 commits into
masterfrom
release-0.12.56a1
Closed

github-actions[bot] wants to merge 516 commits into
masterfrom
release-0.12.56a1

Conversation

@github-actions

Copy link
Copy Markdown

Human review requested! This supersedes any earlier open release proposal for this repository.

github-actions Bot and others added 30 commits September 26, 2026 10:25
locale/pl-PL/ ships dialogs, intents, entities and vocabularies and no
skill.json, so the Polish store entry has no name and no description.

Machine written from locale/en-US/skill.json. Unvouched: it waits for a
Polish speaker. The native-reviewer registry has no pl-PL row at all, so
there is nobody to tag.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
locale/pt-BR/ ships dialogs, intents, entities and vocabularies and no
skill.json, so the Brazilian store entry has no name and no description.

Machine written from locale/en-US/skill.json. Unvouched: it waits for
femelo, the pt-BR reviewer on record.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
… space (#288)

The es-ES bread-timer example read "un temporizador de pandurante 30 minutos".
The machine fused "bread" and "for" into one word and dropped the bread. The
sibling locales keep it: gl-ES "para o pan", it-IT "la cottura del pane".

Three descriptions, en-US included, ended in a space. The store renders the
value verbatim.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…list (#298)

Both files were a cross product of three bags of words translated one word
at a time from an English option list. The first group held 'claro' for
"clear", 'espetáculo' for "show", 'nomeação' for "appointment", 'obteve'
for "got" and the fragment 'ter i' for "have I". They matched utterances
nobody says, missed the ones people do say, and swallowed a question about
what an alarm is.

The templates now use the {alertkind} slot this locale already ships, as
en-US does, instead of repeating a noun list inside each file.

Measured with a real padacioso container on 23 ordinary requests:
4 of 23 before, 23 of 23 after. 'o que é um alarme', a question about what
an alarm is, matched list_alerts before and does not now.

The skill.json examples in #295 still match: 14 of 14, unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Three golden rows in test/end2end/golden_utterances_pt-PT.jsonl named
sentences only the old templates matched: 'claro alarme', 'atualizar
alarme' and 'existe alarmes'. They are replaced with sentences a Portuguese
speaker says, which the new templates match: 'cancela todos os alarmes',
'quando é o meu próximo alarme' and 'quais são os meus alarmes'. Verified
16 of 16 in a padacioso container (T-5480).

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
…d list (#300)

Both files were a cross product of three bags of words, each word
translated on its own from an English option list. They matched utterances
nobody says, missed the ones people do say, and collided with other
intents of this same skill.

Measured with a real padacioso container, using this locale's own
templates as the probes: 2 tie(s) between an intent of this skill and
list_alerts before, 0 after. A tie has no winner, so the runtime picks
one arbitrarily.

The two ties were `tinc un esdeveniment` and `tinc una cita`, both create_event samples, tied with list_alerts because the bag held `vaig`/`tinc` and the kind noun.

The templates now use the {alertkind} slot this locale already ships in
entity/alertkind.entity, as en-US does, instead of repeating a noun list
inside each file.

The store examples in locale/ca-ES/skill.json also improve, from 3 of
14 to 7 of 14, with none lost.

Unvouched: ca-ES has nobody on record in the native-reviewer registry.



The {name} line this file was missing.

Every line here rewrites cancel_alert out of the T-5467 word salad, and none
of them let the user name the alert: measured across all nine open rewrites,
145 added lines and not one carrying {name}. Nine locales would have got a
clean cancel_alert that still cannot cancel one alarm rather than all of
them.

The line is localize's, from T-5662, not this lane's. The shape is the
locale's own "cancel my {alertkind}" line with one function word and the
slot: `de` here. A bare appended {name} was proposed and rejected,
because two adjacent slots give the engine no boundary to split on.

Probe recorded by localize for this locale: `cancel·la la meva alarma de dentista`
  before: cancel_alert, name empty
  after:  cancel_alert, name=dentista

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…d list (#301)

Both files were a cross product of three bags of words, each word
translated on its own from an English option list. They matched utterances
nobody says, missed the ones people do say, and collided with other
intents of this same skill.

Measured with a real padacioso container, using this locale's own
templates as the probes: 1 tie(s) between an intent of this skill and
list_alerts before, 0 after. A tie has no winner, so the runtime picks
one arbitrarily.

The tie was `dime que recordatorios`, a create_reminder sample, tied with list_alerts because the bag held `dime` and `recordatorios`. The first group also held `espectáculo` for "show" the performance and `conseguido` for "got".

The templates now use the {alertkind} slot this locale already ships in
entity/alertkind.entity, as en-US does, instead of repeating a noun list
inside each file.

The store examples in locale/es-ES/skill.json also improve, from 3 of
14 to 6 of 14, with none lost.

Unvouched: es-ES has nobody on record in the native-reviewer registry.



The {name} line this file was missing.

Every line here rewrites cancel_alert out of the T-5467 word salad, and none
of them let the user name the alert: measured across all nine open rewrites,
145 added lines and not one carrying {name}. Nine locales would have got a
clean cancel_alert that still cannot cancel one alarm rather than all of
them.

The line is localize's, from T-5662, not this lane's. The shape is the
locale's own "cancel my {alertkind}" line with one function word and the
slot: `de` here. A bare appended {name} was proposed and rejected,
because two adjacent slots give the engine no boundary to split on.

Probe recorded by localize for this locale: `cancela mi alarma de dentista`
  before: cancel_alert, name empty
  after:  cancel_alert, name=dentista

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…d list (#302)

Both files were a cross product of three bags of words, each word
translated on its own from an English option list. They matched utterances
nobody says, missed the ones people do say, and collided with other
intents of this same skill.

Measured with a real padacioso container, using this locale's own
templates as the probes: 1 tie(s) between an intent of this skill and
list_alerts before, 0 after. A tie has no winner, so the runtime picks
one arbitrarily.

The tie was `teño un evento`, a create_event sample, tied with list_alerts because the bag held `teño` and `evento`.

The templates now use the {alertkind} slot this locale already ships in
entity/alertkind.entity, as en-US does, instead of repeating a noun list
inside each file.

The store examples in locale/gl-ES/skill.json also improve, from 0 of
14 to 4 of 14, with none lost.

Unvouched: gl-ES has nobody on record in the native-reviewer registry.



The {name} line this file was missing.

Every line here rewrites cancel_alert out of the T-5467 word salad, and none
of them let the user name the alert: measured across all nine open rewrites,
145 added lines and not one carrying {name}. Nine locales would have got a
clean cancel_alert that still cannot cancel one alarm rather than all of
them.

The line is localize's, from T-5662, not this lane's. The shape is the
locale's own "cancel my {alertkind}" line with one function word and the
slot: `de` here. A bare appended {name} was proposed and rejected,
because two adjacent slots give the engine no boundary to split on.

Probe recorded by localize for this locale: `cancela a miña alarma de dentista`
  before: cancel_alert, name empty
  after:  cancel_alert, name=dentista

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…e templates (#303)

locale/ru-RU/ ships dialogs, intents, entities and vocabularies and no
skill.json, so the Russian store entry has no name and no description.

The 14 examples are lines the shipped ru-RU templates match, not
translations of the en-US examples: 14 of 14 fire an intent in a real
padacioso container, against an en-US control of 10 of 14 in the same tree.

Machine written from locale/en-US/skill.json. Unvouched: it waits for
putnik, the ru-RU reviewer on record.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
… bags (#318)

Both files were a cross product of two word bags. reschedule_alert held no
slot at all, so a French speaker could not name a time, a name or an old
time, and timer_status held only the noise-group shape.

Eight templates replace each file, each a sentence, each using the
{schedkind} or {timerkind} entity the locale already ships, and each of
the two files gains the {name} line that only en-US, da-DK and pt-BR had.

Controls: three ordinary requests reach the right intent, 0 of 3 before
this change and 3 of 3 after; a definition question reaches neither
intent; every line expands with ovos_spec_tools.expand and no line holds
adjacent slots.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
github-actions Bot and others added 27 commits October 23, 2026 21:35
No code, intent or test loads these vocabularies, and en-US no longer ships them. The translated copies stayed behind in the other locales: calendar.voc, change.voc, choice.voc, delete.voc, items.voc, later.voc, media.voc, miss.voc, put.voc, query.voc, question.voc, remaining.voc, script.voc, synchronize.voc, time.voc.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
handle_ocp_alarm took its branch before create_alarm asked for a time.
With no time in the utterance it attached the media result to the next
upcoming alarm, silently, instead of creating one.

handle_create_alarm now resolves the expiration first, asking for the
time exactly as it does for a plain alarm, and hands the new alarm to
handle_ocp_alarm, which only attaches the media to that alarm.

Fail-before: with one 07:00 alarm, "set an alarm that plays music" left
the 07:00 alarm holding the media and spoke nothing.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The check that decides whether a media request names an existing alarm
read only each alarm's next expiration. A daily 07:00 alarm plus a
change_media_properties request for "jazz at 7 am on sunday" therefore
created a second Sunday 07:00 alarm. Alert.rings_at now also matches the
weekday, interval and until repeats of an alarm. When one or more alarms
ring at the requested time, only those alarms are offered for the media,
so an alarm on another day is never offered.

Tests send change_media_properties straight to the skill, so the guard is
reached whatever intent the matcher would have chosen. The test for a
time that an existing alarm rings at seeds the next 07:00 instead of
tomorrow's, which failed between midnight and 07:00.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
The golden module boots through ovoscope.routing on the one-stage m2v
prototype pipeline and records each golden and negative row in the
session routing tally. The only routing gate is the session threshold in
the pytest options, with no per-locale or per-row exceptions.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
padacioso 2.5.4a1 counts an accented entity value as a member of its
entity. With that, cs-CZ "nastav budík, aby přehrával hudbu" scores
change_media_properties and create_alarm the same, and create_alarm
wins. known_intent_ties.json records the tie.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
OVOSSkill.voc_match and the module voc_match take the utterance first and
the vocabulary name second. Three calls passed them the other way round, so
each looked up a vocabulary named after the utterance and never matched.
"this week" listed every alert instead of the week's, "my next alarm" on the
list intent listed every alert instead of the next one, and "cancel" while
choosing alarm media searched for "cancel" as media.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: JarbasAI <33701864+JarbasAl@users.noreply.github.com>
get_alert_type_from_intent no longer writes keyword matches into
message.data and reads them back. A create intent names its alert type.
Any other intent takes the type from the first alert type vocabulary in
the utterance, else AlertType.ALL.

"remind me to wake up the kids at 7" on create_reminder was an alarm,
because wake.voc ranked before remind.voc. A create intent whose
utterance held no type word, such as "set one for 10 minutes", was
AlertType.ALL.

handle_list_all_alerts listed every kind only when the injected "alert"
key was set. A list request that named no kind spoke the intro and no
alert. It lists every kind when the type is AlertType.ALL.

kw_match had no other caller and is removed.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: JarbasAI <33701864+JarbasAl@users.noreply.github.com>
…d time (#461)

When two or more alarms ring in the same minute at different next
expirations (for example two alarms that repeat every two hours),
_resolve_requested_alert keeps no candidate, because none has the
requested time of day as its next expiration. The handler then said
"You have no scheduled alarm" and changed nothing.

_resolve_requested_alert takes ask_if_unmatched. When no candidate
matches and the flag is set, it asks the user to pick from the alarms it
was given, with the usual pick_multiple_entries intro. The change-media
handler sets it when alarms ring at the requested time. The picker runs
once: a declined answer is not asked a second time.

Unit and MiniCroft tests fail on dev (the picker is never offered) and
the decline tests fail on the earlier fallback (picker asked twice).

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: JarbasAI <33701864+JarbasAl@users.noreply.github.com>
#463)

"wake me up in 8 hours" added the duration to a zoned datetime. Python
does that sum on the wall clock, so an interval that crosses a DST change
in the configured zone came out one hour off: 18:16 WEST on the autumn
change day rang 9 real hours later, and a 90-minute timer at 00:50 WEST on
the change night rang after 2.5 hours.

parse_alert_time_from_message, the repeat-interval default and
parse_timedelta_from_message now do the arithmetic in UTC. Two readers of
the result had the same wall-clock flaw. Alert._get_next_expiration_time
replaced the stored offset with the zone, which moved a time in the
repeated autumn hour back by one hour. spoken_duration subtracted two
datetimes of one zone, so the spoken length was wrong across the change.

The two test_skill assertions encoded the wall-clock rule. They now assert
elapsed time. New tests freeze the clock at Lisbon DST-crossing instants.
Without the fix 7 of the 9 new tests fail; with it all pass.

The new tests import time_machine, so time-machine joins the test extra.
An expired alert reports no expiration, so the two tests that read
Alert.expiration also freeze the clock before the stored instant.

Co-authored-by: JarbasAi <jarbasai@mailfence.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot closed this Oct 28, 2026
@coderabbitai

coderabbitai Bot commented Oct 28, 2026

Copy link
Copy Markdown

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 40d042da-f69e-4e1e-aea3-5191eb1a3f06

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions
github-actions Bot deleted the release-0.12.56a1 branch October 28, 2026 18:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants