Skip to content

Synth 0.10.1

Choose a tag to compare

@RamazanovDV RamazanovDV released this 15 Oct 16:10

0.10.1 (2026-10-15)

An engineering release without new subsystems: god-object decomposition (ADR-095), the split of
architecture documents into ADR and PROP, num_ctx configured through Synth, the native
/api/chat for Ollama and a series of security fixes (P0/P1/P2). 52 commits after v0.10.0.

God-object decomposition (ADR-095)

  • The seam extraction pattern was adopted: the facade keeps its public API, related blocks move
    into modules and methods delegate; one seam — one commit, every step under green typecheck/lint/test.
  • Step 1 — ui/lib/api/synthApi.ts: 2 596 → 161 lines (32 domain modules lib/api/* + a barrel,
    a verbatim move of 223 methods, a contract test of the surface).
  • Step 2 — shared/types/index.ts: 1 452 → 51 (12 modules types/* + a barrel; the public exports of
    @itphx/synth-shared are identical, 531/531).
  • Step 3 — ui/components/panels/LeftPanel.tsx: 2 230 → 59 (subcomponents and hooks in left-panel/*).
  • Step 4 — core/server/app.ts 2 014 → 380 and backend/app.ts 1 738 → 286 (modules app/*,
    the route mounting order is preserved byte for byte).
  • Step 5 — core/engine/tools/task.ts: 1 926 → 29 (7 modules engine/tools/task/*, exports 1:1).
  • Step 6 — core/engine/orchestrator.ts: 5 393 → 3 777 (9 modules orchestrator/* + phases/*,
    _processMessage 1 668 → ~980 lines).
  • Behaviour did not change: the full run (~5 084 tests) is green, each step is a separate commit that
    updates the per-package AGENTS.md and the roadmap. The remaining 6b-2 part (the Tool Use loop body) is deferred on purpose.

Architecture decisions: splitting ADR and PROP

  • The catalog is split into ADR — accepted decisions (43) and PROP — proposals with a due date
    (41: 32 actionable + 9 vision); the files are adr-NNN-*.md / prop-NNN-*.md, the ids and references
    were updated across the repository.
  • The rules live in the new docs/ARCH_DECISIONS.md: five document classes, "by default there is no
    document", an ADR no longer than a page, the history block; the proposal index and due dates are in docs/roadmap.md.
  • The checker scripts/adr-check.mjs (pnpm adr:check/pnpm adr:write) assembles the ADR/PROP index and
    runs in a dedicated docs workflow.
  • The bulky historical ADRs were compressed to one page and their as-built part moved into the spec homes:
    ADR-052 (415→60), ADR-046 (652→54), ADR-069 (608→59), ADR-070 (717→72), ADR-089 (601→49).
  • New proposals: PROP-091 (backup/restore/transfer), PROP-092 (instance lifecycle),
    PROP-093 (docs versioning), PROP-094 (observability and metrics), PROP-096 (background subagent sessions),
    PROP-097 (background processes), PROP-098 (steering), PROP-099 (memory footprint optimization).
  • Roadmap: the "Priority goals of release 0.11" section — PostgreSQL (+ a YDB assessment), operations and
    ops skills, memory optimization.

Providers and context window

  • num_ctx is now configured through Synth: the ProviderConfig.numCtx field (API POST/PATCH /providers,
    CLI synth config provider add --num-ctx, env SYNTH_PROVIDER_<NAME>_NUM_CTX) and it takes priority over
    the model's contextWindow.
  • The ollama provider type switched to the native /api/chat: a URL with /v1 is normalized
    (the suffix is stripped with a warning), because the OpenAI-compatible layer ignores options/num_ctx.
  • README/compose/LLM_PROVIDERS and the portal were updated: the recommended local model is qwen3.8:27b,
    with an explanation of the effective window and OLLAMA_CONTEXT_LENGTH.

Security

  • P0: the WS calls send_message/permission_reply/permission_hold/cancel now authorize by session
    visibility; /api/v2/fs/* uses authorizeProject (read/write separately); the backend session routes
    (export/notes/optimization/debug-system-message) are under canAccessSession.
  • P1: fail-closed for external paths (external_directory: ask, and deny in plan/strict);
    {dataDir}/secrets and {dataDir}/security are in the denied prefixes; shell-guard is fail-closed for
    $VAR/glob/$() and resolves $SYNTH_DATA_DIR.
  • P1: OIDC issuer/audience, fail-closed CORS (open CORS only with SYNTH_CORS_ALLOW_ALL=true),
    a Secure cookie by default, avatar containment by username, a rate limit on POST /me/identities/claim.
  • P2: an SSRF policy for web_fetch (private/loopback/link-local) with manual redirects (≤5 hops);
    docker-compose: SYNTH_API_KEY comes from .env, no hardcoding.
  • A gitleaks allowlist for confirmed false positives.

Reliability and fixes

  • FileMutex: acquisition is confirmed by mkdir — the ENOENT race between mkdir and stat no
    longer yields a "lock without ownership" (dropped ScheduleStore/FileLeader updates); a deterministic
    regression was added.
  • A terminal LLM error is persisted into the session (metadata.status=error) and kept out of the LLM context.
  • Providers API: the url/model/apiKey aliases, base_url validation, PATCH support.
  • Flakes stabilized: task-resume (a fresh session read instead of a stale snapshot), webhooks/service
    (drain() instead of setTimeout), UI SchedulerTab/EventsAdminSettings (waitFor/flush instead of empty act pauses).

Performance and UI

  • Code-splitting: the entry chunk went 2 024 → 420 kB (vendor groups, a separate themes chunk, lazy
    RightPanel tabs and App modals); heavy modals mount on first open while keeping the closing animation.
  • A WCAG AA contrast test across 62 themes was added (contrast.test.ts).

CI, build and publishing

  • The workflows were split: ci-docs (adr-check + docs-link-check over docs/** and **/*.md), ci —
    code/UI tests and pnpm audit (report-only); a regular push is checked by tests, while build and publishing
    happen only on a release tag.
  • A dedicated step publishes the GitVerse Release body (scripts/publish-release.mjs) instead of actions/create-release@v1.
  • GitHub is a mirror without Actions: the publish-github job pushes master:main and the tags and creates
    a GitHub Release; all three base images (synth, synth-backend, synth-ui) are published to gitverse.ru and ghcr.io (version tag only).
  • The stub package @itphx/synth-runner was removed (7 → 6 packages); Runner remains only in PROP-050.
  • The GitHub Release body is English (changelog.sh --lang en), together with the English "Installation" block.

Documentation

  • English documentation for the GitHub mirror: README.en.md, the docs/en/ catalog (ARCHITECTURE, API_V2,
    CONFIGURATION, HYBRID, UI-KIT, ROUTING, LLM_PROVIDERS, QUICKSTART, DEVELOPMENT, PUBLISHING, TROUBLESHOOTING,
    KEYCLOAK) and the mandatory glossary docs/en/GLOSSARY.md (RU→EN, product strings take priority).
  • A pair of release descriptions was introduced: docs/releases/<VERSION>.md (the GitVerse body) and
    <VERSION>.en.md (the GitHub body); scripts/changelog.sh gained the --lang and --out options.
  • Community files for the public mirror: CONTRIBUTING, CODE_OF_CONDUCT, SECURITY, SUPPORT, CHANGELOG,
    THIRD-PARTY-NOTICES, issue/PR templates.
  • The positioning was updated: "AI platform for team collaboration" (self-hosted); promises about the
    unimplemented opencode/cline engines were removed.
  • References to the t11 prototype were removed from the instructions and actionable places.
  • The dev docs were updated for the decomposition (per-package AGENTS.md, module maps).

Artifacts

  • npm: @itphx/synth*@0.10.1 (6 packages; npmjs.org and GitVerse Package Registry)
  • Docker: the base images are published to both registries (version tag only) — gitverse.ru/itphx/synth:0.10.1, gitverse.ru/itphx/synth-backend:0.10.1, gitverse.ru/itphx/synth-ui:0.10.1 and ghcr.io/itphx/synth:0.10.1, ghcr.io/itphx/synth-backend:0.10.1, ghcr.io/itphx/synth-ui:0.10.1
  • Helm: the synth chart 0.10.1

Installation

CLI (npm — from npmjs.org or the GitVerse Package Registry):

npm install -g @itphx/synth@0.10.1

Base Docker image from the GitHub Container Registry:

docker pull ghcr.io/itphx/synth:0.10.1
docker run -p 4300:4300 ghcr.io/itphx/synth:0.10.1

The primary image registry is gitverse.ru/itphx/synth:0.10.1;
all three base images (synth, synth-backend, synth-ui) are published to
both gitverse.ru and ghcr.io (version tag only).