Skip to content

Release 0.0.2a8 - #25

Open
github-actions[bot] wants to merge 24 commits into
masterfrom
release-0.0.2a8
Open

Release 0.0.2a8#25
github-actions[bot] wants to merge 24 commits into
masterfrom
release-0.0.2a8

Conversation

@github-actions

Copy link
Copy Markdown

Human review requested!

JarbasAl and others added 24 commits November 22, 2025 21:16
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* test: add full-pipeline persona e2e via ovoscope

Adds test/test_e2e_persona_pipeline.py: drives an utterance through
MiniCroft with ovos-persona-pipeline-plugin backed by AIMLSolver
(bundled AIML brain, no network), asserts speak output and per-session
memory recording (USER + ASSISTANT turns).

Also modernises CI workflows to OpenVoiceOS/gh-automations@dev and
adds pyproject.toml with [test] extras.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(packaging): dynamic version from version.py so pyproject build resolves

* fix(packaging): move dependencies under [project] (was nested in project.urls)

* fix: drop legacy setup.py/requirements.txt, pin ovos-persona@dev, modernize workflows

- Remove setup.py (pyproject.toml covers everything); fixes sdist build failure
  caused by missing requirements.txt inside the isolated build env
- Remove requirements.txt (deps declared in pyproject.toml [project.dependencies])
- MANIFEST.in: fix recursive-include syntax; drop requirements.txt line
- pyproject.toml: bump build-system requires to setuptools>=61.0; pin test extra
  ovos-persona to git+https://github.com/OpenVoiceOS/ovos-persona@dev so CI gets
  the version that exposes Persona.memory (not released 0.7.1)
- conventional-label.yml: replace hand-rolled bcoe action with
  OpenVoiceOS/gh-automations reusable workflow @dev
- license_tests.yml: replace copy-pasted full-OVOS-core workflow with
  OpenVoiceOS/gh-automations license-check.yml @dev

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test: pin ovos-persona>=0.9.0a1 from PyPI instead of git+@dev

* ci: drop non-canonical license workflow (not in OVOS plugin CI set)

* ci: add license-check (canonical invocation)

* refactor!: migrate from deprecated QuestionSolver to ChatEngine

QuestionSolver is deprecated and its base eagerly builds a LanguageTranslator
(enable_tx=True) that hard-fails when no translate plugin is installed, dropping
the persona in clean environments. ChatEngine loads no translator. Implements
continue_chat() over the AIML brain; entry point moves to opm.agents.chat.

BREAKING CHANGE: registers under opm.agents.chat (was neon.plugin.solver); class
renamed AIMLSolver -> AIMLChatEngine.

* feat: opt-in brain-file translation for non-English langs (enable_tx, default off)

When enable_tx=True and a non-English lang has no local AIML brain, the bundled
en-us brain files are translated via a lazy-loaded translate plugin (default:
ovos-translate-plugin-server) and cached in the XDG per-lang dir. Only
human-readable text in <pattern> and <template> nodes is translated; structural
tags, wildcards, <srai>/<star>/<bot> and all attributes are left untouched.
Falls back gracefully to en-us on any failure. Default path unchanged.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: brain<->locale converter helper scripts

scripts/brain_to_locale.py bootstraps OVOS locale/ (.intent/.dialog) from the
aiml brain; scripts/locale_to_brain.py compiles a brain back from locale/ —
so contributors write/translate in standard OVOS notation and the brain is
regenerated. {query} slot <-> engine wildcard; partial (skips unmappable constructs).

* feat: make locale/ the source of truth for the AIML brain

- Bootstrap locale/en-us/ from the bundled AIML brain (24175 intents,
  ~42% of categories; unmappable constructs left in legacy aiml_data/)
- Add .github/workflows/regenerate-brain.yml: pushes to dev regenerate
  aiml_data/<lang>/generated.aiml from locale/ and commit back; idempotent
  (no-diff second run exits 0); cannot trigger release (that fires on PR
  closed, not push)
- Add docs/locale.md: locale format, {query} slots, how to add/translate
  intents, CI flow, supported vs skipped AIML constructs
- Add docs/converters.md: usage of both converter scripts, round-trip,
  conversion-rate caveat
- Update README with "Contributing intents" section linking to docs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: query-level translation, drop locale source-of-truth

Non-English support mirrors the Wolfram pattern: translate the user query into
the brain language (English), answer, translate back. enable_tx defaults off; a
remote translate service is recommended.

The bundled aiml_data brain is the source of truth. Drop the locale/ tree and
the regenerate-brain workflow; keep brain<->locale as optional standalone helper
scripts whose exports never emit residual <…> markup. Bump ovos-plugin-manager
floor to >=2.6.1a1 (ChatEngine + pydantic in core).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: run persona e2e via ovoscope and wire shared CI workflows

- move persona pipeline e2e test into test/end2end/ for the ovoscope job
- add coverage, lint and ovoscope reusable workflows (gh-automations @dev)
- align build-tests workflow and require fixed ovos-persona (locale data shipped)

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

* test: require ovoscope and ovos-persona so the e2e test always runs

Replace pytest.importorskip guards with hard imports and an assert on
pipeline availability so missing test dependencies surface as failures
instead of silent skips. Pin pytest<9.

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Adds a Dockerfile that builds an ovos-persona-server image serving
one persona, AimlBot, backed by this plugin's AIMLChatEngine. AIML
pattern matching runs offline against the bundled aiml_data, so no
credentials or network access are needed. Follows the same structure
as OpenVoiceOS/ovos-plugin-linguonnx: install from PyPI, pin
ovos-persona-server[mcp] and pass --mcp, publish to ghcr.io on push
to master/dev and on tags via the same docker workflow.

Pinned to ovos-solver-aiml-plugin>=0.0.2a6: the latest stable release
on PyPI, 0.0.1, predates AIMLChatEngine and does not register the
opm.agents.chat entry point at all.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
)

* fix: e2e test asserts the current speak topic, not the legacy one

test_e2e_persona_pipeline.py checked msg.msg_type == "speak", but the stack
now emits "ovos.utterance.speak" (see ovos_spec_tools.messages.SpecMessage.SPEAK).
This fails identically on unmodified dev - reproduced by running the class
before this change - so it is a pre-existing defect, not something
introduced by other work in this repo. It blocks CI on every PR that touches
this test file, since the two tests in TestAimlPersonaSpeaksThroughPipeline
never find a "speak" message and fail on "Expected at least one 'speak'
message".

* fix: bot identity reflects the A.L.I.C.E./AIML lineage, not Mycroft

setBotPredicate calls hardcoded "Mycroft" for name and genus, and age was
computed from mycroft-core's creation year. A prior version of this fix
replaced those with generic "OVOS" branding, but AIML is a historical
chatbot language with its own lineage worth preserving: it was authored by
Dr. Richard S. Wallace as the pattern-matching engine behind A.L.I.C.E.
(Artificial Linguistic Internet Computer Entity), an ELIZA successor that
won the Loebner Prize three times. The defaults now name that lineage
instead - name/genus/family describe A.L.I.C.E. and AIML, and age derives
from ALICE_BIRTH_YEAR (1995, when A.L.I.C.E. "came to life" per
https://en.wikipedia.org/wiki/Artificial_Linguistic_Internet_Computer_Entity)
instead of an arbitrary org creation date. No unsourced biographical detail
about Wallace (e.g. a hometown) was invented.

Deployed and probed live with real questions, which caught two problems the
predicate-value assertions alone couldn't see because the bug is in how a
value renders inside the corpus's sentence frames, not in the value itself:

"botmaster" is a role word the corpus interpolates a name into (e.g. "My
<bot botmaster> is <bot master>.", "WHO IS YOUR BOTMASTER" -> "My
<botmaster> is <master>."), not a name slot. Setting it to "Dr. Richard S.
Wallace" produced "My Dr. Richard S. Wallace is Dr. Richard S. Wallace." -
grammatical nonsense. botmaster now stays "master" (the original role
word) and the person goes in "master" instead, rendering "My master is Dr.
Richard S. Wallace."

birthplace/location/city were never set at all, so "WHERE ARE YOU FROM"
rendered "I am originally from . Now I live in . Where are you?" with
empty holes, and similarly for "I am presently domiciled at <location>."
Grepped every <bot name="..."/> reference across the bundled corpus (101
distinct predicates) against what this plugin actually sets; birthplace/
location/city/birthday/phylum were reachable but unset, so they now default
to values describing the bot itself (it runs on the internet; phylum
"software" completes the kingdom/phylum/class/order/family/genus/species
taxonomy chain already partly set) rather than a guess about Wallace's
whereabouts, since no source gives him a hometown or birthday. 87 of the
101 corpus predicates remain unset by design (secondary details like
favorite foods/movies/hobbies, not core identity, out of scope for this
fix) - see the PR description for the full list.

All predicates remain overridable via config, the int() guard around the
birth year still can't crash construction, and every value is still
coerced with str(). Regression tests assert both the predicate values and
(new) the actual rendered answer text via continue_chat, so a
correct-value-wrong-slot regression like the botmaster one fails the suite
even when the underlying predicate value looks right in isolation.

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
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.

1 participant