What's new in 0.5.0
Five generic patterns extracted from bjornswarm (Carryall's customer-zero deployment) and shipped upstream as deployment-agnostic primitives. The boundary held throughout: mechanism ports up, policy stays down — Carryall ships the framework, deployments supply rules, paths, identities, and rule contents.
Highlights
-
skill_loader—SKILL.mdtools:allowlist. Pydantic-validated frontmatter parser with fail-closed semantics. No wildcards, no prefix matching, missing or empty list denies everything. NewSkillManifesttype andenforce_tool_access()helper. (docs/skill_authoring.md) -
harness_audit— config-surface scanner.HarnessAuditorwalks a config root, runs registeredRules, emitsFindings to JSONL. Two universal built-ins:no-dangerous-mode-skip(critical),skills-declare-tools(medium). Rule exceptions are isolated — a rule that raises becomes aseverity=highfinding rather than crashing the scan. (docs/harness_audit.md) -
rule_packs— numbered hard-rule enforcement.RulePack.load(yaml)loads deployment rules;@enforces(pack, point)decorator wraps pipeline entry points;RuleViolationcarriesrule_id/rule_number/description/enforcement_pointso violations trace back to a deployment's canonical rule list. Predicate convention aligned withauthority_runtime.constraints(returnNoneto pass, a string to fail). (docs/rules.md) -
router— sensitivity-aware tiered routing primitive.Router(classifier, registry, logger)composes aSensitivityClassifier(ABC) with aModelRegistryand a pluggableUsageLogger.force_tier=overrides classification withforced=Trueaudit trail.ModelRegistry.assert_origins_allowed(set)raises at boot if any tier's origin falls outside policy. Privacy posture:JsonlUsageLoggerwrites onlyquery_len, never the body. (docs/router.md) -
load_soul()/SkillSoul— opt-in SOUL.md sibling parser. SKILL.md is the operational contract; SOUL.md is voice, posture, refusals.load_skill()auto-attaches a siblingSOUL.mdif present (load_soul=Falseto skip). The convention is under evaluation in bjornswarm (evalsl-qvby, window closes 2026-06-02) — Carryall ships the parser so deployments running the eval don't fork bespoke tooling, but the convention itself is documented as descriptive, not prescriptive. (docs/soul.md)
Also in this release
OllamaCompiler— local Ollama-backed policy compiler. Same Pydantic-validated scope/context narrowing asOpenAICompiler/AnthropicCompiler;gemma4:26bdefault;/api/chatwithformat: jsonandnum_predict=2000for Gemma's internal CoT.mcp_servernow defaultscompile_policytoollama, and anyavailable_scopescontaining"finance"is force-routed toollamaregardless of caller-supplied provider — sensitive data must stay local. Missing API keys for frontier providers raisePermissionDenied(wasValueError) so failures are fail-closed at the auth layer.
Compatibility
Fully backward compatible. The five port packages are additive; existing imports keep working. OllamaCompiler is exposed alongside FakeCompiler / OpenAICompiler / AnthropicCompiler from authority_runtime.
Tests
490 passing (478 → 490 across the five ports).
See CHANGELOG.md for the full per-port detail.