Thanks for your interest. Silmari is the generic engine — governed, read-only, scoped, audited data access + a runtime that derives review-priority signals (실마리) from rules. Domain rule content is intentionally out of scope here; keep it in your own private overlay.
packages/silmari-core— governance library (L1).packages/silmari-runtime— registry, executor, ruleset engine, sinks, review, API (L2).- See
docs/spec.mdfor the architecture and data contracts.
# Python 3.14+, managed with uv
uv sync
uv run pytest -q # everything runs offline (demo backend, LLM off)
uv run ruff check .
uv run mypy packages/silmari-core/src packages/silmari-runtime/srcThe test suite must stay green and offline — never require a live database or external LLM.
Any change must preserve these (there are tests for each — see docs/spec.md §6):
- Read-only — no write path to the data source; the SQL guard rejects non-
SELECT(top-level and nested), and adapters enforce DB-level read-only. - Scoped — a bot/rule reads only its declared tables (parse-based, not substring).
- Audited — every access writes an audit row; no bypass path.
- Signals, not verdicts — outputs always carry the not-a-verdict note; no auto-write-back.
- PII stays put — only
local/*models skip redaction.
PRs that weaken these will not be merged. If you think an invariant is wrong, open an issue to discuss first.
- Branch from
main; keep PRs focused. - Include tests for new behavior; keep
pytest/ruff/mypygreen. - Use clear, imperative commit messages.
- By contributing you agree your work is licensed under the project's AGPL-3.0-or-later license (no CLA).
Bugs and feature requests: open a GitHub issue. Security issues: see SECURITY.md
(report privately).