Skip to content

Add root README.md - #8

Open
coding-jona wants to merge 9 commits into
mainfrom
add-root-readme
Open

Add root README.md#8
coding-jona wants to merge 9 commits into
mainfrom
add-root-readme

Conversation

@coding-jona

Copy link
Copy Markdown
Owner

Summary

Repo had no root README.md at all (Task #1 from this restructuring
effort). Adds one: project overview, feature list, architecture summary,
repo layout, getting-started build/test commands, and a documentation map.

Notes for reviewers

🤖 Generated with Claude Code

Jona and others added 9 commits August 13, 2026 20:34
Now that CI actually runs the full suite (windows-latest, previously
masked by the broken cross-platform matrix), three tests failed
because their dependency is deliberately not installed by default:

- test_core.py imported ovos_bus_client unconditionally at module
  level. It's intentionally kept out of requirements.txt (ADR-002 /
  TD-007: OVOS deps live in requirements-ovos.txt, only needed for
  --no-gui mode). Now raises unittest.SkipTest on ImportError instead
  of failing the whole module.
- test_command_engine.py's test_gui_mode_uses_qt_presenter patched
  confirmation_dialog.QApplication, which doesn't exist as a module
  attribute when PySide6 isn't installed (deprecated legacy UI stack,
  TD-006). Now skips via the module's own _HAS_QT flag.
- test_integrations.py's test_push_to_talk mock.patch'd
  pynput.keyboard.Controller; pynput is an optional Discord
  push-to-talk dependency (see requirements.txt's "Legacy / optional
  feature deps" comment block) and isn't installed by default. Now
  skipped via importlib.util.find_spec when pynput is absent.

The right fix here is skipping, not installing these packages in CI -
adding PySide6/OVOS back to the default install would reopen TD-005/
TD-006/TD-007, which were deliberately resolved by keeping them out.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Full log review (7 remaining ERROR/FAIL after the first pass) turned up
two categories:

Test-runner gap:
- test_language_swap.py and test_workspace_resolver.py are written as
  bare pytest-style functions/fixtures, not unittest.TestCase classes.
  `python -m unittest discover` only collects TestCase subclasses, so
  these files' tests silently never ran under CI at all - not a new
  regression, this addresses TD-015 properly (requirements-dev.txt
  already existed but CI never installed it or used pytest as the
  runner). Switched ci.yml to `pip install -r requirements-dev.txt`
  + `pytest workspace/debug/tests`, which runs both styles.
- test_security.py's test_install_persona_removes_key_field imports
  ovos_engine (which imports ovos_bus_client at module level, not in
  requirements.txt per ADR-002/TD-007) - now skips cleanly, same
  pattern as the previous test_core.py fix.

Real, pre-existing bugs surfaced now that the suite actually runs:
- test_mesh_plugin.py imported WIKO/ZTE from heartbeat.py, but that
  module deliberately uses device-neutral role names (HUB, SECONDARY)
  instead of brand names per its own docstring - test was never
  updated when the constants were renamed. Fixed the test's imports/
  usages, left the ZTE_BLADE_V70 wire-format string literals alone
  (those are real device identifiers, not the renamed constants).
- test_plugins.py's dynamically-generated dummy plugin source still
  imported `from tarno.ai...` / `from tarno.plugins...` - missed by
  the tarno -> tarno_backend rename pass since it's a string literal,
  not a real import statement. Fixed both occurrences.
- test_provider_switch.py's Ollama switch test failed because
  OllamaProvider.__init__ does a real connectivity check against
  localhost:11434 (see ollama_client.py's _verify_connection) - no
  Ollama server exists in CI. The test's actual intent (per its own
  docstring) is set_provider's no-API-key routing logic, not real
  Ollama reachability, so patched _verify_connection out instead of
  trying to stand up a real Ollama server in CI.

Also fixed a stale tarno/grpc/tarno.proto path reference in
requirements-dev.txt's comment (rename pass missed it, same class of
issue as the plugin test fix above).

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

A GitHub Copilot review of the CI logs flagged the 401 traceback for
"https://huggingface.co/de-DE-ConradNeural/resolve/main/model.onnx" as
the CI job's primary failure cause. It isn't - that exception is caught
and logged in synthesizer.py's _init_engines(), which already moves on
to try the next fallback engine; the actual job failures were the
separate ERRORs/FAILs fixed in the previous two commits. But it's a
real bug worth fixing regardless: SpeechSynthesizerTests
(test_voice.py) configures voice="de-DE-ConradNeural" (an edge-tts
neural voice name), and _init_engines() threads that same tts_config
into every fallback engine it tries, including "piper" - which then
attempts to resolve it as a HuggingFace repo id and fails.

edge.py already guards the opposite case (a Piper repo id reaching
EdgeTTSEngine) by checking for the "-"+"Neural" pattern and deriving a
proper voice from the language instead. Piper had no equivalent check.
Added the mirrored guard: PiperEngine now falls back to its own
_DEFAULT_REPO when the configured voice looks like an edge-tts name,
instead of attempting a doomed download.

Copilot's suggested fixes (correct the HF URL, add an HF auth token)
were treating the symptom - de-DE-ConradNeural was never meant to be a
HuggingFace repo id in the first place, no URL or token would fix that.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Both only became visible once the WIKO/ZTE import fix let this file's
tests actually collect and run:

- _make_router() passed wiko_bridge=bridge, but MeshRouter.__init__'s
  actual parameter is hub_bridge (its hub_node_match/secondary_node_match
  defaults legitimately still say "WIKO"/"ZTE" - those are wire-format
  substring-match patterns against real device identifiers, deliberately
  not renamed, unlike the hub_bridge param name itself).
- test_draft_on_scenario_change asserted "Hub-Rolle" in the PC_FALLBACK
  draft message, but persona.py's comment() randomly picks between
  multiple phrasings per event type (see its docstring) and "Hub-Rolle"
  only appears in the HUB_FULL_MESH variants, not HUB_FALLBACK_PC (the
  scenario this test actually triggers). Asserts against both actual
  HUB_FALLBACK_PC phrasings instead.

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

My earlier WIKO->SECONDARY / ZTE->HUB substitution had the mapping
backwards. router.py's actual defaults are hub_node_match="WIKO" and
secondary_node_match="ZTE" (a sender_node containing "WIKO" classifies
as HUB, "ZTE" classifies as SECONDARY) - the opposite of what I assumed
from the "Node A: ZTE Blade V70" doc reference. Swapped HUB<->SECONDARY
throughout the file to match router.py's real classify/tick logic
(hub_online -> FULL_MESH, secondary_online -> PC_FALLBACK).

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

SpeechSynthesizerTests._make_config() sets voice="de-DE-ConradNeural"
(an edge-tts name). Before the piper.py fix, PiperEngine crashed
immediately trying to use that as a HuggingFace repo id, so this test
class incidentally never made a real network call - the crash was fast
and got silently swallowed by _init_engines()'s per-engine try/except.
Now that PiperEngine correctly falls back to its default German voice
instead of crashing, SpeechSynthesizer construction makes a real
(successful) HuggingFace download on every test in this class - slow,
network-dependent, and apparently enough to perturb
test_speak_does_not_hang_forever_if_get_busy_never_clears's
timing-sensitive watchdog assertions on one Python version.

Added a setUp() that patches piper.py's hf_hub_download to fail
deterministically, restoring the fast/network-free/edge-tts-only
behavior this test class always effectively depended on - without
relying on the underlying bug that used to make it fail.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Skip tests needing optional/legacy deps not in requirements.txt
Project overview, architecture summary, repo layout, getting-started
build/test commands, and a documentation map pointing at CLAUDE.md, the
ADRs, technical-debt catalog, and workspace/plans/.

Links into workspace/*_README.md files that exist on the dev branch
(PR #7, not yet merged) - they'll resolve once #6 and #7 land, in the
same order the rest of this session's restructuring work has merged.

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