Core behavioral rules and skills for NanoClaw personal assistant agents. Always-on rules for communication, verification, memory, and formatting.
69
87%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Risky
Do not use without reviewing
jbaruch/nanoclaw-core is a tessl tile — a publishable package of behavioral rules and skills for NanoClaw personal assistant agents. It is installed into NanoClaw agent environments via tessl install jbaruch/nanoclaw-core. The tile provides always-on conversational rules and reusable skill scripts.
Current version: see tile.json → version field.
tile.json # Tile manifest: name, version, rules/skills registry
README.md # Human-readable overview + rules/skills tables
CHANGELOG.md # Version history and unreleased changes
pyproject.toml # pytest config + ruff lint (scoped to tests/ only)
requirements-dev.txt # Dev dependencies: pytest==8.3.4, ruff==0.7.4
rules/ # 12 always-on behavioral rule files (Markdown)
core-behavior.md
telegram-protocol.md
default-silence.md
ground-truth.md
context-recovery.md
post-compaction-trust.md
tone-matching.md
language-matching.md
temporal-awareness.md
read-full-content.md
query-size-limits.md
progress-updates.md
skills/
status/
SKILL.md # Skill definition consumed by the tessl runtime
scripts/
container-uptime.py # Reads /.dockerenv mtime to compute container uptime
query-history/
SKILL.md
scripts/
query-message-history.py # Keyword/sender search over messages.db
now-vs-deadline/
SKILL.md
scripts/
now-vs-deadline.py # Deterministic past/future comparison vs the current instant
tests/
conftest.py # Shared fixtures; loads kebab-case scripts via importlib
test_container_uptime.py
test_query_message_history.py
test_now_vs_deadline.py
.github/
workflows/
test.yml # CI: ruff lint + pytest on every PR and push to main
publish-tile.yml # Publish tile to tessl registry on push to main
review-openai.yml/.md # AI-assisted PR review (OpenAI)
review-anthropic.yml/.md# AI-assisted PR review (Anthropic)Install dev dependencies first (Python 3.11+):
pip install -r requirements-dev.txtLint (scoped to tests/ only — tile scripts under skills/*/scripts/ predate the lint config):
python -m ruff check tests/
python -m ruff format --check tests/Run tests:
python -m pytestCI runs these in order: ruff check → ruff format → pytest. All three must pass on every PR.
There is no build step. This is a pure Python + Markdown tile; nothing needs compiling.
rules/*.md)alwaysApply: true as the first thing in the file:
---
alwaysApply: true
---core-behavior.md).skills/*/SKILL.md)name: and description: fields (no alwaysApply).skills/<skill-name>/scripts/ and use kebab-case filenames (e.g., container-uptime.py)./home/node/.claude/skills/tessl__<skill-name>/scripts/<script>.py.tile.json and README.md must stay in synctile.json (the rules object) and the rules table in README.md.tile.json (the skills object) and the skills table in README.md.version field in tile.json follows semver; bump it for every change published to the tessl registry.tests/ and are standard pytest.import container-uptime is a syntax error). All test fixtures load them via importlib.util.spec_from_file_location. The conftest.py _load() helper handles this — use the existing container_uptime fixture as the template rather than reimplementing the loading pattern.test_container_uptime.py for the pattern).tests/ in pyproject.toml; do not apply ruff rules to files under skills/*/scripts/ unless that is the explicit scope of a PR.error field uses three states: null (clean success), "env-warning: ..." prefix (non-fatal config hint, script still produced useful output), or any other string (hard failure, exits non-zero).| Workflow | Trigger | Purpose |
|---|---|---|
test.yml | PR + push to main | Lint (ruff) + pytest |
publish-tile.yml | push to main, workflow_dispatch | tessl skill review (quality gate ≥85) + tile publish |
review-openai.md / review-anthropic.md | PR events | AI-assisted code review |
The publish workflow runs tessl skill review --threshold 85 on each skill before publishing. A failing quality score blocks the publish.
tile.json + README.md drift — if you add/remove a rule or skill in one place, update both. The table and the JSON registry must match.tests/. Do not widen it to skills/*/scripts/ without an explicit decision in the PR.alwaysApply: true frontmatter will not be applied by the tessl runtime. Always include it.conftest.py following the _load() pattern. Do not try to import the script directly.tile.json version for any change intended to be published. The publish workflow does not auto-bump it.## Unreleased before they land in a release section.rules
tests