@lmctl-ai/lmctl 0.1.324 → 0.1.326

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.
@@ -859,3 +859,18 @@ CREATE INDEX IF NOT EXISTS idx_invocation_state_target_status
859
859
  ON invocation_state(target_teamfile, target_alias, status, launch_source);
860
860
  CREATE INDEX IF NOT EXISTS idx_invocation_state_from_time
861
861
  ON invocation_state(from_identity, started_at DESC);
862
+
863
+ -- v59: source-generation identity. A single-row, non-secret random id assigned
864
+ -- ONCE at migration time. Every lmctl-issued reference (invocation/provider-
865
+ -- session/mail ref) binds to it so a ref minted against one ledger can never
866
+ -- silently resolve against an unrelated or recovered one. The singleton CHECK
867
+ -- makes >1 row structurally impossible; the row itself is inserted by
868
+ -- migrate()'s ensureLedgerIdentity (fresh create AND upgrade paths).
869
+ -- DELIBERATELY EXCLUDED from the db-recovery salvage set (salvageEssentialConfig
870
+ -- copies only root_team + lmctl_config): a salvage-into-fresh-db is a NEW ledger
871
+ -- and must mint a NEW id; only a full-file backup restore retains this row.
872
+ CREATE TABLE IF NOT EXISTS state_ledger_identity (
873
+ singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
874
+ instance_id TEXT NOT NULL,
875
+ created_at TEXT NOT NULL
876
+ );
@@ -21,6 +21,17 @@ For `.lmctl` teamfile compatibility mode:
21
21
  user-defined, not a fixed vendor catalog, so a hardcoded list in this
22
22
  doc would be wrong for every user whose aliases differ. See the
23
23
  `## Kimi` section below.
24
+ - `hermes` model ids are the ENCODED `<provider>:<model>` form Hermes's
25
+ ACP server advertises (`acp_adapter/model_catalog.py`). lmctl sends the
26
+ value through ACP `session/set_model` and does NOT maintain a Hermes
27
+ model list to validate against: Hermes resolves models at runtime from
28
+ its own provider config + auth, so any hardcoded list here would be
29
+ wrong for most users. Lint warns only when `model=` has no `provider:`
30
+ prefix. Hermes only treats a leading `<x>:` as a provider delimiter when
31
+ `x` is a known provider name (`hermes_cli/models.py:parse_model_input`);
32
+ a bare id stays the model name and Hermes then has to infer the provider
33
+ by detection, which fails for models it cannot place. See the `## Hermes`
34
+ section below.
24
35
  - `copilot` accepts `model=` syntactically, but model selection is not
25
36
  supported and lint warns that the value is ignored.
26
37
  - `lmctl seed <teamfile>` passes `model=` through to the provider seed
@@ -54,11 +65,24 @@ or retiring tested model ids.
54
65
  | `gpt-5.4` | Ported from lmctl0 tested-model catalog. |
55
66
  | `gpt-5.5` | Ported from lmctl0 tested-model catalog. |
56
67
  | `gpt-5.6-sol` | Operator-confirmed for Codex review team use on 2026-07-19. |
57
- | `gpt-5.4-mini` | Ported from lmctl0 tested-model catalog. |
58
68
  | `gpt-5.3-codex` | Ported from lmctl0 tested-model catalog. |
59
69
  | `gpt-5.3-codex-spark` | Ported from lmctl0 tested-model catalog. Banned as a build model by the operator (2026-09-06, plenty of regular-GPT quota headroom) -- `lmctl lint` now warns on explicit `model=gpt-5.3-codex-spark` for build work; kept in this tested list since it's still a real, valid model for genuinely non-build (classification-only) use. |
60
70
  | `gpt-6-astra` | Operator seeding for evaluation, 2026-09-06. |
61
71
 
72
+ **Retired:** `gpt-5.4-mini` -- removed 2026-09-15 after a real fleet incident:
73
+ the model was withdrawn from the OpenAI subscription while 194 codex members
74
+ across ~90 teamfiles had no `model=` pinned and were falling through to it
75
+ as the ambient default (unrelated to this catalog directly, but the SAME
76
+ stale id was also still listed here as "tested", so `lmctl lint` would have
77
+ passed the exact configuration that was failing in production). Unlike
78
+ `claude-fable-5` above (suspended, may return, kept valid), this id was
79
+ withdrawn outright and is not expected back -- do not re-add without fresh
80
+ operator/production confirmation it works again. Codex has no live model
81
+ catalog to check against (unlike `agy`/`opencode`, which query the
82
+ installed provider CLI directly) -- see the code comment on
83
+ `BUILTIN_TESTED_MODELS.codex` for why, and keep this table and that array
84
+ synchronized by hand until/unless a live check becomes possible for codex.
85
+
62
86
  ## Gemini
63
87
 
64
88
  | Configured `model=` | Evidence |
@@ -198,3 +222,41 @@ _MEMBER_ alias=Reviewer provider=kimi model="kimi-code/k3" sessionid=<seeded-id>
198
222
  | `claude` | Claude Code has native `--effort`, but lmctl has not wired `_MEMBER_ effort=` to Claude yet. |
199
223
  | `codex` | Native effort surfaces exist; lmctl has not wired `_MEMBER_ effort=` to Codex yet. |
200
224
  | `agy` | No verified effort flag; only `--model` supported. |
225
+ | `hermes` | Not supported. Hermes exposes reasoning effort through its own config (`--reasoning`) but not through its ACP surface, so lmctl ignores `effort=` for a Hermes member and warns. |
226
+
227
+ ## Hermes
228
+
229
+ Hermes is driven over ACP (`hermes acp`), and its ACP model ids are the
230
+ encoded `provider:model` strings it advertises in `session/new`
231
+ (`acp_adapter/model_catalog.py`, `encode_model_choice`). lmctl applies
232
+ `model=` with ACP `session/set_model` when it differs from the loaded model.
233
+
234
+ ```md
235
+ _MEMBER_ alias=Reviewer provider=hermes model="deepseek:deepseek-v4.1-flash" sessionid=<uuid>
236
+ ```
237
+
238
+ There is deliberately **no** tested-model table here. Hermes resolves its
239
+ model inventory at runtime from the user's own provider configuration and
240
+ credentials, so a list in this repository would be wrong for most users —
241
+ the same reasoning as `kimi` and `opencode`. Lint checks the SHAPE only:
242
+ the value should carry a `provider:` prefix, because without one Hermes
243
+ has to infer the provider by model-name detection and fails for models it
244
+ cannot place.
245
+
246
+ V1 supports ACP seeding and structured chat/dispatch against one effective
247
+ `HERMES_HOME`. Existing session IDs default to strict resume. Yolo mode enables
248
+ both the shell approval bypass and the per-process ACP edit mode; plan mode is
249
+ rejected. Native deletion, interactive resume, fork, and persistent daemon
250
+ sessions are not supported by this integration. The reader is read-only and
251
+ shows active transcript rows; token totals do not establish last-turn usage.
252
+
253
+ Release prerequisites: Hermes must return JSON-RPC errors for missing load/resume
254
+ IDs. Task 140 also uncovered an ACP compression-head restore defect: restart-safe
255
+ resume after compression requires a separate Hermes fix before this provider lands.
256
+
257
+ The source fixes are reviewed and committed locally in the Hermes checkout as
258
+ `989fd87461e23493fe62250b1671f9fc368e9117`. This is not an upstream release or an
259
+ installed-runtime update: the current GitHub identity has read-only access to
260
+ NousResearch/hermes-agent, and validation used the fixed checkout explicitly.
261
+ Provider publication remains gated on an approved, available patched Hermes
262
+ runtime and final owner landing approval (task 141 notes 548-549).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lmctl-ai/lmctl",
3
- "version": "0.1.324",
3
+ "version": "0.1.326",
4
4
  "description": "A provider-agnostic control plane for teams of AI coding agents — across providers, with independent review and durable memory.",
5
5
  "type": "module",
6
6
  "homepage": "https://lmctl.com",