Skip to content

feat: register {brightness}/{color} entity files - #38

Draft
JarbasAl wants to merge 1 commit into
devfrom
entity-registration-wave-a
Draft

feat: register {brightness}/{color} entity files#38
JarbasAl wants to merge 1 commit into
devfrom
entity-registration-wave-a

Conversation

@JarbasAl

@JarbasAl JarbasAl commented Aug 13, 2026

Copy link
Copy Markdown
Member

🤖 Auto-generated by Claude Fable 5 (claude-fable-5) via Claude Code — NOT human-reviewed. Verify before acting.

This repo ships brightness.entity and color.entity files matching the {brightness} and {color} slots in brightness.intent and eye_color.intent. The original version of this PR wired a manual initialize() that called register_entity_file for both. ovos-workshop 9.5.0a1 makes that manual call unnecessary: it now auto-registers every .entity file shipped under a skill's locale resources the first time that language's resources load, before any intent template is registered, and the registration is idempotent. So this PR now ships only the entity files (already present) plus the test coverage and the floor bumps that guarantee auto-registration is active — there is no more skill-authored registration code.

Floors: ovos-workshop>=9.5.0a1,<10.0.0 (runtime and test extra) and ovos-padatious>=2.0.4a1,<3.0.0 (test extra). These are the versions where auto-registration and its entity-naming fix landed. The test extra's ovos-core pin was also fixed to ovos-core[plugins,lgpl], matching the sibling skill PRs in this batch, so ovos-adapt-pipeline-plugin actually installs and the golden-utterance suite's Adapt-intent rows (e.g. "right look") run instead of silently failing to match.

The unit test now boots the skill with a FakeBus and no manual registration call anywhere in the code, and asserts the padatious:register_entity messages for both {brightness} and {color} land on the bus with the expected sample values straight from the locale files. Deleting either entity file turns the test red — verified locally by removing color.entity, confirming the failure, then restoring it and confirming green again.

The end-to-end suite is unchanged in substance: a registered color ("turquoise") still routes at the padatious-high band with the slot tagged correctly, and an unregistered color ("mauve") still routes but only once the session pipeline also includes padatious-medium, since an unregistered value is floored below the high threshold — that's the entity-as-hint, not allow-list, behavior. brightness.entity's bare #/##/###/#%/##%/###% lines across all thirteen locales were placeholders left over from an earlier draft, never actually replaced: the shared resource reader drops them as comments, so they never registered any numeric hint. They're now replaced in every locale with real numeric and percent examples (20, 50, 75, 100 and their percent-word forms), and the unit test asserts a numeric sample lands on the bus alongside the word samples.

Verified in a fresh uv venv with --prerelease=allow: the resolver picks ovos-workshop==9.5.0a1 and ovos-padatious==2.0.4a1 off the declared floors, and ovos_adapt now imports. Full suite (64 tests, unit + end-to-end) passed clean in ~271s after the brightness.entity fix.

@coderabbitai

coderabbitai Bot commented Aug 13, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: e52eb6dd-2465-4750-b801-0576529e0af3

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

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 commented Aug 13, 2026

Copy link
Copy Markdown

Checking back in with the latest test results. 📡

I've aggregated the results of the automated checks for this PR below.

📋 Repo Health

Ensuring the repo is getting enough sleep (aka stable releases). 💤

✅ All required files present.

Latest Version: 0.0.3a6

version.py — Version file
README.md — README
LICENSE — License file
pyproject.toml — pyproject.toml
⚠️ setup.py — setup.py
CHANGELOG.md — Changelog
version.py has valid version block markers

🎙️ Skill

Auditing the skill's manifest for completeness. 📋

🎙️ (unknown skill_id) — 13 languages

en-US: 3 intents · 22 vocab · 15 dialogs · skill.json ⚠️

Translation coverage — 12 languages (6 complete, 6 incomplete)
Language Progress Coverage
ca-ES ██████████ ✅ 100.0% (42/42)
da-DK ██████████ ✅ 100.0% (42/42)
de-DE ██████████ ✅ 100.0% (42/42)
el-GR █████░░░░░ ❌ 45.2% (19/42)
es-ES ██████████ ✅ 100.0% (42/42)
fr-FR ██████████ ✅ 100.0% (42/42)
gl-ES ██████████ ✅ 100.0% (42/42)
it-IT █████░░░░░ ❌ 45.2% (19/42)
nl-NL █████░░░░░ ❌ 45.2% (19/42)
pt-BR █████░░░░░ ❌ 45.2% (19/42)
ru-RU █████░░░░░ ❌ 45.2% (19/42)
sv-SE █████░░░░░ ❌ 45.2% (19/42)

⚖️ License Check

Legal eagle here! Checking those licenses. ⚖️

✅ No license violations found.

Policy: Apache 2.0 (universal donor). StrongCopyleft / NetworkCopyleft / WeakCopyleft / Other / Error categories fail. MPL allowed.

🔒 Security (pip-audit)

Security report: No threats detected in the area. ✅

✅ No known vulnerabilities found (78 packages scanned).

🔍 Lint

The latest check cycle has concluded. 🔄

ruff: issues found — see job log

🧪 Spec Lint

The latest check report is officially filed. 📁

22 error(s), 22 warning(s)

locale/ca-ES/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/ca-ES/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/da-DK/brightness.intent: error: single-branch group (dine): a group must offer a choice between at least two branches  [in: 'dæmp (dine) øjne til {brightness} (procent|)']
locale/de-DE/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/de-DE/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/el-GR/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/el-GR/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/el-GR/brightness.intent: error: single-branch group (σου): a group must offer a choice between at least two branches  [in: 'άλλαξε (το|τη) (επίπεδο φωτεινότητας|φωτεινότητα) (στο|στα) (μάτι|μάτια) (σου)']
locale/el-GR/brightness.intent: error: single-branch group (φωτεινός): a group must offer a choice between at least two branches  [in: 'είσαι (πολύ|) (φωτεινός)']
locale/es-ES/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/es-ES/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/fr-FR/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/fr-FR/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/gl-ES/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/gl-ES/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/gl-ES/brightness.intent: error: single-branch group (nivel): a group must offer a choice between at least two branches  [in: '(cambiar|establecer) (o teu) (nivel) de (brillo|iluminación) do (ollo|) ata o (nivel|)']
locale/gl-ES/brightness.intent: error: single-branch group (nivel): a group must offer a choice between at least two branches  [in: '(cambiar|establecer) (o teu) (nivel) de (brillo|iluminación) do (ollo|) ata o {brightness} (por cento|)']
locale/gl-ES/brightness.intent: error: single-branch group (reduzace): a group must offer a choice between at least two branches  [in: '(reduzace) (o|a) (brillo|iluminación) dos teus ollos ata o {brightness} (porcento|)']
locale/gl-ES/brightness.intent: error: single-branch group (os teus): a group must offer a choice between at least two branches  [in: 'escurece (os teus) ollos ata o {brightness} (porcento|)']
locale/it-IT/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/it-IT/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/it-IT/brightness.intent: error: single-branch group (di): a group must offer a choice between at least two branches  [in: '(cambia|imposta |modifica) (livello| ) (di) (luminosità | illuminazione) (del| tuo) (occhio |)']
locale/it-IT/brightness.intent: error: single-branch group (percento): a group must offer a choice between at least two branches  [in: '(modifica|cambia|imposta) (il|tuo|livello|la|di) (luminosità|illuminazione) (degli occhi) al {brightness} (percento)']
locale/it-IT/eye_color.intent: error: single-branch group (colore): a group must offer a choice between at least two branches  [in: '(cambia|imposta) (i tuoi|gli|) occhi a (un) (colore) {color}']
locale/it-IT/eye_color.intent: error: single-branch group (colore): a group must offer a choice between at least two branches  [in: '(cambia|imposta) (occhio|occhi) a (un) (colore) {color}']
locale/nl-NL/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/nl-NL/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/nl-NL/custom_eye_color.intent: error: single-branch group (in): a group must offer a choice between at least two branches  [in: '(stel|verander) (op|in) (een)? aangepaste oog(kleur|kleuren) (in)?']
locale/nl-NL/custom_eye_color.intent: error: single-branch group (in): a group must offer a choice between at least two branches  [in: '(zet|stel) aangepaste oog(kleur|kleuren) (in)?']
locale/nl-NL/eye_color.intent: error: single-branch group (in): a group must offer a choice between at least two branches  [in: '(verander|stel) (de|jouw) oog(kleur|kleuren|) (naar|in|op) {color} (in)?']
locale/nl-NL/eye_color.intent: error: single-branch group (in): a group must offer a choice between at least two branches  [in: '(verander|stel) (jouw)? ogen (naar|in|op) (een)? {color} (kleur)? (in)?']
locale/nl-NL/eye_color.intent: error: single-branch group (in): a group must offer a choice between at least two branches  [in: '(verander|stel) (oog(kleur|kleuren|)|ogen) (naar|in|op) {color} (in)?']
locale/nl-NL/eye_color.intent: error: single-branch group (in): a group must offer a choice between at least two branches  [in: '(verander|stel) oog(kleur|kleuren) (in)?']
locale/nl-NL/eye_color.intent: error: single-branch group (in): a group must offer a choice between at least two branches  [in: '(verander|stel) oog(kleur|kleuren) (naar|in|op) iets {color} (in)?']
locale/pt-BR/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/pt-BR/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/pt-BR/brightness.intent: error: single-branch group (nível): a group must offer a choice between at least two branches  [in: '(mudar|definir|trocar) (o|seu) (nível) de (brilho|iluminação) do (olho|) para {brightness} (por cento|)']
locale/ru-RU/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/ru-RU/colors.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)
locale/ru-RU/brightness.intent: error: unbalanced metacharacters in template '(измени|установи|смени) ((уровень|) (яркость|иллюминацию) (|твоих) (глаз|) на {brightness} (процентов|()'  [in: '(измени|установи|смени) ((уровень|) (яркость|иллюминацию) (|твоих) (глаз|) на {brightness} (процентов|()']
locale/ru-RU/brightness.intent: error: single-branch group (процент): a group must offer a choice between at least two branches  [in: 'затемни ( | твои) глаза {brightness} (процент)']
locale/ru-RU/brightness.intent: error: single-branch group (процент): a group must offer a choice between at least two branches  [in: 'затемни на {brightness} (процент)']
locale/sv-SE/brightness.levels.value: warning: .value is a legacy file type, not an OVOS-INTENT-2 resource role (OVOS-INTENT-2 §1)

🔨 Build Tests

Running the forge to see if the code tempers correctly. 🔥

✅ All versions pass

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

🔌 Skill Tests (ovoscope)

Intent-matching simulation: results incoming! 🚀

59/59 passed

TestEntityConstraints — 3/3
TestIntentRouting — 2/2
test_golden_utterance[blink enclosure] — 1/1
test_golden_utterance[blink left] — 1/1
test_golden_utterance[blink right] — 1/1
test_golden_utterance[blink] — 1/1
test_golden_utterance[change eye color to default] — 1/1
test_golden_utterance[change eye colors to default] — 1/1
test_golden_utterance[change eye to default] — 1/1
test_golden_utterance[change eyes color to default] — 1/1
test_golden_utterance[change eyes colors to default] — 1/1
test_golden_utterance[change the brightness level] — 1/1
test_golden_utterance[change the brightness] — 1/1
test_golden_utterance[change the eye brightness level] — 1/1
test_golden_utterance[change the eye brightness] — 1/1
test_golden_utterance[change the eye illumination] — 1/1
test_golden_utterance[change to a custom eye color] — 1/1
test_golden_utterance[change to a custom eye colors] — 1/1
test_golden_utterance[crazy eye animation] — 1/1
test_golden_utterance[crazy eye enclosure] — 1/1
test_golden_utterance[crazy eye] — 1/1
test_golden_utterance[down look enclosure] — 1/1
test_golden_utterance[down look] — 1/1
test_golden_utterance[down up look animation] — 1/1
test_golden_utterance[down up look enclosure] — 1/1
test_golden_utterance[down up look] — 1/1
test_golden_utterance[enclosure back to default] — 1/1
test_golden_utterance[eye narrow enclosure] — 1/1
test_golden_utterance[eye narrow] — 1/1
test_golden_utterance[left look enclosure] — 1/1
test_golden_utterance[left look] — 1/1
test_golden_utterance[left right look animation] — 1/1
test_golden_utterance[left right look enclosure] — 1/1
test_golden_utterance[left right look] — 1/1
test_golden_utterance[listen enclosure] — 1/1
test_golden_utterance[listen] — 1/1
test_golden_utterance[right look enclosure] — 1/1
test_golden_utterance[right look] — 1/1
test_golden_utterance[rotate enclosure] — 1/1
test_golden_utterance[rotate] — 1/1
test_golden_utterance[set custom eye color] — 1/1
test_golden_utterance[set to a custom eye color] — 1/1
test_golden_utterance[set to a custom eye colors] — 1/1
test_golden_utterance[smile enclosure] — 1/1
test_golden_utterance[smile] — 1/1
test_golden_utterance[think enclosure] — 1/1
test_golden_utterance[think] — 1/1
test_golden_utterance[up look enclosure] — 1/1
test_golden_utterance[up look] — 1/1
test_negative_confusable_not_claimed[go to sleep] — 1/1
test_negative_confusable_not_claimed[play some music] — 1/1
test_negative_confusable_not_claimed[set a timer for 5 minutes] — 1/1
test_negative_confusable_not_claimed[take a screenshot] — 1/1
test_negative_confusable_not_claimed[turn off the living room lights] — 1/1
test_negative_confusable_not_claimed[turn up the brightness] — 1/1
test_negative_confusable_not_claimed[what's the weather] — 1/1

🚌 Bus Coverage

Calculating the signal margins of your changes. 📐

⚠️ Bus coverage report unavailable — check the job log.

📊 Coverage

How well do we know our own code? 🧠

16.6% total coverage

Per-file coverage (10 files)
File Coverage Missing lines
test/end2end/test_entity_constraints.py 0.0% 58
test/end2end/test_golden_utterances.py 0.0% 62
test/end2end/test_intents_en_us.py 0.0% 46
test/unittests/test_entity_registration.py 0.0% 26
test/unittests/test_resources.py 0.0% 21
version.py 0.0% 7
__init__.py 30.7% 178
test/__init__.py 100.0% 0
test/end2end/__init__.py 100.0% 0
test/unittests/__init__.py 100.0% 0

Full report: download the coverage-report artifact.

🏷️ Release Preview

I've checked the 'Security Updates' section. 🛡️

Current: 0.0.3a6Next: 0.1.0a1

Signal Value
Label feature
PR title feat: register {brightness}/{color} entity files
Bump minor

✅ PR title follows conventional commit format.


🚀 Release Channel Compatibility

Predicted next version: 0.1.0a1

Channel Status Note Current Constraint
Stable Not in channel -
Testing Not in channel -
Alpha Not in channel -

Thanks for making OVOS better today! 🙌

ovos-workshop 9.5.0a1 auto-registers every .entity file shipped under a
skill's locale resources the first time that language's resources load,
before any intent template is registered, and the registration is
idempotent -- no skill-authored register_entity_file() call is needed
anymore. This PR now ships only locale/*/brightness.entity and
locale/*/color.entity (already present) plus test coverage and the floor
bumps that guarantee auto-registration is active; __init__.py no longer
has an initialize() at all.

Unit test boots the skill via a FakeBus with no manual registration call
and asserts the padatious:register_entity messages for both {brightness}
and {color} land with the expected sample values. Deleting either entity
file turns it red (verified locally). E2e coverage of the padatious
hint-band behavior for out-of-list values, and brightness.entity's
digit-wildcard '#' lines being dropped as comments, is unchanged.

Also fixes the test extra's ovos-core pin to ovos-core[plugins,lgpl],
matching the sibling skill PRs in this batch, so ovos-adapt-pipeline-plugin
actually installs and the golden-utterance suite's Adapt-intent rows can
run instead of silently failing to match.

Floors: ovos-workshop>=9.5.0a1,<10.0.0; ovos-padatious>=2.0.4a1,<3.0.0
(test extra).
@JarbasAl
JarbasAl force-pushed the entity-registration-wave-a branch from 1230d39 to ff3408a Compare August 15, 2026 12:49
@github-actions github-actions Bot added feature and removed feature labels Aug 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant