- CI Matrix & Hardening (
tests.yml, etc.): Hardened CI workflow matrix across Python 3.10, 3.11, 3.12, and 3.13 on bothubuntu-latestandwindows-latest. Added concurrency controls (cancel-in-progress: true), explicit minimal token permissions (contents: read), and strict job timeouts (timeout-minutes: 15). Also hardenedstale.yml,welcome.yml,auto-assign.yml, andlabel-sync.ymlwith concurrency and timeout guards. - PEP 621 Metadata & Tooling: Enriched
pyproject.tomlwithlicense-files = ["LICENSE", "THIRD_PARTY_LICENSES.md"], full set of[project.urls](Changelog,Third-Party Licenses,Parent Organization,LLM Ready), standard[tool.pytest.ini_options](minversion = "7.0",addopts = "-ra -v",norecursedirs), and[tool.ruff]configuration (target-version = "py310",select = ["E", "F", "W"]). - Dependency Audit & SBOM (
THIRD_PARTY_LICENSES.md): Created comprehensive audit confirming zero external runtime dependencies (PSF-2.0Python Standard Library only),RunAsInvokeruser privilege requirement, non-viral MIT licensing, optionaltaskplanseam architecture, and 10 core governance invariants (INV-LOCAL-01throughINV-SLA-10). - Comprehensive Contract Tests (
tests/test_metadata.py): Added 9 contract tests verifying PEP 621 metadata, version parity, CI workflow security/matrix configurations, cloud-sync/LOCK system.gitignorerules, statutory liability notice (§ 521 BGB Gefälligkeitsrecht), SBOM audit, UTF-8 file integrity, Mermaid diagram syntax, and CLI smoke execution (--help,--version). Test suite expanded from 110 to 119 tests (100% pass rate). - Code Linting & Bug Fixes: Resolved 26 static analysis linter issues across
auto/,cli.py,connectors/,memory/, andtests/(redundant f-strings, unused imports/variables, variable shadowingtvs i18n translation function). Added--versionflag to root CLI entrypoint. - Multi-Host & LOCK System Guardrails (
.gitignore): Added explicit rules protecting against multi-host conflict files (*conflicted copy*,*-ASUS*,*-WORKSTATION*,*-Mac Studio*) and canonical lock files (LOCK,LOCK.*,LOCK*.txt,LOCK.permissions.json,LOCK.user.*,LOCK.until.*,LOCK.condition.*).
- Agent Interaction Sequence Diagram: Added end-to-end Mermaid sequence diagrams illustrating the autonomous agent lifecycle (task query, context injection from SQLite memory, runner chat inference, memory lesson feedback, task completion, connector notification) across
README.md,README_de.md, anddocs/architecture.md. Validated 100% clean withlint_mermaid.py. - Badges & Discoverability: Added
Dependencies: 0 (stdlib only)badge and CLI quick links to bothREADME.mdandREADME_de.md. - Architecture Documentation Sync: Synchronized module overview in
docs/architecture.mdto reflect all five core modules (memory,tasks,connectors,auto,i18n) and their event bus / seam integration. - Machine-Readable Index (
llms.txt): UpdatedLast-checkedverification timestamp to2026-09-10.
- i18n is now reachable, not just present.
set_language()existed but was never called: there was no switch, no environment variable, and no locale detection, so the six declared languages could not be selected at all. Addedresolve_language()/apply_language()(precedence:--lang>RINNSAL_LANG> system locale > default) and a global--langflag. - Translation catalog filled. It previously held a single key (
status.title) withes/zh/ja/ruempty. The completestatuscommand is now translated into all six languages and was verified in real terminal output (glyphs and column alignment). A regression test fails if any key is left untranslated in any language -- otherwiset()silently falls back to the lead language and the gap never surfaces. taskplanreferences point to the public repository (ellmos-ai/task-master) instead of an internal, unresolvable module path. The relationship is now also documented in the README positioning table and inllms.txt..gitattributesadded. Without it, a checkout on Linux/macOS reports the whole tree as modified after a Windows commit.
- Verification & Status Update: Verified pytest test suite (102/102 passed in 0.55s, 100% green). Updated
llms.txtverification timestamp to2026-07-30. Verified PEP 621 metadata, file integrity, and repository hygiene.
-
Verification & Status Update: Verified test suite contract (102/102 passed in 1.06s). Updated
llms.txtverification timestamp to2026-07-27. -
Discoverability & Visual Presentation: Added Shields.io badges (Pytest 102 passed, Python 3.10+, Local-First Privacy, LLM-Ready) and machine-readable AI agent callouts (
> [!NOTE]) referencingllms.txtin both English (README.md) and German (README_de.md). -
System Architecture Diagram: Integrated a Mermaid flowchart visualizing Rinnsal's tier positioning between USMC (Tier 1 primitive) and BACH (Tier 3 OS) across its five core modules.
-
Project Configuration: Added
[tool.pytest.ini_options]topyproject.tomlfor standard pytest execution (pythonpath = ["."],testpaths = ["tests"]). -
Machine-Readable Index (
llms.txt): Updated headerLast-checkedtimestamp to2026-07-25.
- Tasks module (
rinnsal/tasks): SQLite-based task management (statuses open/active/done/cancelled, priorities, tags) sharing the database with the memory system.TaskClient, high-level singleton API, and CLI commandsrinnsal task add|list|show|done|activate|cancel|reopen|delete|count. Tasks are also shown inrinnsal status. - OllamaRunner (
rinnsal/auto/ollama_runner.py): runner for local Ollama models alongsideClaudeRunner. - GitHub Actions smoke workflow for Python 3.10, 3.11, 3.12, and 3.13 with unittest discovery and compileall.
- Smoke tests for the tasks module (
tests/test_tasks.py): TaskClient CRUD, status transitions, semantic priority ordering, and the high-level singleton API. - i18n module (
rinnsal/i18n): Internationalization infrastructure with JSON-based translation strings. Supports de, en, es, zh, ja, ru with fallback chain (en → de → key). CLI output starts usingt()for translatable strings.
- Tasks module extracted to
taskplan(2026-07-11): the canonical task implementation now lives in the standalonetaskplanpackage.rinnsal.tasks.clientbecame a seam that prefers an installedtaskplan(subclass injecting rinnsal's default DB resolution) and falls back to the frozen bundled copy (rinnsal/tasks/_bundled.py) whentaskplanis not installed — zero-dependency installs keep working. Import pathrinnsal.tasks.client.TaskClient, schema (tablerinnsal_tasks), and behavior are unchanged;rinnsal.tasks.TASKS_ENGINEreports the active implementation. - Default database path is now
~/.rinnsal/rinnsal.dbinstead ofrinnsal.dbin the current working directory. Override via theRINNSAL_DBenvironment variable or thememory.db_pathconfig key; explicit--db/db_patharguments keep precedence. - Known user home paths for chain config normalization are no longer hardcoded; they are read from the config key
auto.known_user_homesor theRINNSAL_KNOWN_HOMESenvironment variable. - The default LLM model name is now a single constant
rinnsal.shared.config.DEFAULT_MODEL(was duplicated as a string literal in four modules). - Package version is now sourced dynamically from
rinnsal.__version__(dynamic = ["version"]inpyproject.toml); the version is no longer maintained in two places. - Build requirement raised to
setuptools>=77, matching the PEP-639license = "MIT"string inpyproject.toml(older setuptools failed the build).
- Chain names are now validated (
validate_chain_name()) before being used inchains/,logs/, andstate/file paths. Previously, names containing path separators or..could read or write files outside those directories (path traversal, CWE-22), e.g. viarinnsal chain start "../../other_file".
load_config()now returns a copy: mutating the returned dict no longer poisoned the process-wide config cache for later callers.- In-memory databases (
db_path=":memory:") are now usable from background threads: the shared connection is created withcheck_same_thread=False. This matters for connector poll threads (Telegram/Discordon_message) writing to memory/tasks. - Removed the dead config key
auto.telegram.bot_token_envfrom defaults and the example config: it was never read — chain status updates always use the token of theconnectors.telegramentry. rinnsal chain startno longer crashes on Linux/macOS: the{HOME}/{BASH_HOME}placeholder substitution assumed a Windows drive letter and raisedValueErroron POSIX home paths.- Invalid chain
deadlinevalues no longer crash shutdown checks; they now emit aRuntimeWarningand the chain keeps evaluating the remaining stop conditions. translations.jsonis now packaged insiderinnsal.i18n(moved from the repo-rootlocales/directory) and loaded viaimportlib.resources, so translations work for pip installs and the PyInstaller build. A legacy repo-root fallback remains for old checkouts.rinnsal/connectors/telegram.py: Corrected type hintany→Any(import fromtyping); lowercaseanyresolves to the builtin, not the type hint.rinnsal/i18n:get_missing()signature corrected toOptional[str]; ambiguous loop variablelrenamed; docstring no longer references an internal pipeline path.rinnsal/auto/chain.py: removed an unusedrinnsal_dirassignment inrun_chain().
Initial release. Extracted from the BACH agent system.
-
Memory (from USMC): Cross-agent shared memory with SQLite backend
- Facts, Working Memory, Lessons Learned, Sessions
- Confidence-based merge, multi-agent support
- High-level singleton API + direct client
-
Connectors (from BACH): Channel abstraction for messaging platforms
- Telegram Bot API (polling, send, voice, file upload)
- Discord (Bot + Webhook dual mode)
- Home Assistant REST API
- Registry + factory pattern, ENV-based secrets
-
Automation (from llmauto): LLM agent chain orchestration
- ClaudeRunner: subprocess wrapper for Claude CLI
- Chain engine: sequential agent chains with loop/once modes
- State management: rounds, handoff, shutdown conditions
- Skip-pattern protection, status manipulation guard
-
CLI: Unified entry point (
rinnsal)rinnsal status/rinnsal memory/rinnsal chain/rinnsal connect
-
Shared infrastructure
- Central config loader (JSON + ENV)
- Minimal event bus for component decoupling