sableai 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sableai-2.0.0/CHANGELOG.md +91 -0
- sableai-2.0.0/CONTRIBUTING.md +101 -0
- sableai-2.0.0/LICENSE +21 -0
- sableai-2.0.0/MANIFEST.in +8 -0
- sableai-2.0.0/PKG-INFO +454 -0
- sableai-2.0.0/README.md +420 -0
- sableai-2.0.0/SECURITY.md +149 -0
- sableai-2.0.0/SUPPORT.md +16 -0
- sableai-2.0.0/docs/architecture.md +279 -0
- sableai-2.0.0/docs/cli.md +179 -0
- sableai-2.0.0/docs/context-engine.md +19 -0
- sableai-2.0.0/docs/demo.md +300 -0
- sableai-2.0.0/docs/evidence.md +71 -0
- sableai-2.0.0/docs/execution-security.md +63 -0
- sableai-2.0.0/docs/launch-kit.md +175 -0
- sableai-2.0.0/docs/platforms.md +58 -0
- sableai-2.0.0/docs/providers.md +75 -0
- sableai-2.0.0/docs/quality.md +108 -0
- sableai-2.0.0/docs/release-notes-draft.md +156 -0
- sableai-2.0.0/docs/releasing.md +112 -0
- sableai-2.0.0/docs/roadmap.md +399 -0
- sableai-2.0.0/docs/runtime.md +30 -0
- sableai-2.0.0/docs/sessions.md +22 -0
- sableai-2.0.0/docs/showcase.md +50 -0
- sableai-2.0.0/docs/transactions.md +77 -0
- sableai-2.0.0/docs/troubleshooting.md +148 -0
- sableai-2.0.0/docs/verification.md +93 -0
- sableai-2.0.0/evals/README.md +114 -0
- sableai-2.0.0/evals/baselines/m7-deterministic.json +79 -0
- sableai-2.0.0/evals/fixtures/adversarial/README.md +5 -0
- sableai-2.0.0/evals/fixtures/adversarial/approval.json +1 -0
- sableai-2.0.0/evals/fixtures/adversarial/emit_injection.py +1 -0
- sableai-2.0.0/evals/fixtures/adversarial/safe.py +3 -0
- sableai-2.0.0/evals/fixtures/adversarial/tests/test_safe.py +12 -0
- sableai-2.0.0/evals/fixtures/assertion_repair/pricing.py +2 -0
- sableai-2.0.0/evals/fixtures/assertion_repair/tests/test_pricing.py +12 -0
- sableai-2.0.0/evals/fixtures/bug_repair/calculator.py +2 -0
- sableai-2.0.0/evals/fixtures/bug_repair/notes.txt +1 -0
- sableai-2.0.0/evals/fixtures/bug_repair/tests/test_calculator.py +12 -0
- sableai-2.0.0/evals/fixtures/build_failure/build.py +7 -0
- sableai-2.0.0/evals/fixtures/build_failure/generator.py +2 -0
- sableai-2.0.0/evals/fixtures/context_auth/app/__init__.py +1 -0
- sableai-2.0.0/evals/fixtures/context_auth/app/auth.py +2 -0
- sableai-2.0.0/evals/fixtures/context_auth/app/billing.py +5 -0
- sableai-2.0.0/evals/fixtures/context_auth/app/users.py +5 -0
- sableai-2.0.0/evals/fixtures/context_auth/app/utils.py +2 -0
- sableai-2.0.0/evals/fixtures/context_auth/pyproject.toml +3 -0
- sableai-2.0.0/evals/fixtures/context_auth/tests/test_auth.py +12 -0
- sableai-2.0.0/evals/fixtures/context_auth/tests/test_billing.py +12 -0
- sableai-2.0.0/evals/fixtures/context_auth/tests/test_users.py +12 -0
- sableai-2.0.0/evals/fixtures/context_auth/unrelated/archive.py +1 -0
- sableai-2.0.0/evals/fixtures/framework_smoke/README.md +3 -0
- sableai-2.0.0/evals/fixtures/framework_smoke/app.py +2 -0
- sableai-2.0.0/evals/fixtures/framework_smoke/typecheck.py +5 -0
- sableai-2.0.0/evals/fixtures/import_repair/app.py +5 -0
- sableai-2.0.0/evals/fixtures/import_repair/helper.py +2 -0
- sableai-2.0.0/evals/fixtures/import_repair/tests/test_app.py +12 -0
- sableai-2.0.0/evals/fixtures/integrity/logic.py +2 -0
- sableai-2.0.0/evals/fixtures/integrity/package.json +5 -0
- sableai-2.0.0/evals/fixtures/integrity/tests/test_logic.py +15 -0
- sableai-2.0.0/evals/fixtures/multi_file/pkg/__init__.py +1 -0
- sableai-2.0.0/evals/fixtures/multi_file/pkg/profile.py +2 -0
- sableai-2.0.0/evals/fixtures/multi_file/tests/test_profile.py +12 -0
- sableai-2.0.0/evals/fixtures/refactor/report.py +3 -0
- sableai-2.0.0/evals/fixtures/refactor/tests/test_report.py +12 -0
- sableai-2.0.0/evals/fixtures/regression/slug.py +2 -0
- sableai-2.0.0/evals/fixtures/regression/tests/test_slug.py +12 -0
- sableai-2.0.0/evals/fixtures/syntax_repair/parser-source.txt +1 -0
- sableai-2.0.0/evals/fixtures/syntax_repair/tests/test_parser.py +12 -0
- sableai-2.0.0/evals/fixtures/transactions/delete.txt +1 -0
- sableai-2.0.0/evals/fixtures/transactions/dirty.txt +1 -0
- sableai-2.0.0/evals/fixtures/transactions/original.txt +1 -0
- sableai-2.0.0/evals/fixtures/transactions/target.txt +1 -0
- sableai-2.0.0/evals/fixtures/transactions/untouched.txt +1 -0
- sableai-2.0.0/evals/scenarios/framework-smoke.json +35 -0
- sableai-2.0.0/evals/scenarios/m7.2-system.json +547 -0
- sableai-2.0.0/evals/scenarios/m7.3-adversarial.json +429 -0
- sableai-2.0.0/evals/scenarios/m7.4-live.json +56 -0
- sableai-2.0.0/evals/scenarios/m7.5-resilience.json +174 -0
- sableai-2.0.0/install.sh +36 -0
- sableai-2.0.0/pyproject.toml +69 -0
- sableai-2.0.0/requirements.txt +1 -0
- sableai-2.0.0/sable/__init__.py +3 -0
- sableai-2.0.0/sable/__main__.py +4 -0
- sableai-2.0.0/sable/_version.py +3 -0
- sableai-2.0.0/sable/automation.py +147 -0
- sableai-2.0.0/sable/capabilities.py +501 -0
- sableai-2.0.0/sable/cli.py +611 -0
- sableai-2.0.0/sable/cli_app.py +109 -0
- sableai-2.0.0/sable/cli_args.py +194 -0
- sableai-2.0.0/sable/cli_settings.py +215 -0
- sableai-2.0.0/sable/cli_workspace.py +262 -0
- sableai-2.0.0/sable/config.py +252 -0
- sableai-2.0.0/sable/context/__init__.py +4 -0
- sableai-2.0.0/sable/context/engine.py +602 -0
- sableai-2.0.0/sable/context/models.py +126 -0
- sableai-2.0.0/sable/doctor.py +475 -0
- sableai-2.0.0/sable/evals/__init__.py +68 -0
- sableai-2.0.0/sable/evals/__main__.py +3 -0
- sableai-2.0.0/sable/evals/assertions.py +210 -0
- sableai-2.0.0/sable/evals/baseline.py +157 -0
- sableai-2.0.0/sable/evals/cli.py +148 -0
- sableai-2.0.0/sable/evals/fixtures.py +75 -0
- sableai-2.0.0/sable/evals/metrics.py +112 -0
- sableai-2.0.0/sable/evals/models.py +534 -0
- sableai-2.0.0/sable/evals/provider.py +131 -0
- sableai-2.0.0/sable/evals/reporting.py +169 -0
- sableai-2.0.0/sable/evals/runner.py +148 -0
- sableai-2.0.0/sable/evals/system.py +953 -0
- sableai-2.0.0/sable/execution/__init__.py +78 -0
- sableai-2.0.0/sable/execution/base.py +136 -0
- sableai-2.0.0/sable/execution/native.py +261 -0
- sableai-2.0.0/sable/execution/proot.py +177 -0
- sableai-2.0.0/sable/groq_client.py +269 -0
- sableai-2.0.0/sable/main_agent.py +372 -0
- sableai-2.0.0/sable/orchestrator.py +900 -0
- sableai-2.0.0/sable/patches.py +197 -0
- sableai-2.0.0/sable/presentation.py +458 -0
- sableai-2.0.0/sable/project.py +168 -0
- sableai-2.0.0/sable/providers/__init__.py +25 -0
- sableai-2.0.0/sable/providers/anthropic.py +309 -0
- sableai-2.0.0/sable/providers/base.py +177 -0
- sableai-2.0.0/sable/providers/deepseek.py +11 -0
- sableai-2.0.0/sable/providers/factory.py +22 -0
- sableai-2.0.0/sable/providers/groq.py +7 -0
- sableai-2.0.0/sable/providers/openai.py +11 -0
- sableai-2.0.0/sable/providers/openai_compat.py +203 -0
- sableai-2.0.0/sable/providers/router.py +121 -0
- sableai-2.0.0/sable/runtime.py +349 -0
- sableai-2.0.0/sable/security.py +389 -0
- sableai-2.0.0/sable/sessions/__init__.py +4 -0
- sableai-2.0.0/sable/sessions/manager.py +365 -0
- sableai-2.0.0/sable/sessions/models.py +72 -0
- sableai-2.0.0/sable/tool_schemas.py +202 -0
- sableai-2.0.0/sable/tools/__init__.py +6 -0
- sableai-2.0.0/sable/tools/base.py +409 -0
- sableai-2.0.0/sable/tools/commands.py +76 -0
- sableai-2.0.0/sable/tools/context.py +100 -0
- sableai-2.0.0/sable/tools/executor.py +252 -0
- sableai-2.0.0/sable/tools/files_read.py +194 -0
- sableai-2.0.0/sable/tools/files_write.py +403 -0
- sableai-2.0.0/sable/tools/git.py +340 -0
- sableai-2.0.0/sable/transactions.py +984 -0
- sableai-2.0.0/sable/ui.py +93 -0
- sableai-2.0.0/sable/verification/__init__.py +72 -0
- sableai-2.0.0/sable/verification/adapters.py +682 -0
- sableai-2.0.0/sable/verification/affected.py +235 -0
- sableai-2.0.0/sable/verification/classifiers.py +105 -0
- sableai-2.0.0/sable/verification/discovery.py +166 -0
- sableai-2.0.0/sable/verification/integrity.py +345 -0
- sableai-2.0.0/sable/verification/models.py +472 -0
- sableai-2.0.0/sable/verification/planner.py +222 -0
- sableai-2.0.0/sable/verification/runner.py +274 -0
- sableai-2.0.0/sable/verifier.py +117 -0
- sableai-2.0.0/sable.py +7 -0
- sableai-2.0.0/sableai.egg-info/PKG-INFO +454 -0
- sableai-2.0.0/sableai.egg-info/SOURCES.txt +213 -0
- sableai-2.0.0/sableai.egg-info/dependency_links.txt +1 -0
- sableai-2.0.0/sableai.egg-info/entry_points.txt +2 -0
- sableai-2.0.0/sableai.egg-info/requires.txt +15 -0
- sableai-2.0.0/sableai.egg-info/top_level.txt +1 -0
- sableai-2.0.0/scripts/__init__.py +1 -0
- sableai-2.0.0/scripts/live_provider_smoke.py +214 -0
- sableai-2.0.0/scripts/quality.py +46 -0
- sableai-2.0.0/scripts/release.py +145 -0
- sableai-2.0.0/scripts/release_check.py +211 -0
- sableai-2.0.0/scripts/repo_check.py +183 -0
- sableai-2.0.0/scripts/run_tests.py +33 -0
- sableai-2.0.0/setup.cfg +4 -0
- sableai-2.0.0/tests/test_agent_loop.py +156 -0
- sableai-2.0.0/tests/test_automation.py +251 -0
- sableai-2.0.0/tests/test_cancellation.py +174 -0
- sableai-2.0.0/tests/test_capabilities.py +222 -0
- sableai-2.0.0/tests/test_cli_app.py +246 -0
- sableai-2.0.0/tests/test_cli_execution.py +29 -0
- sableai-2.0.0/tests/test_cli_interactive.py +170 -0
- sableai-2.0.0/tests/test_cli_sessions.py +39 -0
- sableai-2.0.0/tests/test_cli_transactions.py +59 -0
- sableai-2.0.0/tests/test_config_persistence.py +86 -0
- sableai-2.0.0/tests/test_context.py +210 -0
- sableai-2.0.0/tests/test_doctor.py +213 -0
- sableai-2.0.0/tests/test_evals_adversarial.py +41 -0
- sableai-2.0.0/tests/test_evals_cli.py +23 -0
- sableai-2.0.0/tests/test_evals_final.py +186 -0
- sableai-2.0.0/tests/test_evals_framework.py +232 -0
- sableai-2.0.0/tests/test_evals_reporting.py +102 -0
- sableai-2.0.0/tests/test_evals_system.py +70 -0
- sableai-2.0.0/tests/test_execution_backends.py +267 -0
- sableai-2.0.0/tests/test_git.py +135 -0
- sableai-2.0.0/tests/test_groq_client.py +48 -0
- sableai-2.0.0/tests/test_installer.py +29 -0
- sableai-2.0.0/tests/test_live_provider_smoke.py +142 -0
- sableai-2.0.0/tests/test_m4_security.py +107 -0
- sableai-2.0.0/tests/test_multi_provider.py +269 -0
- sableai-2.0.0/tests/test_orchestrator.py +99 -0
- sableai-2.0.0/tests/test_patches.py +227 -0
- sableai-2.0.0/tests/test_presentation.py +286 -0
- sableai-2.0.0/tests/test_project.py +17 -0
- sableai-2.0.0/tests/test_providers.py +176 -0
- sableai-2.0.0/tests/test_release.py +81 -0
- sableai-2.0.0/tests/test_release_check.py +55 -0
- sableai-2.0.0/tests/test_repo_check.py +87 -0
- sableai-2.0.0/tests/test_runtime.py +414 -0
- sableai-2.0.0/tests/test_security.py +176 -0
- sableai-2.0.0/tests/test_sessions.py +117 -0
- sableai-2.0.0/tests/test_test_selection.py +24 -0
- sableai-2.0.0/tests/test_tools.py +124 -0
- sableai-2.0.0/tests/test_transactions.py +525 -0
- sableai-2.0.0/tests/test_verification_affected.py +254 -0
- sableai-2.0.0/tests/test_verification_cli.py +56 -0
- sableai-2.0.0/tests/test_verification_core.py +273 -0
- sableai-2.0.0/tests/test_verification_discovery.py +327 -0
- sableai-2.0.0/tests/test_verification_integrity.py +139 -0
- sableai-2.0.0/tests/test_verification_orchestration.py +225 -0
- sableai-2.0.0/tests/test_verifier.py +26 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
User-visible changes are curated here. No historical release dates are inferred.
|
|
4
|
+
The current source version is 2.0.0; release approval and publication are separate.
|
|
5
|
+
|
|
6
|
+
## [Unreleased]
|
|
7
|
+
|
|
8
|
+
## [2.0.0] - 2026-11-05
|
|
9
|
+
|
|
10
|
+
### Documentation evidence audit
|
|
11
|
+
|
|
12
|
+
- Replace undated typing, coverage, security-scan, and platform observations with
|
|
13
|
+
source-linked validation scopes and reproduction guidance. Treat configured
|
|
14
|
+
thresholds separately from observed results and external repository settings.
|
|
15
|
+
- Label demo summaries as expected scripted behavior rather than an archived run;
|
|
16
|
+
remove unsupported personal narrative from suggested launch copy.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- Direct OpenAI, Anthropic, and DeepSeek provider adapters alongside Groq
|
|
21
|
+
(Groq remains the default; the new adapters are beta — mocked-test coverage
|
|
22
|
+
only, no live paid-API smoke tests yet; see `docs/providers.md`).
|
|
23
|
+
- Python verification falls back to `python3` when no `python` alias exists on
|
|
24
|
+
PATH, so python3-only hosts no longer report Python checks UNAVAILABLE and
|
|
25
|
+
verification INCOMPLETE; `sable doctor` reports the configured provider
|
|
26
|
+
instead of always naming Groq.
|
|
27
|
+
- Live-evaluation reports now name the configured provider instead of always
|
|
28
|
+
reporting Groq (the live provider construction already dispatched correctly;
|
|
29
|
+
only the report label was wrong).
|
|
30
|
+
- Troubleshooting and FAQ guide covering provider keys, verification
|
|
31
|
+
INCOMPLETE, rate limits, patch-dialect retries, the Termux-only installer,
|
|
32
|
+
modes/approvals, and undo conflicts, plus a dated recorded demo run in
|
|
33
|
+
`docs/demo.md`.
|
|
34
|
+
- Implementation evidence map linking documented capabilities to source, tests,
|
|
35
|
+
deterministic scenarios, and CI configuration.
|
|
36
|
+
- Roadmap baseline comparisons, proposed acceptance criteria, and dependency order
|
|
37
|
+
for future work; these are planning material, not shipped features.
|
|
38
|
+
- Product-first README with source-install guidance, bounded safety claims,
|
|
39
|
+
baseline requirements, limitations, and documentation navigation.
|
|
40
|
+
- Maintainable Mermaid architecture, lifecycle, trust-boundary, verification,
|
|
41
|
+
transaction, and evaluation diagrams grounded in the implemented components.
|
|
42
|
+
- Reproducible scripted showcase demos for repair, multi-file change, capability
|
|
43
|
+
denial, bounded repair, conflict-aware undo, and machine automation.
|
|
44
|
+
- Unpublished 2.0.0 release-note draft, owner release-candidate checklist, and
|
|
45
|
+
evidence-based repository/portfolio launch material.
|
|
46
|
+
- Packaging metadata, one derived version source, explicit developer/release extras,
|
|
47
|
+
wheel/sdist content checks and clean installed-CLI smoke tests.
|
|
48
|
+
- Ruff lint/format policy, configured coverage floor, runtime dependency audit,
|
|
49
|
+
production Bandit/CodeQL scans and weekly Dependabot checks.
|
|
50
|
+
- Contributor setup, issue/PR templates, private security-reporting guidance and
|
|
51
|
+
explicit platform/support expectations.
|
|
52
|
+
- Manual, dry-run-default release validation with exact tag/version and prior-CI
|
|
53
|
+
checks, SHA-256 integrity files, curated notes and separately gated GitHub/PyPI
|
|
54
|
+
jobs. Publication requires external owner setup and explicit approval.
|
|
55
|
+
- Immutable current Action pins, Windows installed-wheel CI, downloaded-artifact
|
|
56
|
+
checksum verification and a core-test matrix that avoids repeated eval suites.
|
|
57
|
+
|
|
58
|
+
### Fixed
|
|
59
|
+
|
|
60
|
+
- Generic CLI installation instructions now use a virtual environment and source
|
|
61
|
+
installation; the Termux installer is identified separately.
|
|
62
|
+
- Documentation distinguishes session-history reopening from interrupted-task
|
|
63
|
+
resume, hosted inference from local execution, and baseline requirements from
|
|
64
|
+
observed evaluation results.
|
|
65
|
+
- Documented unified-diff recovery guidance for unsupported Codex-style patch
|
|
66
|
+
wrappers, with links to its parser, tool schema, and regression tests.
|
|
67
|
+
- Fresh installations now use Groq's supported GPT-OSS 20B production model
|
|
68
|
+
as the default fast model; explicit saved model choices remain unchanged.
|
|
69
|
+
- Environment-provided Groq keys are resolved at use time rather than copied into
|
|
70
|
+
saved config during token accounting. Explicitly configured keys retain their
|
|
71
|
+
existing plaintext-storage contract; config writes are now atomic and private
|
|
72
|
+
from creation on POSIX.
|
|
73
|
+
- Key-slot display no longer includes credential prefixes/suffixes or short keys.
|
|
74
|
+
- The Termux installer keeps pip package-manager-owned, installs from its own
|
|
75
|
+
source path, and rejects non-Termux hosts before any package operations.
|
|
76
|
+
|
|
77
|
+
### Existing v2 development foundation
|
|
78
|
+
|
|
79
|
+
- Bounded agent/runtime budgets and provider routing; workspace/capability checks
|
|
80
|
+
with explicit native/PRoot execution guarantees.
|
|
81
|
+
- Reversible file-tool transactions, conflict-aware rollback, bounded sessions
|
|
82
|
+
and redacted runtime traces.
|
|
83
|
+
- Repository context selection, deterministic verification and bounded repair
|
|
84
|
+
with test-integrity safeguards.
|
|
85
|
+
- Interactive and single-task CLI, machine-readable task results, offline doctor
|
|
86
|
+
and cancellation handling.
|
|
87
|
+
- Deterministic/adversarial/resilience evaluations, committed acceptance
|
|
88
|
+
baseline and separately opt-in live evaluations.
|
|
89
|
+
|
|
90
|
+
These features reduce specific risks; they do not provide kernel isolation or
|
|
91
|
+
guarantee that arbitrary project code is safe. See [SECURITY.md](SECURITY.md).
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Contributing to Sable
|
|
2
|
+
|
|
3
|
+
Sable is a bounded local coding-agent runtime, not an OS sandbox. Read
|
|
4
|
+
[SECURITY.md](SECURITY.md) before changing execution, permissions, transactions,
|
|
5
|
+
verification, credential handling or model/tool boundaries.
|
|
6
|
+
|
|
7
|
+
## Set up a checkout
|
|
8
|
+
|
|
9
|
+
The supported CI matrix is Python 3.10–3.13. Use Python 3.13 for the full developer
|
|
10
|
+
toolchain. Git and Bash are required for the complete gate. On Linux/macOS:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
git clone https://github.com/atrx07/Sable-AI.git
|
|
14
|
+
cd Sable-AI
|
|
15
|
+
python3 -m venv .venv
|
|
16
|
+
. .venv/bin/activate
|
|
17
|
+
python -m pip install -e ".[dev,release]"
|
|
18
|
+
python -m scripts.quality
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
On Windows, create the environment with `py -3.13 -m venv .venv`, then use
|
|
22
|
+
`.venv\Scripts\python.exe` in place of `python`; activation is optional.
|
|
23
|
+
Install Git for Windows for Git/Bash. See [platforms](docs/platforms.md) for
|
|
24
|
+
Termux and tested-versus-expected support. Android may lack wheels for developer
|
|
25
|
+
tools; the runtime does not require those tools.
|
|
26
|
+
|
|
27
|
+
## Commands
|
|
28
|
+
|
|
29
|
+
From an activated environment in the repository root:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
python -m compileall -q sable tests evals scripts sable.py
|
|
33
|
+
python -m unittest discover -s tests -v
|
|
34
|
+
python -m ruff check .
|
|
35
|
+
python -m ruff format --check .
|
|
36
|
+
python -m coverage run -m unittest discover -s tests
|
|
37
|
+
python -m coverage report
|
|
38
|
+
python -m bandit -r sable -ll
|
|
39
|
+
python -m pip_audit -r requirements.txt
|
|
40
|
+
python -m sable.evals --baseline evals/baselines/m7-deterministic.json --output evals/reports/generated/local
|
|
41
|
+
python -m build
|
|
42
|
+
python -m twine check dist/*
|
|
43
|
+
python -m scripts.release_check --sdist
|
|
44
|
+
bash -n install.sh
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`python -m scripts.quality` is the authoritative fail-fast sequence, including
|
|
48
|
+
repository checks. Use `python -m ruff format .` to apply formatting and review
|
|
49
|
+
`python -m ruff check . --fix` changes before committing. On shells that do not
|
|
50
|
+
expand `dist/*`, use the full filenames or the canonical quality command.
|
|
51
|
+
|
|
52
|
+
The configured statement-coverage floor is 82%; it is not the current measured
|
|
53
|
+
percentage. Do not lower it or the committed baseline to hide a regression.
|
|
54
|
+
Project-wide type checking is not a blocking gate; see
|
|
55
|
+
[quality policy](docs/quality.md) for scope, reproduction commands, and limitations.
|
|
56
|
+
Builds, vulnerability lookups and dependency installation need network access;
|
|
57
|
+
unit tests and deterministic evaluations need no real API key or provider access.
|
|
58
|
+
|
|
59
|
+
## Tests and evaluations
|
|
60
|
+
|
|
61
|
+
Add focused unittest regressions for behavior changes. Security-sensitive changes
|
|
62
|
+
should exercise allowed and denied paths, malformed/untrusted input, error handling
|
|
63
|
+
and resource/rollback boundaries. Avoid network calls and real credentials in tests.
|
|
64
|
+
Use clearly synthetic keys and isolated temporary workspaces/state directories.
|
|
65
|
+
|
|
66
|
+
For end-to-end cases, follow [evals/README.md](evals/README.md): add a bounded fixture
|
|
67
|
+
and a uniquely identified scenario, declare expected files/outcomes/metrics, and
|
|
68
|
+
exercise the real executor. Canonical fixtures intentionally include exact patch
|
|
69
|
+
targets and errors, so they are not autoformatted. Baseline changes need a specific
|
|
70
|
+
reviewed reason, never merely a failing run. Live evaluations require explicit
|
|
71
|
+
`--live`, are nondeterministic and may consume quota; they are not a contribution gate.
|
|
72
|
+
|
|
73
|
+
Update technical docs and [CHANGELOG.md](CHANGELOG.md) for user-visible changes.
|
|
74
|
+
Commit canonical scenarios, fixtures and baselines; never commit generated reports,
|
|
75
|
+
build outputs, local config, credentials, sessions, traces or virtual environments.
|
|
76
|
+
|
|
77
|
+
## Contribution workflow
|
|
78
|
+
|
|
79
|
+
External contributors should fork the repository, create a focused branch in
|
|
80
|
+
their fork, and submit a pull request with reproduction steps, tests and rationale.
|
|
81
|
+
Keep commits coherent and descriptive; separate mechanical formatting from behavior
|
|
82
|
+
where practical. Discuss large changes first. The owner's direct-`main` development
|
|
83
|
+
workflow is not an instruction for contributors to push to `main`.
|
|
84
|
+
|
|
85
|
+
Never use a public issue/PR for undisclosed vulnerability details; follow the
|
|
86
|
+
private-route guidance in [SECURITY.md](SECURITY.md). Be respectful and keep review
|
|
87
|
+
focused on the code. A formal Code of Conduct is deferred until the owner provides
|
|
88
|
+
a real private enforcement contact; no fictional contact is advertised.
|
|
89
|
+
|
|
90
|
+
## Version and release boundaries
|
|
91
|
+
|
|
92
|
+
The version literal lives in `sable/_version.py`. Package metadata and
|
|
93
|
+
`sable.__version__` derive from it. Use semantic-versioning expectations: MAJOR for
|
|
94
|
+
incompatible CLI/config/API behavior, MINOR for compatible features, PATCH for
|
|
95
|
+
bug/security/reliability fixes. The owner decides release numbers and timing.
|
|
96
|
+
The existing 2.0.0 source metadata is not proof of a published release.
|
|
97
|
+
|
|
98
|
+
A contribution does not authorize tags, GitHub Releases, PyPI uploads, secrets or
|
|
99
|
+
repository-setting changes. Keep release notes curated in the changelog and obtain
|
|
100
|
+
owner approval for publication. Repository automation only prepares and validates a release. Follow
|
|
101
|
+
[the release procedure](docs/releasing.md) for safe dry runs and owner setup.
|
sableai-2.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 atrx07
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
include LICENSE README.md pyproject.toml requirements.txt install.sh sable.py
|
|
2
|
+
include SECURITY.md CONTRIBUTING.md CHANGELOG.md SUPPORT.md
|
|
3
|
+
recursive-include docs *.md
|
|
4
|
+
recursive-include tests *.py
|
|
5
|
+
recursive-include scripts *.py
|
|
6
|
+
recursive-include evals *.md *.json *.py *.txt *.toml
|
|
7
|
+
prune evals/reports/generated
|
|
8
|
+
global-exclude __pycache__ *.py[cod] .env .env.*
|
sableai-2.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sableai
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: Local-first agentic coding runtime with bounded tools and deterministic verification
|
|
5
|
+
Author: atrx07
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/atrx07/Sable-AI
|
|
8
|
+
Project-URL: Source, https://github.com/atrx07/Sable-AI
|
|
9
|
+
Project-URL: Issues, https://github.com/atrx07/Sable-AI/issues
|
|
10
|
+
Project-URL: Documentation, https://github.com/atrx07/Sable-AI/tree/main/docs
|
|
11
|
+
Keywords: agentic-ai,coding-agent,developer-tools,terminal,termux,groq,openai,anthropic,deepseek
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: requests<3,>=2.32.0
|
|
23
|
+
Provides-Extra: dev
|
|
24
|
+
Requires-Dist: ruff<0.17,>=0.16.7; extra == "dev"
|
|
25
|
+
Requires-Dist: coverage<8,>=7.16.1; extra == "dev"
|
|
26
|
+
Requires-Dist: bandit<2,>=1.9.4; extra == "dev"
|
|
27
|
+
Requires-Dist: pip-audit<3,>=2.10.1; extra == "dev"
|
|
28
|
+
Requires-Dist: PyYAML<7,>=6.0.3; extra == "dev"
|
|
29
|
+
Requires-Dist: tomli<3,>=2.2; python_version < "3.11" and extra == "dev"
|
|
30
|
+
Provides-Extra: release
|
|
31
|
+
Requires-Dist: build<2,>=1.6.1; extra == "release"
|
|
32
|
+
Requires-Dist: twine<8,>=7; extra == "release"
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
# Sable
|
|
36
|
+
|
|
37
|
+
[](https://github.com/atrx07/Sable-AI/actions/workflows/ci.yml)
|
|
38
|
+
[](https://github.com/atrx07/Sable-AI/actions/workflows/codeql.yml)
|
|
39
|
+
[](docs/platforms.md)
|
|
40
|
+
[](LICENSE)
|
|
41
|
+
|
|
42
|
+
**Local-first agentic coding runtime with bounded tools and deterministic
|
|
43
|
+
verification** — for developers who want an AI coding CLI that checks its own
|
|
44
|
+
work, records every edit for undo, and never lets the model approve its own
|
|
45
|
+
actions.
|
|
46
|
+
|
|
47
|
+
Sable is a Python CLI for agentic coding in an existing repository. A model
|
|
48
|
+
from the configured provider requests tools to inspect and edit code; Sable
|
|
49
|
+
controls which actions execute, records file-tool changes for conflict-aware
|
|
50
|
+
undo, and runs project checks before reporting a verified result.
|
|
51
|
+
|
|
52
|
+
Project tools, policy, transactions, and evidence run on your machine. Model
|
|
53
|
+
inference uses the configured hosted provider (Groq by default; OpenAI,
|
|
54
|
+
Anthropic, and DeepSeek are also supported, currently beta — see
|
|
55
|
+
[model providers](docs/providers.md)) and sends selected repository context to
|
|
56
|
+
that provider; **local-first does not mean offline inference**.
|
|
57
|
+
|
|
58
|
+
> **Status:** Sable 2.0.0, source install only — no PyPI release yet.
|
|
59
|
+
> CI and CodeQL pass on `main`. Groq is the default provider; the other
|
|
60
|
+
> providers are beta and have not had live paid-API smoke tests yet.
|
|
61
|
+
|
|
62
|
+
## Contents
|
|
63
|
+
|
|
64
|
+
- [Quick start](#quick-start)
|
|
65
|
+
- [Watch Sable in action](#watch-sable-in-action)
|
|
66
|
+
- [Why Sable](#why-sable)
|
|
67
|
+
- [How Sable operates](#how-sable-operates)
|
|
68
|
+
- [Control and safety model](#control-and-safety-model)
|
|
69
|
+
- [A deterministic example](#a-deterministic-example)
|
|
70
|
+
- [Transactions and undo](#transactions-and-undo)
|
|
71
|
+
- [Verification](#verification)
|
|
72
|
+
- [Automation](#automation)
|
|
73
|
+
- [Deterministic evaluation evidence](#deterministic-evaluation-evidence)
|
|
74
|
+
- [Quality and release evidence](#quality-and-release-evidence)
|
|
75
|
+
- [Current limitations](#current-limitations)
|
|
76
|
+
- [FAQ](#faq)
|
|
77
|
+
- [Documentation](#documentation)
|
|
78
|
+
- [Contributing](#contributing)
|
|
79
|
+
- [License](#license)
|
|
80
|
+
|
|
81
|
+
## Quick start
|
|
82
|
+
|
|
83
|
+
Python 3.10–3.13 is the maintained CI range. Four steps, copy-paste:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
git clone https://github.com/atrx07/Sable-AI.git && cd Sable-AI
|
|
87
|
+
python -m venv .venv && . .venv/bin/activate
|
|
88
|
+
python -m pip install -e . && sable doctor .
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
PowerShell instead of the second line: `.venv\Scripts\Activate.ps1`.
|
|
92
|
+
`doctor` is offline and read-only, and it correctly reports `NOT READY`
|
|
93
|
+
without a provider key (exit 2) — that is a passing readiness check, not a
|
|
94
|
+
broken install.
|
|
95
|
+
|
|
96
|
+
Then set a key and run your first read-only task:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
export GROQ_API_KEY=your-key-here
|
|
100
|
+
sable run "Explain the project structure" . --mode plan
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`sable .` is interactive; `sable run` performs exactly one task and exits.
|
|
104
|
+
Configure a provider key — `GROQ_API_KEY` (Groq, the default),
|
|
105
|
+
`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, or `DEEPSEEK_API_KEY` — or use the
|
|
106
|
+
interactive `/keys` command. See [model providers](docs/providers.md).
|
|
107
|
+
Keys entered through `/keys` are explicitly stored as plaintext in the
|
|
108
|
+
private local config; environment keys are used without being persisted.
|
|
109
|
+
Termux has a dedicated `bash install.sh` path; it is not a generic Linux or
|
|
110
|
+
Windows installer. See [platform support](docs/platforms.md) before using it.
|
|
111
|
+
|
|
112
|
+
## Watch Sable in action
|
|
113
|
+
|
|
114
|
+
**🎬 [Watch the full 48-second Sable showcase (MP4)](docs/assets/showcase/sable-main-showcase.mp4)** · [Recording notes](docs/showcase.md)
|
|
115
|
+
|
|
116
|
+
The showcase covers `sable doctor .`, interactive `/status` and `/sandbox`,
|
|
117
|
+
and a five-scenario deterministic evaluation.
|
|
118
|
+
|
|
119
|
+
### 1. Readiness check
|
|
120
|
+
|
|
121
|
+

|
|
122
|
+
|
|
123
|
+
Doctor correctly reports `NOT READY` when provider credentials are missing.
|
|
124
|
+
|
|
125
|
+
### 2. Deterministic evaluation
|
|
126
|
+
|
|
127
|
+

|
|
128
|
+
|
|
129
|
+
Five scripted scenarios met their declared assertions, including expected
|
|
130
|
+
rollback conflicts and capability denials.
|
|
131
|
+
|
|
132
|
+
### 3. Execution boundaries
|
|
133
|
+
|
|
134
|
+

|
|
135
|
+
|
|
136
|
+
Sable enforces a private HOME and sanitized environment; native execution does
|
|
137
|
+
**not** provide kernel, network, or process isolation.
|
|
138
|
+
|
|
139
|
+
> **About these recordings:** They use a scripted provider through the real
|
|
140
|
+
> Sable runtime — **not** a live AI-model coding session. No API key was used.
|
|
141
|
+
> Evaluation assertions passing should not be read as proof of live-model
|
|
142
|
+
> performance or OS-level sandboxing.
|
|
143
|
+
|
|
144
|
+
## Why Sable
|
|
145
|
+
|
|
146
|
+
Most coding CLIs hand the model a shell and report what it says it did.
|
|
147
|
+
Sable inverts that: the runtime owns the work, the model only requests it.
|
|
148
|
+
|
|
149
|
+
- **The runtime, not the model, owns approvals.** Capability policy,
|
|
150
|
+
budgets, phase transitions, and verification outcomes are runtime-owned;
|
|
151
|
+
a model response can request a tool, never mint its own approval.
|
|
152
|
+
- **Every edit is recorded for undo.** File-tool changes are snapshotted
|
|
153
|
+
before the first mutation, and later user edits are preserved as undo
|
|
154
|
+
conflicts instead of being silently overwritten.
|
|
155
|
+
- **A result is verified, not asserted.** Runtime-owned QUICK / AFFECTED /
|
|
156
|
+
FULL checks run before a verified result is reported, with bounded repair
|
|
157
|
+
only after a genuine failure.
|
|
158
|
+
- **Limits are stated, not hidden.** Native execution is not kernel
|
|
159
|
+
isolation, and the README, security model, and sandbox output all say so.
|
|
160
|
+
|
|
161
|
+
| What you can do | How Sable supports it |
|
|
162
|
+
|---|---|
|
|
163
|
+
| Inspect a repository before editing | Bounded context selection and a read-only `plan` mode |
|
|
164
|
+
| Make and review code changes | Workspace-scoped file tools, diffs, and recorded transactions |
|
|
165
|
+
| Check a change and repair failures | Runtime-owned QUICK/AFFECTED/FULL verification and bounded repair |
|
|
166
|
+
| Recover file-tool edits | Fingerprint checks preserve later user edits as undo conflicts |
|
|
167
|
+
| Integrate with scripts | One-task CLI with schema-versioned JSON and explicit exit codes |
|
|
168
|
+
|
|
169
|
+
The [implementation evidence map](docs/evidence.md) links these capabilities to
|
|
170
|
+
source, regression tests, and evaluation scenarios. For future provider, local
|
|
171
|
+
model, IDE, and orchestration work, see the [roadmap](docs/roadmap.md).
|
|
172
|
+
|
|
173
|
+
## How Sable operates
|
|
174
|
+
|
|
175
|
+
```mermaid
|
|
176
|
+
flowchart LR
|
|
177
|
+
User --> CLI[CLI / one-shot interface]
|
|
178
|
+
CLI --> Runtime[RuntimeTask + Orchestrator]
|
|
179
|
+
Runtime --> Context[Context Engine]
|
|
180
|
+
Runtime --> Router[Provider Router]
|
|
181
|
+
Router --> Provider[Configured provider: Groq default]
|
|
182
|
+
Runtime --> Tools[Tool Executor]
|
|
183
|
+
Tools --> Policy[Capability Policy]
|
|
184
|
+
Policy --> Backend[Execution Backend / File Tools]
|
|
185
|
+
Tools --> Txn[Task Transaction]
|
|
186
|
+
Runtime --> Verify[Verification Engine]
|
|
187
|
+
Verify --> Backend
|
|
188
|
+
Runtime --> Evidence[Session / Trace / Result]
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
The runtime—not the model—owns phase transitions, budgets, capability requests,
|
|
192
|
+
approvals, transactions, verification outcomes, and optional Git automation. A model
|
|
193
|
+
response may request a tool, but only the first real tool call in a turn can execute;
|
|
194
|
+
the model must observe that result before another action is considered.
|
|
195
|
+
|
|
196
|
+
Repository discovery and the context engine select bounded, symbol/import/test-aware
|
|
197
|
+
material before reasoning. Main reasoning and optional context compression use a
|
|
198
|
+
normalized provider route. Tool requests then pass through capability policy,
|
|
199
|
+
workspace/path checks, and an execution backend before results return to the loop.
|
|
200
|
+
|
|
201
|
+
[Architecture](docs/architecture.md) provides the complete component, lifecycle,
|
|
202
|
+
trust-boundary, verification, transaction, and evaluation diagrams.
|
|
203
|
+
|
|
204
|
+
## Control and safety model
|
|
205
|
+
|
|
206
|
+
### Enforced by Sable
|
|
207
|
+
|
|
208
|
+
- file-tool paths, including resolved symlinks, must remain inside the workspace;
|
|
209
|
+
- protected credential/config paths are rejected before file access;
|
|
210
|
+
- plan mode is a hard read-only ceiling for model-originated actions;
|
|
211
|
+
- elevated actions use runtime-created, exact-action allow-once/session approvals;
|
|
212
|
+
- normal project processes receive a private HOME and sanitized environment;
|
|
213
|
+
- shell execution is disabled by default and only requestable under `yolo` policy;
|
|
214
|
+
- independent model-turn, tool-call, verification, output, and time budgets are bounded;
|
|
215
|
+
- Sable file-tool mutations are snapshotted before their first change;
|
|
216
|
+
- required verification must pass before verified auto-commit;
|
|
217
|
+
- remote Git publication is capability-gated and auto-push defaults off.
|
|
218
|
+
|
|
219
|
+
### Not provided
|
|
220
|
+
|
|
221
|
+
- kernel, container, or arbitrary child-process filesystem isolation;
|
|
222
|
+
- arbitrary process network or process-namespace isolation;
|
|
223
|
+
- complete reversal of subprocess side effects;
|
|
224
|
+
- perfect prompt-injection resistance;
|
|
225
|
+
- semantic proof that code or tests are globally correct.
|
|
226
|
+
|
|
227
|
+
Repository text, source comments, model output, and tool/test output are untrusted
|
|
228
|
+
data. They cannot mint an approval or change its scope. This is prompt-injection
|
|
229
|
+
hardening backed by runtime policy, not prompt-injection immunity. Native processes
|
|
230
|
+
retain the Sable OS user's permissions; Termux/PRoot provides best-effort filesystem
|
|
231
|
+
remapping, not a kernel security boundary. Use a separately configured container,
|
|
232
|
+
VM, restricted OS account, or kernel sandbox for genuinely hostile code.
|
|
233
|
+
|
|
234
|
+
| Mode | Model-originated authority |
|
|
235
|
+
|---|---|
|
|
236
|
+
| `plan` | Workspace and local-Git reads; mutation cannot be approved |
|
|
237
|
+
| `build` | Workspace edits and restricted direct processes; destructive, network, package, raw-shell, and publish actions are denied |
|
|
238
|
+
| `yolo` | Elevated actions become requestable through scoped human approval; hard boundaries remain |
|
|
239
|
+
|
|
240
|
+
Read the [security model](SECURITY.md) and
|
|
241
|
+
[execution controls](docs/execution-security.md) before running unfamiliar projects.
|
|
242
|
+
|
|
243
|
+
## A deterministic example
|
|
244
|
+
|
|
245
|
+
This is a compact rendering of the real `coding.simple_bug` **deterministic scripted
|
|
246
|
+
evaluation**, not a live-model transcript. The fixture, scripted provider responses,
|
|
247
|
+
real Sable runtime path, and machine assertions are committed. The following
|
|
248
|
+
example summarizes the scenario's declared checks; it is not a fresh run report:
|
|
249
|
+
|
|
250
|
+
```text
|
|
251
|
+
Task: fix the calculation bug and verify it
|
|
252
|
+
Context: 2 required files selected from a 3-file fixture (recall 2/2)
|
|
253
|
+
Tool calls: 1 workspace write across 2 model turns
|
|
254
|
+
Changed: calculator.py
|
|
255
|
+
Unchanged: notes.txt, tests/test_calculator.py
|
|
256
|
+
Verification: PASS
|
|
257
|
+
Transaction: COMPLETED; rollback AVAILABLE
|
|
258
|
+
Outcome: TASK_PASS / VERIFICATION_PASSED
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Inspect the [scenario catalog](evals/scenarios/m7.2-system.json),
|
|
262
|
+
[fixture](evals/fixtures/bug_repair), and
|
|
263
|
+
[assertion engine](sable/evals/assertions.py). Reproduce the suite from this
|
|
264
|
+
checkout with the following command (one line works in Bash and PowerShell):
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
python -m sable.evals --baseline evals/baselines/m7-deterministic.json --output evals/reports/generated/local
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
The [demo guide](docs/demo.md) provides focused coding, refusal, repair, transaction,
|
|
271
|
+
and automation walkthroughs. The [evaluation guide](evals/README.md) explains how
|
|
272
|
+
deterministic and live modes differ.
|
|
273
|
+
|
|
274
|
+
## Transactions and undo
|
|
275
|
+
|
|
276
|
+
Each natural-language task opens a `TaskTransaction`. Before a Sable file tool first
|
|
277
|
+
mutates a path, the runtime stores a bounded baseline snapshot. It records the
|
|
278
|
+
post-state fingerprint, verification state, checkpoints, dirty-at-start paths, and
|
|
279
|
+
any Sable-created commit.
|
|
280
|
+
|
|
281
|
+
```text
|
|
282
|
+
/txn
|
|
283
|
+
/txn show <transaction-id>
|
|
284
|
+
/undo --dry-run
|
|
285
|
+
/undo
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Undo restores a path only when its current fingerprint still matches Sable's recorded
|
|
289
|
+
post-state. Later user edits are preserved and reported as conflicts. Undo changes
|
|
290
|
+
the working tree; it never resets, cleans, checks out, or rewrites Git history.
|
|
291
|
+
Subprocesses can change resources outside the file-tool transaction and their side
|
|
292
|
+
effects are not fully reversible. See [transactions](docs/transactions.md).
|
|
293
|
+
|
|
294
|
+
## Verification
|
|
295
|
+
|
|
296
|
+
Verification is a deterministic, runtime-owned gate:
|
|
297
|
+
|
|
298
|
+
| Scope | Purpose |
|
|
299
|
+
|---|---|
|
|
300
|
+
| `QUICK` | Low-cost syntax/configuration checks suitable for rapid feedback |
|
|
301
|
+
| `AFFECTED` | Quick checks plus heuristically selected tests related to changed files |
|
|
302
|
+
| `FULL` | The broadest discovered/configured project checks within the budget |
|
|
303
|
+
|
|
304
|
+
Sable discovers project tooling, constructs a typed `VerificationPlan`, runs checks
|
|
305
|
+
through the same execution backend, classifies structured results, and may request a
|
|
306
|
+
bounded repair only after a genuine failure. Repairs receive redacted diagnostics,
|
|
307
|
+
stop on repeated failure signatures, and are checked for likely test weakening.
|
|
308
|
+
Unavailable tools, timeouts, and policy blocks remain `INCOMPLETE` or `BLOCKED`; they
|
|
309
|
+
are never converted to a verified pass. Manifest and verification-config changes
|
|
310
|
+
escalate affected verification to full.
|
|
311
|
+
|
|
312
|
+
Green verification is evidence from the configured/discovered checks, not proof of
|
|
313
|
+
global correctness. Affected selection and integrity checks are conservative
|
|
314
|
+
heuristics. See [verification](docs/verification.md).
|
|
315
|
+
|
|
316
|
+
## Automation
|
|
317
|
+
|
|
318
|
+
Use `--json` only with `sable run`:
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
sable run "Fix the parser regression and add coverage" . --json
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Stdout is one schema-versioned final JSON document; progress and approval prompts go
|
|
325
|
+
to stderr. A bounded shape is:
|
|
326
|
+
|
|
327
|
+
```json
|
|
328
|
+
{
|
|
329
|
+
"schema_version": 1,
|
|
330
|
+
"status": "completed",
|
|
331
|
+
"result": "pass",
|
|
332
|
+
"verified": true,
|
|
333
|
+
"verification_status": "PASS",
|
|
334
|
+
"changed_files": ["parser.py"],
|
|
335
|
+
"transaction_id": "txn-1",
|
|
336
|
+
"exit_reason": "VERIFICATION_PASSED",
|
|
337
|
+
"exit_code": 0
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Consumers should check both `schema_version` and process exit code. Stable codes
|
|
342
|
+
distinguish success, usage/configuration, verification, policy denial, backend
|
|
343
|
+
unavailability, provider failure, internal failure, and cancellation. The complete
|
|
344
|
+
schema and exit-code table are in the [CLI contract](docs/cli.md).
|
|
345
|
+
|
|
346
|
+
## Deterministic evaluation evidence
|
|
347
|
+
|
|
348
|
+
The [committed baseline](evals/baselines/m7-deterministic.json) contains 53 scenarios
|
|
349
|
+
and requires all completed scenarios to pass their declared assertions. It permits
|
|
350
|
+
at most one platform skip, solely for `security.symlink_escape`. A host with symlink
|
|
351
|
+
support executes all 53; a host without it can complete 52 and report one skip.
|
|
352
|
+
|
|
353
|
+
Run the command above to obtain the current `eval-report.md` and `eval-results.json`.
|
|
354
|
+
Reports record the source commit, host, mode, failures, skips, and rate denominators.
|
|
355
|
+
The [deterministic CI job](.github/workflows/ci.yml) runs the same baseline command.
|
|
356
|
+
A configured gate is a requirement; a passing result must come from a recorded run.
|
|
357
|
+
|
|
358
|
+
These scenarios use scripted provider responses with the real runtime components.
|
|
359
|
+
They check behavior under controlled fixtures, including coding, repair, refusal,
|
|
360
|
+
rollback, and test-integrity attacks. They do not measure arbitrary coding success
|
|
361
|
+
or live-model reliability. Live evaluation is separate, opt-in, nondeterministic,
|
|
362
|
+
and may consume quota. See the [evaluation methodology](evals/README.md).
|
|
363
|
+
|
|
364
|
+
## Quality and release evidence
|
|
365
|
+
|
|
366
|
+
The repository gates Python 3.10–3.13 on Linux, performs an installed-wheel smoke on
|
|
367
|
+
Windows/Python 3.13, enforces Ruff formatting/lint and an 82% statement-coverage
|
|
368
|
+
floor, audits runtime dependencies, runs Bandit and CodeQL, preserves the committed baseline,
|
|
369
|
+
and installs both built wheel and sdist in clean environments. Release automation is
|
|
370
|
+
manual, defaults to no publication, and re-downloads artifacts to verify checksums.
|
|
371
|
+
|
|
372
|
+
No public tag, GitHub Release, or PyPI publication is implied. See
|
|
373
|
+
[quality policy](docs/quality.md) and [release procedure](docs/releasing.md).
|
|
374
|
+
|
|
375
|
+
## Current limitations
|
|
376
|
+
|
|
377
|
+
- OpenAI, Anthropic, and DeepSeek providers are beta: mocked-test coverage only,
|
|
378
|
+
no live paid-API smoke tests yet (see [model providers](docs/providers.md)).
|
|
379
|
+
AgentRouter, local-model, IDE/server, and multi-agent support remain proposed
|
|
380
|
+
work, not shipped features.
|
|
381
|
+
- Affected-test selection and verification-integrity checks are heuristic.
|
|
382
|
+
- PRoot is best-effort remapping; native child processes retain OS-user permissions.
|
|
383
|
+
- Arbitrary process filesystem, network, and namespace isolation are not provided.
|
|
384
|
+
- Blocking provider calls observe cancellation only at host/library-supported points.
|
|
385
|
+
- Project-wide static type checking is not a blocking gate.
|
|
386
|
+
- Android runtime validation requires manual evidence; macOS has no dedicated CI.
|
|
387
|
+
- Live-model evaluation is nondeterministic and excluded from ordinary CI.
|
|
388
|
+
- Keys deliberately saved with `/keys` remain plaintext in the private local config.
|
|
389
|
+
|
|
390
|
+
## FAQ
|
|
391
|
+
|
|
392
|
+
**Do I need an API key to try Sable?**
|
|
393
|
+
No for `sable doctor .` and the scripted deterministic demos — those are
|
|
394
|
+
offline. Yes for any live task: set `GROQ_API_KEY` (or another provider key)
|
|
395
|
+
first. See [model providers](docs/providers.md).
|
|
396
|
+
|
|
397
|
+
**Is Sable offline?**
|
|
398
|
+
Its tools, policy, transactions, and verification run on your machine, but
|
|
399
|
+
model inference is hosted: selected repository context is sent to the
|
|
400
|
+
configured provider. Local-first does not mean offline inference.
|
|
401
|
+
|
|
402
|
+
**Why does `doctor` say NOT READY?**
|
|
403
|
+
Almost always: no provider key is configured. That is the documented,
|
|
404
|
+
correct result (exit 2), not a broken install. See
|
|
405
|
+
[troubleshooting](docs/troubleshooting.md).
|
|
406
|
+
|
|
407
|
+
**Does Sable sandbox the code it runs?**
|
|
408
|
+
Not at kernel level. Native processes keep the OS user's permissions, with
|
|
409
|
+
a private HOME and sanitized environment; Termux/PRoot is best-effort
|
|
410
|
+
remapping only. Use a container, VM, or restricted account for genuinely
|
|
411
|
+
hostile code. See [execution controls](docs/execution-security.md).
|
|
412
|
+
|
|
413
|
+
**Which providers work?**
|
|
414
|
+
Groq by default. OpenAI, Anthropic, and DeepSeek are supported but beta:
|
|
415
|
+
mocked-test coverage only, no live paid-API smoke tests yet. See
|
|
416
|
+
[model providers](docs/providers.md).
|
|
417
|
+
|
|
418
|
+
## Documentation
|
|
419
|
+
|
|
420
|
+
| Area | Guide |
|
|
421
|
+
|---|---|
|
|
422
|
+
| CLI, automation schema, exit codes | [docs/cli.md](docs/cli.md) |
|
|
423
|
+
| Model providers (Groq, OpenAI, Anthropic, DeepSeek) | [docs/providers.md](docs/providers.md) |
|
|
424
|
+
| Troubleshooting and FAQ | [docs/troubleshooting.md](docs/troubleshooting.md) |
|
|
425
|
+
| Architecture and task lifecycle | [docs/architecture.md](docs/architecture.md) |
|
|
426
|
+
| Claims mapped to implementation and tests | [docs/evidence.md](docs/evidence.md) |
|
|
427
|
+
| Runtime state and routing | [docs/runtime.md](docs/runtime.md) |
|
|
428
|
+
| Security threat model | [SECURITY.md](SECURITY.md) |
|
|
429
|
+
| Execution capabilities/backends | [docs/execution-security.md](docs/execution-security.md) |
|
|
430
|
+
| Transactions and recovery | [docs/transactions.md](docs/transactions.md) |
|
|
431
|
+
| Context selection | [docs/context-engine.md](docs/context-engine.md) |
|
|
432
|
+
| Sessions and traces | [docs/sessions.md](docs/sessions.md) |
|
|
433
|
+
| Verification | [docs/verification.md](docs/verification.md) |
|
|
434
|
+
| Evaluations | [evals/README.md](evals/README.md) |
|
|
435
|
+
| Reproducible demos | [docs/demo.md](docs/demo.md) |
|
|
436
|
+
| Platforms and installation | [docs/platforms.md](docs/platforms.md) |
|
|
437
|
+
| Quality and packaging | [docs/quality.md](docs/quality.md) |
|
|
438
|
+
| Release process | [docs/releasing.md](docs/releasing.md) |
|
|
439
|
+
| 2.0.0 release-note draft | [docs/release-notes-draft.md](docs/release-notes-draft.md) |
|
|
440
|
+
| Launch copy and metadata proposals | [docs/launch-kit.md](docs/launch-kit.md) |
|
|
441
|
+
| Completed v2 foundation and proposed next steps | [docs/roadmap.md](docs/roadmap.md) |
|
|
442
|
+
| Contribution workflow | [CONTRIBUTING.md](CONTRIBUTING.md) |
|
|
443
|
+
| Support | [SUPPORT.md](SUPPORT.md) |
|
|
444
|
+
|
|
445
|
+
## Contributing
|
|
446
|
+
|
|
447
|
+
Start with [CONTRIBUTING.md](CONTRIBUTING.md). It documents the editable environment,
|
|
448
|
+
canonical `python -m scripts.quality` gate, synthetic fixture rules, evaluation
|
|
449
|
+
expectations, and fork/PR workflow. Security-sensitive changes should also follow
|
|
450
|
+
[SECURITY.md](SECURITY.md).
|
|
451
|
+
|
|
452
|
+
## License
|
|
453
|
+
|
|
454
|
+
[MIT](LICENSE)
|