Skip to content

Simplify bundled skill catalog and routing - #1517

Merged
Open-Squilla merged 5 commits into
mainfrom
feature/simplify-skill-catalog
Sep 8, 2026
Merged

Open-Squilla merged 5 commits into
mainfrom
feature/simplify-skill-catalog

Conversation

@lihongguang-0014

@lihongguang-0014 lihongguang-0014 commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Scope

The bundled Skill catalog previously mixed public entry points, workflow dependencies, and redundant wrappers. This change gives prompts and clients a deterministic public catalog while retaining the internal dependencies needed by supported Meta workflows.

  • Expose eight ordinary bundled Skills and three stable Meta workflows; expose code-task when coding mode is enabled. Keep internal helpers out of public prompts and detail bodies.
  • Extend meta.list and add meta.inspect with passive readiness and exact instance identity. Preserve public Meta entries and root content in skills.list / skills.get for older clients, including managed lifecycle diagnostics.
  • Support separate WebUI and Gateway upgrades. The new adapter detects capabilities, falls back only for unavailable methods, and merges Meta results by exact identity. It retains source, installation identity, and declared dependencies while refreshing readiness, missing dependencies, lifecycle badges, and status messages. Authentication, validation, and identity errors remain errors.
  • Use the existing application/adapter boundary and generated RPC registration. Production validators for the two new methods are limited to result; full contract verification remains available in the test toolchain.
  • Retire the relevance filter and its lexical/semantic/hybrid selection path. Migrate only the allowlisted legacy skills.filter_* settings, clean persisted TOML, and ignore deprecated environment spellings before strict settings validation with warnings. Unknown settings still fail validation.
  • Preserve correct invocation defaults for newly authored personal/project Meta SOPs, and make CLI/TUI completion follow the public catalog and operator-disabled gates.
  • Retire 31 bundled Skills: four native-tool wrappers, five audio wrappers, summarize, five weather/tmux/HTML-to-PDF/LaTeX/PDF-rewrite wrappers, eight obsolete paper helpers, three creator helpers, and five stack-trace probes.
  • Keep native cron and memory capabilities. The memory change is limited to clarifying the existing memory_save and memory_delete descriptions; it adds no tool or execution mechanism. Scheduled jobs and stored memory remain intact.

Retirement takes effect after the upgraded Gateway restarts and rebuilds its Skill snapshot. Old snapshots cannot restore retired bundled entries; residual packaged files remain hidden. Independently installed personal, managed, project, workspace, and extra-directory copies are retained.

Old Meta workflow definitions that reference retired Skills are not supported or automatically migrated; their authors must update those references. Dedicated retired scripts and their output contracts are not preserved. PDF extraction, composition, and generation remain supported, while arbitrary in-place PDF rewriting is no longer a dedicated Skill capability.

Branch

Base branch: main

Target exception: N/A

Issue

Linked issue: None

If None, reason: catalog simplification and upgrade-compatibility work without a tracking issue.

Release Note

Release note: YES — CHANGELOG.md documents the smaller catalog, the 31 retirements, retained user data and installations, configuration migration, separate client/Gateway upgrades, and the unsupported legacy Meta definitions.

Tests

Latest integration: commit cfcab89212375b152a36c0b5e35201ba4a00fae8 (tree 885eedcadd81f7288d88b00c9fbcc1a967250621) includes main through f7dd1b6f64b050caad83f7f8223b1b5d45a5971f. Its five-file delta preserves the upstream reservation race fix and Windows recovery harness watchdog/diagnostics. The expanded 23-file environment/safety/regression preflight passed: 1,005 passed, 40 skipped; exit 0. Full 511-file backend acceptance and complete CI are running for this integration.

Completed local results below apply to the preceding commit 4b6f78e016d2b0aed99d63ef41e79c27582f57df (tree dd251293a37da7f411ee7c8483ba3d0a3153558e). Frontend and contract inputs are unchanged by the latest five-file integration.

Ruff: ruff check src tests scripts/skill_simplification_ab.py .github/scripts/plan_ci.py passed.

Pytest:

  • Full offline Skill and associated backend acceptance, expanded to 510 test files including all CI tests and the real contract toolchain: 9,317 passed, 98 skipped, 5 live tests deselected; exit 0.
  • Ordinary-checkout environment preflight, including native macOS safety probes and all relevant previously failing files: 980 passed, 40 skipped; exit 0. Source state, Python imports, dependencies, verified WebUI staging, and all 18 Router assets were checked; all nine LFS objects were materialized and matched their recorded hashes.
  • All five files containing the six failed RPC/CI assertions: 180 passed; exit 0. The exact surface is 307 methods; removing the sole new method meta.inspect reproduces the previous 306-method digest. Static registrations are 86; Meta methods use the generated adapter registration.
  • Real Python/TypeScript/Ajv contract tests with OPENSQUILLA_RUN_CONTRACT_TOOLCHAIN_INTEGRATION=1: 388 passed, 1 skipped, included in the full acceptance above.

Build:

  • WebUI preflight: 175 passed. Full unit suite: 434 files / 5,543 tests passed; exit 0.
  • Full WebUI production build and artifact staging verification: passed.
  • Backend mypy src/opensquilla --show-error-codes: passed across 1,551 source files.
  • Production contract generation --check and --verify-determinism: passed.
  • Complete verification profile generation, determinism, standalone validator verification, and hash manifest: passed. 226 contracts / 877 roles, 112,117 comparisons across 212 production roles, with positive seeds for every role.

Regression tests: added

CI: current integration run is running. All four Linux full offline shards, three-platform Skill gates, frontend tests/build, and Linux full contract verification have passed. Windows contract verification and recovery-migration remain in progress. One Windows ownership E2E failed while waiting for the predecessor Gateway process to exit; replacement identity verification and UI reconnection had already succeeded. Relevant ownership/runtime/harness files are unchanged from passing main65af and PR4b controls, but the failure mechanism is not confirmed. A single full-job reproduction on the same tree is planned, without changing assertions or time limits. The PR is Ready; merge remains gated on all required checks passing.

Notes: local validation runs on macOS. An initial native stdout assertion failed once and was not reproduced in candidate/main file controls; complete preflight subsequently passed with unchanged policy and assertions. One local full run was stopped after detecting LFS pointers instead of model assets; assets were restored and the entire 510-file command passed. Failed/interrupted logs and real exit codes were retained, rather than replacing those outcomes with isolated retries.

Historical synthetic A/B evidence

Preserved evidence: report, raw JSON, raw CSV, summary, and deterministic summarizer.

The 166 synthetic-request Provider comparison remains bound to baseline 27ca02ca4596f8f24fe79ab603f068cbec6ab858 and candidate 058a7675a24177f513ca9262b1d0db96578c1e58. It is not a measurement of the current implementation.

Its overall hard-gate result remains FAIL: mean total input fell 4.84%, below the 30% requirement; warm cache-read ratio fell slightly; truncations remained; and the visible-word comparison was unassessable. The historical catalog-token reduction of 36.70% and median latency reduction of 48.32% do not override those failed gates. No new Provider benchmark is claimed here.

Maintainer Live Check

Maintainer live check: no new credentialed live check for the current implementation.

Surface: historical provider evidence only, bound to the candidate SHA above.

Safety

  • Legacy configuration cleanup is allowlisted and warning-backed; it does not delete user-authored Skills, memory, or cron state.
  • Internal, experimental, and retired definitions cannot be exposed through public detail reads, including exact-ID requests. Meta inspection validates only the current public winner; an identity cannot select a shadowed definition.
  • Operator-disabled roots are omitted from the Meta catalog and rejected by inspection. Existing managed diagnostics and execution gates remain in place.
  • Contract capability detection supports mixed client/Gateway versions without treating permission or validation failures as compatibility fallbacks.
  • Versioned evidence uses synthetic prompts. No credentials, real conversations, memory contents, private paths, or runtime state are included.

Third-Party Origin

Third-party origin: none

The implementation is original. Read-only architectural research informed behavior and test-shape comparison; no third-party code, comments, fixtures, identifiers, or wording were copied or adapted.

Documentation Changes

  • Links point to existing repository files or stable external pages.
  • Markdown uses the repository PR template.
  • Examples avoid real secrets, local private paths, and private transcripts.

@Open-Squilla
Open-Squilla marked this pull request as draft August 31, 2026 08:27
Preserve main image projection and attachment replay changes while retaining the simplified Skill catalog policy. Bring in the Windows orphan process-identity fix. Validated 429 focused Skill and image-routing tests on Windows.
@Open-Squilla
Open-Squilla added this pull request to the merge queue Sep 8, 2026
Merged via the queue into main with commit bbd0c42 Sep 8, 2026
42 checks passed
@Open-Squilla
Open-Squilla deleted the feature/simplify-skill-catalog branch September 17, 2026 19:11
Open-Squilla added a commit to qiaoye2024/opensquilla that referenced this pull request Sep 18, 2026
…hythm#1056)

* Stabilize long-running CI tests and desktop case cleanup (#1354)

* Reduce long-running CI test contention

* fix(ci): use available context for Electron cache

* fix(ci): avoid Windows shard command length limit

* fix(ci): target Windows venv executable

* Fix frozen Windows Desktop process-tree helper launch (#1336)

* Fix frozen Windows process-tree helper launch

* Fix frozen Windows helper readiness retries

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* fix(chat): preserve activity timeline order across refresh (#1343)

* fix(chat): preserve activity timeline order across refresh

* fix(chat): satisfy activity type and live detail contracts

* chore(chat): document terminal snapshot eviction race

* fix(chat): complete CI activity contracts

* fix(chat): preserve settled tool summaries

* fix(chat): align activity recovery CI contracts

* test(chat): assert localized activity tool labels

* Add autonomous HTML document editing loop (#1359)

* feat: add autonomous HTML document editing loop

* feat: add protocol-v4 candidate preview bridge

* fix: make prompt annotation selection lifecycle reliable

* Preserve annotation focus across document follow-ups

* Resolve PR code quality review findings

* Address latest PR quality findings

* Remove unused cancellation recovery assignment

* Stabilize chat scroll ownership across session changes (#1361)

* Improve Workbench divider hit target (#1363)

* Improve macOS Keychain startup recovery (#1362)

* Keep sidebar hover previews anchored for long titles (#1366)

* Fix Windows installer progress presentation (#1360)

* Fix Windows installer progress presentation

* Update installer release contracts

* Stabilize Windows process-tree fixture handshake

* Avoid joining asyncio executor workers in cancellation test

* Stabilize Windows orphan recovery cleanup deadline

* Stabilize approval deadline regression on Windows

* Stabilize long-task history evidence

* Fix desktop document edit turn bindings (#1364)

* feat(runtime-packs): add discard download action (#1365)

* feat(runtime-packs): add discard download action

* test(ci): serialize fallback gateway case

* Isolate usage model detail expansion by session (#1380)

* fix(cli): return nonzero after terminal agent errors (#1342)

* fix(cli): return nonzero after terminal agent errors

* test(cli): isolate invalid-key process profile locks

* Isolate Windows home for invalid-key CLI test

* Decouple desktop startup from gateway readiness (#1355)

* Decouple desktop startup from gateway readiness

* Add Desktop entrypoint to packaging fixtures

* Stabilize split WebUI entrypoints

* Align onboarding E2E with local Desktop shell

* Fix duplicate router cards after reconnect (#1384)

* Stabilize process-tree lifecycle checks (#1390)

* Stabilize process-tree lifecycle checks

* Make SQLite change-count assertions portable

* Remove unused legacy orange logo asset (#1387)

* Fix route-limited attachment history capacity admission (#1389)

* fix(router): project route-limited attachment history capacity

* test(router): cover route-limited attachment history capacity

* test(live): add TokenRhythm attachment capacity gate

* Run Windows shell process tests serially in CI (#1391)

* Persist historical router panel snapshots (#1386)

* Persist historical router panel snapshots

* Recover chat subscription after connection race

* fix(skills): verify digests through catalog paths (#1367)

Co-authored-by: kriptoburak <kriptoburak@users.noreply.github.com>

* Fix Windows Safe noop shell execution (#1388)

* Fix Windows Safe noop shell execution

* Fix Windows noop argv test expectations

* Stabilize concurrent Windows owner registry writes

* Stabilize HTML annotation proofs and picker rearming (#1392)

* Protect interrupted annotation drafts

* fix(artifacts): tolerate additive ancestor classes in annotations

* fix(desktop): reliably rearm annotation picker

* test(desktop): stress repeated annotation picker clicks

* fix(desktop): fence stale annotation geometry cleanup

* fix(desktop): atomically rearm HTML annotation picker

* fix(desktop): rearm picker after rejected annotation target

* fix(annotations): allow additive selected element classes

* fix(annotations): recover fenced picker handoffs

* test(annotations): make HTML case concatenation explicit

* test(artifacts): simplify bridge client stub

* feat(workbench): mark annotation editing as beta

* test(provider): make request proof compaction deterministic

* Prepare OpenSquilla 0.5.4 release (#1396)

* Prepare OpenSquilla 0.5.4 release

* Mark HTML document editing as beta

* Retry transient storage contention in artifact release E2E

* Make abort budget regression test deterministic

* Include runtime catalog in container builds (#1397)

* Fix desktop package verification boundaries (#1398)

* Align packaged first-send startup budget (#1399)

* Avoid packaged first-send reload race (#1401)

* Preserve packaged first-send probe across routes (#1402)

* Extend OSS mirror workflow timeout to 60 minutes (#1403)

* Decouple nightly health from merge CI (#1404)

* Remove unreachable agent-loop experiment code (#1385)

* Remove unreachable runtime and UI code (#1382)

* Consolidate CI planning and remove redundant lanes (#1405)

* Consolidate CI planning and remove redundant lanes

* Stabilize Gateway and Desktop shutdown CI

* Make abort deadline regression test deterministic

* Stabilize Windows noop and plan RPC tests

* Preserve Windows PowerShell startup cache

* Use prewarmed PowerShell cache in Windows contract

* Keep tool progress out of final answers (#1406)

* fix(cli): check the config key whichever way `config set` persists it (#1410)

Without `--config` the command wrote no file, so it skipped the key check
entirely and answered any dotted string with an export line. Two spellings
from the report show what that costs: `definitely.invalid` came back as
`export OPENSQUILLA_GATEWAY_DEFINITELY__INVALID=123`, and `gateway.port`
came back as `OPENSQUILLA_GATEWAY_GATEWAY__PORT=18823` — the field is
`port`, so the variable the gateway actually reads stayed unset. Neither is
merely useless output: an export line reads as confirmation that the setting
was understood, so the operator sets it and then goes looking for why
nothing changed. The persisting form refused both. Now the env form runs the
same check and exits 1 with the same message.

Making the two agree exposed the other half. Key validity was read off the
values in the document rather than off the schema, and TOML has no null, so
every field resting at its `None` default is absent from `to_toml_dict()`
and was refused as "Key not found" — `auth.token`, `llm.api_key`,
`compaction.model`, the agent timeout overrides, 58 in total, none of them
settable through this command at all. Validity now comes from
`GatewayConfig.model_fields`, and a schema-valid path creates the tables it
needs on the way down.

Mapping fields keep the old rule, because the schema cannot enumerate an
operator's agent ids or router tier names: those segments must already be
present in the document, so `squilla_router.tiers.c0.model` still resolves,
`...tiers.no_such_tier.model` is still refused, and a typo never invents a
half-formed entry. Every one of the 363 leaf keys the previous check
accepted is replayed against the new one in a test; none is now refused.

Closes #1383.


Claude-Session: https://claude.ai/code/session_01LgCn6RgA7fr4Fi1zTWcJt7

Co-authored-by: Claude <noreply@anthropic.com>

* Use merge-base for PR CI planning (#1420)

* Correct gateway port configuration examples (#1423)

* Keep session routing above active goals (#1425)

* Restore the latest unsent chat draft (#1427)

* Fix deleted subagent session cards (#1426)

* Validate provider credentials before onboarding save (#1428)

* Preserve terminal activity during stream pressure (#1429)

* Restart ready desktop gateways after unexpected exit (#1430)

* Keep unknown chat sends out of composer (#1424)

* Keep unknown chat sends out of composer

* Align annotation disconnect recovery coverage

* Refine annotation replay history assertion

* Retrigger CI after runner startup failure

* Retrigger CI after runner recovery

* Fix tool streaming overflow and resource activity presentation (#1432)

* Fix tool activity streaming and presentation

* Make search result targets collapsible

* Fix tool presentation dependency direction

* Align activity browser contracts with resource rules

* Wait for verified gateway replacement ownership

* Align orphan recovery contract with verified ownership

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* Route image capability by session mode (#1436)

* Cap RPC reconnect attempts (#1433)

* Retry interrupted history on replacement connections (#1434)

* Honor exact model repetition thresholds (#1443)

* fix(cli): give sessions export/delete/resume and bundle the selected profile (#1417)

`--profile qa` sets `OPENSQUILLA_PROFILE`, which moves
`default_opensquilla_home()`, which moves the resolved `config.toml`, which
carries the port that profile's gateway binds. `default_gateway_url()`
follows that chain, and `sessions list`, `show` and `abort` reach it through
`run_gateway_sync`.

Four call sites did not. `sessions_cmd._with_client` connected to a literal
`ws://localhost:18791/ws`, so `export`, `delete` and `resume` addressed the
default gateway whatever profile was selected — the reported `export` failure
with NOT_FOUND (#1379) is the visible half. `delete` is the half that is not
merely inconvenient: aimed at the wrong gateway it does not fail safe, it
operates on whatever is listening on 18791.

`bundle._live_enrichment` had the same literal (#1374). Everything else in a
bundle is read from the selected profile's home, so the `doctor` and
`channels` sections could describe a different gateway entirely, and the file
says nothing about it. A wrong live section is worse than no live section,
because the bundle still looks complete.

Both now call `default_gateway_url()`. It checks `OPENSQUILLA_GATEWAY_URL`
first, so the env override keeps outranking the profile exactly as before,
and with nothing configured it still resolves to the same release default.
The bundle's contract is untouched: `default_gateway_url()` is called inside
the block whose failure path already returns `{}`, so a dead or unreachable
gateway still yields a bundle without live sections rather than an error.

These four commands, and no others. `reset` and `mcp-server run` are still
profile-blind, but in both the literal is the default of a documented
`--gateway` option rather than an internal fallback, so changing it changes
`--help` and the flag's advertised contract. `reset` carries the same
state-mutating risk as `delete` and is the first of the two to move; both go
in their own reviewed change rather than riding along here.

Closes #1379.
Closes #1374.


Claude-Session: https://claude.ai/code/session_01LgCn6RgA7fr4Fi1zTWcJt7

Co-authored-by: RickyYii <237135932+RickyYii@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* fix: stop counting packaged routing defaults as profile references (#1357)

Fixes #1297: a provider profile whose only 'references' were the packaged
openrouter router-tier preset and the dormant legacy static ensemble
selection_mode could never be deleted, because remove_llm_profile treated
those factory defaults as operator references.

Only operator-owned configuration now blocks removal: a tier counts when
its content differs from the packaged preset entry, and selection_mode
counts when ensemble_selection_configured reports it as operator-owned.
Explicit references — including a disabled ensemble's explicitly set
static mode — are still rejected exactly as before.

The defaults are never persisted and regenerate on every config load, so
removing the profile cannot dangle them.

Co-authored-by: Shaun <249469326i-lang@users.noreply.github.com>

* fix(webui): turn the Router off instead of surfacing router_provider_conflict on active-provider removal (#1411)

Removing the active provider promotes the replacement through the same
primary-swap path as activateProvider. When the Router is a custom/legacy
binding with cross-provider routing off and a tier still names the previous
provider, the backend rejects the removal with an untranslated
router_provider_conflict (the code is not in RPC_ERROR_KEYS, so the user sees
raw English instead of a guided choice).

Mirror activateProvider: detect the conflict up front against the replacement
and send routerAction: 'disable', which keeps the saved tiers and turns the
Router off so the removal succeeds. Report the same in the success toast via a
new providerRemovedRouterDisabled i18n key in all six locales.

Co-authored-by: freeaccount-create <freeaccount-create@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* Attribute listed models to the configured provider id (#1442)

`list_models` labelled every row with the wire dialect
(`_provider_kind`) or the adapter family (`provider_name`) instead of
the configured deployment identity (`provider_id`). Those three axes
diverge for 11 runtime-supported specs, so a `vllm` endpoint listed its
models as `openai`, `kimi_coding_openai` as `moonshot`, and
`byteplus_coding_plan` as `openai_responses`.

`models.list` compares its `provider` filter against that field
verbatim, so a mislabeled row was unreachable by its own configured id:
`opensquilla models list --provider vllm` returned nothing while
`--provider openai` matched a provider that was never configured.

Every other catalog consumer (pricing, subagent budgeting, router tier
facts, onboarding discovery) already resolves against the configured
`provider_id`, and the openai adapter's own usage/billing sites already
used `self.provider_id` — the listing paths were the outlier.

`OpenAIProvider`'s direct-construction fallback also moves from
`provider_name` to the resolved dialect: that adapter serves every
OpenAI-compatible dialect, so falling back to `provider_name` (always
`"openai"`) attributed a DashScope or OpenRouter instance to OpenAI,
which is exactly what the field exists to prevent. Three stream goldens
are regenerated for the resulting `DoneEvent.provider` attribution.

`_provider_kind` remains the wire dialect everywhere it belongs
(payload shaping, trace recording, install-id headers).

Fixes #1346

Third-party origin: none

Co-authored-by: Shaun <249469326i-lang@users.noreply.github.com>

* fix(cli): resolve the reset and mcp-server gateway instead of assuming it (#1418)

Follow-up to #1417, which fixed the four commands whose `localhost:18791`
was an internal fallback. These two are the remaining pair, and they differ:
the literal is the *default of a documented `--gateway` option*, so changing
it changes `--help` and the flag's advertised contract. That is why they were
held back for their own review rather than folded into #1417.

`reset` is the one that matters. It flushes the session's memory and rotates
its id, so aimed at the wrong gateway it does not fail a lookup — it mutates
whatever session key matches on 127.0.0.1:18791. A named profile's gateway on
another port was unreachable without spelling the URL out by hand, which is
the same defect #1379 reported for `sessions export`, on a command that
writes.

Both options now default to `None` and resolve in the body: an explicit
`--gateway` or `OPENSQUILLA_GATEWAY_URL` arrives as a value and is used
directly, so the top two rungs of the precedence chain are untouched; with
neither set, `default_gateway_url()` supplies the selected profile's
configured gateway, and falls back to the same release default as before.
`normalize_gateway_url("http://localhost:18791")` and
`default_gateway_url()` with nothing configured both yield
`ws://localhost:18791/ws`, so an unconfigured install is byte-identical.

The `--help` text now states the resolved default in words, since there is no
longer a literal for typer to print.


Claude-Session: https://claude.ai/code/session_01LgCn6RgA7fr4Fi1zTWcJt7

Co-authored-by: RickyYii <237135932+RickyYii@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: lihongguang-0014 <hongguang.li@tokenrhythm.ai>

* Keep workspace navigation on the current WebSocket (#1435)

* Keep workspace navigation on the current WebSocket

* Preserve long-history viewport through recovery

* test(webui): remove duplicate session handoff race matrix

* test(desktop): snapshot healthy session recovery metrics

* fix(gateway): make sandbox upgrade migration non-blocking (#1450)

* fix(gateway): simplify sandbox upgrade migration

* test: skip router E2E without hydrated LFS assets

* Coordinate Gateway WebSocket shutdown (#1451)

* Coordinate Gateway WebSocket shutdown

* Register WebSocket close tests in Windows shards

* Retry transient Windows loopback socket exhaustion

* docs: replace stale What's New sections with a Release Notes pointer (#1459)

The README carried release summaries for 0.5.0/0.4.1/0.2.1/0.2.0 while
the current release is 0.5.4, duplicating CHANGELOG.md content that was
no longer being maintained. Drop the per-version sections from all six
README translations and point to CHANGELOG.md and docs/releases/
instead.

* fix(ci): validate release contracts for README changes (#1462)

* refactor: establish typed sessions.list contract seam (#1460)

* feat(contracts): add generated sessions.list v4 contract

* refactor(gateway): route sessions.list through contract adapter

* refactor(clients): share sessions.list contract adapter

* refactor(webui): introduce session directory module

* chore(architecture): enforce RPC contract boundaries

* fix(contracts): stabilize generated hashes on Windows

* Preserve versioned session naming API roots (#1456)

* Harden session auto-naming prompts (#1466)

* refactor(contracts): generalize gateway contract generation (#1467)

* refactor(webui): establish private transport and contract architecture gates (#1468)

* refactor(webui): add private gateway transport seam

* refactor(gateway): consume generated method registry

* refactor(webui): add private HTTP transport gate

* refactor(webui): harden RPC boundary provenance

* refactor(gateway): harden contract registration invariants

* refactor(webui): make RPC provenance symbol-aware

* refactor(gateway): validate contract failure types

* fix(webui): cancel stale session count queries

* refactor(webui): trace HTTP debt by symbol provenance

* test(webui): harden HTTP provenance edge cases

* refactor(webui): expand HTTP wrappers by tainted call graph

* refactor(webui): harden private HTTP transport

* test(webui): close HTTP provenance edge cases

* fix(webui): harden RPC provenance architecture gate

* fix(webui): fence HTTP body lifecycle and F2 LOC budget

* test(ci): account for reviewed F2 foundation budget

* fix(webui): enforce HTTP body lifecycle cancellation

* fix(webui): close transitive RPC boundary leaks

* fix(webui): allow RPC factory barrels

* fix(webui): harden HTTP filename and body boundaries

* test(ci): account for reviewed HTTP hardening budget

* fix(webui): require native form body brands

* test(ci): tighten HTTP foundation line budget

* fix(webui): cancel HTTP response bodies on lifecycle end

* fix(webui): normalize HTTP request option boundaries

* test(ci): account for HTTP lifecycle foundation budget

* fix(webui): normalize HTTP endpoint inputs

* test(ci): register F2 gateway adapter shard

* refactor(sessions): add typed resolve contract seam (#1469)

* refactor(sessions): add typed resolve contract seam

* fix(contracts): emit browser-safe ESM validators

* test(contracts): import generated ESM with file URLs

* refactor(sessions): deepen session search application seam (#1470)

* refactor(sessions): deepen session search application seam

* docs(sessions): clarify search failure compatibility

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* feat(contracts): add sessions.search gateway contract adapter (#1471)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): route session search through domain adapter (#1472)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* fix(sessions): bound preview transcript reads (#1473)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(transcript): define application read seam (#1474)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* docs: add ChinaXiv link for Chinese technical report to READMEs (#1458)

The Chinese version of the technical report is now on ChinaXiv
(202608.00176); add it to the 2026-08-22 news entry in all six
README translations.

* refactor(gateway): route sessions.preview through application seam (#1475)

Rebase the verified S4b slice onto the latest origin/main README update.

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* test(gateway): lock chat history wire behavior (#1476)

Add executable v4 characterization fixtures and dispatcher/bootstrap tests before extracting the session history application seam. Keep production behavior and transport unchanged, and register the new tests in Windows shard governance.

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(application): add session history read seam (#1478)

Introduce a transport-neutral SessionHistoryApplication with narrow canonical and active transcript Ports. Preserve canonical preference, fallback pagination, cursor precedence, and fatal reader errors while leaving the existing Gateway handler and v4 wire path untouched. Add focused tests and Windows shard governance.

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(gateway): connect chat history to application seam (#1479)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(contracts): standardize sessions.changed event boundary (#1481)

* fix(webui): preserve legacy session change invalidations (#1482)

* refactor(webui): extract session lifecycle module (#1483)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): extract session routing domain seam (#1484)

Introduce a typed SessionRouting module and v4 adapter backed by language-neutral JSON Schema contracts. Keep legacy WebSocket wire aliases and errors inside the adapter, migrate ChatView and routing composable, and add generated Python/TypeScript validators, fixtures, compatibility tests, and architecture debt updates.

* refactor(contracts): define conversation event decoder seam (#1485)

* refactor(contracts): define conversation event decoder seam

Add the language-neutral v4 conversation event family Contract and deterministic Python/TypeScript generated artifacts. Keep canonical schema_version=1 and legacy unversioned payloads behind dormant adapters, with alias normalization, sequence metadata, unknown-event quarantine, and cross-language fixtures.

Do not change event producers, live consumers, WebSocket transport, runtime, or database behavior; the later Conversation Runtime slice will switch consumers after compatibility review.

* fix(contract): make conversation event codegen type-safe

Keep legacy payload validation structurally separate from the versioned base so the generated Pydantic models pass the repository-wide mypy gate. Refresh the Windows provisional duration inventory for the recent contract test files exposed by the full CI run.

* refactor: extract conversation runtime seams (#1487)

* refactor: centralize conversation transport and lease policy (#1488)

* refactor(webui): expose typed conversation event ingress (#1489)

* refactor(webui): centralize conversation event and subscription ownership (#1490)

* refactor(webui): share conversation runtime ownership (#1491)

* refactor(webui): extract bootstrap ownership coordinator (#1492)

* refactor(webui): extract bootstrap queue coordination (#1494)

* refactor(build): isolate WebUI artifact and preserve legacy consumers (#1493)

Rebased onto the current main after S12-C3.

* refactor(webui): extract TurnCommands seam (#1496)

* refactor(webui): extract TurnCommands seam

* test(ci): account for TurnCommands seam

* refactor(webui): contractize turn commands (#1499)

* refactor(webui): isolate pending input queue adapter (#1501)

* refactor(webui): isolate pending input queue adapter

* test(webui): include pending input adapter in composition

* test(webui): fix pending queue composition assertion

* refactor(webui): validate pending input wire at adapter boundary

* refactor(webui): isolate approval center contract (#1509)

* refactor(webui): isolate approval center contract

* fix(contracts): keep approval event version in union branches

* ci(windows): seed approval contract test duration

* refactor(webui): isolate goals status and set contract (#1510)

* refactor(webui): isolate goals status and set contract

* test(ci): register goals contract coverage

* refactor(gateway): register goals contracts (#1511)

* refactor(webui): own goal mode availability in module (#1512)

* refactor(goals): contract capability discovery (#1513)

* refactor(goals): isolate continuity contract boundary (#1514)

* refactor(goals): isolate continuity contract boundary

* fix(goals): keep contract alias typing explicit

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor: isolate Goal and Plan contract boundaries (#1521)

* refactor(adapter): add Goal and Plan domain seams

* refactor(webui): migrate Goal and Plan consumers

* docs(contract): define Goal and Plan migration boundary

* test(adapter): cover PlanCenter wire and event mapping

* refactor(webui): move plan capability checks into PlanCenter

* contract(goals-plans): add generated v4 method contracts

* refactor(goals-plans): register v4 command adapters

* test(ci): account for new contract test shard weights

* refactor(meta): isolate MetaRunCenter boundary (#1523)

* refactor(meta): isolate MetaRunCenter boundary

* test(meta): include MetaRunCenter in adapter composition

* refactor(platform): add configuration domain adapters (#1525)

test(platform): update adapter composition expectations

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(platform): complete WebUI domain boundaries (#1530)

* Fix F2 architecture ownership gate

* Complete platform domain boundaries

* Close Meta wire type leakage

* Isolate migration platform operations

* Route workspace operations through a catalog

* Wire platform adapters into the composition root

* Type platform gateway module factories

* Preserve session bootstrap priority for setup reads

* Test platform consumers through domain interfaces

* Stabilize shared-state CI coverage

* Refactor sandbox runtime domain boundaries (#1531)

* Refactor sandbox runtime domain boundaries

* Fix sandbox adapter typing and debt ledger

* Stabilize sandbox settings adapter fixture

* refactor(chat): migrate session and ancillary consumers behind domain seam (#1533)

* Refactor session consumers behind conversation seam

* Migrate chat ancillary consumers behind conversation seam

* Fix SessionConversation integration regressions

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): isolate read catalog domain boundaries (#1534)

* Add read catalog domain adapters

* Route read catalog consumers through domain interfaces

* Remove migrated read catalog transport debt

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): isolate runtime domain boundaries (#1535)

* Add cron and channel domain adapters

* Route cron and channel consumers through domain interfaces

* Remove migrated runtime transport debt

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(workbench): isolate artifact transport boundaries (#1537)

* Add ArtifactWorkbench contract and adapters

* Migrate ArtifactWorkbench consumers

* Tighten ArtifactWorkbench boundary gates

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* Close WebUI transport architecture boundaries (#1541)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* Close final WebUI domain transport boundaries (#1543)

* Close WebUI domain transport boundaries

* Enforce final WebUI boundary closure

* Satisfy architecture gate lint

* Update desktop usage boundary contract

* Update packaged usage client contract

* Fix Windows desktop retry classification

* Allow slow Desktop Gateway startup in recovery E2E

* Stabilize Desktop orphan ownership verification

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* fix(sandbox): initialize after gateway readiness and remove native warnings (#1527)

* fix(sandbox): initialize after gateway readiness without capability probes

* fix(sandbox): enforce explicit safe-mode admission

* fix(sandbox): replace native warnings with state-aware Safe selection

* test(channels): align ingress fixtures with global sandbox mode

* test(ci): account for merged domain adapter registrations

* test(gateway): align routing and meta fixtures with runtime contracts

* test(desktop): follow observability usage boundary

* test(ci): register sandbox startup shard weight

* test(ci): follow observability usage boundary

* test(desktop): drop retired sandbox auto-setup field

* refactor(session): isolate read lifecycle boundaries (#1551)

* Add Session read application contracts

* Move Session reads behind one lifecycle

* Remove legacy Session read facade

* Fix Session read recovery boundaries

* Align Session read recovery fixtures

* Bound Desktop recovery shutdown

* Make Windows Desktop teardown fail closed

* Record pre-drain Gateway termination

* Update V1 shutdown ordering contract

* Stabilize Windows CI timing and teardown

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(sandbox): isolate runtime domain boundary (#1555)

* Define SandboxRuntime v4 contracts

* Route sandbox use cases through application ports

* Migrate WebUI sandbox consumers to the domain runtime

* Keep sandbox contract tests dependency-minimal

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(session): isolate lifecycle domain boundary (#1557)

* Formalize session fork contracts

* Deepen session lifecycle boundaries

* Move session fork behind lifecycle adapter

* Fix workspace callback protocol variance

* Refresh Windows shard weights for domain tests

* Preserve Windows shard source metadata

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): complete backend domain boundaries (#1559)

* Deepen Platform setup domain boundaries

* Deepen session maintenance boundaries

* Deepen turn admission boundaries

* Deepen pending input queue boundaries

* Deepen conversation ancillary boundaries

* Deepen agent catalog boundaries

* Deepen channel administration boundaries

* Deepen cron scheduler boundaries

* Deepen observability boundaries

* Deepen skill catalog read boundaries

* Deepen skill management boundaries

* Deepen skill proposal review boundaries

* Define Artifact Workbench document contracts

* Define Artifact Workbench resource contracts

* Route Artifact Workbench through domain adapters

* Deepen Artifact Workbench content boundaries

* Deepen Artifact Workbench platform boundaries

* Complete Artifact Workbench boundary closure

* Preserve chat bootstrap recovery ordering

* Extend Windows Contract CI budget

* Serialize nested Windows lock probes

* Make attachment routing tests tokenizer-independent

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* Preserve upgrade compatibility after the TokenRhythm organization migration (#1567)

* Preserve update compatibility after organization migration

* Tighten upgrade verification and CI coverage

* feat(gateway): let operator-listed extension origins reach a loopback… (#1548)

* feat(gateway): let operator-listed extension origins reach a loopback gateway

Browser extension runtimes attach a custom-scheme Origin (for example
chrome-extension://<id>) that is not an http(s) origin: it can neither match
the gateway's own origin nor survive _parsed_browser_origin, so listing it
in cors.allowed_origins never had any effect and every browser handshake
was rejected with 403 FORBIDDEN_ORIGIN.

Generalize the registered opensquilla-app://desktop precedent: an operator
who lists the exact non-http(s) origin in cors.allowed_origins lets that
origin reach a loopback gateway. The Origin header is browser-controlled,
so a hostile web page cannot forge it; the match stays exact ("*" is never
accepted), http(s) origins keep the existing parse path with zero behavior
change, and remote listeners reject listed custom-scheme origins.

* Clarify extension origin loopback authority boundary

* Stabilize skill catalog polling regression test

Wait for the initial polling baseline before mutating the Skill tree, then wait for the actual poll invalidation with bounded timeouts. Always stop the watcher when a wait fails.

Test-only, platform-neutral change; no runtime, config, state, or client compatibility changes. Verified 92 targeted tests, Ruff, slow initial/subsequent scan regressions, and timeout cleanup controls.

* test(ci): stabilize Windows legacy lock probes

---------

Co-authored-by: Hermes Agent <hermes@ai-wiki>
Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* refactor(webui): close legacy protocol paths and architecture gates (#1568)

* Bind Platform RPCs to generated contracts

* Bind strict RPC methods to generated contracts

* Freeze remaining WebUI gateway contracts

* Close WebUI transport debt gate

* Extract shared gateway config persistence

* Correct Gateway contract error metadata

* Bind remaining Gateway methods to generated contracts

* Extract shared artifact session scope

* Extract durable memory health projection

* Use shared run-context route projection

* Deepen session reset application boundary

* Avoid session reset adapter import cycle

* Extract shared log status projection

* Extract shared memory status projection

* Correct remaining Gateway contract error metadata

* Bind final Gateway methods to generated contracts

* Deepen manual session compaction boundary

* Extract shared readiness status projections

* Close WebUI raw HTTP transport paths

* Unify WebUI conversation event ownership

* Deepen Platform configuration mutations

* Deepen turn admission boundary

* Extract shared session event publisher

* Deepen Artifact Workbench application path

* Deepen R5 backend boundaries

* Make folded turn log the sole live projection

* Close WebUI protocol boundary leaks

* Close session backend protocol boundaries

* Close cross-RPC startup imports

* Deepen remaining protocol boundaries

* Tighten Platform application result types

* Type session application results

* Strengthen application port architecture gates

* Route cron mutations through typed commands

* Deepen ancillary Gateway runtime ports

* Clarify typed turn admission boundaries

* Type readiness collection boundaries

* Deduplicate generated contract binding adapters

* Deepen Platform runtime ports

* Align Gateway port result types

* Close Artifact HTTP transport and restore Desktop downloads

* Complete typed conversation and native turn boundaries

Finish Admission, Steer and PendingInputQueue business migrations through
typed Application interfaces and fixed native primitives. Remove their
legacy forwarding bodies while retaining receipt, epoch, cancellation,
attachment ownership and compatibility behavior.

Preserve the existing Usage, Conversation and Meta closure work and repair
regressions at the real adapter seams. Replace the explicitly withdrawn
Session domain line ceilings with complete ownership accounting; retain
F2, Sandbox, SessionMaintenance and RpcContext limits.

* Fix Contract test isolation and native lock probes

Keep the six real Gateway registration cases in the Gateway test suite so Contract-only CI does not import runtime dependencies. Preserve the cases and their assertions.

Probe the existing native Gateway lease in a lean subprocess, retaining the ten-second deadline and migration assertions. Verify free, busy and released lock states against GatewayPidLock.

* Preserve live steer capability and pending cancel revisions

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* Render global toasts above modal layers (#1455)

* Account physical ensemble provider calls (#1457)

* Account for physical ensemble provider calls

* Fix selector stream type narrowing

* perf(contracts): trim production validator artifacts (#1571)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* fix: stop retrying rate limits on one deployment (#1452)

* Consolidate settings and durable turn admission (#1572)

* Restore Gateway contract parameter fidelity

* Reuse narrow Gateway request capabilities

* Centralize settings policy and commit ordering

* Share durable turn activation and preserve compensation outcomes

* Register turn activation regressions in CI shards

* Share activation compensation regression scenarios

* Keep route feedback data local to its domain

* test: make cancellation and Windows CI ordering deterministic

Keep exact-abort result checks within the normal observation budget and use
explicit readiness barriers for MetaSkill, channel reconciliation, restore
lock contention, and concurrent owner registry writers. Test approval
extension with a controlled clock instead of short wall-clock sleeps.

Separate agent startup watchdogs from tool cancellation policy. Observe the
actual tool batch grace and bounded policy, and exercise single/batch grace
expiry with a controlled timer while retaining real outer watchdogs.

Release and drain asynchronous work and synthetic child processes on failure.
Production cancellation budgets and CI retry/shard policy are unchanged.

Validation: 142 passed, 16 platform/environment skips across the seven
related test files on native Windows; Ruff and git diff --check pass.

* fix(session): fence turns to durable session owners (#1550)

* fix(session): fence turns to durable session owners

* test(session): cover durable owner lifecycle

* fix(session): fence internal task admission

* test(session): update owner fencing doubles

* fix(session): preserve owner fencing across lifecycle stages

* fix(session): fence remaining owner-bound stages

* fix(session): require explicit owner contracts

* fix(session): fence durable completion callbacks

* test(session): update durable owner contracts

* fix(gateway): expose reset quiesce as storage busy

* fix(gateway): fence durable send owner adapters

* ci: assign subagent owner tests to windows shard

* ci: account owner helper in session lifecycle surface

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* feat(tools): add progressive tool disclosure (#1575)

* feat(tools): add progressive tool disclosure

* ci: assign progressive tool tests to core shard

* fix(gateway): close runner stream on turn exit and tolerate cross-Context scope teardown (#1570)

* fix(gateway): close runner stream on turn exit and tolerate cross-Context scope teardown

Every chat.abort left the turn's run generator to asyncio's async-generator
finalizer, which runs aclose() in a fresh Context where the run generator's
scope stack cannot reset its ContextVar tokens: each abort logged
"Task exception was never retrieved" with a nested ValueError chain, and
the subscriber-visible turn-terminal event could be lost (#1569).

- run_direct_turn closes the composed runner stream in its finally so the
  scope stack unwinds in the Context that entered it
- the five turn scopes (process ownership, sandbox policy, Git run mode,
  runtime pack, managed toolchain state) reset their tokens through a
  helper that tolerates cross-Context teardown as a backstop

Verified on a live loopback gateway: 5 aborts -> 5 orphan crashes on main,
0 crashes after this change, terminal events delivered on every abort.

* fix(gateway): appease ruff import order and mypy on close helper

CI on #1570 failed on the repo-wide ruff check (import order in the new
finalizer regression test) and would have failed mypy: wrap_stream returns
AsyncIterator, whose protocol has no aclose — use the same getattr idiom
stream_wrappers.py already uses.

* Close composed turn streams and preserve cleanup on repeated cancellation

* Group scope finalization coverage with stream wrapper tests

---------

Co-authored-by: Hermes Agent <hermes@ai-wiki>
Co-authored-by: lihongguang-0014 <hongguang.li@tokenrhythm.ai>

* fix(session): reject turns in isolated cron sessions (#1547)

Co-authored-by: mikemikimike <13286568797@163.com>

* ci(windows): sign release artifacts with DigiCert (#1480)

* ci(windows): sign release artifacts with DigiCert

* test(release): align contracts with DigiCert signing

* fix(release): validate signed Windows sources and independent audits

* test(release): fix POSIX signing fixtures and register Windows shard weights

* test(release): bound first-send cleanup and retain signed diagnostics

* fix(desktop): package Unicode tool search resources and audit signed candidates

* test(release): match native Windows install contracts and diagnose signed quit

* test(release): require concurrent recovery continuity and isolate routed quit

* test(release): require natural Electron exit across packaged gates

* test(release): compile fresh audit harnesses before installing artifacts

* test(release): capture bounded Windows wait chains after quit timeout

* test(desktop): use an owned process for shutdown telemetry fixture

* test(release): retain partial wait diagnostics and healthy process control

* test(release): compare quit with owned Electron debug transports

* test(release): capture bounded native stacks after Windows quit timeout

* test(release): handle native debugger signal termination in controls

* test(release): preserve filtered native collector failure metadata

* test(release): keep debugger input open for startup stack commands

* test(release): inspect SDK debugger capabilities before native controls

* fix(test): use the installed SDK debugger network symbol option

* test(release): diagnose debugger initialization on an owned empty process

* test(release): isolate SDK switch parsing before installing the candidate

* fix(test): follow measured CDB switch behavior instead of incorrect help

* fix(test): avoid unsupported detach-on-exit for noninvasive CDB

* test(windows): capture exit error dialog without suppressing it

* fix(desktop): ignore late renderer console events after window disposal

* test(windows): remove temporary exit investigation probes

* Diagnose release profile changes without exposing values

* Control the checkpoint receipt deadline test clock

* Avoid redundant Desktop startup locale writes

* Make Windows contract tests independent of runner scheduling

* Clean up signing credentials when environment export fails

* fix(cron): restore interactive sessions and label scheduled turns (#1579)

* fix(session): restore interactive automation conversations

Revert PR #1547 (23f9c83a902c323fca7c3578721e674092df0e09) and cover follow-up admission, queued replay, persisted ownership, and browser history recovery.

* fix(session): report cron conversations as interactive

* test(gateway): keep compaction fixtures within fallback token budget

* fix(cron): preserve scheduled message provenance

* test(ci): register cron provenance coverage in shard metadata

* fix(scheduler): fence reservation release at the write boundary (#1576)

* fix(scheduler): fence reservation release at the write boundary

* fix(scheduler): preserve newer concurrent edit timestamps

* ci: register reservation race test shard

---------

Co-authored-by: Kuang-xianxin <243476082+Kuang-xianxin@users.noreply.github.com>
Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* test(windows): bound recovery harness with a platform-aware watchdog (#1582)

* Preserve image inputs across configured model routes (#1577)

* feat: add image projection and attachment manifest primitives

* feat: preserve image turns across model capabilities

* Fix image replay and legacy routing compatibility

* fix: preserve image replay ownership across main integration

* fix: clarify replayed images and configured route candidates

* test: align image gateway harness and shard coverage

* Resolve routed image capability from deployment metadata

* Hide retired image model from routing settings

* Preserve selected canonical images across physical model requests

* Bind image analysis tools to the active deployment and turn budget

* Honor attachment persistence policy across ingestion and temporary image material

* Honor explicit image opt-outs when the follow-up gate is disabled

* Update image analysis fixtures for active deployment binding

* Check attachment paths in message text instead of debug repr

* test(desktop): track orphan Gateway exits by process identity (#1583)

* Simplify bundled skill catalog and routing (#1517)

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* chore: remove archived experiment control plane (D01) (#1589)

* docs: pin D01 archive provenance and deletion scope

* chore: remove archived experiment control plane (D01)

* docs: refresh archive provenance after engine repository move

* Preview uploaded chat images before and after sending (#1590)

* Preview uploaded images before and after sending

* Update attachment browser fixtures for session read contracts

* fix(webui): validate gateway handshake and session directory responses (#1585)

* build(contracts): publish sessions.list result validator

* fix(webui): validate gateway handshake and session directory responses

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* Resolve Skill sources and select immutable directories before downloading (#1591)

* ci: accelerate Gateway Contract generation without reducing coverage (#1595)

* ci: parallelize and consolidate Gateway Contract generation

* test: verify queued Contract compilers stop after failure

* ci: register parallel Contract test in shard timing metadata

* Remove retired runtime experiment steering (#1599)

* fix(webui): isolate router cards across replay and reconnect (#1598)

* fix(webui): promote provisional router cards

(cherry picked from commit 399349b4ebae773336a4ec15291bb87e1112048f)

* Keep router cards owned by replay attempts

* Keep legacy ensemble progress on the current router attempt

---------

Co-authored-by: mikemikimike <13286568797@163.com>

* Fix plan questionnaire waiting and terminal state recovery (#1597)

* Fix plan questionnaire waiting and terminal state recovery

* Run plan questionnaire regressions in recovery CI

* Keep questionnaire hydration cursors separate from Goal state

* fix(webui): enter draft before project hydration (#1602)

* fix(webui): enter draft before project hydration

* test(ci): include draft race in recovery manifest

* feat(desktop): add signed Windows installer handoff and cached update recovery (#1584)

* feat(desktop): verify and persist signed Windows installer downloads

* feat(desktop): hand off verified Windows updates after safe shutdown

* test(desktop): gate signed Windows handoff and native upgrade rehearsals

* test(desktop): validate Windows update handoff and fix update UX

* fix(desktop): refresh channels while retaining verified installer caches

* test(desktop): align update contracts with manual cache refresh

* test(desktop): cover OSS-only updates and clarify installer actions

* ci: support internal Windows-only signed rehearsals

* test(desktop): prepare native signed upgrade acceptance on Windows

* docs: describe native Windows audit preparation and evidence

* test(desktop): canonicalize retained audit fixture temp paths

* test(desktop): harden signed Windows native update audits

* test(desktop): validate native retained update interactions

* docs: record minimum signed update merge gate and native evidence

* ci: reuse validated queue suites and report queue failures to PRs (#1603)

* ci: reuse validated queue suites with complete fallback coverage

* ci: reject reduced queue coverage without an explicit proof

* Remove optional runtime steering experiments (#1604)

* Remove optional runtime steering experiments

* Complete retired runtime registration and test cleanup

* ci: remove retired composition helpers (#1608)

* Remove unused runtime, desktop, and WebUI code (#1607)

* refactor: remove unused runtime and UI code

* test: patch the active HTTP client in managed-network checks

* Remove optional tool projection experiments (#1605)

* Remove optional tool projection experiments

* Retire obsolete tiny-guard trace expectation

* refactor(engine): retire patch evidence ledger collection (#1611)

* feat(desktop): enable signed Windows installer handoff by default (#1606)

* test(desktop): add native GitHub-to-OSS update acceptance mode

* test(release): account for explicit signed update source fallback

* feat(desktop): default Windows installer handoff with manual opt-out

* docs(desktop): record bounded host acceptance for Windows activation

* Use shared tools for HTML annotations and restore saved versions directly (#1610)

* Use shared tools for HTML annotations and restore saved versions directly

* Preserve version identity across MIME aliases and fix CI checks

* Check adopted browser bounds against available window space

* Wait for native page readiness in installed HTML tests

* fix(webui): fence legacy turn events and verify New Task cleanup (#1613)

* test(webui): cover ensemble DOM cleanup on New Task

* fix(webui): reject stale legacy turn events before stream mutation

* Keep client sessions usable across Gateway connection interruptions (#1609)

* feat: preserve client continuity across gateway transport failures

* docs: record connection stability implementation and verification

* Record latest main merge check and validation boundaries

* Fix CI coverage selection, typed recovery state, and connection fixtures

* Keep delayed Hello metadata behind session recovery admission

* Recognize owned Node source excerpts in Desktop CI classification

* Make history hydration pagination test race-safe

* fix(artifacts): prevent duplicate attachments after custom-name publication (#1616)

* fix(artifacts): deduplicate automatic delivery by source version

Use successful publication source records to recognize an unchanged file
even when it was published under a custom display name. Compare the stored
entry hash and bundle digest before suppressing the automatic backstop,
and keep source/publication records isolated to each runtime turn.

Fixes #1164
Refs #1225

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* test(windows): bound signed audit orchestration with host startup headroom

The merge-queue Windows core job exceeded the full synthetic audit's
30-second subprocess budget. Allow 90 seconds only for the parametrized
Windows orchestration test while preserving its one-second observation
deadlines and all fail-closed assertions. Keep other helper calls at 30
seconds and attach captured output when a subprocess times out.

Validated the full audit contract file with four Windows xdist workers:
118 passed. Production audit and installer behavior are unchanged.

* Stop repeating generator hashes in Contract artifacts (#1621)

* refactor(engine): retire experiment-only diagnostic outputs (#1615)

* perf(engine): skip unconsumed runtime diagnostics

* perf(engine): defer inactive watchdog and repeat-call work

* refactor(engine): remove unused failure summary cache

* refactor(engine): retire experiment-only diagnostic outputs

* docs: document experimental diagnostic event retirement

* fix(ci): prefer Git Bash over Windows launcher aliases (#1623)

* fix(desktop): reject incomplete and stale Gateway packages (#1622)

* Discover TokenRhythm models on trusted subdomains (#1620)

* Fix Desktop manual reconnect through runtime-owned connection settings (#1625)

* Gate Windows upgrades on complete v0.5.4 migration history (#1624)

* Preserve native reasoning across tool calls and session replay (#1612)

* Preserve native assistant reasoning state across session replay

* Preserve native Anthropic replay blocks and fix Windows test IDs

* Complete Anthropic stream fixtures in request proof tests

* Align replay message copy indentation

* Keep retirement upgrade assertions aligned with the migration chain

* Enable WebSocket transport flow by default (#1627)

* Enable WebSocket transport flow by default

* Keep flow config tests in weighted shard

* Preserve user-selected thinking during recovery (#1628)

* Fix image validation, attachment ownership, and analysis recovery (#1632)

* Fix image admission and cross-task attachment recovery

* Honor attachment capacity before starting fusion

* Use valid image fixtures in capacity regressions

* Keep media regression fixtures consistent with admission contracts

* Remove interactive preview notice (#1633)

* Accept inert custom-provider stream epilogues (#1629)

* Add custom provider extra request body (#1630)

* Add custom provider extra request body

* Register custom extra body tests in Windows shards

* Remove retired Gateway RPC surface (#1635)

* Add consent-scoped reliability and growth telemetry (#1560)

* Add consent-scoped telemetry and dashboard

* Fix telemetry v2 CI regressions

* Honor CI telemetry suppression in desktop recovery test

* Fix telemetry CI platform regressions

* Add hourly reliability dashboard trend

* Add source version stability breakdown

* Include source revision in desktop reliability events

* Add actual-use feature telemetry

* Respect telemetry package boundary

* Fix telemetry milestone replay and performance turn counts

* Complete telemetry recovery and desktop turn aggregation

* Run growth lifecycle regressions in desktop CI

* Wait for background telemetry persistence in runtime test

* Update gateway validator role baseline for main

* Align contract inventory baselines with main

* Update compatibility lifecycle baseline

* Remove obsolete internal validation documents (#1636)

* Remove obsolete internal validation documents

* Remove benchmark evidence and report artifacts

* Remove links to deleted report artifacts

* Make Windows CI resolve native Git Bash explicitly

* Keep compaction fixture within portable token budget

* Allow Windows abort cleanup observation to settle

* fix(windows): isolate Node version probe exit code (#1643)

* fix(desktop): surface sandbox migration failures (#1645)

* fix(desktop): surface sandbox migration failures

* fix(gateway): tolerate legacy service containers

* Restore Desktop share export QR assets (#1646)

* fix(install): protect Windows source upgrades from running uv tools (#1647)

* fix(install): check Windows uv tool processes before source upgrades

* fix(install): keep source script parseable with Windows ANSI decoding

* feat: local-first HTML previews and persistent task workspaces (#1644)

* feat(session): persist per-task execution workspace bindings

* feat(preview): register workspace HTML sources and normalize paths

* fix(delivery): keep HTML out of implicit publication

* chore(prompt): centralize HTML preview guidance

* feat(webui): render workspace preview links

* feat(files): add preview resource file actions

* style(test): format workspace preview fixture

* fix(delivery): preserve channel handoff and simplify preview actions

* fix(workspace): inherit task bindings and settle uncommitted allocations

* fix(preview): reopen requested pages and preserve XHTML MIME

* test(delivery): add bounded acceptance harness and file action CI coverage

* test(ci): register local-first suites in Windows shard governance

* test(session): normalize project keys in Windows cleanup fixtures

* test(preview): extend deterministic task isolation and child fixtures

* test(preview): add real local-first UI acceptance journeys

* test(preview): declare fixture capacity and preserve early failures

* test(preview): verify canonical child tool receipts

* test(preview): capture sanitized client recovery diagnostics

* test(preview): gate UI acceptance on hydration contracts

* docs(test): record confirmed hydration protocol mismatch

* fix(webui): decode legacy safe mode in session metadata

* test(desktop): require observed legacy metadata compatibility

* docs(test): record strict protocol acceptance and Windows gates

* test: stabilize Windows gateway shard assertions

* fix(workspace): preserve task bindings across RPC and heartbeat

* fix(heartbeat): validate durable storage before workspace preparation

* fix(ci): isolate installer tooling preparation with bounded retries

* Require execution traces before rendering fusion receipts (#1653)

* Keep image history in the main model tool loop (#1652)

* Keep image history in the main model tool loop

* Fix Windows signtool test executable shim

* Stabilize Windows test fixture completion

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* fix: match sessions list --channel against the projected source fields (#1600)

* fix: match sessions list --channel against the projected source fields

`sessions list --json` projects each row with the canonical source
metadata built by chat.source.chat_source_metadata — source_kind,
channel_kind, surface — and leaves the plain `channel` key null:

    {"source_kind":"cron","channel_kind":"cron","surface":"cron",
     "channel":null}

_filter_sessions compared --channel against channel, last_channel,
lastChannel, source_channel and sourceChannel only. On a cron or webchat
row all five are null, so the comparison set collapsed to {""} and no
CLI value could ever match it: --channel cron returned zero rows while
the unfiltered listing showed the session. --agent and --status were
unaffected because they read fields that are populated, which is why the
command looked selectively broken.

Read the projected fields as well, keeping the existing keys so rows
that do carry an explicit `channel` are unchanged. Falsy values are now
skipped rather than coerced to "", so a null field can no longer put an
empty string into the comparison set.

Fixes #1538

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Register session filter tests in CI shard metadata

Assign the new session filter regression file to the gateway-sqlite shard using the documented provisional duration floor. Keep the unweighted-file budget and assignment guardrails unchanged.

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* fix(windows): retry legacy NSIS uninstall with a shorter temporary path (#1648)

* fix(windows): bound legacy NSIS uninstall retry environment

* fix(windows): restore installer environment before legacy uninstall starts

* Improve agent loop recovery and tool failure handling (#1637)

* Keep real tool failures available for autonomous recovery

Validation: 292 tests passed in the independent intermediate checkout.

* Retire heuristic agent interventions

Validation: 780 tests passed in the independent intermediate checkout.

* Separate task and tool execution deadlines

Validation: 220 tests passed in the independent intermediate checkout.

* Keep provider recovery on the active authority

Validation: 429 tests passed in the independent intermediate checkout.

* Preserve accepted messages when turn execution fails

Validation: 118 tests passed in the independent intermediate checkout.

* Bound tool output capture and retained logs

Validation: 195 tests passed, 1 skipped under existing platform conditions in the independent intermediate checkout.

* Match recovery authority to transmitted credentials

* Preserve encoded output and final diagnostics

* Clarify safe retries and independent progress

* Restore reference-backed tool failure guidance

* Bound managed provider recovery without a turn deadline

* Tighten recovery documentation and comments

* Clarify managed recovery timeout errors

* Reduce agent loop documentation and prompt noise

* Add browser coverage for agent recovery activity

* Remove flaky provider retry browser fixture

* Preserve retry deadlines and retained output bytes across platforms

* Keep recovered tool failures separate from task outcomes

* Make provider recovery test clocks deterministic and offline

* Make timeout output tests await child readiness

* Initialize telemetry storage before lifecycle race checks

* Simplify provider recovery and remove redundant agent guidance

* Align recovery snapshots with retired agent mechanisms

* Preserve complete execution logs with bounded retrieval

* Complete execution log contract validation

* Align run trace tests with content expansion labels

* Preserve output through slow writes and failed reads

* Use independent fallback when rate-limit wait cannot fit

* Remove retired internal timeout and output reservation wiring

* Align recovery tests with early fallback checks and process exit

* Keep non-stream compatibility failures on finite recovery

* Bound code execution previews while retaining log references

* Verify execution log previews with explicit LF and CRLF bytes

* Capture expected Goal settlement errors without traceback rendering

* ci: parallelize slow Windows shards with three workers (#1657)

* Improve search evidence previews and recover truncated web content (#1656)

* Preserve web search evidence and recover truncated page content

* Append the search snapshot callback after existing runtime fields

* Align search recovery with queued tool result storage changes

* Improve Gateway connection recovery UX (#1660)

* fix(webui): make chat recovery notices truthful

* fix(webui): make recovery copy automatic and actionable

* fix(webui): suppress invalid gateway recovery actions

* test: add isolated gateway ux harness

* fix(test): launch npm cmd on Windows

* fix(test): use gateway port option

* Fix recovery assertions and Windows Gateway UX harness

* fix(logging): prevent prompt content in default diagnostics (#1663)

* fix(logging): keep prompt content out of default diagnostics

* test(ci): register privacy regressions in the gateway shard

* docs: clarify Desktop and CLI installations (#1662)

* docs: clarify Desktop and CLI installations

* ci: retrigger checks for docs change

* Restore primary provider switching and Router synchronization (#1661)

* fix(desktop): preserve Router ownership through provider setup

* feat(setup): atomically save and activate provider profiles

* feat(webui): restore safe primary provider switching

* fix(webui): make primary provider state visible

* feat(router): complete primary routing refinement

* fix(ensemble): honor submitted lineup on first activation

* fix(webui): refine primary provider transition and action menu

* fix(webui): show primary activation settling state

* Fix Desktop provider switching and complete routing contracts

* Align Desktop provider conflicts with executable Router tiers

* Initialize CLI routing defaults before conflict validation

* Share Router default initialization with CLI configuration

* Update complete contract inventory and Desktop test anchors

* Keep primary transition validation behind Gateway adapters

* Align the session routing E2E fixture with its offline provider

* Clarify image analysis support in model ensemble settings (#1664)

* Clarify image analysis support in model ensemble settings

* test: make provider deadline cancellation deterministic

* fix(search): preserve Unicode terms in agent session search (#1655)

* fix(search): preserve Unicode session search queries

* fix(ci): register session search regression shard metadata

* fix(webui): preserve new task drafts on refresh (#1666)

* Unify telemetry uploads and add product activity reporting (#1650)

* Unify telemetry uploads and add product activity reporting

* Fix product activity contract CI baselines and notice typing

* Update contract inventory tests for product activity RPC

* Fix telemetry PR regression checks and profile dependency layering

* Restore onboarding error feedback container

* Stabilize onboarding submit E2E clicks

* Fix model identity context across routing mode changes (#1651)

* Fix execution identity across session routing modes

* Reproduce stale execution identity after provider fallback

* Project execution facts at physical request boundaries

* Cover routing transitions and execution contracts on macOS

* Preserve runtime field positions and deterministic acceptan…
QinLuza added a commit to QinLuza/opensquilla-QinLuza that referenced this pull request Sep 18, 2026
* Preserve JSON structure when redacting diagnostic bundles

* Close credential and JSONL boundary gaps in diagnostic bundles

* Redact compound credentials independently of header casing

* Redact namespaced compound credentials across casing variants

* Show physical models during router fallbacks (#1454)

* Show the physical model during router fallbacks

* Make terminal router browser assertions deterministic

* Track admitted fusion models and settle replay attempts

* fix: safely relocate apply_patch hunks across line-number drift (#1356)

* fix: relocate apply_patch hunk anchors across line-number drift

Follow-up to #957 for #911: when lines were inserted or removed above a
hunk, its contiguous context block merely shifts, but the strict anchor
still rejected the patch and pushed recovery onto the model. Search
outward from the declared anchor (one line at a time, like git apply) and
apply at the first position where the whole context block fits.

Deliberately unchanged, per the boundary pinned in #957: hunks whose
context is no longer contiguous anywhere (a blank line inside the hunk
window), leading indentation drift, and non-ASCII whitespace all remain
rejections. Pure-add hunks keep their declared position.

* Make patch relocation unambiguous and plan hunks before editing

* Exercise patch planning in persisted failure evidence test

---------

Co-authored-by: Shaun <249469326i-lang@users.noreply.github.com>
Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* Fix Python runtime routing and Windows Safe execution (#1453)

* Expose managed Python to Bubblewrap code execution

* Preserve workspace writes outside Python runtime assets

* Run packaged Python code through an internal child role

* fix(windows): avoid inherited ACL grants on tool ancestors

* fix(windows): report native sandbox timeouts distinctly

* fix(sandbox): distinguish Python traceback paths from denials

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* Bound tool failure recovery and finalize missing-runtime tasks (#1712)

* Bound tool failure recovery and report missing runtimes

* Preserve repair progress and finalization contracts

* test: allow Windows install rollback receipts to settle

* fix: let concurrent session storage initialization settle

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* fix: gate startup requests and require Windows dependency acceptance (#1713)

* ci: require packaged Windows dependency acceptance

* ci: build desktop before packaged cleanup contracts

* fix(webui): wait for gateway readiness before startup synchronization

* fix(webui): never replay an issued elevated-mode request

* chore(webui): consolidate compatible dependency, Pinia 4 and Router 5 updates (#1717)

* chore(webui): update sanitized content rendering dependencies

* chore(webui): refresh Vue and browser build tooling

* chore(webui): migrate Pinia to v4 with explicit devtools peer

* chore(webui): migrate Vue Router to v5

* docs(webui): attribute the Vue devtools peer

* chore(deps): consolidate compatible Python updates with CLI and SDK compatibility (#1718)

* chore(deps): consolidate compatible Python updates

* test(ci): register real Feishu SDK Windows coverage

* test(cli): align owner fencing fake with turn context

* test(channels): clean up owned Feishu SDK cache tasks

* test(desktop): validate certifi runtime floor semantically

* Fix DeepSeek model discovery and current Flash defaults (#1716)

* Fix DeepSeek model discovery and current Flash defaults

* Align DeepSeek live harness defaults with current Flash

* Preserve bounded gateway diagnostics in provider smoke assertions

* chore(desktop): align Node types and update ws within validated runtime (#1719)

* fix(gateway): isolate standalone compaction from next turn (#1715)

* test(windows): use native paths for pending attachment assertions (#1727)

* fix(cli): reject non-positive list limits (#1565)

* chore(toolchain): migrate compilers and generators; gate cold-start sidebar reads (#1726)

* chore(toolchain): migrate compiler and codegen with frozen contract isolation

* fix(ci): audit all mutually exclusive codegen dependency variants

* test(session): verify failed startup cleanup on both SQLite backends

* test(desktop): retain subprocess diagnostics for orphan cleanup

* fix(webui): wait for Gateway readiness before automatic sidebar reads

* Fix MCP stdio readline 64 KB limit for large JSON-RPC responses (#953)

* Fix MCP stdio readline 64 KB limit for large JSON-RPC responses

* Bound MCP stdio messages and preserve reader lifecycle

Retain large-response support while limiting each JSON frame to 16 MiB. Preserve LF and EOF semantics, clear process read-ahead on close/connect, and disconnect after an oversized frame. Cover framing boundaries and large initialize/list/call responses with synthetic subprocess tests.

---------

Co-authored-by: MENG Chao (mbp) <324410233@qq.com>
Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* chore(deps): bump the compatible-updates group across 1 directory with 2 updates (#1723)

Bumps the compatible-updates group with 2 updates in the /opensquilla-webui directory: [@vue/devtools-api](https://github.com/vuejs/devtools/tree/HEAD/packages/devtools-api) and [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/HEAD/packages/plugin-vue).


Updates `@vue/devtools-api` from 8.1.5 to 8.2.1
- [Release notes](https://github.com/vuejs/devtools/releases)
- [Commits](https://github.com/vuejs/devtools/commits/v8.2.1/packages/devtools-api)

Updates `@vitejs/plugin-vue` from 6.0.8 to 6.0.9
- [Release notes](https://github.com/vitejs/vite-plugin-vue/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-vue/blob/main/packages/plugin-vue/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-vue/commits/plugin-vue@6.0.9/packages/plugin-vue)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-vue"
  dependency-version: 6.0.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: compatible-updates
- dependency-name: "@vue/devtools-api"
  dependency-version: 8.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: compatible-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix(shell): preserve literal Python code on Windows Full Host (#1056)

* Stabilize long-running CI tests and desktop case cleanup (#1354)

* Reduce long-running CI test contention

* fix(ci): use available context for Electron cache

* fix(ci): avoid Windows shard command length limit

* fix(ci): target Windows venv executable

* Fix frozen Windows Desktop process-tree helper launch (#1336)

* Fix frozen Windows process-tree helper launch

* Fix frozen Windows helper readiness retries

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* fix(chat): preserve activity timeline order across refresh (#1343)

* fix(chat): preserve activity timeline order across refresh

* fix(chat): satisfy activity type and live detail contracts

* chore(chat): document terminal snapshot eviction race

* fix(chat): complete CI activity contracts

* fix(chat): preserve settled tool summaries

* fix(chat): align activity recovery CI contracts

* test(chat): assert localized activity tool labels

* Add autonomous HTML document editing loop (#1359)

* feat: add autonomous HTML document editing loop

* feat: add protocol-v4 candidate preview bridge

* fix: make prompt annotation selection lifecycle reliable

* Preserve annotation focus across document follow-ups

* Resolve PR code quality review findings

* Address latest PR quality findings

* Remove unused cancellation recovery assignment

* Stabilize chat scroll ownership across session changes (#1361)

* Improve Workbench divider hit target (#1363)

* Improve macOS Keychain startup recovery (#1362)

* Keep sidebar hover previews anchored for long titles (#1366)

* Fix Windows installer progress presentation (#1360)

* Fix Windows installer progress presentation

* Update installer release contracts

* Stabilize Windows process-tree fixture handshake

* Avoid joining asyncio executor workers in cancellation test

* Stabilize Windows orphan recovery cleanup deadline

* Stabilize approval deadline regression on Windows

* Stabilize long-task history evidence

* Fix desktop document edit turn bindings (#1364)

* feat(runtime-packs): add discard download action (#1365)

* feat(runtime-packs): add discard download action

* test(ci): serialize fallback gateway case

* Isolate usage model detail expansion by session (#1380)

* fix(cli): return nonzero after terminal agent errors (#1342)

* fix(cli): return nonzero after terminal agent errors

* test(cli): isolate invalid-key process profile locks

* Isolate Windows home for invalid-key CLI test

* Decouple desktop startup from gateway readiness (#1355)

* Decouple desktop startup from gateway readiness

* Add Desktop entrypoint to packaging fixtures

* Stabilize split WebUI entrypoints

* Align onboarding E2E with local Desktop shell

* Fix duplicate router cards after reconnect (#1384)

* Stabilize process-tree lifecycle checks (#1390)

* Stabilize process-tree lifecycle checks

* Make SQLite change-count assertions portable

* Remove unused legacy orange logo asset (#1387)

* Fix route-limited attachment history capacity admission (#1389)

* fix(router): project route-limited attachment history capacity

* test(router): cover route-limited attachment history capacity

* test(live): add TokenRhythm attachment capacity gate

* Run Windows shell process tests serially in CI (#1391)

* Persist historical router panel snapshots (#1386)

* Persist historical router panel snapshots

* Recover chat subscription after connection race

* fix(skills): verify digests through catalog paths (#1367)

Co-authored-by: kriptoburak <kriptoburak@users.noreply.github.com>

* Fix Windows Safe noop shell execution (#1388)

* Fix Windows Safe noop shell execution

* Fix Windows noop argv test expectations

* Stabilize concurrent Windows owner registry writes

* Stabilize HTML annotation proofs and picker rearming (#1392)

* Protect interrupted annotation drafts

* fix(artifacts): tolerate additive ancestor classes in annotations

* fix(desktop): reliably rearm annotation picker

* test(desktop): stress repeated annotation picker clicks

* fix(desktop): fence stale annotation geometry cleanup

* fix(desktop): atomically rearm HTML annotation picker

* fix(desktop): rearm picker after rejected annotation target

* fix(annotations): allow additive selected element classes

* fix(annotations): recover fenced picker handoffs

* test(annotations): make HTML case concatenation explicit

* test(artifacts): simplify bridge client stub

* feat(workbench): mark annotation editing as beta

* test(provider): make request proof compaction deterministic

* Prepare OpenSquilla 0.5.4 release (#1396)

* Prepare OpenSquilla 0.5.4 release

* Mark HTML document editing as beta

* Retry transient storage contention in artifact release E2E

* Make abort budget regression test deterministic

* Include runtime catalog in container builds (#1397)

* Fix desktop package verification boundaries (#1398)

* Align packaged first-send startup budget (#1399)

* Avoid packaged first-send reload race (#1401)

* Preserve packaged first-send probe across routes (#1402)

* Extend OSS mirror workflow timeout to 60 minutes (#1403)

* Decouple nightly health from merge CI (#1404)

* Remove unreachable agent-loop experiment code (#1385)

* Remove unreachable runtime and UI code (#1382)

* Consolidate CI planning and remove redundant lanes (#1405)

* Consolidate CI planning and remove redundant lanes

* Stabilize Gateway and Desktop shutdown CI

* Make abort deadline regression test deterministic

* Stabilize Windows noop and plan RPC tests

* Preserve Windows PowerShell startup cache

* Use prewarmed PowerShell cache in Windows contract

* Keep tool progress out of final answers (#1406)

* fix(cli): check the config key whichever way `config set` persists it (#1410)

Without `--config` the command wrote no file, so it skipped the key check
entirely and answered any dotted string with an export line. Two spellings
from the report show what that costs: `definitely.invalid` came back as
`export OPENSQUILLA_GATEWAY_DEFINITELY__INVALID=123`, and `gateway.port`
came back as `OPENSQUILLA_GATEWAY_GATEWAY__PORT=18823` — the field is
`port`, so the variable the gateway actually reads stayed unset. Neither is
merely useless output: an export line reads as confirmation that the setting
was understood, so the operator sets it and then goes looking for why
nothing changed. The persisting form refused both. Now the env form runs the
same check and exits 1 with the same message.

Making the two agree exposed the other half. Key validity was read off the
values in the document rather than off the schema, and TOML has no null, so
every field resting at its `None` default is absent from `to_toml_dict()`
and was refused as "Key not found" — `auth.token`, `llm.api_key`,
`compaction.model`, the agent timeout overrides, 58 in total, none of them
settable through this command at all. Validity now comes from
`GatewayConfig.model_fields`, and a schema-valid path creates the tables it
needs on the way down.

Mapping fields keep the old rule, because the schema cannot enumerate an
operator's agent ids or router tier names: those segments must already be
present in the document, so `squilla_router.tiers.c0.model` still resolves,
`...tiers.no_such_tier.model` is still refused, and a typo never invents a
half-formed entry. Every one of the 363 leaf keys the previous check
accepted is replayed against the new one in a test; none is now refused.

Closes #1383.


Claude-Session: https://claude.ai/code/session_01LgCn6RgA7fr4Fi1zTWcJt7

Co-authored-by: Claude <noreply@anthropic.com>

* Use merge-base for PR CI planning (#1420)

* Correct gateway port configuration examples (#1423)

* Keep session routing above active goals (#1425)

* Restore the latest unsent chat draft (#1427)

* Fix deleted subagent session cards (#1426)

* Validate provider credentials before onboarding save (#1428)

* Preserve terminal activity during stream pressure (#1429)

* Restart ready desktop gateways after unexpected exit (#1430)

* Keep unknown chat sends out of composer (#1424)

* Keep unknown chat sends out of composer

* Align annotation disconnect recovery coverage

* Refine annotation replay history assertion

* Retrigger CI after runner startup failure

* Retrigger CI after runner recovery

* Fix tool streaming overflow and resource activity presentation (#1432)

* Fix tool activity streaming and presentation

* Make search result targets collapsible

* Fix tool presentation dependency direction

* Align activity browser contracts with resource rules

* Wait for verified gateway replacement ownership

* Align orphan recovery contract with verified ownership

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* Route image capability by session mode (#1436)

* Cap RPC reconnect attempts (#1433)

* Retry interrupted history on replacement connections (#1434)

* Honor exact model repetition thresholds (#1443)

* fix(cli): give sessions export/delete/resume and bundle the selected profile (#1417)

`--profile qa` sets `OPENSQUILLA_PROFILE`, which moves
`default_opensquilla_home()`, which moves the resolved `config.toml`, which
carries the port that profile's gateway binds. `default_gateway_url()`
follows that chain, and `sessions list`, `show` and `abort` reach it through
`run_gateway_sync`.

Four call sites did not. `sessions_cmd._with_client` connected to a literal
`ws://localhost:18791/ws`, so `export`, `delete` and `resume` addressed the
default gateway whatever profile was selected — the reported `export` failure
with NOT_FOUND (#1379) is the visible half. `delete` is the half that is not
merely inconvenient: aimed at the wrong gateway it does not fail safe, it
operates on whatever is listening on 18791.

`bundle._live_enrichment` had the same literal (#1374). Everything else in a
bundle is read from the selected profile's home, so the `doctor` and
`channels` sections could describe a different gateway entirely, and the file
says nothing about it. A wrong live section is worse than no live section,
because the bundle still looks complete.

Both now call `default_gateway_url()`. It checks `OPENSQUILLA_GATEWAY_URL`
first, so the env override keeps outranking the profile exactly as before,
and with nothing configured it still resolves to the same release default.
The bundle's contract is untouched: `default_gateway_url()` is called inside
the block whose failure path already returns `{}`, so a dead or unreachable
gateway still yields a bundle without live sections rather than an error.

These four commands, and no others. `reset` and `mcp-server run` are still
profile-blind, but in both the literal is the default of a documented
`--gateway` option rather than an internal fallback, so changing it changes
`--help` and the flag's advertised contract. `reset` carries the same
state-mutating risk as `delete` and is the first of the two to move; both go
in their own reviewed change rather than riding along here.

Closes #1379.
Closes #1374.


Claude-Session: https://claude.ai/code/session_01LgCn6RgA7fr4Fi1zTWcJt7

Co-authored-by: RickyYii <237135932+RickyYii@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

* fix: stop counting packaged routing defaults as profile references (#1357)

Fixes #1297: a provider profile whose only 'references' were the packaged
openrouter router-tier preset and the dormant legacy static ensemble
selection_mode could never be deleted, because remove_llm_profile treated
those factory defaults as operator references.

Only operator-owned configuration now blocks removal: a tier counts when
its content differs from the packaged preset entry, and selection_mode
counts when ensemble_selection_configured reports it as operator-owned.
Explicit references — including a disabled ensemble's explicitly set
static mode — are still rejected exactly as before.

The defaults are never persisted and regenerate on every config load, so
removing the profile cannot dangle them.

Co-authored-by: Shaun <249469326i-lang@users.noreply.github.com>

* fix(webui): turn the Router off instead of surfacing router_provider_conflict on active-provider removal (#1411)

Removing the active provider promotes the replacement through the same
primary-swap path as activateProvider. When the Router is a custom/legacy
binding with cross-provider routing off and a tier still names the previous
provider, the backend rejects the removal with an untranslated
router_provider_conflict (the code is not in RPC_ERROR_KEYS, so the user sees
raw English instead of a guided choice).

Mirror activateProvider: detect the conflict up front against the replacement
and send routerAction: 'disable', which keeps the saved tiers and turns the
Router off so the removal succeeds. Report the same in the success toast via a
new providerRemovedRouterDisabled i18n key in all six locales.

Co-authored-by: freeaccount-create <freeaccount-create@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* Attribute listed models to the configured provider id (#1442)

`list_models` labelled every row with the wire dialect
(`_provider_kind`) or the adapter family (`provider_name`) instead of
the configured deployment identity (`provider_id`). Those three axes
diverge for 11 runtime-supported specs, so a `vllm` endpoint listed its
models as `openai`, `kimi_coding_openai` as `moonshot`, and
`byteplus_coding_plan` as `openai_responses`.

`models.list` compares its `provider` filter against that field
verbatim, so a mislabeled row was unreachable by its own configured id:
`opensquilla models list --provider vllm` returned nothing while
`--provider openai` matched a provider that was never configured.

Every other catalog consumer (pricing, subagent budgeting, router tier
facts, onboarding discovery) already resolves against the configured
`provider_id`, and the openai adapter's own usage/billing sites already
used `self.provider_id` — the listing paths were the outlier.

`OpenAIProvider`'s direct-construction fallback also moves from
`provider_name` to the resolved dialect: that adapter serves every
OpenAI-compatible dialect, so falling back to `provider_name` (always
`"openai"`) attributed a DashScope or OpenRouter instance to OpenAI,
which is exactly what the field exists to prevent. Three stream goldens
are regenerated for the resulting `DoneEvent.provider` attribution.

`_provider_kind` remains the wire dialect everywhere it belongs
(payload shaping, trace recording, install-id headers).

Fixes #1346

Third-party origin: none

Co-authored-by: Shaun <249469326i-lang@users.noreply.github.com>

* fix(cli): resolve the reset and mcp-server gateway instead of assuming it (#1418)

Follow-up to #1417, which fixed the four commands whose `localhost:18791`
was an internal fallback. These two are the remaining pair, and they differ:
the literal is the *default of a documented `--gateway` option*, so changing
it changes `--help` and the flag's advertised contract. That is why they were
held back for their own review rather than folded into #1417.

`reset` is the one that matters. It flushes the session's memory and rotates
its id, so aimed at the wrong gateway it does not fail a lookup — it mutates
whatever session key matches on 127.0.0.1:18791. A named profile's gateway on
another port was unreachable without spelling the URL out by hand, which is
the same defect #1379 reported for `sessions export`, on a command that
writes.

Both options now default to `None` and resolve in the body: an explicit
`--gateway` or `OPENSQUILLA_GATEWAY_URL` arrives as a value and is used
directly, so the top two rungs of the precedence chain are untouched; with
neither set, `default_gateway_url()` supplies the selected profile's
configured gateway, and falls back to the same release default as before.
`normalize_gateway_url("http://localhost:18791")` and
`default_gateway_url()` with nothing configured both yield
`ws://localhost:18791/ws`, so an unconfigured install is byte-identical.

The `--help` text now states the resolved default in words, since there is no
longer a literal for typer to print.


Claude-Session: https://claude.ai/code/session_01LgCn6RgA7fr4Fi1zTWcJt7

Co-authored-by: RickyYii <237135932+RickyYii@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: lihongguang-0014 <hongguang.li@tokenrhythm.ai>

* Keep workspace navigation on the current WebSocket (#1435)

* Keep workspace navigation on the current WebSocket

* Preserve long-history viewport through recovery

* test(webui): remove duplicate session handoff race matrix

* test(desktop): snapshot healthy session recovery metrics

* fix(gateway): make sandbox upgrade migration non-blocking (#1450)

* fix(gateway): simplify sandbox upgrade migration

* test: skip router E2E without hydrated LFS assets

* Coordinate Gateway WebSocket shutdown (#1451)

* Coordinate Gateway WebSocket shutdown

* Register WebSocket close tests in Windows shards

* Retry transient Windows loopback socket exhaustion

* docs: replace stale What's New sections with a Release Notes pointer (#1459)

The README carried release summaries for 0.5.0/0.4.1/0.2.1/0.2.0 while
the current release is 0.5.4, duplicating CHANGELOG.md content that was
no longer being maintained. Drop the per-version sections from all six
README translations and point to CHANGELOG.md and docs/releases/
instead.

* fix(ci): validate release contracts for README changes (#1462)

* refactor: establish typed sessions.list contract seam (#1460)

* feat(contracts): add generated sessions.list v4 contract

* refactor(gateway): route sessions.list through contract adapter

* refactor(clients): share sessions.list contract adapter

* refactor(webui): introduce session directory module

* chore(architecture): enforce RPC contract boundaries

* fix(contracts): stabilize generated hashes on Windows

* Preserve versioned session naming API roots (#1456)

* Harden session auto-naming prompts (#1466)

* refactor(contracts): generalize gateway contract generation (#1467)

* refactor(webui): establish private transport and contract architecture gates (#1468)

* refactor(webui): add private gateway transport seam

* refactor(gateway): consume generated method registry

* refactor(webui): add private HTTP transport gate

* refactor(webui): harden RPC boundary provenance

* refactor(gateway): harden contract registration invariants

* refactor(webui): make RPC provenance symbol-aware

* refactor(gateway): validate contract failure types

* fix(webui): cancel stale session count queries

* refactor(webui): trace HTTP debt by symbol provenance

* test(webui): harden HTTP provenance edge cases

* refactor(webui): expand HTTP wrappers by tainted call graph

* refactor(webui): harden private HTTP transport

* test(webui): close HTTP provenance edge cases

* fix(webui): harden RPC provenance architecture gate

* fix(webui): fence HTTP body lifecycle and F2 LOC budget

* test(ci): account for reviewed F2 foundation budget

* fix(webui): enforce HTTP body lifecycle cancellation

* fix(webui): close transitive RPC boundary leaks

* fix(webui): allow RPC factory barrels

* fix(webui): harden HTTP filename and body boundaries

* test(ci): account for reviewed HTTP hardening budget

* fix(webui): require native form body brands

* test(ci): tighten HTTP foundation line budget

* fix(webui): cancel HTTP response bodies on lifecycle end

* fix(webui): normalize HTTP request option boundaries

* test(ci): account for HTTP lifecycle foundation budget

* fix(webui): normalize HTTP endpoint inputs

* test(ci): register F2 gateway adapter shard

* refactor(sessions): add typed resolve contract seam (#1469)

* refactor(sessions): add typed resolve contract seam

* fix(contracts): emit browser-safe ESM validators

* test(contracts): import generated ESM with file URLs

* refactor(sessions): deepen session search application seam (#1470)

* refactor(sessions): deepen session search application seam

* docs(sessions): clarify search failure compatibility

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* feat(contracts): add sessions.search gateway contract adapter (#1471)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): route session search through domain adapter (#1472)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* fix(sessions): bound preview transcript reads (#1473)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(transcript): define application read seam (#1474)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* docs: add ChinaXiv link for Chinese technical report to READMEs (#1458)

The Chinese version of the technical report is now on ChinaXiv
(202608.00176); add it to the 2026-08-22 news entry in all six
README translations.

* refactor(gateway): route sessions.preview through application seam (#1475)

Rebase the verified S4b slice onto the latest origin/main README update.

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* test(gateway): lock chat history wire behavior (#1476)

Add executable v4 characterization fixtures and dispatcher/bootstrap tests before extracting the session history application seam. Keep production behavior and transport unchanged, and register the new tests in Windows shard governance.

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(application): add session history read seam (#1478)

Introduce a transport-neutral SessionHistoryApplication with narrow canonical and active transcript Ports. Preserve canonical preference, fallback pagination, cursor precedence, and fatal reader errors while leaving the existing Gateway handler and v4 wire path untouched. Add focused tests and Windows shard governance.

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(gateway): connect chat history to application seam (#1479)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(contracts): standardize sessions.changed event boundary (#1481)

* fix(webui): preserve legacy session change invalidations (#1482)

* refactor(webui): extract session lifecycle module (#1483)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): extract session routing domain seam (#1484)

Introduce a typed SessionRouting module and v4 adapter backed by language-neutral JSON Schema contracts. Keep legacy WebSocket wire aliases and errors inside the adapter, migrate ChatView and routing composable, and add generated Python/TypeScript validators, fixtures, compatibility tests, and architecture debt updates.

* refactor(contracts): define conversation event decoder seam (#1485)

* refactor(contracts): define conversation event decoder seam

Add the language-neutral v4 conversation event family Contract and deterministic Python/TypeScript generated artifacts. Keep canonical schema_version=1 and legacy unversioned payloads behind dormant adapters, with alias normalization, sequence metadata, unknown-event quarantine, and cross-language fixtures.

Do not change event producers, live consumers, WebSocket transport, runtime, or database behavior; the later Conversation Runtime slice will switch consumers after compatibility review.

* fix(contract): make conversation event codegen type-safe

Keep legacy payload validation structurally separate from the versioned base so the generated Pydantic models pass the repository-wide mypy gate. Refresh the Windows provisional duration inventory for the recent contract test files exposed by the full CI run.

* refactor: extract conversation runtime seams (#1487)

* refactor: centralize conversation transport and lease policy (#1488)

* refactor(webui): expose typed conversation event ingress (#1489)

* refactor(webui): centralize conversation event and subscription ownership (#1490)

* refactor(webui): share conversation runtime ownership (#1491)

* refactor(webui): extract bootstrap ownership coordinator (#1492)

* refactor(webui): extract bootstrap queue coordination (#1494)

* refactor(build): isolate WebUI artifact and preserve legacy consumers (#1493)

Rebased onto the current main after S12-C3.

* refactor(webui): extract TurnCommands seam (#1496)

* refactor(webui): extract TurnCommands seam

* test(ci): account for TurnCommands seam

* refactor(webui): contractize turn commands (#1499)

* refactor(webui): isolate pending input queue adapter (#1501)

* refactor(webui): isolate pending input queue adapter

* test(webui): include pending input adapter in composition

* test(webui): fix pending queue composition assertion

* refactor(webui): validate pending input wire at adapter boundary

* refactor(webui): isolate approval center contract (#1509)

* refactor(webui): isolate approval center contract

* fix(contracts): keep approval event version in union branches

* ci(windows): seed approval contract test duration

* refactor(webui): isolate goals status and set contract (#1510)

* refactor(webui): isolate goals status and set contract

* test(ci): register goals contract coverage

* refactor(gateway): register goals contracts (#1511)

* refactor(webui): own goal mode availability in module (#1512)

* refactor(goals): contract capability discovery (#1513)

* refactor(goals): isolate continuity contract boundary (#1514)

* refactor(goals): isolate continuity contract boundary

* fix(goals): keep contract alias typing explicit

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor: isolate Goal and Plan contract boundaries (#1521)

* refactor(adapter): add Goal and Plan domain seams

* refactor(webui): migrate Goal and Plan consumers

* docs(contract): define Goal and Plan migration boundary

* test(adapter): cover PlanCenter wire and event mapping

* refactor(webui): move plan capability checks into PlanCenter

* contract(goals-plans): add generated v4 method contracts

* refactor(goals-plans): register v4 command adapters

* test(ci): account for new contract test shard weights

* refactor(meta): isolate MetaRunCenter boundary (#1523)

* refactor(meta): isolate MetaRunCenter boundary

* test(meta): include MetaRunCenter in adapter composition

* refactor(platform): add configuration domain adapters (#1525)

test(platform): update adapter composition expectations

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(platform): complete WebUI domain boundaries (#1530)

* Fix F2 architecture ownership gate

* Complete platform domain boundaries

* Close Meta wire type leakage

* Isolate migration platform operations

* Route workspace operations through a catalog

* Wire platform adapters into the composition root

* Type platform gateway module factories

* Preserve session bootstrap priority for setup reads

* Test platform consumers through domain interfaces

* Stabilize shared-state CI coverage

* Refactor sandbox runtime domain boundaries (#1531)

* Refactor sandbox runtime domain boundaries

* Fix sandbox adapter typing and debt ledger

* Stabilize sandbox settings adapter fixture

* refactor(chat): migrate session and ancillary consumers behind domain seam (#1533)

* Refactor session consumers behind conversation seam

* Migrate chat ancillary consumers behind conversation seam

* Fix SessionConversation integration regressions

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): isolate read catalog domain boundaries (#1534)

* Add read catalog domain adapters

* Route read catalog consumers through domain interfaces

* Remove migrated read catalog transport debt

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): isolate runtime domain boundaries (#1535)

* Add cron and channel domain adapters

* Route cron and channel consumers through domain interfaces

* Remove migrated runtime transport debt

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(workbench): isolate artifact transport boundaries (#1537)

* Add ArtifactWorkbench contract and adapters

* Migrate ArtifactWorkbench consumers

* Tighten ArtifactWorkbench boundary gates

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* Close WebUI transport architecture boundaries (#1541)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* Close final WebUI domain transport boundaries (#1543)

* Close WebUI domain transport boundaries

* Enforce final WebUI boundary closure

* Satisfy architecture gate lint

* Update desktop usage boundary contract

* Update packaged usage client contract

* Fix Windows desktop retry classification

* Allow slow Desktop Gateway startup in recovery E2E

* Stabilize Desktop orphan ownership verification

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* fix(sandbox): initialize after gateway readiness and remove native warnings (#1527)

* fix(sandbox): initialize after gateway readiness without capability probes

* fix(sandbox): enforce explicit safe-mode admission

* fix(sandbox): replace native warnings with state-aware Safe selection

* test(channels): align ingress fixtures with global sandbox mode

* test(ci): account for merged domain adapter registrations

* test(gateway): align routing and meta fixtures with runtime contracts

* test(desktop): follow observability usage boundary

* test(ci): register sandbox startup shard weight

* test(ci): follow observability usage boundary

* test(desktop): drop retired sandbox auto-setup field

* refactor(session): isolate read lifecycle boundaries (#1551)

* Add Session read application contracts

* Move Session reads behind one lifecycle

* Remove legacy Session read facade

* Fix Session read recovery boundaries

* Align Session read recovery fixtures

* Bound Desktop recovery shutdown

* Make Windows Desktop teardown fail closed

* Record pre-drain Gateway termination

* Update V1 shutdown ordering contract

* Stabilize Windows CI timing and teardown

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(sandbox): isolate runtime domain boundary (#1555)

* Define SandboxRuntime v4 contracts

* Route sandbox use cases through application ports

* Migrate WebUI sandbox consumers to the domain runtime

* Keep sandbox contract tests dependency-minimal

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(session): isolate lifecycle domain boundary (#1557)

* Formalize session fork contracts

* Deepen session lifecycle boundaries

* Move session fork behind lifecycle adapter

* Fix workspace callback protocol variance

* Refresh Windows shard weights for domain tests

* Preserve Windows shard source metadata

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* refactor(webui): complete backend domain boundaries (#1559)

* Deepen Platform setup domain boundaries

* Deepen session maintenance boundaries

* Deepen turn admission boundaries

* Deepen pending input queue boundaries

* Deepen conversation ancillary boundaries

* Deepen agent catalog boundaries

* Deepen channel administration boundaries

* Deepen cron scheduler boundaries

* Deepen observability boundaries

* Deepen skill catalog read boundaries

* Deepen skill management boundaries

* Deepen skill proposal review boundaries

* Define Artifact Workbench document contracts

* Define Artifact Workbench resource contracts

* Route Artifact Workbench through domain adapters

* Deepen Artifact Workbench content boundaries

* Deepen Artifact Workbench platform boundaries

* Complete Artifact Workbench boundary closure

* Preserve chat bootstrap recovery ordering

* Extend Windows Contract CI budget

* Serialize nested Windows lock probes

* Make attachment routing tests tokenizer-independent

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* Preserve upgrade compatibility after the TokenRhythm organization migration (#1567)

* Preserve update compatibility after organization migration

* Tighten upgrade verification and CI coverage

* feat(gateway): let operator-listed extension origins reach a loopback… (#1548)

* feat(gateway): let operator-listed extension origins reach a loopback gateway

Browser extension runtimes attach a custom-scheme Origin (for example
chrome-extension://<id>) that is not an http(s) origin: it can neither match
the gateway's own origin nor survive _parsed_browser_origin, so listing it
in cors.allowed_origins never had any effect and every browser handshake
was rejected with 403 FORBIDDEN_ORIGIN.

Generalize the registered opensquilla-app://desktop precedent: an operator
who lists the exact non-http(s) origin in cors.allowed_origins lets that
origin reach a loopback gateway. The Origin header is browser-controlled,
so a hostile web page cannot forge it; the match stays exact ("*" is never
accepted), http(s) origins keep the existing parse path with zero behavior
change, and remote listeners reject listed custom-scheme origins.

* Clarify extension origin loopback authority boundary

* Stabilize skill catalog polling regression test

Wait for the initial polling baseline before mutating the Skill tree, then wait for the actual poll invalidation with bounded timeouts. Always stop the watcher when a wait fails.

Test-only, platform-neutral change; no runtime, config, state, or client compatibility changes. Verified 92 targeted tests, Ruff, slow initial/subsequent scan regressions, and timeout cleanup controls.

* test(ci): stabilize Windows legacy lock probes

---------

Co-authored-by: Hermes Agent <hermes@ai-wiki>
Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* refactor(webui): close legacy protocol paths and architecture gates (#1568)

* Bind Platform RPCs to generated contracts

* Bind strict RPC methods to generated contracts

* Freeze remaining WebUI gateway contracts

* Close WebUI transport debt gate

* Extract shared gateway config persistence

* Correct Gateway contract error metadata

* Bind remaining Gateway methods to generated contracts

* Extract shared artifact session scope

* Extract durable memory health projection

* Use shared run-context route projection

* Deepen session reset application boundary

* Avoid session reset adapter import cycle

* Extract shared log status projection

* Extract shared memory status projection

* Correct remaining Gateway contract error metadata

* Bind final Gateway methods to generated contracts

* Deepen manual session compaction boundary

* Extract shared readiness status projections

* Close WebUI raw HTTP transport paths

* Unify WebUI conversation event ownership

* Deepen Platform configuration mutations

* Deepen turn admission boundary

* Extract shared session event publisher

* Deepen Artifact Workbench application path

* Deepen R5 backend boundaries

* Make folded turn log the sole live projection

* Close WebUI protocol boundary leaks

* Close session backend protocol boundaries

* Close cross-RPC startup imports

* Deepen remaining protocol boundaries

* Tighten Platform application result types

* Type session application results

* Strengthen application port architecture gates

* Route cron mutations through typed commands

* Deepen ancillary Gateway runtime ports

* Clarify typed turn admission boundaries

* Type readiness collection boundaries

* Deduplicate generated contract binding adapters

* Deepen Platform runtime ports

* Align Gateway port result types

* Close Artifact HTTP transport and restore Desktop downloads

* Complete typed conversation and native turn boundaries

Finish Admission, Steer and PendingInputQueue business migrations through
typed Application interfaces and fixed native primitives. Remove their
legacy forwarding bodies while retaining receipt, epoch, cancellation,
attachment ownership and compatibility behavior.

Preserve the existing Usage, Conversation and Meta closure work and repair
regressions at the real adapter seams. Replace the explicitly withdrawn
Session domain line ceilings with complete ownership accounting; retain
F2, Sandbox, SessionMaintenance and RpcContext limits.

* Fix Contract test isolation and native lock probes

Keep the six real Gateway registration cases in the Gateway test suite so Contract-only CI does not import runtime dependencies. Preserve the cases and their assertions.

Probe the existing native Gateway lease in a lean subprocess, retaining the ten-second deadline and migration assertions. Verify free, busy and released lock states against GatewayPidLock.

* Preserve live steer capability and pending cancel revisions

---------

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* Render global toasts above modal layers (#1455)

* Account physical ensemble provider calls (#1457)

* Account for physical ensemble provider calls

* Fix selector stream type narrowing

* perf(contracts): trim production validator artifacts (#1571)

Co-authored-by: wailord <wailord@wailords-MacBook-Air-2.local>

* fix: stop retrying rate limits on one deployment (#1452)

* Consolidate settings and durable turn admission (#1572)

* Restore Gateway contract parameter fidelity

* Reuse narrow Gateway request capabilities

* Centralize settings policy and commit ordering

* Share durable turn activation and preserve compensation outcomes

* Register turn activation regressions in CI shards

* Share activation compensation regression scenarios

* Keep route feedback data local to its domain

* test: make cancellation and Windows CI ordering deterministic

Keep exact-abort result checks within the normal observation budget and use
explicit readiness barriers for MetaSkill, channel reconciliation, restore
lock contention, and concurrent owner registry writers. Test approval
extension with a controlled clock instead of short wall-clock sleeps.

Separate agent startup watchdogs from tool cancellation policy. Observe the
actual tool batch grace and bounded policy, and exercise single/batch grace
expiry with a controlled timer while retaining real outer watchdogs.

Release and drain asynchronous work and synthetic child processes on failure.
Production cancellation budgets and CI retry/shard policy are unchanged.

Validation: 142 passed, 16 platform/environment skips across the seven
related test files on native Windows; Ruff and git diff --check pass.

* fix(session): fence turns to durable session owners (#1550)

* fix(session): fence turns to durable session owners

* test(session): cover durable owner lifecycle

* fix(session): fence internal task admission

* test(session): update owner fencing doubles

* fix(session): preserve owner fencing across lifecycle stages

* fix(session): fence remaining owner-bound stages

* fix(session): require explicit owner contracts

* fix(session): fence durable completion callbacks

* test(session): update durable owner contracts

* fix(gateway): expose reset quiesce as storage busy

* fix(gateway): fence durable send owner adapters

* ci: assign subagent owner tests to windows shard

* ci: account owner helper in session lifecycle surface

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* feat(tools): add progressive tool disclosure (#1575)

* feat(tools): add progressive tool disclosure

* ci: assign progressive tool tests to core shard

* fix(gateway): close runner stream on turn exit and tolerate cross-Context scope teardown (#1570)

* fix(gateway): close runner stream on turn exit and tolerate cross-Context scope teardown

Every chat.abort left the turn's run generator to asyncio's async-generator
finalizer, which runs aclose() in a fresh Context where the run generator's
scope stack cannot reset its ContextVar tokens: each abort logged
"Task exception was never retrieved" with a nested ValueError chain, and
the subscriber-visible turn-terminal event could be lost (#1569).

- run_direct_turn closes the composed runner stream in its finally so the
  scope stack unwinds in the Context that entered it
- the five turn scopes (process ownership, sandbox policy, Git run mode,
  runtime pack, managed toolchain state) reset their tokens through a
  helper that tolerates cross-Context teardown as a backstop

Verified on a live loopback gateway: 5 aborts -> 5 orphan crashes on main,
0 crashes after this change, terminal events delivered on every abort.

* fix(gateway): appease ruff import order and mypy on close helper

CI on #1570 failed on the repo-wide ruff check (import order in the new
finalizer regression test) and would have failed mypy: wrap_stream returns
AsyncIterator, whose protocol has no aclose — use the same getattr idiom
stream_wrappers.py already uses.

* Close composed turn streams and preserve cleanup on repeated cancellation

* Group scope finalization coverage with stream wrapper tests

---------

Co-authored-by: Hermes Agent <hermes@ai-wiki>
Co-authored-by: lihongguang-0014 <hongguang.li@tokenrhythm.ai>

* fix(session): reject turns in isolated cron sessions (#1547)

Co-authored-by: mikemikimike <13286568797@163.com>

* ci(windows): sign release artifacts with DigiCert (#1480)

* ci(windows): sign release artifacts with DigiCert

* test(release): align contracts with DigiCert signing

* fix(release): validate signed Windows sources and independent audits

* test(release): fix POSIX signing fixtures and register Windows shard weights

* test(release): bound first-send cleanup and retain signed diagnostics

* fix(desktop): package Unicode tool search resources and audit signed candidates

* test(release): match native Windows install contracts and diagnose signed quit

* test(release): require concurrent recovery continuity and isolate routed quit

* test(release): require natural Electron exit across packaged gates

* test(release): compile fresh audit harnesses before installing artifacts

* test(release): capture bounded Windows wait chains after quit timeout

* test(desktop): use an owned process for shutdown telemetry fixture

* test(release): retain partial wait diagnostics and healthy process control

* test(release): compare quit with owned Electron debug transports

* test(release): capture bounded native stacks after Windows quit timeout

* test(release): handle native debugger signal termination in controls

* test(release): preserve filtered native collector failure metadata

* test(release): keep debugger input open for startup stack commands

* test(release): inspect SDK debugger capabilities before native controls

* fix(test): use the installed SDK debugger network symbol option

* test(release): diagnose debugger initialization on an owned empty process

* test(release): isolate SDK switch parsing before installing the candidate

* fix(test): follow measured CDB switch behavior instead of incorrect help

* fix(test): avoid unsupported detach-on-exit for noninvasive CDB

* test(windows): capture exit error dialog without suppressing it

* fix(desktop): ignore late renderer console events after window disposal

* test(windows): remove temporary exit investigation probes

* Diagnose release profile changes without exposing values

* Control the checkpoint receipt deadline test clock

* Avoid redundant Desktop startup locale writes

* Make Windows contract tests independent of runner scheduling

* Clean up signing credentials when environment export fails

* fix(cron): restore interactive sessions and label scheduled turns (#1579)

* fix(session): restore interactive automation conversations

Revert PR #1547 (23f9c83a902c323fca7c3578721e674092df0e09) and cover follow-up admission, queued replay, persisted ownership, and browser history recovery.

* fix(session): report cron conversations as interactive

* test(gateway): keep compaction fixtures within fallback token budget

* fix(cron): preserve scheduled message provenance

* test(ci): register cron provenance coverage in shard metadata

* fix(scheduler): fence reservation release at the write boundary (#1576)

* fix(scheduler): fence reservation release at the write boundary

* fix(scheduler): preserve newer concurrent edit timestamps

* ci: register reservation race test shard

---------

Co-authored-by: Kuang-xianxin <243476082+Kuang-xianxin@users.noreply.github.com>
Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* test(windows): bound recovery harness with a platform-aware watchdog (#1582)

* Preserve image inputs across configured model routes (#1577)

* feat: add image projection and attachment manifest primitives

* feat: preserve image turns across model capabilities

* Fix image replay and legacy routing compatibility

* fix: preserve image replay ownership across main integration

* fix: clarify replayed images and configured route candidates

* test: align image gateway harness and shard coverage

* Resolve routed image capability from deployment metadata

* Hide retired image model from routing settings

* Preserve selected canonical images across physical model requests

* Bind image analysis tools to the active deployment and turn budget

* Honor attachment persistence policy across ingestion and temporary image material

* Honor explicit image opt-outs when the follow-up gate is disabled

* Update image analysis fixtures for active deployment binding

* Check attachment paths in message text instead of debug repr

* test(desktop): track orphan Gateway exits by process identity (#1583)

* Simplify bundled skill catalog and routing (#1517)

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* chore: remove archived experiment control plane (D01) (#1589)

* docs: pin D01 archive provenance and deletion scope

* chore: remove archived experiment control plane (D01)

* docs: refresh archive provenance after engine repository move

* Preview uploaded chat images before and after sending (#1590)

* Preview uploaded images before and after sending

* Update attachment browser fixtures for session read contracts

* fix(webui): validate gateway handshake and session directory responses (#1585)

* build(contracts): publish sessions.list result validator

* fix(webui): validate gateway handshake and session directory responses

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* Resolve Skill sources and select immutable directories before downloading (#1591)

* ci: accelerate Gateway Contract generation without reducing coverage (#1595)

* ci: parallelize and consolidate Gateway Contract generation

* test: verify queued Contract compilers stop after failure

* ci: register parallel Contract test in shard timing metadata

* Remove retired runtime experiment steering (#1599)

* fix(webui): isolate router cards across replay and reconnect (#1598)

* fix(webui): promote provisional router cards

(cherry picked from commit 399349b4ebae773336a4ec15291bb87e1112048f)

* Keep router cards owned by replay attempts

* Keep legacy ensemble progress on the current router attempt

---------

Co-authored-by: mikemikimike <13286568797@163.com>

* Fix plan questionnaire waiting and terminal state recovery (#1597)

* Fix plan questionnaire waiting and terminal state recovery

* Run plan questionnaire regressions in recovery CI

* Keep questionnaire hydration cursors separate from Goal state

* fix(webui): enter draft before project hydration (#1602)

* fix(webui): enter draft before project hydration

* test(ci): include draft race in recovery manifest

* feat(desktop): add signed Windows installer handoff and cached update recovery (#1584)

* feat(desktop): verify and persist signed Windows installer downloads

* feat(desktop): hand off verified Windows updates after safe shutdown

* test(desktop): gate signed Windows handoff and native upgrade rehearsals

* test(desktop): validate Windows update handoff and fix update UX

* fix(desktop): refresh channels while retaining verified installer caches

* test(desktop): align update contracts with manual cache refresh

* test(desktop): cover OSS-only updates and clarify installer actions

* ci: support internal Windows-only signed rehearsals

* test(desktop): prepare native signed upgrade acceptance on Windows

* docs: describe native Windows audit preparation and evidence

* test(desktop): canonicalize retained audit fixture temp paths

* test(desktop): harden signed Windows native update audits

* test(desktop): validate native retained update interactions

* docs: record minimum signed update merge gate and native evidence

* ci: reuse validated queue suites and report queue failures to PRs (#1603)

* ci: reuse validated queue suites with complete fallback coverage

* ci: reject reduced queue coverage without an explicit proof

* Remove optional runtime steering experiments (#1604)

* Remove optional runtime steering experiments

* Complete retired runtime registration and test cleanup

* ci: remove retired composition helpers (#1608)

* Remove unused runtime, desktop, and WebUI code (#1607)

* refactor: remove unused runtime and UI code

* test: patch the active HTTP client in managed-network checks

* Remove optional tool projection experiments (#1605)

* Remove optional tool projection experiments

* Retire obsolete tiny-guard trace expectation

* refactor(engine): retire patch evidence ledger collection (#1611)

* feat(desktop): enable signed Windows installer handoff by default (#1606)

* test(desktop): add native GitHub-to-OSS update acceptance mode

* test(release): account for explicit signed update source fallback

* feat(desktop): default Windows installer handoff with manual opt-out

* docs(desktop): record bounded host acceptance for Windows activation

* Use shared tools for HTML annotations and restore saved versions directly (#1610)

* Use shared tools for HTML annotations and restore saved versions directly

* Preserve version identity across MIME aliases and fix CI checks

* Check adopted browser bounds against available window space

* Wait for native page readiness in installed HTML tests

* fix(webui): fence legacy turn events and verify New Task cleanup (#1613)

* test(webui): cover ensemble DOM cleanup on New Task

* fix(webui): reject stale legacy turn events before stream mutation

* Keep client sessions usable across Gateway connection interruptions (#1609)

* feat: preserve client continuity across gateway transport failures

* docs: record connection stability implementation and verification

* Record latest main merge check and validation boundaries

* Fix CI coverage selection, typed recovery state, and connection fixtures

* Keep delayed Hello metadata behind session recovery admission

* Recognize owned Node source excerpts in Desktop CI classification

* Make history hydration pagination test race-safe

* fix(artifacts): prevent duplicate attachments after custom-name publication (#1616)

* fix(artifacts): deduplicate automatic delivery by source version

Use successful publication source records to recognize an unchanged file
even when it was published under a custom display name. Compare the stored
entry hash and bundle digest before suppressing the automatic backstop,
and keep source/publication records isolated to each runtime turn.

Fixes #1164
Refs #1225

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* test(windows): bound signed audit orchestration with host startup headroom

The merge-queue Windows core job exceeded the full synthetic audit's
30-second subprocess budget. Allow 90 seconds only for the parametrized
Windows orchestration test while preserving its one-second observation
deadlines and all fail-closed assertions. Keep other helper calls at 30
seconds and attach captured output when a subprocess times out.

Validated the full audit contract file with four Windows xdist workers:
118 passed. Production audit and installer behavior are unchanged.

* Stop repeating generator hashes in Contract artifacts (#1621)

* refactor(engine): retire experiment-only diagnostic outputs (#1615)

* perf(engine): skip unconsumed runtime diagnostics

* perf(engine): defer inactive watchdog and repeat-call work

* refactor(engine): remove unused failure summary cache

* refactor(engine): retire experiment-only diagnostic outputs

* docs: document experimental diagnostic event retirement

* fix(ci): prefer Git Bash over Windows launcher aliases (#1623)

* fix(desktop): reject incomplete and stale Gateway packages (#1622)

* Discover TokenRhythm models on trusted subdomains (#1620)

* Fix Desktop manual reconnect through runtime-owned connection settings (#1625)

* Gate Windows upgrades on complete v0.5.4 migration history (#1624)

* Preserve native reasoning across tool calls and session replay (#1612)

* Preserve native assistant reasoning state across session replay

* Preserve native Anthropic replay blocks and fix Windows test IDs

* Complete Anthropic stream fixtures in request proof tests

* Align replay message copy indentation

* Keep retirement upgrade assertions aligned with the migration chain

* Enable WebSocket transport flow by default (#1627)

* Enable WebSocket transport flow by default

* Keep flow config tests in weighted shard

* Preserve user-selected thinking during recovery (#1628)

* Fix image validation, attachment ownership, and analysis recovery (#1632)

* Fix image admission and cross-task attachment recovery

* Honor attachment capacity before starting fusion

* Use valid image fixtures in capacity regressions

* Keep media regression fixtures consistent with admission contracts

* Remove interactive preview notice (#1633)

* Accept inert custom-provider stream epilogues (#1629)

* Add custom provider extra request body (#1630)

* Add custom provider extra request body

* Register custom extra body tests in Windows shards

* Remove retired Gateway RPC surface (#1635)

* Add consent-scoped reliability and growth telemetry (#1560)

* Add consent-scoped telemetry and dashboard

* Fix telemetry v2 CI regressions

* Honor CI telemetry suppression in desktop recovery test

* Fix telemetry CI platform regressions

* Add hourly reliability dashboard trend

* Add source version stability breakdown

* Include source revision in desktop reliability events

* Add actual-use feature telemetry

* Respect telemetry package boundary

* Fix telemetry milestone replay and performance turn counts

* Complete telemetry recovery and desktop turn aggregation

* Run growth lifecycle regressions in desktop CI

* Wait for background telemetry persistence in runtime test

* Update gateway validator role baseline for main

* Align contract inventory baselines with main

* Update compatibility lifecycle baseline

* Remove obsolete internal validation documents (#1636)

* Remove obsolete internal validation documents

* Remove benchmark evidence and report artifacts

* Remove links to deleted report artifacts

* Make Windows CI resolve native Git Bash explicitly

* Keep compaction fixture within portable token budget

* Allow Windows abort cleanup observation to settle

* fix(windows): isolate Node version probe exit code (#1643)

* fix(desktop): surface sandbox migration failures (#1645)

* fix(desktop): surface sandbox migration failures

* fix(gateway): tolerate legacy service containers

* Restore Desktop share export QR assets (#1646)

* fix(install): protect Windows source upgrades from running uv tools (#1647)

* fix(install): check Windows uv tool processes before source upgrades

* fix(install): keep source script parseable with Windows ANSI decoding

* feat: local-first HTML previews and persistent task workspaces (#1644)

* feat(session): persist per-task execution workspace bindings

* feat(preview): register workspace HTML sources and normalize paths

* fix(delivery): keep HTML out of implicit publication

* chore(prompt): centralize HTML preview guidance

* feat(webui): render workspace preview links

* feat(files): add preview resource file actions

* style(test): format workspace preview fixture

* fix(delivery): preserve channel handoff and simplify preview actions

* fix(workspace): inherit task bindings and settle uncommitted allocations

* fix(preview): reopen requested pages and preserve XHTML MIME

* test(delivery): add bounded acceptance harness and file action CI coverage

* test(ci): register local-first suites in Windows shard governance

* test(session): normalize project keys in Windows cleanup fixtures

* test(preview): extend deterministic task isolation and child fixtures

* test(preview): add real local-first UI acceptance journeys

* test(preview): declare fixture capacity and preserve early failures

* test(preview): verify canonical child tool receipts

* test(preview): capture sanitized client recovery diagnostics

* test(preview): gate UI acceptance on hydration contracts

* docs(test): record confirmed hydration protocol mismatch

* fix(webui): decode legacy safe mode in session metadata

* test(desktop): require observed legacy metadata compatibility

* docs(test): record strict protocol acceptance and Windows gates

* test: stabilize Windows gateway shard assertions

* fix(workspace): preserve task bindings across RPC and heartbeat

* fix(heartbeat): validate durable storage before workspace preparation

* fix(ci): isolate installer tooling preparation with bounded retries

* Require execution traces before rendering fusion receipts (#1653)

* Keep image history in the main model tool loop (#1652)

* Keep image history in the main model tool loop

* Fix Windows signtool test executable shim

* Stabilize Windows test fixture completion

---------

Co-authored-by: Open-Squilla <275096992+Open-Squilla@users.noreply.github.com>

* fix: match sessions list --channel against the projected source fields (#1600)

* fix: match sessions list --channel against the projected source fields

`sessions list --json` projects each row with the canonical source
metadata built by chat.source.chat_source_metadata — source_kind,
channel_kind, surface — and leaves the plain `channel` key null:

    {"source_kind":"cron","channel_kind":"cron","surface":"cron",
     "channel":null}

_filter_sessions compared --channel against channel, last_channel,
lastChannel, source_channel and sourceChannel only. On a cron or webchat
row all five are null, so the comparison set collapsed to {""} and no
CLI value could ever match it: --channel cron returned zero rows while
the unfiltered listing showed the session. --agent and --status were
unaffected because they read fields that are populated, which is why the
command looked selectively broken.

Read the projected fields as well, keeping the existing ke…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants