diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index e9abf2e..ec2c6be 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -108,7 +108,7 @@
чистые функции), `agilePref` (запоминание вида в `localStorage` под ключом `sdlc-hub-agile`: `{метка: {backlog|sprint|kanban: вид}}`;
поиск и выбор спринтов не хранятся), `useAgileView` (хук состояния вида и поиска), `AgileToolbar` (панель фильтров), `EpicsPanel`
(панель «Эпики» бэклога и выбор эпика в узкой панели), `SprintPicker` (выбор спринтов), `ColumnsMenu` (скрытие колонок «Спринт» и
-«Kanban»). «Бэклог», «Спринт» и «Kanban» имеют фильтры, свёртку и скрытие колонок; «Бэклог» — панель эпиков, «Спринт» — выбор спринтов.
+«Kanban»). «Бэклог» — фильтры, свёртка секций, панель эпиков; «Спринт» — фильтры, выбор спринтов (в адресе `?sprint=`, не в `localStorage`), скрытие колонок; «Kanban» — поиск/исполнитель и скрытие колонок.
Данные — один запрос `GET /agile?project=<метка>` (`modules/jira/agile.py`); страницы только смотрят (фильтры и вид в Jira не пишут).
Модуль `wiki` (`web/src/modules/wiki/index.tsx`): страница «Вики» (`/app/wiki`): дерево (`Tree`) с поиском (`Search`), страница
diff --git a/openspec/changes/agile-web-polish/specs/web-app/spec.md b/openspec/changes/agile-web-polish/specs/web-app/spec.md
index e203284..bde860c 100644
--- a/openspec/changes/agile-web-polish/specs/web-app/spec.md
+++ b/openspec/changes/agile-web-polish/specs/web-app/spec.md
@@ -19,7 +19,7 @@
**Значок типа** SHALL различать по `issue_type` без учёта регистра: эпик («Эпик», «Epic», «Фича»), история
(«История», «Story»), задача («Задача», «Task»), ошибка («Ошибка», «Bug»), подзадача («Подзадача», «Sub-task»,
-«Subtask»); прочие и пустой тип — нейтральный значок. Значок — цветной квадрат с белым символом, у каждого вида свои
+«Subtask»); прочие и пустой тип — нейтральный значок. Значок — цветной квадрат с символом цвета `--color-text-on-primary`, контрастным в обеих темах, у каждого вида свои
цвет и символ (эпик — молния, история — закладка, задача — галочка, ошибка — круг, подзадача — два квадрата), в обеих
темах; название типа — в `aria-label` и подсказке.
diff --git a/web/e2e/agile.spec.ts b/web/e2e/agile.spec.ts
index b181d49..20235de 100644
--- a/web/e2e/agile.spec.ts
+++ b/web/e2e/agile.spec.ts
@@ -172,3 +172,17 @@ test("390×800: документ без горизонтальной прокр
expect(m.bottom, JSON.stringify(m)).toBeLessThanOrEqual(m.inner);
expect(m.sw).toBeGreaterThan(m.cw);
});
+
+test("панель фильтров на 1600 px: «Исполнитель» и поиск на одной строке, подпись видна (I-2, M-2)", async ({ page }) => {
+ await page.setViewportSize({ width: 1600, height: 900 });
+ await login(page, "/app/jira/sprint?project=AWPCA");
+ const search = page.getByRole("searchbox", { name: "Поиск по ключу или теме" });
+ const select = page.getByRole("combobox", { name: "Исполнитель" });
+ await expect(select).toBeVisible();
+ await expect(page.locator(".agile-toolbar__field").getByText("Исполнитель", { exact: true })).toBeVisible();
+ const mid = async (l: typeof search) => { const b = (await l.boundingBox())!; return b.y + b.height / 2; };
+ expect(Math.abs((await mid(search)) - (await mid(select))), "центры по вертикали").toBeLessThanOrEqual(2);
+ const bar = (await page.locator(".agile-toolbar").boundingBox())!;
+ const sel = (await select.boundingBox())!;
+ expect(sel.width, "выбор не растянут на строку").toBeLessThan(bar.width / 2);
+});
diff --git a/web/src/modules/jira/agile/AgileToolbar.tsx b/web/src/modules/jira/agile/AgileToolbar.tsx
index 83880a9..c0b93c1 100644
--- a/web/src/modules/jira/agile/AgileToolbar.tsx
+++ b/web/src/modules/jira/agile/AgileToolbar.tsx
@@ -12,9 +12,12 @@ export function AgileToolbar({ filter, setQ, set, onReset, assignees, showHideDo