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.
Files changed (215) hide show
  1. sableai-2.0.0/CHANGELOG.md +91 -0
  2. sableai-2.0.0/CONTRIBUTING.md +101 -0
  3. sableai-2.0.0/LICENSE +21 -0
  4. sableai-2.0.0/MANIFEST.in +8 -0
  5. sableai-2.0.0/PKG-INFO +454 -0
  6. sableai-2.0.0/README.md +420 -0
  7. sableai-2.0.0/SECURITY.md +149 -0
  8. sableai-2.0.0/SUPPORT.md +16 -0
  9. sableai-2.0.0/docs/architecture.md +279 -0
  10. sableai-2.0.0/docs/cli.md +179 -0
  11. sableai-2.0.0/docs/context-engine.md +19 -0
  12. sableai-2.0.0/docs/demo.md +300 -0
  13. sableai-2.0.0/docs/evidence.md +71 -0
  14. sableai-2.0.0/docs/execution-security.md +63 -0
  15. sableai-2.0.0/docs/launch-kit.md +175 -0
  16. sableai-2.0.0/docs/platforms.md +58 -0
  17. sableai-2.0.0/docs/providers.md +75 -0
  18. sableai-2.0.0/docs/quality.md +108 -0
  19. sableai-2.0.0/docs/release-notes-draft.md +156 -0
  20. sableai-2.0.0/docs/releasing.md +112 -0
  21. sableai-2.0.0/docs/roadmap.md +399 -0
  22. sableai-2.0.0/docs/runtime.md +30 -0
  23. sableai-2.0.0/docs/sessions.md +22 -0
  24. sableai-2.0.0/docs/showcase.md +50 -0
  25. sableai-2.0.0/docs/transactions.md +77 -0
  26. sableai-2.0.0/docs/troubleshooting.md +148 -0
  27. sableai-2.0.0/docs/verification.md +93 -0
  28. sableai-2.0.0/evals/README.md +114 -0
  29. sableai-2.0.0/evals/baselines/m7-deterministic.json +79 -0
  30. sableai-2.0.0/evals/fixtures/adversarial/README.md +5 -0
  31. sableai-2.0.0/evals/fixtures/adversarial/approval.json +1 -0
  32. sableai-2.0.0/evals/fixtures/adversarial/emit_injection.py +1 -0
  33. sableai-2.0.0/evals/fixtures/adversarial/safe.py +3 -0
  34. sableai-2.0.0/evals/fixtures/adversarial/tests/test_safe.py +12 -0
  35. sableai-2.0.0/evals/fixtures/assertion_repair/pricing.py +2 -0
  36. sableai-2.0.0/evals/fixtures/assertion_repair/tests/test_pricing.py +12 -0
  37. sableai-2.0.0/evals/fixtures/bug_repair/calculator.py +2 -0
  38. sableai-2.0.0/evals/fixtures/bug_repair/notes.txt +1 -0
  39. sableai-2.0.0/evals/fixtures/bug_repair/tests/test_calculator.py +12 -0
  40. sableai-2.0.0/evals/fixtures/build_failure/build.py +7 -0
  41. sableai-2.0.0/evals/fixtures/build_failure/generator.py +2 -0
  42. sableai-2.0.0/evals/fixtures/context_auth/app/__init__.py +1 -0
  43. sableai-2.0.0/evals/fixtures/context_auth/app/auth.py +2 -0
  44. sableai-2.0.0/evals/fixtures/context_auth/app/billing.py +5 -0
  45. sableai-2.0.0/evals/fixtures/context_auth/app/users.py +5 -0
  46. sableai-2.0.0/evals/fixtures/context_auth/app/utils.py +2 -0
  47. sableai-2.0.0/evals/fixtures/context_auth/pyproject.toml +3 -0
  48. sableai-2.0.0/evals/fixtures/context_auth/tests/test_auth.py +12 -0
  49. sableai-2.0.0/evals/fixtures/context_auth/tests/test_billing.py +12 -0
  50. sableai-2.0.0/evals/fixtures/context_auth/tests/test_users.py +12 -0
  51. sableai-2.0.0/evals/fixtures/context_auth/unrelated/archive.py +1 -0
  52. sableai-2.0.0/evals/fixtures/framework_smoke/README.md +3 -0
  53. sableai-2.0.0/evals/fixtures/framework_smoke/app.py +2 -0
  54. sableai-2.0.0/evals/fixtures/framework_smoke/typecheck.py +5 -0
  55. sableai-2.0.0/evals/fixtures/import_repair/app.py +5 -0
  56. sableai-2.0.0/evals/fixtures/import_repair/helper.py +2 -0
  57. sableai-2.0.0/evals/fixtures/import_repair/tests/test_app.py +12 -0
  58. sableai-2.0.0/evals/fixtures/integrity/logic.py +2 -0
  59. sableai-2.0.0/evals/fixtures/integrity/package.json +5 -0
  60. sableai-2.0.0/evals/fixtures/integrity/tests/test_logic.py +15 -0
  61. sableai-2.0.0/evals/fixtures/multi_file/pkg/__init__.py +1 -0
  62. sableai-2.0.0/evals/fixtures/multi_file/pkg/profile.py +2 -0
  63. sableai-2.0.0/evals/fixtures/multi_file/tests/test_profile.py +12 -0
  64. sableai-2.0.0/evals/fixtures/refactor/report.py +3 -0
  65. sableai-2.0.0/evals/fixtures/refactor/tests/test_report.py +12 -0
  66. sableai-2.0.0/evals/fixtures/regression/slug.py +2 -0
  67. sableai-2.0.0/evals/fixtures/regression/tests/test_slug.py +12 -0
  68. sableai-2.0.0/evals/fixtures/syntax_repair/parser-source.txt +1 -0
  69. sableai-2.0.0/evals/fixtures/syntax_repair/tests/test_parser.py +12 -0
  70. sableai-2.0.0/evals/fixtures/transactions/delete.txt +1 -0
  71. sableai-2.0.0/evals/fixtures/transactions/dirty.txt +1 -0
  72. sableai-2.0.0/evals/fixtures/transactions/original.txt +1 -0
  73. sableai-2.0.0/evals/fixtures/transactions/target.txt +1 -0
  74. sableai-2.0.0/evals/fixtures/transactions/untouched.txt +1 -0
  75. sableai-2.0.0/evals/scenarios/framework-smoke.json +35 -0
  76. sableai-2.0.0/evals/scenarios/m7.2-system.json +547 -0
  77. sableai-2.0.0/evals/scenarios/m7.3-adversarial.json +429 -0
  78. sableai-2.0.0/evals/scenarios/m7.4-live.json +56 -0
  79. sableai-2.0.0/evals/scenarios/m7.5-resilience.json +174 -0
  80. sableai-2.0.0/install.sh +36 -0
  81. sableai-2.0.0/pyproject.toml +69 -0
  82. sableai-2.0.0/requirements.txt +1 -0
  83. sableai-2.0.0/sable/__init__.py +3 -0
  84. sableai-2.0.0/sable/__main__.py +4 -0
  85. sableai-2.0.0/sable/_version.py +3 -0
  86. sableai-2.0.0/sable/automation.py +147 -0
  87. sableai-2.0.0/sable/capabilities.py +501 -0
  88. sableai-2.0.0/sable/cli.py +611 -0
  89. sableai-2.0.0/sable/cli_app.py +109 -0
  90. sableai-2.0.0/sable/cli_args.py +194 -0
  91. sableai-2.0.0/sable/cli_settings.py +215 -0
  92. sableai-2.0.0/sable/cli_workspace.py +262 -0
  93. sableai-2.0.0/sable/config.py +252 -0
  94. sableai-2.0.0/sable/context/__init__.py +4 -0
  95. sableai-2.0.0/sable/context/engine.py +602 -0
  96. sableai-2.0.0/sable/context/models.py +126 -0
  97. sableai-2.0.0/sable/doctor.py +475 -0
  98. sableai-2.0.0/sable/evals/__init__.py +68 -0
  99. sableai-2.0.0/sable/evals/__main__.py +3 -0
  100. sableai-2.0.0/sable/evals/assertions.py +210 -0
  101. sableai-2.0.0/sable/evals/baseline.py +157 -0
  102. sableai-2.0.0/sable/evals/cli.py +148 -0
  103. sableai-2.0.0/sable/evals/fixtures.py +75 -0
  104. sableai-2.0.0/sable/evals/metrics.py +112 -0
  105. sableai-2.0.0/sable/evals/models.py +534 -0
  106. sableai-2.0.0/sable/evals/provider.py +131 -0
  107. sableai-2.0.0/sable/evals/reporting.py +169 -0
  108. sableai-2.0.0/sable/evals/runner.py +148 -0
  109. sableai-2.0.0/sable/evals/system.py +953 -0
  110. sableai-2.0.0/sable/execution/__init__.py +78 -0
  111. sableai-2.0.0/sable/execution/base.py +136 -0
  112. sableai-2.0.0/sable/execution/native.py +261 -0
  113. sableai-2.0.0/sable/execution/proot.py +177 -0
  114. sableai-2.0.0/sable/groq_client.py +269 -0
  115. sableai-2.0.0/sable/main_agent.py +372 -0
  116. sableai-2.0.0/sable/orchestrator.py +900 -0
  117. sableai-2.0.0/sable/patches.py +197 -0
  118. sableai-2.0.0/sable/presentation.py +458 -0
  119. sableai-2.0.0/sable/project.py +168 -0
  120. sableai-2.0.0/sable/providers/__init__.py +25 -0
  121. sableai-2.0.0/sable/providers/anthropic.py +309 -0
  122. sableai-2.0.0/sable/providers/base.py +177 -0
  123. sableai-2.0.0/sable/providers/deepseek.py +11 -0
  124. sableai-2.0.0/sable/providers/factory.py +22 -0
  125. sableai-2.0.0/sable/providers/groq.py +7 -0
  126. sableai-2.0.0/sable/providers/openai.py +11 -0
  127. sableai-2.0.0/sable/providers/openai_compat.py +203 -0
  128. sableai-2.0.0/sable/providers/router.py +121 -0
  129. sableai-2.0.0/sable/runtime.py +349 -0
  130. sableai-2.0.0/sable/security.py +389 -0
  131. sableai-2.0.0/sable/sessions/__init__.py +4 -0
  132. sableai-2.0.0/sable/sessions/manager.py +365 -0
  133. sableai-2.0.0/sable/sessions/models.py +72 -0
  134. sableai-2.0.0/sable/tool_schemas.py +202 -0
  135. sableai-2.0.0/sable/tools/__init__.py +6 -0
  136. sableai-2.0.0/sable/tools/base.py +409 -0
  137. sableai-2.0.0/sable/tools/commands.py +76 -0
  138. sableai-2.0.0/sable/tools/context.py +100 -0
  139. sableai-2.0.0/sable/tools/executor.py +252 -0
  140. sableai-2.0.0/sable/tools/files_read.py +194 -0
  141. sableai-2.0.0/sable/tools/files_write.py +403 -0
  142. sableai-2.0.0/sable/tools/git.py +340 -0
  143. sableai-2.0.0/sable/transactions.py +984 -0
  144. sableai-2.0.0/sable/ui.py +93 -0
  145. sableai-2.0.0/sable/verification/__init__.py +72 -0
  146. sableai-2.0.0/sable/verification/adapters.py +682 -0
  147. sableai-2.0.0/sable/verification/affected.py +235 -0
  148. sableai-2.0.0/sable/verification/classifiers.py +105 -0
  149. sableai-2.0.0/sable/verification/discovery.py +166 -0
  150. sableai-2.0.0/sable/verification/integrity.py +345 -0
  151. sableai-2.0.0/sable/verification/models.py +472 -0
  152. sableai-2.0.0/sable/verification/planner.py +222 -0
  153. sableai-2.0.0/sable/verification/runner.py +274 -0
  154. sableai-2.0.0/sable/verifier.py +117 -0
  155. sableai-2.0.0/sable.py +7 -0
  156. sableai-2.0.0/sableai.egg-info/PKG-INFO +454 -0
  157. sableai-2.0.0/sableai.egg-info/SOURCES.txt +213 -0
  158. sableai-2.0.0/sableai.egg-info/dependency_links.txt +1 -0
  159. sableai-2.0.0/sableai.egg-info/entry_points.txt +2 -0
  160. sableai-2.0.0/sableai.egg-info/requires.txt +15 -0
  161. sableai-2.0.0/sableai.egg-info/top_level.txt +1 -0
  162. sableai-2.0.0/scripts/__init__.py +1 -0
  163. sableai-2.0.0/scripts/live_provider_smoke.py +214 -0
  164. sableai-2.0.0/scripts/quality.py +46 -0
  165. sableai-2.0.0/scripts/release.py +145 -0
  166. sableai-2.0.0/scripts/release_check.py +211 -0
  167. sableai-2.0.0/scripts/repo_check.py +183 -0
  168. sableai-2.0.0/scripts/run_tests.py +33 -0
  169. sableai-2.0.0/setup.cfg +4 -0
  170. sableai-2.0.0/tests/test_agent_loop.py +156 -0
  171. sableai-2.0.0/tests/test_automation.py +251 -0
  172. sableai-2.0.0/tests/test_cancellation.py +174 -0
  173. sableai-2.0.0/tests/test_capabilities.py +222 -0
  174. sableai-2.0.0/tests/test_cli_app.py +246 -0
  175. sableai-2.0.0/tests/test_cli_execution.py +29 -0
  176. sableai-2.0.0/tests/test_cli_interactive.py +170 -0
  177. sableai-2.0.0/tests/test_cli_sessions.py +39 -0
  178. sableai-2.0.0/tests/test_cli_transactions.py +59 -0
  179. sableai-2.0.0/tests/test_config_persistence.py +86 -0
  180. sableai-2.0.0/tests/test_context.py +210 -0
  181. sableai-2.0.0/tests/test_doctor.py +213 -0
  182. sableai-2.0.0/tests/test_evals_adversarial.py +41 -0
  183. sableai-2.0.0/tests/test_evals_cli.py +23 -0
  184. sableai-2.0.0/tests/test_evals_final.py +186 -0
  185. sableai-2.0.0/tests/test_evals_framework.py +232 -0
  186. sableai-2.0.0/tests/test_evals_reporting.py +102 -0
  187. sableai-2.0.0/tests/test_evals_system.py +70 -0
  188. sableai-2.0.0/tests/test_execution_backends.py +267 -0
  189. sableai-2.0.0/tests/test_git.py +135 -0
  190. sableai-2.0.0/tests/test_groq_client.py +48 -0
  191. sableai-2.0.0/tests/test_installer.py +29 -0
  192. sableai-2.0.0/tests/test_live_provider_smoke.py +142 -0
  193. sableai-2.0.0/tests/test_m4_security.py +107 -0
  194. sableai-2.0.0/tests/test_multi_provider.py +269 -0
  195. sableai-2.0.0/tests/test_orchestrator.py +99 -0
  196. sableai-2.0.0/tests/test_patches.py +227 -0
  197. sableai-2.0.0/tests/test_presentation.py +286 -0
  198. sableai-2.0.0/tests/test_project.py +17 -0
  199. sableai-2.0.0/tests/test_providers.py +176 -0
  200. sableai-2.0.0/tests/test_release.py +81 -0
  201. sableai-2.0.0/tests/test_release_check.py +55 -0
  202. sableai-2.0.0/tests/test_repo_check.py +87 -0
  203. sableai-2.0.0/tests/test_runtime.py +414 -0
  204. sableai-2.0.0/tests/test_security.py +176 -0
  205. sableai-2.0.0/tests/test_sessions.py +117 -0
  206. sableai-2.0.0/tests/test_test_selection.py +24 -0
  207. sableai-2.0.0/tests/test_tools.py +124 -0
  208. sableai-2.0.0/tests/test_transactions.py +525 -0
  209. sableai-2.0.0/tests/test_verification_affected.py +254 -0
  210. sableai-2.0.0/tests/test_verification_cli.py +56 -0
  211. sableai-2.0.0/tests/test_verification_core.py +273 -0
  212. sableai-2.0.0/tests/test_verification_discovery.py +327 -0
  213. sableai-2.0.0/tests/test_verification_integrity.py +139 -0
  214. sableai-2.0.0/tests/test_verification_orchestration.py +225 -0
  215. 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
+ [![CI](https://github.com/atrx07/Sable-AI/actions/workflows/ci.yml/badge.svg)](https://github.com/atrx07/Sable-AI/actions/workflows/ci.yml)
38
+ [![CodeQL](https://github.com/atrx07/Sable-AI/actions/workflows/codeql.yml/badge.svg)](https://github.com/atrx07/Sable-AI/actions/workflows/codeql.yml)
39
+ [![Python 3.10–3.13](https://img.shields.io/badge/Python-3.10%E2%80%933.13-3776AB)](docs/platforms.md)
40
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
+ ![Sable Doctor readiness check: API key missing, NOT READY](docs/assets/showcase/gif-doctor.gif)
122
+
123
+ Doctor correctly reports `NOT READY` when provider credentials are missing.
124
+
125
+ ### 2. Deterministic evaluation
126
+
127
+ ![Sable deterministic evaluation: five scenarios meet their assertions](docs/assets/showcase/gif-eval.gif)
128
+
129
+ Five scripted scenarios met their declared assertions, including expected
130
+ rollback conflicts and capability denials.
131
+
132
+ ### 3. Execution boundaries
133
+
134
+ ![Sable sandbox capabilities and protections](docs/assets/showcase/gif-sandbox.gif)
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)