From ce60498a904d9da653bd67984b6fc77283cbcb6a Mon Sep 17 00:00:00 2001 From: claude_code Date: Sun, 21 Jun 2026 16:54:56 +0300 Subject: [PATCH] docs: track post-0.93.0 share-AI cap change + deferred stream-coverage debt Follow-ups from the multi-aspect review of the e5bc82c7..d4658d4c range. - CHANGELOG: document under [Unreleased] that the default per-workspace hourly public-share assistant cap was lowered 300 -> 100 after the v0.93.0 tag (#62). v0.93.0 shipped 300, so existing deployments that never set SHARE_AI_WORKSPACE_MAX_PER_HOUR drop to 100 on upgrade. - Recreate the still-open Section 3 (AiChatService.stream integration coverage) of the deleted feature-test-coverage-deferred.md as a focused backlog doc so the test debt stays tracked; Sections 1-2 are already closed by the integration harness (PR #115). Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 9 +++++ .../ai-chat-stream-integration-coverage.md | 33 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 docs/backlog/ai-chat-stream-integration-coverage.md diff --git a/CHANGELOG.md b/CHANGELOG.md index b1cb6ebb..43255596 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- **Public share AI: default per-workspace hourly assistant cap lowered + 300 → 100.** The limiter falls back to this default whenever + `SHARE_AI_WORKSPACE_MAX_PER_HOUR` is unset, so a `0.93.0` deployment that + never set the env var has its anonymous public-share assistant hourly cap + cut from 300 to 100 on upgrade. Set `SHARE_AI_WORKSPACE_MAX_PER_HOUR` to + keep the previous limit. (#62) + ## [0.93.0] - 2026-06-21 This release builds on the 0.91.0 AI foundation: admin-defined AI agent roles, diff --git a/docs/backlog/ai-chat-stream-integration-coverage.md b/docs/backlog/ai-chat-stream-integration-coverage.md new file mode 100644 index 00000000..c9c24cbb --- /dev/null +++ b/docs/backlog/ai-chat-stream-integration-coverage.md @@ -0,0 +1,33 @@ +# Отложенные интеграционные тесты `AiChatService.stream` + +Статус: **открыто.** Это остаток от прежнего документа +`feature-test-coverage-deferred.md` (хвост тест-плана PR #49). Два из трёх +его разделов уже закрыты новой интеграционной обвязкой против реального +Postgres/Redis (`apps/server/test/integration/`, PR #115): + +- ✅ **Раздел 1 — repo-тесты против БД.** Закрыт `ai-agent-roles-repo`, + `ai-chat-repo-find-by-creator`, `page-template-references-cascade`, + `workspace-repo-update-setting` (`*.int-spec.ts`). +- ✅ **Раздел 2 — достоверность Lua-окна cost-cap против реального Redis.** + Закрыт `public-share-workspace-limiter.int-spec.ts`. +- ⬜ **Раздел 3 (ниже) — полная интеграция `AiChatService.stream`.** Всё ещё + не реализован; держим запись открытой, чтобы тест-долг не потерялся при + удалении исходного документа. + +## Полная интеграция `AiChatService.stream` (рефактор R1-stream) + +`apps/server/src/core/ai-chat/ai-chat.service.ts`. В PR #49 извлечён и +покрыт только чистый `buildErrorAssistantRecord`. Полные интеграционные +сценарии всё ещё отложены: + +- **Запись чата, упавшего на первом ходу** (`onError`) — ассистентская + запись об ошибке должна сохраняться, даже когда первый ход стрима падает. +- **Жизненный цикл external-MCP клиентов** — клиенты закрываются и при + `throw`, и при `onFinish` (нет утечки соединений). +- **Анти-tamper: история восстанавливается из БД, а не из `body.messages`** — + клиент не может подменить историю через тело запроса. + +Эти сценарии требуют сидирования SDK `streamText` (инъекция/seam колбэков +`onError` / `onFinish` / `onAbort` + `res.hijack`). Отложено, чтобы не +дестабилизировать 287-строчный `stream()`; делать вместе с выносом testable +turn-pipeline.