@kodax-ai/kodax 0.7.77 → 0.7.78

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 (98) hide show
  1. package/CHANGELOG.md +176 -4
  2. package/README.md +200 -64
  3. package/README_CN.md +153 -49
  4. package/config-templates/config.example.jsonc +114 -32
  5. package/dist/chunks/agent-ASP4MS3X.js +2 -0
  6. package/dist/chunks/argument-completer-JYQ7FX3W.js +2 -0
  7. package/dist/chunks/{chunk-XSA37BVM.js → chunk-2CFHBKRE.js} +1 -1
  8. package/dist/chunks/chunk-35PPHOQ2.js +292 -0
  9. package/dist/chunks/chunk-43QNNDHR.js +29 -0
  10. package/dist/chunks/chunk-5BNQXXGY.js +1 -0
  11. package/dist/chunks/chunk-5GO6FH7L.js +458 -0
  12. package/dist/chunks/{chunk-FSXI4MAV.js → chunk-5NDCSFOP.js} +14 -14
  13. package/dist/chunks/{chunk-3DD4QEBH.js → chunk-6FOJVETH.js} +10 -10
  14. package/dist/chunks/chunk-6XM4B6K2.js +48 -0
  15. package/dist/chunks/chunk-6YZUE6NC.js +240 -0
  16. package/dist/chunks/{chunk-HORNWBYR.js → chunk-7OEBJGHK.js} +1 -1
  17. package/dist/chunks/{chunk-OAMKECRG.js → chunk-KQLQYHWU.js} +205 -200
  18. package/dist/chunks/{chunk-IQT4RPCE.js → chunk-NXO6GWSY.js} +2 -2
  19. package/dist/chunks/chunk-T2XZTLYE.js +316 -0
  20. package/dist/chunks/chunk-TQDBTTIM.js +348 -0
  21. package/dist/chunks/{chunk-FNW2XUL5.js → chunk-UID7BLAB.js} +1 -1
  22. package/dist/chunks/chunk-VAT2QYXM.js +765 -0
  23. package/dist/chunks/chunk-YAZQTC2L.js +5 -0
  24. package/dist/chunks/chunk-YVRYHC4C.js +655 -0
  25. package/dist/chunks/{chunk-EH7AOMJ7.js → chunk-Z3KFRTSB.js} +1 -1
  26. package/dist/chunks/compaction-config-BQSSIWK5.js +2 -0
  27. package/dist/chunks/{construction-bootstrap-RPRL3L7R.js → construction-bootstrap-VQLQGWPY.js} +1 -1
  28. package/dist/chunks/{dist-FDSOIR35.js → dist-BFT5YIGU.js} +1 -1
  29. package/dist/chunks/dist-PCFE24YP.js +2 -0
  30. package/dist/chunks/host-UTFXCYYM.js +2 -0
  31. package/dist/chunks/run-manager-PJU3WIFJ.js +2 -0
  32. package/dist/chunks/utils-SID4HW2Q.js +2 -0
  33. package/dist/index.d.ts +18 -17
  34. package/dist/index.js +6 -6
  35. package/dist/kodax_cli.js +1751 -1352
  36. package/dist/kodax_resume.js +17 -17
  37. package/dist/runtime-worker.js +1680 -1299
  38. package/dist/sandbox-workspace-session.js +563 -0
  39. package/dist/sdk-a2a.d.ts +16 -16
  40. package/dist/sdk-a2a.js +8 -8
  41. package/dist/sdk-agent.d.ts +275 -60
  42. package/dist/sdk-agent.js +1 -1
  43. package/dist/sdk-coding.d.ts +33 -165
  44. package/dist/sdk-coding.js +1 -1
  45. package/dist/sdk-experimental-memory.d.ts +2 -2
  46. package/dist/sdk-experimental-memory.js +1 -1
  47. package/dist/sdk-llm.d.ts +2 -1
  48. package/dist/sdk-llm.js +1 -1
  49. package/dist/sdk-mcp.js +1 -1
  50. package/dist/sdk-media.js +1 -1
  51. package/dist/sdk-repl.d.ts +67 -25
  52. package/dist/sdk-repl.js +2 -2
  53. package/dist/sdk-runtime.d.ts +194 -147
  54. package/dist/sdk-runtime.js +1 -1
  55. package/dist/sdk-sandbox.d.ts +93 -0
  56. package/dist/sdk-sandbox.js +2 -0
  57. package/dist/sdk-session.d.ts +6 -7
  58. package/dist/sdk-session.js +1 -1
  59. package/dist/sdk-skills.d.ts +2 -2
  60. package/dist/sdk-skills.js +1 -1
  61. package/dist/semantic-worker.js +15 -15
  62. package/dist/types-chunks/{bash-prefix-extractor.d-pZdu6qt7.d.ts → bash-prefix-extractor.d-uAe2Oqda.d.ts} +126 -8
  63. package/dist/types-chunks/{capsule.d-CxCm1KZz.d.ts → capsule.d-BlSv9l3V.d.ts} +1 -1
  64. package/dist/types-chunks/{guardrail.d-CJx9RRd3.d.ts → guardrail.d-BRE_ErEj.d.ts} +1 -1
  65. package/dist/types-chunks/{guardrail.d-B0PwAZVR.d.ts → guardrail.d-CXDYRgZ3.d.ts} +200 -34
  66. package/dist/types-chunks/{history-retrieval.d-B__aEN62.d.ts → history-retrieval.d-DtCy7x64.d.ts} +1 -1
  67. package/dist/types-chunks/{integration-config.d-ojG4swOP.d.ts → integration-config.d-BNowXE8k.d.ts} +23 -8
  68. package/dist/types-chunks/{public-api.d--fF88JrC.d.ts → public-api.d-B3AohsxN.d.ts} +36 -7
  69. package/dist/types-chunks/{commands.d-BccESAMV.d.ts → repl.d-Ie_ZXb_U.d.ts} +89 -78
  70. package/dist/types-chunks/{side-query.d-5JvXhuOZ.d.ts → resolver.d-iAQ9ocLB.d.ts} +3 -66
  71. package/dist/types-chunks/{run-manager.d-B47hIqnI.d.ts → run-manager.d-D1twIhF9.d.ts} +1 -1
  72. package/dist/types-chunks/{sdk-session-CLWf8Adb.d.ts → sdk-session-DB9KksIx.d.ts} +2 -2
  73. package/dist/types-chunks/side-query.d-DTuLPcC5.d.ts +77 -0
  74. package/dist/types-chunks/{types-LanCEDj8.d.ts → types-D3g6XUQr.d.ts} +41 -2
  75. package/dist/types-chunks/{types.d-RdWRfUEs.d.ts → types.d-BA-Jwpfs.d.ts} +459 -7
  76. package/dist/types-chunks/{types.d-CODuyyqy.d.ts → types.d-BH0ZkTGf.d.ts} +1 -1
  77. package/dist/types-chunks/{types.d-DCQVBqVn.d.ts → types.d-BbtGlKZu.d.ts} +25 -3
  78. package/dist/types-chunks/{types.d-DCsKM8aT.d.ts → types.d-DVDTIfB_.d.ts} +2 -2
  79. package/dist/types-chunks/{utils.d-CDduqbFw.d.ts → utils.d-CVp6bFl9.d.ts} +22 -6
  80. package/docs/SDK_EMBEDDER_GUIDE.md +399 -55
  81. package/package.json +8 -1
  82. package/dist/chunks/agent-NGSWFE73.js +0 -2
  83. package/dist/chunks/argument-completer-WGGZPEEO.js +0 -2
  84. package/dist/chunks/chunk-27QLRH3D.js +0 -5
  85. package/dist/chunks/chunk-2MQPVY6P.js +0 -770
  86. package/dist/chunks/chunk-6WAPVAGQ.js +0 -74
  87. package/dist/chunks/chunk-AOENDSVN.js +0 -448
  88. package/dist/chunks/chunk-HV2GMZUZ.js +0 -343
  89. package/dist/chunks/chunk-JS2BHGJP.js +0 -158
  90. package/dist/chunks/chunk-ON2WG2LG.js +0 -622
  91. package/dist/chunks/chunk-RUGAAHTF.js +0 -321
  92. package/dist/chunks/chunk-TGCG7U2W.js +0 -37
  93. package/dist/chunks/compaction-config-BE7VYWH6.js +0 -2
  94. package/dist/chunks/dist-ZZBNVTKU.js +0 -2
  95. package/dist/chunks/host-QAKQVC4A.js +0 -2
  96. package/dist/chunks/run-manager-N4UFWA2D.js +0 -2
  97. package/dist/chunks/utils-AUHCI4D5.js +0 -2
  98. package/dist/types-chunks/center-types.d-BBT122uJ.d.ts +0 -91
package/CHANGELOG.md CHANGED
@@ -6,12 +6,184 @@ All notable changes to this project will be documented in this file.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.7.78] - 2026-07-29
10
+
11
+ ### Added
12
+
13
+ - **Evidence-Gated Background Skill Learning (FEATURE_263).** Completed the
14
+ Memory-first learning loop with durable non-blocking review, immutable
15
+ project-scoped learned Skill revisions, canonical record/fingerprint-gated
16
+ discovery, exact-use outcome attribution, bounded three-use canaries,
17
+ independently verified project activation, and full `/learn`/Runtime Learning
18
+ Center controls. Protected/formal Skills, global promotion, and Extension
19
+ authoring remain explicit user actions.
20
+ - **Complete First-Run Split Configuration (FEATURE_276).** `kodax setup`,
21
+ first-run onboarding, and `--custom` now create and validate the core, MCP,
22
+ Extensions, and A2A active files plus annotated templates without
23
+ overwriting existing configuration or collecting secrets. Legacy integration
24
+ declarations are preserved and all cooperating writers share the same
25
+ lock/revision boundary.
26
+ - **Standalone Sandbox SDK.** Added the `@kodax-ai/kodax/sandbox` subpath with
27
+ typed capability, doctor, setup/activation guidance, and explicit
28
+ host-owned contained command execution. The generic API reports structured
29
+ unavailability and never silently executes without containment.
30
+ - Added read-only `/sandbox` diagnostics and optional `tool.sandbox` Runtime
31
+ events. Ordinary startup, history, and command cards remain quiet.
32
+
33
+ ### Changed
34
+
35
+ - **Intent-Aligned Auto[LLM] Permission and ASRT Execution (FEATURE_277).**
36
+ Precisely modeled ordinary reads and workspace/system-temp mutations bypass
37
+ classifier latency independently of sandbox readiness. Other actions are
38
+ reviewed against bounded user intent and exact side effects; approval timeout
39
+ cancels only the current operation. ASRT is optional execution containment,
40
+ not permission authority, and admitted commands reuse a workspace-scoped
41
+ session instead of paying initialization/reset per command.
42
+ - The published bundle now exposes 12 SDK subpaths (13 entries including the
43
+ root), adding `/sandbox`; README, README_CN, the SDK embedder guide, and
44
+ `kodax_manual` describe the same surface.
45
+
46
+ ### Fixed
47
+
48
+ - The v0.7.78 semantic release gates now use frozen, resumable current-policy
49
+ runners instead of absent or historical fixtures. F263 revision
50
+ `f263-v0.7.78.4` freezes production learning-review and downstream action
51
+ bytes; F277 revision `f277-v0.7.78.4` freezes the intent-aligned permission
52
+ prompt and exact action evidence. Both default to zero provider calls, require
53
+ explicit owner authorization plus a feature-specific generation flag, keep
54
+ raw/blind-review evidence outside the repository, and fail closed on
55
+ case/prompt/scorer drift.
56
+ - The first F263 paid validity pilot (`f263-v0.7.78.2`) correctly stopped after
57
+ 4 calls: three outputs were rejected by the production normalizer and neither
58
+ positive sample produced a project canary. The production report contract now
59
+ requires `memoryPlan` and `capabilityDecision` as top-level siblings and
60
+ states the governed `requiresApproval=true` invariant without weakening the
61
+ strict normalizer or changing Skill admission policy.
62
+ - The subsequent F263 `.3` safety panel found no credible high-severity harm:
63
+ no negative case normalized to a project canary and all nine positive raw
64
+ decisions selected `project_canary`. It also exposed one systematic utility
65
+ mismatch: six human-readable Skill names failed the production slug
66
+ invariant, leaving only 3/9 normalized positive canaries. The production
67
+ prompt/tool schema now state the existing lowercase hyphenated-slug and
68
+ 64-character constraints. Strict validation, evidence thresholds, scope,
69
+ canary admission, and promotion policy remain unchanged; downstream expansion
70
+ stopped and fresh `.4` revisions bind the corrected bytes to one exact
71
+ candidate.
72
+ - Runtime Actor trees now persist one exclusive owner per Session. A second live
73
+ Runtime can no longer recover another Runtime's active child turns; stale
74
+ controllers self-fence on CAS conflict, physically abort local executors,
75
+ refresh durable state and mailbox events, and expose actionable
76
+ `actor_owner_conflict` diagnostics. Runtime close and Session deletion release
77
+ ownership safely; archive/delete retain the owner through the filesystem
78
+ operation, while deletion quiesces executors before removing the file and
79
+ then performs a no-write local dispose. A per-Session gate closes Run/Agent
80
+ admission races with archive/delete, and SA root Runs now claim the same
81
+ owner fence. A Runtime-scoped loopback identity challenge now distinguishes
82
+ a live owner from an unrelated process that reused its PID: refused or
83
+ completed mismatched challenges prove stale, while timeouts and unknown
84
+ failures stay fail-closed. Legacy snapshots without an identity challenge
85
+ remain fail-closed because their live owner cannot be proven. Archived Sessions
86
+ reject Run/Agent execution and in-place mutation until unarchived, and
87
+ archived Actor CAS writes stay in the exact archived file instead of
88
+ recreating an active duplicate. Failed deletion retains its authoritative
89
+ snapshot and owner for retry, paired archive moves roll back on sidecar
90
+ failure, and external task aborts cover queued, preflight, pending, and
91
+ ambiguous start admission with a prompt `AbortSignal`, A2A request-level
92
+ propagation, retained per-Agent start ordering, coalesced reference-aware
93
+ cancellation, and bounded Actor-turn convergence.
94
+ Actor recovery preflight is byte-for-byte read-only, and Session recovery re-reads under the
95
+ cross-process lock without bypassing Actor ownership or moving archived data.
96
+ Stale full Session saves cannot replace the Actor CAS sub-snapshot, and all
97
+ full rewrites/island maintenance retain the resolved archived path.
98
+ Failed initialization releases a newly claimed fence and supports
99
+ same-instance/double-failure cleanup. Raw maintenance and retention reject
100
+ owned/non-terminal trees, complete Session file sets delete through
101
+ rollback-safe staging, and cross-process append revalidates and merges stale
102
+ watermarks plus same-length identity rewrites on the exact resolved path.
103
+ Runtime client, Worker, hosted-daemon, host, lease, and executor-plane close
104
+ attempts are shared and retryable after partial failure or timeout.
105
+ - SDK daemon auto-start accepts an opt-in `daemonOrphanExitMs` lifecycle
106
+ contract. A newly ready daemon arms bootstrap grace even if its launching
107
+ client crashes before initialize; attach cancels the timer, and loss of the
108
+ final logical client starts a fresh full grace period. Other clients cancel
109
+ it, governed active work defers shutdown until terminal/idle state, and only
110
+ then does the daemon release its endpoint, state, and owner lock. Ordinary
111
+ CLI persistent daemons remain unchanged. The dedicated
112
+ `daemonOrphanExit:1` capability reports that the current host actually has
113
+ the policy enabled, and both Runtime facades safely replace an idle
114
+ persistent owner before relying on it.
115
+ - Invalid optional MCP, A2A, or Extension configuration no longer aborts
116
+ daemon cold start. Each domain fails independently to a visible safe-empty
117
+ state, retains last-known-good data on later invalid edits, watches legacy
118
+ `config.json` fallbacks, and hot-recovers without mutating user files.
119
+ Detached bootstrap output is retained in continuously bounded logs, and the
120
+ daemon advertises the versioned `integrationConfigResilience` contract.
121
+ - Auto[LLM] now retries classifier timeout/provider/contract failures once,
122
+ enforces its deadline even when a provider ignores cancellation, exposes
123
+ bounded prompt-size and TTFT phase diagnostics, and then degrades at the
124
+ Accept-edits boundary without switching to Auto[rules]. Classifier
125
+ concerns request user confirmation instead of hard-blocking. Exact,
126
+ explicitly requested workspace copy/move/rename/delete/write/create shell
127
+ calls can proceed without an LLM round trip independently of sandbox
128
+ readiness. ASRT adds optional execution containment; unavailable or
129
+ pre-launch-failed local containment falls back to the ordinary path without
130
+ another classifier/approval. Admitted commands in one workspace reuse a
131
+ long-lived ASRT session, so session-level initialization/reset is not paid
132
+ on every command. Normal history stays quiet, while `/sandbox` provides
133
+ explicit diagnostics and SDK hosts can opt into structured events.
134
+ - Runtime Auto capability negotiation now requires
135
+ `runtimeAutoModeGuardrail:4` for daemon auto-start and consistently reports
136
+ `fallbackPersistsEngine:false` from embedded, Worker, and daemon hosts. An
137
+ idle v3 daemon is replaced before a v0.7.78 client relies on the
138
+ intent-preserving, non-Rules fallback contract.
139
+ - The built-in A2A listener now rejects explicit Fetch-blocked ports and
140
+ retries ephemeral allocation when the operating system selects one, so a
141
+ successfully returned loopback URL is usable by Fetch-compatible clients.
142
+ - `/learn promote` now has dedicated help, strict `--scope user` validation,
143
+ name/slug/capability-ID disambiguation, command completion, v2 learned-record
144
+ transport across inline/Worker/daemon, reviewed `ready` or `active_learned`
145
+ admission, and atomic non-overwriting publication with symlink/junction
146
+ containment and idempotent repeat behavior.
147
+ - Learned Skill canaries now remain in `testing` until all three exact-revision
148
+ outcomes settle, activate only with at least one independently verified
149
+ success, and revalidate revision/fingerprint inside the second locked
150
+ invocation mutation. A stale artifact identity cannot consume a canary slot
151
+ or be attributed to the current revision.
152
+ - Root AMA runs now execute the same governed MemorySession lifecycle as the
153
+ standard Agent path. The new root-only `memory_intent` signal binds an exact
154
+ current-user quote, distinguishes captured/queued/applied states, retains
155
+ durable review evidence, serializes review drains, and prevents generated
156
+ resume text or child Agents from authorizing Memory writes. Explicit
157
+ host-bound intent survives a later root cancellation without preserving
158
+ observations or lessons from the cancelled task; foreground completion still
159
+ stops at durable review enqueue rather than waiting for semantic review.
160
+ - Workspace ASRT shell containment now denies reads from sensitive home
161
+ credential paths and the complete resolved agent home. Home-local executable
162
+ search paths cannot carve access back into a denied subtree; ordinary
163
+ external reads, workspace/temp writes, bootstrap execution, and the existing
164
+ network policy remain unchanged.
165
+ - Edit mode no longer sends already-allowed static Skill loading to the client
166
+ permission broker, and Plan mode can load static instructions without
167
+ authorizing their later side effects. Dynamic Skill commands are blocked
168
+ live in Plan and otherwise require an explicit host-controlled executor;
169
+ protected writes and non-read-only shell actions keep their normal gates.
170
+ - Managed Workflow Actor waits no longer turn the Actor API's internal
171
+ 30-second polling window into a misleading `undefinedms` failure when the
172
+ workflow has no explicit timeout. Explicit deadlines remain authoritative,
173
+ and terminal Actor output closes event-delivery races.
174
+ - The resume Session picker now renders stored timestamps in the host's local
175
+ timezone instead of presenting UTC values without a timezone marker.
176
+ - The Windows ordinary-query regression now gives temporary recursive removal
177
+ a bounded native retry window for the intentionally non-blocking governed
178
+ Memory review queue. The release gate no longer fails with transient
179
+ `ENOTEMPTY`, without making background review block foreground completion.
180
+
9
181
  ## [0.7.77] - 2026-07-27
10
182
 
11
- > Release-ready candidate prepared at `@kodax-ai/kodax@0.7.77`. The Git tag,
12
- > GitHub Release, and npm publication are not created yet. Frozen F274/F275
13
- > paid evaluation completed with a joint owner `SHIP` decision; no unmeasured
14
- > task-effect, token, or latency improvement is claimed.
183
+ > Released as Git tag `v0.7.77`, GitHub Release, and
184
+ > `@kodax-ai/kodax@0.7.77` on npm. Frozen F274/F275 paid evaluation completed
185
+ > with a joint owner `SHIP` decision; no unmeasured task-effect, token, or
186
+ > latency improvement is claimed.
15
187
 
16
188
  ### Added
17
189
 
package/README.md CHANGED
@@ -41,21 +41,30 @@
41
41
  ```bash
42
42
  npm i -g @kodax-ai/kodax
43
43
 
44
- # Pick any one you have an API key for:
45
- export ZHIPU_API_KEY=... # or ANTHROPIC_API_KEY / OPENAI_API_KEY / KIMI_API_KEY /
46
- # MINIMAX_API_KEY / MIMO_API_KEY / ARK_API_KEY / QWEN_API_KEY /
47
- # QWEN_TOKEN_API_KEY /
48
- # DEEPSEEK_API_KEY / GEMINI_API_KEY
44
+ # Pick any one you have an API key for (`kodax setup --help` lists all):
45
+ export ZHIPU_API_KEY=... # ANTHROPIC_API_KEY / OPENAI_API_KEY / DEEPSEEK_API_KEY /
46
+ # KIMI_API_KEY / KIMI_CODE_API_KEY / QWEN_API_KEY /
47
+ # QWEN_TOKEN_API_KEY / ZHIPU_CODING_API_KEY /
48
+ # ZAI_CODING_API_KEY / MINIMAX_CODING_API_KEY /
49
+ # MIMO_API_KEY / MIMO_CODING_API_KEY / ARK_CODING_API_KEY
49
50
 
50
51
  kodax
51
52
  ```
52
53
 
53
- That's it. You're in the REPL — ask anything in natural language. If this is a
54
- new machine with no provider selection or supported API-key environment
55
- variable, the bare `kodax` launch opens a metadata-only setup flow first. It
56
- never asks for the key itself; after choosing a provider/model, set the named
57
- environment variable, restart the terminal, and run `kodax` again. Use
58
- `kodax setup` to rerun that flow explicitly.
54
+ That's it. You're in the REPL — ask anything in natural language. On a new
55
+ machine with no selected provider, bare interactive `kodax` opens setup first,
56
+ even if a supported credential environment variable already exists. Setup
57
+ checks core, MCP, Extensions, and A2A active files plus all annotated templates
58
+ without overwriting existing files. It never asks for the key itself; after
59
+ choosing a provider/model, set the named environment variable, restart the
60
+ terminal, and run `kodax` again. Use `kodax setup` to rerun the flow,
61
+ `kodax setup --custom` for a guided custom provider, and `kodax setup --help`
62
+ (or REPL `/setup --help`) for paths, provider variables, commands, and
63
+ shortcuts. Interactive setup also checks the optional ASRT sandbox once:
64
+ Windows may show a one-time UAC prompt; macOS/Linux report any required
65
+ Seatbelt/bubblewrap dependencies. Declining or missing a dependency does not
66
+ break ordinary permission handling, and normal startup will not keep reminding
67
+ you.
59
68
 
60
69
  > **No-Node target machines:** download a Bun-compiled single binary for Windows / macOS / Linux × x64 + arm64 from the [GitHub Releases](https://github.com/icetomoyo/KodaX/releases) page. See [docs/release.md](docs/release.md) for the build pipeline.
61
70
 
@@ -147,23 +156,69 @@ npm link
147
156
 
148
157
  KodaX reads API keys from environment variables. For built-in providers, the fastest path is:
149
158
 
150
- ```bash
151
- # Interactive metadata-only provider/model setup (does not collect a key)
152
- kodax setup
153
- ```
154
-
155
- The command tells you the exact environment-variable name to set and exits so
156
- you can restart the terminal. You can also configure it directly:
159
+ ```bash
160
+ # Interactive metadata-only provider/model setup (does not collect a key)
161
+ kodax setup
162
+
163
+ # Guided custom OpenAI/Anthropic-compatible provider
164
+ kodax setup --custom
165
+
166
+ # Complete guide; does not change files
167
+ kodax setup --help
168
+ ```
169
+
170
+ Setup checks these active files and matching `*.example.jsonc` references:
171
+
172
+ - `~/.kodax/config.json` and `~/.kodax/config.example.jsonc`
173
+ - `~/.kodax/integrations/mcp.json`
174
+ - `~/.kodax/integrations/extensions.json`
175
+ - `~/.kodax/integrations/a2a.json`
176
+
177
+ The core active file remains strict JSON. The first line of the annotated
178
+ `config.example.jsonc` points to all split files and documents every supported
179
+ core setting. Setup preserves existing files and stages readable legacy
180
+ `config.json#mcpServers` / `config.json#extensions` before creating empty
181
+ authoritative split files. It tells you the exact environment-variable name to
182
+ set and exits so you can restart the terminal. Existing active files are
183
+ validated first; an invalid file is reported without creating or overwriting
184
+ configuration. You can also configure it directly:
157
185
 
158
186
  ```bash
159
187
  # macOS / Linux
160
188
  export ZHIPU_API_KEY=your_api_key
161
189
 
162
190
  # PowerShell
163
- $env:ZHIPU_API_KEY="your_api_key"
164
- ```
165
-
166
- For Qwen Token Plan, select `qwen-token-plan` and use its separate credential;
191
+ $env:ZHIPU_API_KEY="your_api_key"
192
+ ```
193
+
194
+ ### 2.1 Activate the optional sandbox
195
+
196
+ `kodax setup` and first-run setup check sandbox readiness. You can inspect or
197
+ activate it explicitly:
198
+
199
+ ```bash
200
+ kodax sandbox doctor
201
+ kodax sandbox setup
202
+ ```
203
+
204
+ - Windows uses a restricted sandbox account and network policy. A normal
205
+ terminal is sufficient; approve the one-time UAC prompt.
206
+ - macOS uses Seatbelt/`sandbox-exec` and requires ripgrep
207
+ (`brew install ripgrep`).
208
+ - Linux uses bubblewrap and requires `bubblewrap`, `socat`, and `ripgrep`
209
+ (install them with your distro's `apt`, `dnf`, or `pacman`).
210
+
211
+ KodaX never runs `sudo` or a package manager automatically. If the sandbox is
212
+ not active, deterministic safe operations and Auto[LLM] decisions keep the
213
+ same permission behavior; only OS-level containment is absent. Ordinary runs
214
+ do not repeatedly prompt for setup. In the REPL, `/sandbox` refreshes readiness
215
+ and diagnostics without activating the backend or requesting elevation.
216
+ Per-command sandbox routing remains internal and is not shown in normal command
217
+ history. SDK embedders can use the same capability independently through
218
+ `@kodax-ai/kodax/sandbox`; see the
219
+ [SDK sandbox guide](docs/SDK_EMBEDDER_GUIDE.md#30-standalone-sandbox-sdk-v0778).
220
+
221
+ For Qwen Token Plan, select `qwen-token-plan` and use its separate credential;
167
222
  `QWEN_API_KEY` does not authenticate this route:
168
223
 
169
224
  ```bash
@@ -412,7 +467,7 @@ for K2.7 Code, alongside `kimi-for-coding-highspeed` and the 1M `k3` tier. K3
412
467
  supports `low` / `high` / `max` reasoning with `high` as default; the 256K
413
468
  route supports image input but not video input.
414
469
 
415
- **v0.7.77 release-ready candidate:** AMA now chooses and composes six named
470
+ **v0.7.77 release:** AMA now chooses and composes six named
416
471
  problem-solving patterns through the existing Actor control plane instead of
417
472
  using a fixed topology or hidden Workflow. Optional strategy metadata becomes
418
473
  a bounded, fact-only `PatternTrace`; the existing Sidecar remains the only
@@ -430,7 +485,42 @@ joint `SHIP` decision for the deterministic contracts. Semantic memory
430
485
  selection remains experimental and host opt-in; no task-quality, token, or
431
486
  latency improvement is claimed.
432
487
 
433
- The same candidate adds an opt-in, host-configurable Shell Execution Contract.
488
+ **v0.7.78 evidence-gated learning, setup, and permission/sandbox release:**
489
+ Background learning is Memory-first. Only repeated independently verified
490
+ evidence, or an explicit preserve-as-Skill request with verified terminal
491
+ evidence, can admit a low-risk declarative Skill to a bounded immutable
492
+ project canary; three exact-revision uses and independently verified success
493
+ are required before automatic project trust. Every revision remains visible
494
+ and reversible in `/learn`. Protected/formal Skills, global promotion, and
495
+ Extension authoring remain explicit user actions.
496
+
497
+ First-run setup now creates and validates the split core/MCP/Extensions/A2A
498
+ files and annotated templates without overwriting existing configuration or
499
+ collecting secrets. Auto[LLM] admits precisely modeled ordinary reads and
500
+ workspace/temp mutations before classifier latency, retries classifier
501
+ infrastructure failure once, then falls back at the Accept-edits boundary
502
+ without switching to rules. ASRT is optional execution containment rather
503
+ than permission authority; `/sandbox` is the explicit diagnostic surface, and
504
+ SDK hosts can use the standalone `/sandbox` subpath without a silent
505
+ unsandboxed fallback. KodaX's workspace containment denies reads from common
506
+ home credential paths and the complete resolved agent home without turning
507
+ ordinary external reads into an allowlist. See the
508
+ [v0.7.78 design](docs/features/v0.7.78.md), the
509
+ [release checklist](docs/release.md#v0778-release-verification), and
510
+ [SDK guide sections 29–30](docs/SDK_EMBEDDER_GUIDE.md#29-evidence-gated-background-skill-learning-feature_263-v0778).
511
+
512
+ The release closure also preserves intent across adjacent surfaces: static
513
+ Skill instructions load in Edit/Plan without granting later side effects,
514
+ dynamic Skill commands require an explicit host-controlled executor, root AMA
515
+ uses the governed `memory_intent` lifecycle (including explicit intent captured
516
+ before a later cancellation), Workflow Actor waits remain
517
+ unbounded unless the workflow sets a deadline, and Runtime Auto capability v4
518
+ advertises `fallbackPersistsEngine:false` across embedded, Worker, and daemon
519
+ hosts. Actor ownership additionally uses Runtime identity rather than PID alone,
520
+ so PID reuse cannot pin a crashed owner. The resume Session picker also renders
521
+ timestamps in the host's local timezone.
522
+
523
+ The v0.7.77 release also adds an opt-in, host-configurable Shell Execution Contract.
434
524
  Runtime Session settings or an individual Run can select `pwsh`, Windows
435
525
  PowerShell, `cmd`, `bash`, `zsh`, or an explicit Git Bash executable; KodaX
436
526
  resolves the shell environment in the effective project cwd and then executes
@@ -487,12 +577,14 @@ The Space/IDE shared-daemon contract is documented in
487
577
  [SDK Embedder Guide section 23](docs/SDK_EMBEDDER_GUIDE.md#23-shared-coder-daemon-for-space-and-ide-hosts-feature_269-v0769).
488
578
 
489
579
  **v0.7.72–v0.7.73 Runtime permission contract:** Auto Mode is owned by the Runtime session,
490
- not by a UI hook. It reuses its LLM/rules guardrail across turns, classifies
491
- before the shared permission bridge, and persists an automatic fallback to
492
- rules. The same session settings can select a classifier model and bounded
493
- timeout; `auto` defaults to LLM classification and fails with a recoverable
494
- configuration error when no effective classifier model exists, rather than
495
- silently falling back. Runtime permission prompts now offer opaque, exact
580
+ not by a UI hook. It reuses its LLM/rules guardrail across turns, classifies
581
+ before the shared permission bridge, and persists explicit engine selection.
582
+ The same session settings can select a classifier model and bounded
583
+ timeout; `auto` defaults to LLM classification and fails with a recoverable
584
+ configuration error when no effective classifier model exists, rather than
585
+ silently falling back. In v0.7.78, classifier failures retry once and then use
586
+ the Accept-edits safety boundary; they never change the engine to rules.
587
+ Runtime permission prompts offer opaque, exact
496
588
  allow-once/session/persistent grant suggestions; persistent grants are
497
589
  daemon-owned and revisioned. Host plan exit is exposed only when the host
498
590
  supplies an approval callback. See the [Runtime Auto Mode integration guide](docs/SDK_EMBEDDER_GUIDE.md#24-runtime-owned-auto-mode-and-plan-approval-bridges-v0772v0773).
@@ -510,7 +602,7 @@ kodax --repo-intelligence full --repo-intelligence-trace
510
602
 
511
603
  ## Architecture
512
604
 
513
- KodaX uses a **monorepo architecture** with npm workspaces. Source layout currently has 4 workspace packages; published as a single bundled npm package `@kodax-ai/kodax` with 11 SDK subpath exports (`/agent`, `/llm`, `/coding`, `/media`, `/repl`, `/skills`, `/mcp`, `/session`, `/runtime`, `/a2a`, `/experimental-memory`; ADR-024 + ADR-032 + ADR-038, with ADR-036 consolidation):
605
+ KodaX uses a **monorepo architecture** with npm workspaces. Source layout currently has 4 workspace packages; published as a single bundled npm package `@kodax-ai/kodax` with 12 SDK subpath exports (`/agent`, `/llm`, `/coding`, `/media`, `/repl`, `/skills`, `/mcp`, `/session`, `/runtime`, `/sandbox`, `/a2a`, `/experimental-memory`; ADR-024 + ADR-032 + ADR-038, with ADR-036 consolidation):
514
606
 
515
607
  ```
516
608
  KodaX/
@@ -536,9 +628,9 @@ KodaX/
536
628
 
537
629
  ├── src/ # CLI entry + SDK subpath entries
538
630
  │ ├── kodax_cli.ts # Main CLI entry point (bin: `kodax`)
539
- │ └── sdk-*.ts # SDK subpath re-exports → @kodax-ai/kodax/{agent,llm,coding,media,repl,skills,mcp,session,runtime,a2a,experimental-memory}
540
-
541
- └── package.json # Root workspace config; release.mjs rewrites name + injects subpath exports
631
+ │ └── sdk-*.ts # SDK subpath re-exports → @kodax-ai/kodax/{agent,llm,coding,media,repl,skills,mcp,session,runtime,sandbox,a2a,experimental-memory}
632
+
633
+ └── package.json # Publish-shaped exports; release.mjs only toggles private during pack/publish
542
634
  ```
543
635
 
544
636
  ### Package Dependencies
@@ -585,9 +677,9 @@ Source-side workspace package names (`@kodax-ai/*`). npm consumers install the s
585
677
  KodaX has two layers that consumers should understand separately:
586
678
 
587
679
  - **Source-side**: 4 workspace packages above (what developers see when reading the repo).
588
- - **npm-published**: a single bundled package `@kodax-ai/kodax` with 11 SDK subpaths (what SDK consumers `import` from). The subpaths are split into two roles:
680
+ - **npm-published**: a single bundled package `@kodax-ai/kodax` with 12 SDK subpaths (what SDK consumers `import` from). The subpaths are split into two roles:
589
681
  - **Full-package subpaths** (`/agent`, `/llm`, `/coding`, `/repl`) — each one maps 1:1 to a source workspace and exposes its complete public API.
590
- - **Integration and narrow subpaths** (`/media`, `/skills`, `/mcp`, `/session`, `/runtime`, `/a2a`, `/experimental-memory`) — focused host surfaces. `/a2a` composes the neutral F258 plane with the Runtime facade; it does not add A2A wire types to `/agent`.
682
+ - **Integration and narrow subpaths** (`/media`, `/skills`, `/mcp`, `/session`, `/runtime`, `/sandbox`, `/a2a`, `/experimental-memory`) — focused host surfaces. `/a2a` composes the neutral F258 plane with the Runtime facade; it does not add A2A wire types to `/agent`.
591
683
 
592
684
  | Source package | npm subpath | Type | What you get | Example consumer |
593
685
  |---|---|---|---|---|
@@ -599,9 +691,10 @@ KodaX has two layers that consumers should understand separately:
599
691
  | `packages/agent` | `@kodax-ai/kodax/experimental-memory` | **Experimental subset** | Thin F228-backed `MemoryAgent` / `MemorySession` contracts for scoped recall, deliberate query, observations, and outcomes | SDK hosts explicitly evaluating FEATURE_260 |
600
692
  | `packages/coding` | `@kodax-ai/kodax/coding` | Full package | Coding agent + 50+ tools + repo-intelligence (505 exports) | Build a Claude Code-shape product |
601
693
  | `packages/repl` | `@kodax-ai/kodax/repl` | Full package | Ink TUI + permission modes + commands (217 exports) | Terminal-UI consumers |
602
- | `packages/repl` | `@kodax-ai/kodax/session` | **Narrow subset** | Session management only — `listSessions` / `loadFullTranscript` / `appendClientNotice` / `forkSession` / `compactSession` / `watchSessions` / ... (17 exports) | IDE plugins and desktop hosts reading session history |
603
- | `src` | `@kodax-ai/kodax/runtime` | Host API | Embedded/Worker/daemon runtime facade, sessions/runs/events/permissions/catalog/MCP/artifacts/diagnostics/external agents, daemon protocol schema (10 exports) | SDK hosts, Space/IDE clients, daemon clients |
604
- | `src` | `@kodax-ai/kodax/a2a` | Integration edge | A2A 1.0 Agent Card discovery, JSON-RPC/SSE F258 executor, safe fetch policy, and authenticated Runtime-backed Agent server | Agent orchestrators and KodaX hosts |
694
+ | `packages/repl` | `@kodax-ai/kodax/session` | **Narrow subset** | Session management only — `listSessions` / `loadFullTranscript` / `appendClientNotice` / `forkSession` / `compactSession` / `watchSessions` / ... (17 exports) | IDE plugins and desktop hosts reading session history |
695
+ | `src` | `@kodax-ai/kodax/runtime` | Host API | Embedded/Worker/daemon runtime facade, sessions/runs/events/permissions/catalog/MCP/artifacts/diagnostics/external agents, daemon protocol schema (10 exports) | SDK hosts, Space/IDE clients, daemon clients |
696
+ | `src` | `@kodax-ai/kodax/sandbox` | Host API | Explicit ASRT capability/doctor/setup and host-owned contained command execution; unavailability never means silent ordinary execution | SDK hosts that need standalone process containment |
697
+ | `src` | `@kodax-ai/kodax/a2a` | Integration edge | A2A 1.0 Agent Card discovery, JSON-RPC/SSE F258 executor, safe fetch policy, and authenticated Runtime-backed Agent server | Agent orchestrators and KodaX hosts |
605
698
 
606
699
  **Rule of thumb**: if you need Runner / Agent / fan-out, import from `/agent`. If you only need skills or mcp APIs, import from `/skills` or `/mcp` to get a smaller bundle. The narrow subsets are subsets of the full packages — they do **not** expose extra symbols.
607
700
 
@@ -633,7 +726,7 @@ KodaX has two layers that consumers should understand separately:
633
726
 
634
727
  **Experimental Memory Agent SDK (FEATURE_260, v0.7.68)**: `/experimental-memory` exposes the thin agent-layer `MemoryAgent` and scoped `MemorySession` lifecycle over the existing governed F228 plane. Passive recall is zero-wait; `query()` is read-only and deliberate; durable changes still require the proposal/preview/fingerprint/apply path. The Action LLM remains the final decision maker, recalled content stays low-authority, and safety/scope gates remain deterministic. See the [direct session and boundary guide](docs/SDK_EMBEDDER_GUIDE.md#21-experimental-governed-memory--experimental-memory-feature_260-v0768).
635
728
 
636
- **Bidirectional A2A 1.0 (FEATURE_267, v0.7.69)**: `/a2a` discovers allowed Agent Cards and installs a JSON-RPC/SSE executor through the existing F258 plane. Configured outbound Agents are also registered automatically as `external:<name>` in embedded CLI and user-daemon Runtimes, so the main Agent can orchestrate them without host code. One `a2a.json` may hold many outbound registrations and at most one inbound server, which publishes either the Runtime default or one validated `~/.kodax/agents/*.md` Agent behind an authenticated Runtime facade. The built-in listener is loopback-only; public deployment uses `handle()` behind host-owned TLS and authorization. A2A 0.3, gRPC, HTTP+JSON, push notifications, and automatic public exposure are not advertised. See the [client/server recipes and security boundaries](docs/SDK_EMBEDDER_GUIDE.md#22-bidirectional-a2a-10--a2a-feature_267-v0769).
729
+ **Bidirectional A2A 1.0 (FEATURE_267, v0.7.69)**: `/a2a` discovers allowed Agent Cards and installs a JSON-RPC/SSE executor through the existing F258 plane. Configured outbound Agents are also registered automatically as `external:<name>` in embedded CLI and user-daemon Runtimes, so the main Agent can orchestrate them without host code. One `a2a.json` may hold many outbound registrations and at most one inbound server, which publishes either the Runtime default or one validated `~/.kodax/agents/*.md` Agent behind an authenticated Runtime facade. The built-in listener is loopback-only and will not return a port blocked by Fetch-compatible clients; public deployment uses `handle()` behind host-owned TLS and authorization. A2A 0.3, gRPC, HTTP+JSON, push notifications, and automatic public exposure are not advertised. See the [client/server recipes and security boundaries](docs/SDK_EMBEDDER_GUIDE.md#22-bidirectional-a2a-10--a2a-feature_267-v0769).
637
730
 
638
731
  **A2A interoperability and authentication hardening** keeps a discovered
639
732
  interface on the trusted Agent Card origin and sends credentials only when one
@@ -692,8 +785,9 @@ kodax a2a expose # or: kodax a2a expose document-agent
692
785
  kodax a2a serve # loopback http://127.0.0.1:8765
693
786
  ```
694
787
 
695
- MCP, A2A, and Extension declarations live in one user file per domain under
696
- `~/.kodax/integrations/`. Use `kodax config template <mcp|a2a|extensions>`,
788
+ MCP, A2A, and Extension declarations live in one user file per domain under
789
+ `~/.kodax/integrations/`. Use `kodax config paths`,
790
+ `kodax config template <core|mcp|a2a|extensions>`,
697
791
  `kodax integrations migrate --apply`, and the `kodax mcp`, `kodax a2a`, or
698
792
  `kodax extensions` commands to manage them. Migration imports only legacy
699
793
  `config.json#mcpServers` and `config.json#extensions`; A2A has no legacy source.
@@ -844,12 +938,14 @@ import { createImageArtifactFromPath } from '@kodax-ai/kodax/media'; // input ar
844
938
  import { SkillRegistry } from '@kodax-ai/kodax/skills'; // zero-dep skill loader
845
939
  import { loadConfig } from '@kodax-ai/kodax/repl'; // REPL config / session helpers
846
940
  import { createMcpManager } from '@kodax-ai/kodax/mcp'; // MCP popout manager (v0.7.42)
847
- import { listSessions } from '@kodax-ai/kodax/session'; // session history helpers
848
- import { createKodaXRuntime } from '@kodax-ai/kodax/runtime'; // embedded/daemon runtime API
849
- import { createKodaXA2AServer } from '@kodax-ai/kodax/a2a'; // A2A 1.0 client/server edge
850
- ```
851
-
852
- All 12 SDK entries (root + 11 subpaths) share internal code via ESM chunk splitting — importing from `/agent` does not pull in `/repl`'s Ink + React surface.
941
+ import { listSessions } from '@kodax-ai/kodax/session'; // session history helpers
942
+ import { createKodaXRuntime } from '@kodax-ai/kodax/runtime'; // embedded/daemon runtime API
943
+ import { runKodaXSandboxed } from '@kodax-ai/kodax/sandbox'; // standalone ASRT containment
944
+ import { createKodaXA2AServer } from '@kodax-ai/kodax/a2a'; // A2A 1.0 client/server edge
945
+ import { createMemoryAgent } from '@kodax-ai/kodax/experimental-memory'; // opt-in memory SDK
946
+ ```
947
+
948
+ All 13 SDK entries (root + 12 subpaths) share internal code via ESM chunk splitting — importing from `/agent` does not pull in `/repl`'s Ink + React surface.
853
949
 
854
950
  For the complete host-facing contract — including embedded/Worker/daemon ownership,
855
951
  external-agent registration and task control, session cursor pagination, workflow
@@ -1000,16 +1096,19 @@ KodaX provides 3 permission modes for fine-grained control:
1000
1096
  **Features:**
1001
1097
  - In `accept-edits` mode, choosing "always" can persist safe Bash allow-patterns
1002
1098
  - Plan mode includes system prompt context for LLM awareness
1003
- - Permanent protection zones: `.kodax/`, `~/.kodax/`, paths outside project
1099
+ - Sensitive/protected or unresolved targets enter Auto[LLM]/approval review;
1100
+ ordinary reads outside the project are allowed
1004
1101
  - Pattern-based permission: Allow specific Bash commands (e.g., `Bash(npm install)`)
1005
1102
  - Unified diff display for write/edit operations
1006
- - Auto Mode runs guardrail classification before the permission UI; a safe
1007
- allow verdict does not create a pending approval request. The session records
1008
- an automatic LLM-to-rules fallback for later turns.
1103
+ - Auto Mode first admits exactly modeled safe reads and workspace/temp
1104
+ mutations without classifier latency. Remaining actions are reviewed against
1105
+ bounded user intent and exact operation facts; a safe verdict creates no
1106
+ pending approval request. Classifier failures retry once, then use the
1107
+ Accept-edits safety boundary rather than silently switching to Auto[rules].
1009
1108
  - Shift-Tab cycles `Plan -> Edits -> Auto`; Shift+Enter inserts a newline. Auto
1010
1109
  immediately displays `Auto[LLM]` or `Auto[RULES]`, and rapid mode changes are
1011
- persisted in input order. `Auto[RULES]` is a valid sticky fallback/manual
1012
- state; use `/auto-engine llm` to opt back into LLM classification.
1110
+ persisted in input order. `Auto[RULES]` remains an explicit/manual engine;
1111
+ use `/auto-engine llm` to select LLM classification.
1013
1112
  - Runtime-backed prompts can offer exact `allow once`, `allow this session`,
1014
1113
  and `always allow` choices. Return the Runtime-issued opaque suggestion;
1015
1114
  never derive or widen a permission rule from the displayed command or path.
@@ -1176,7 +1275,7 @@ await runKodaX({
1176
1275
 
1177
1276
  ## SDK Usage
1178
1277
 
1179
- KodaX ships as a single npm package `@kodax-ai/kodax` with 11 SDK subpath exports (ADR-024 v0.7.39 + ADR-032 v0.7.42 + ADR-038 v0.7.49 + v0.7.56 `/media` + v0.7.64 `/runtime` + v0.7.68 `/experimental-memory` + v0.7.69 `/a2a`). Each subpath is tree-shake-friendly so consumers pull only what they need:
1278
+ KodaX ships as a single npm package `@kodax-ai/kodax` with 12 SDK subpath exports (ADR-024 v0.7.39 + ADR-032 v0.7.42 + ADR-038 v0.7.49 + v0.7.56 `/media` + v0.7.64 `/runtime` + v0.7.68 `/experimental-memory` + v0.7.69 `/a2a` + v0.7.78 `/sandbox`). Each subpath is tree-shake-friendly so consumers pull only what they need:
1180
1279
 
1181
1280
  ```bash
1182
1281
  npm install @kodax-ai/kodax
@@ -1190,10 +1289,11 @@ import { KODAX_TOOLS } from '@kodax-ai/kodax/coding'; // tools + pro
1190
1289
  import { createImageArtifactFromPath } from '@kodax-ai/kodax/media'; // input artifact helpers
1191
1290
  import { runInkInteractiveMode } from '@kodax-ai/kodax/repl'; // Ink TUI entrypoint
1192
1291
  import { SkillRegistry } from '@kodax-ai/kodax/skills'; // zero-dep skill loader
1193
- import { createMcpManager } from '@kodax-ai/kodax/mcp'; // MCP popout manager (v0.7.42)
1194
- import { listSessions } from '@kodax-ai/kodax/session'; // session history helpers
1195
- import { createKodaXRuntime } from '@kodax-ai/kodax/runtime'; // embedded/daemon runtime API
1196
- import { createKodaXA2AServer } from '@kodax-ai/kodax/a2a'; // A2A 1.0 client/server edge
1292
+ import { createMcpManager } from '@kodax-ai/kodax/mcp'; // MCP popout manager (v0.7.42)
1293
+ import { listSessions } from '@kodax-ai/kodax/session'; // session history helpers
1294
+ import { createKodaXRuntime } from '@kodax-ai/kodax/runtime'; // embedded/daemon runtime API
1295
+ import { runKodaXSandboxed } from '@kodax-ai/kodax/sandbox'; // explicit standalone containment
1296
+ import { createKodaXA2AServer } from '@kodax-ai/kodax/a2a'; // A2A 1.0 client/server edge
1197
1297
  import { createMemoryAgent } from '@kodax-ai/kodax/experimental-memory'; // opt-in experimental memory SDK
1198
1298
  ```
1199
1299
 
@@ -1368,8 +1468,8 @@ await runInkInteractiveMode({ provider: 'zhipu-coding', effort: 'auto' });
1368
1468
  | mimo-coding | `MIMO_CODING_API_KEY` | Native | mimo-v2.5-pro (Xiaomi Token Plan, Anthropic-compat) |
1369
1469
  | ark-coding | `ARK_CODING_API_KEY` | Native | glm-5.2 (Volcengine Ark Coding Plan — GLM-5.2 (alias: `glm-latest`) · Kimi K2.7 Code / K2.6 · MiniMax M3 / M2.7 · DeepSeek V4 Pro / V4 Flash · Doubao Seed 2.0 Code / Pro / Lite · Doubao Seed Code) |
1370
1470
  | deepseek | `DEEPSEEK_API_KEY` | Native | deepseek-v4-flash (`deepseek-v4-pro` via `/model`) |
1371
- | gemini-cli | `GEMINI_API_KEY` | Prompt-only / CLI bridge | (via gemini CLI) |
1372
- | codex-cli | `OPENAI_API_KEY` | Prompt-only / CLI bridge | (via codex CLI) |
1471
+ | gemini-cli | Provider CLI authentication (no KodaX API-key variable) | Prompt-only / CLI bridge | (via gemini CLI) |
1472
+ | codex-cli | Provider CLI authentication (no KodaX API-key variable) | Prompt-only / CLI bridge | (via codex CLI) |
1373
1473
 
1374
1474
  > **Custom providers**: any OpenAI- or Anthropic-compatible endpoint can be added via `customProviders[]` in `~/.kodax/config.json` (CLI) or `registerCustomProviders()` (library). See the [Quick Start](#2-configure-a-provider) for the configuration shape.
1375
1475
 
@@ -1483,9 +1583,45 @@ Built-in skills include:
1483
1583
  - **tdd** - Test-driven development workflow
1484
1584
  - **git-workflow** - Git commit and workflow automation
1485
1585
 
1486
- Skills are stored in `~/.kodax/skills/` and can be extended with custom skills.
1487
-
1488
- ---
1586
+ Skills are stored in `~/.kodax/skills/` and can be extended with custom skills.
1587
+ F263 background learning is Memory-first: a single correction does not create
1588
+ a Skill. Repeated independently verified evidence can create a low-risk,
1589
+ immutable project-scoped testing revision for at most three exact-revision
1590
+ uses. Promotion requires independently verified success. Use `/learn` to
1591
+ inspect, disable, rollback, trust, or reject learned revisions. Protected or
1592
+ formal Skills, user-global promotion, and Extension authoring remain explicit
1593
+ user actions.
1594
+
1595
+ ### Promote a learned Skill to the user catalog
1596
+
1597
+ Automatic canary activation and user-catalog promotion are different:
1598
+
1599
+ - independently verified canary success changes `testing` to
1600
+ `active_learned` inside the project-scoped Learned Area;
1601
+ - `/learn promote` is an explicit ownership transfer that copies one exact
1602
+ reviewed `ready` or `active_learned` revision into the formal user Skill
1603
+ catalog and changes its lifecycle to `promoted_user`.
1604
+
1605
+ Inspect the revision first, then promote it by name, slug, or exact capability
1606
+ ID:
1607
+
1608
+ ```text
1609
+ /learn show normalize-release-notes
1610
+ /learn promote normalize-release-notes --scope user
1611
+ ```
1612
+
1613
+ `--scope user` is the only supported scope and may be omitted. Invalid scopes,
1614
+ unknown options, duplicate scope options, and extra operands fail without
1615
+ changing the catalog. Promotion writes to the configured KodaX user Skill
1616
+ directory—normally `~/.kodax/skills/<slug>/SKILL.md`—and never overwrites
1617
+ different formal Skill content.
1618
+
1619
+ Use `/learn promote --help`, `/learn help promote`, or
1620
+ `/help learn promote` for the dedicated command reference. In the Ink Learning
1621
+ Center, open `/learn`, select an `active_learned` Skill, and choose
1622
+ **Promote to user catalog**.
1623
+
1624
+ ---
1489
1625
 
1490
1626
  ## Commands (CLI)
1491
1627