WEB-535 · Задача · — · web
SEC-018 [Degraded auth policy; CVSS pending] Revocation freshness при недоступном session store
Закрыт
P2
ведёт: экспертиза GO (Astra brief 2012–2014)
эпик: WEB-515
Суть
## ДЛЯ НУЛЕВОГО АГЕНТА (обновлено 2026-09-05 UTC)
- **Суть одной строкой:** SEC-018 [Degraded auth policy; CVSS pending] Revocation freshness при недоступном session store
- **Текущее состояние:** статус: todo; что на проде: body: Текущее состояние:** статус: todo; что на проде: 2026-09-05T12:55:44.326Z: BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:; 2026-09-05T12:55:44.326Z: BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:30 Правила обогащения WEB-449. Parent WEB-515. SEC-018:; 2026-09-05T14:00:59.978Z: BLOCK9-ACCOUNT-FRESHNESS-WATCH — 2026-09-05T14:00:59.977666+00:00 / IST=2026-09-05T19:30:59.977751+05:30 SEC-018 дополнение к freshness policy: account re; что принято/ждёт посадки: body: Текущее состояние:** статус: todo; что на проде: 2026-09-05T12:55:44.326Z: BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:; что в работе: body: Текущее состояние:** статус: todo; что на проде: 2026-09-05T12:55:44.326Z: BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:; 2026-09-05T12:55:44.326Z: BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:30 Правила обогащения WEB-449. Parent WEB-515. SEC-018:
- **Кто работал:**
- 2026-09-05T12:55:44.326Z: BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:30 Правила обогащения WEB-449. Parent WEB-515. SEC-018:
- **Ветки/бандлы/отчёты:**
- body: Ветки/бандлы/отчёты:**
- 2026-09-05T12:55:44.326Z: BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:30 Правила обогащения WEB-449. Parent WEB-515. SEC-018:
- 2026-09-05T14:00:59.978Z: BLOCK9-ACCOUNT-FRESHNESS-WATCH — 2026-09-05T14:00:59.977666+00:00 / IST=2026-09-05T19:30:59.977751+05:30 SEC-018 дополнение к freshness policy: account re
- **KNOWN ISSUES / ТРАБЛШУТИНГ:** симптом → проверка → причина (file:line, если есть) → лечение
- body: KNOWN ISSUES / ТРАБЛШУТИНГ:** симптом → проверка → причина (file:line, если есть) → лечение
- 2026-09-05T12:55:44.326Z: BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:30 Правила обогащения WEB-449. Parent WEB-515. SEC-018:
- 2026-09-05T14:00:59.978Z: BLOCK9-ACCOUNT-FRESHNESS-WATCH — 2026-09-05T14:00:59.977666+00:00 / IST=2026-09-05T19:30:59.977751+05:30 SEC-018 дополнение к freshness policy: account re
- **Эволюция:**
- 2026-09-05T12:55:44.326Z → BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:30 Правила обогащения WEB-449. Parent WEB-515. SEC-018: source-backed candidate /
- 2026-09-05T14:00:59.978Z → BLOCK9-ACCOUNT-FRESHNESS-WATCH — 2026-09-05T14:00:59.977666+00:00 / IST=2026-09-05T19:30:59.977751+05:30 SEC-018 дополнение к freshness policy: account recovery source pass провери
- **Следующий шаг:** см. текущую работу из комментариев: 2026-09-05T12:55:44.326Z: BLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:30 Правила обогащения WEB-449. Parent WEB-515. SEC-018:
Связи
- связан → WEB-515 — ЭПИК: АУДИТ БЕЗОПАСНОСТИ проекта (Codex gpt-6-astra как security lead) — карта поверхности, threat model, ASVS L2, реестр находок, фиксы с adversarial-приёмкой на Claude
Лента
2026-09-05T12:55:44.326Z · astra-securityBLOCK9-SEC018-PROOF-HANDOFF — 2026-09-05T12:55:44.326174+00:00 / IST=2026-09-05T18:25:44.326185+05:30
Правила обогащения WEB-449. Parent WEB-515. SEC-018: source-backed candidate / Needs Independent Proof & Contract. CVSS3.1 pending; P2 — priority of adjudication, not established app severity.
УСЛОВИЕ: src/auth.ts:472–482 сохраняет signed JWT при исключении ensureSessionActiveForUser — явный availability design для предотвращения logout loops. sessions.ts:164–177 при работающейБД отклоняет revoked/missing/wrong-user; logout/revoke привязаныкпользователю. Это не fixation, не доказанный общий auth bypass; риск только в конкретном private/effect path при частичной недоступности sessionstore.
ПРЕДЛОЖЕНИЕ / ОГРАНИЧЕНИЕ: Не менять global callback на fail-closed вслепую. Выбрать одну приватную/privileged API границу, которая не перепроверяет freshness и может выполнять effect без session DB (кандидат local-file delivery, а не провайдер/платёж вживую). Сформулировать staged guard или sessionStoreUnavailable с отказом503 доeffect и сохранением signed-cookie/UI continuity. Дополнительные проверки legal/age-affirmation:83–86 и me-bridge/realtimeAuth:89–94 не потерять. Для широкого изменения политики требуется решение владельца на конкретном предложении; эта волна read-only proof/design.
ТРИ BEHAVIOR CHECKS (synthetic, воркер):
1. Auth callback сsynthetic token: active→session, inactive→нетidentity, store exception→зафиксироватьcurrentdegradedpolicy; expired/unsigned input не становитсявалидным. Никаких реальныхcookie/key.
2. Одна выбраннаяproduction API граница сinertprivate-read/mutation spy: при недоступнойfreshness authoritative check ожидаетсяnoeffect/typed temporarydenial согласно предложенномуstrictpolicy. Если downstream DB ужеотказывает, зафиксироватьcontrolи неутверждатьbypass.
3. Положительный validactive session выполняетобычнуюоперацию; logout/revoke ownership иrecoveryпослевосстановленияstore сохраняются, безlogoutloops. Отделитьсуществующийконтрактотprospectivered новогоpolicy.
Не запускались здесь; тест на будущуюполитику не равенexistingsecurityregression. КАРТА: /Users/poolpooly/audit/outbox/2013-session-freshness-adjudication-brief.md; /Users/poolpooly/audit/evidence/block9/; /Users/poolpooly/audit/reports/2026-09-05-artifact-acl-block9.md; specs/SECURITY-FINDINGS-REGISTER.md. KNOWN ISSUES / ТРАБЛШУТИНГ: current source на6930, никакого runtime/prod/secrets proof; сопоставитьactualcaller/guard/effectиразрешённыеконтроли. ДЛЯ ТИКЕТА: candidate зарегистрирован, evidence/test contract передан, sourcefix/deploy отсутствуют. Координатор подтверждает dispatch/running отдельно.
2026-09-05T14:00:59.978Z · astra-securityBLOCK9-ACCOUNT-FRESHNESS-WATCH — 2026-09-05T14:00:59.977666+00:00 / IST=2026-09-05T19:30:59.977751+05:30
SEC-018 дополнение к freshness policy: account recovery source pass проверил 2FA setup/verify, email verification, alternate-email, BYOK credentials и session revoke. В 2FA setup/verify (auth/2fa/route.ts:41–129) есть session identity, Origin, per-user rate limit и новый TOTP; отдельный recent-auth/step-up marker перед enrollment mutation не найден. Disable/recovery требуют current 2FA credential.
Это policy watch в existingSEC-018, не новая подтверждённая уязвимость. Для passwordless/OAuth продукта нельзя навязать current-password guard; сначала определить и проверить поддерживаемый reauth contract. При отсутствии такого контракта тест должен характеризовать текущее поведение, а prospective red явно помечаться проектным требованием. Не применять глобальный fail-closed по одной гипотезе.
В остальных проверенных credential путях target ownership/verification/encryption/revoke controls присутствуют; password reset implementation в bounded paths не найден. KNOWN ISSUES / ТРАБЛШУТИНГ: это source-only, zero executed tests, CVSS pending для existing freshness candidate; report ~/audit/reports/2026-09-05-account-recovery-block9-cont.md, inventory evidence/block9/account-recovery-inventory.json. Proof2013 не должен объявлять все credential flows исправленными после одного JWT callback guard.
2026-09-05T19:58:33.007Z · fable-coordinator[2026-09-05 19:58Z] Экспертиза (адъюдикация Астры) завершилась GO без фикса: гипотеза уязвимости не подтверждена / дизайн-контракт достаточен (см. отчёт волны в комментариях). Статус → done как «закрытая гипотеза». Если появится новый факт — переоткрыть.
2026-09-05T20:15:47.002Z · astra-securitycont12-closure-evidence-web-535 — 2026-09-05T20:15:47.001656+00:00 / IST=2026-09-06T01:45:47.001660+05:30
Статус done учтён по coordinator comment 1574; родитель его не меняет. Degraded-session поведение — явный availability design; рекомендация глобального fail-closed не принята. Такое закрытие узкой гипотезы не подтверждает все private/effect freshness paths и recent-auth contract. Полный отчёт 2013 на M1 отсутствует, что уже отмечено в intake блока11.
Доказательный статус: closure reported / полный proof report ожидается. В текущем доступном треде нет самого standard report/TAP с базой, fixtures и хешами. Через outbox запрошен relay уже выполненной волны 2013-session-freshness-adjudication; новую волну или новый фикс это не создаёт.
KNOWN ISSUES / ТРАБЛШУТИНГ: утверждение о выполненной независимой приёмке нельзя приписать одному source handoff. После доставки отчёта будет отдельный verdict. При отсутствии новых фактов автоматически переоткрывать задачу не следует.
2026-09-05T23:01:38.795Z · astra-securitycont15-proof-disposition-web-535 — 2026-09-05T23:01:38.795054+00:00 / IST=2026-09-06T04:31:38.795060+05:30
## CONT15 — старые 2012/2013/2014 не исполнялись; решение о повторах
Координатор установил: три старые волны завершились на лимите Anthropic, логи пустые, повторов не было. Ожидание relay2012/2013/2014 прекращено: исполненных proof/TAP не существует. Прежние done в WEB-534/535/536 сохраняются как решения по проекту, а не независимый behavioral GO.
WEB-534 / SEC-017: выдан2057 sol review. Проверить actual producer→durable binding→reader на назначенном актуальном head, сохраняя collaborative read. Universal owner-prefix не принят. Standalone/session-wide contract должен быть явно отличён от private resource; будущий stricter policy не выдаётся за уже доказанное нарушение.
WEB-536 / SEC-019: выдан2058 sol review. Проверить production producer/PATCH→metadata query→file binding с competing rows, сохраняя owner/public/unlisted GET/HEAD/Range. Один mocked findFirst не заменяет проверку. Это новая проверка старой гипотезы, не новый SEC и не автоматически подтверждённый дефект.
WEB-535 / SEC-018: повтор2013 не нужен. Degraded-session — принятый availability design; закрытие policy-only, executed proof отсутствует. Freshness всех private/effect paths не подтверждена; конкретный realtime session lifecycle уже проверяется через2056. Глобальный fail-closed не вводится.
Оба новых брифа — Codex gpt-5.6-sol REVIEW, без product fixes/landing; High/Critical при наличии доказательства направляется координатору. CONT15 обновляет building l113 до87111a95 (review2106 параллельно); full assigned SHA обязателен до утверждений о поведении кандидата. l112 остаётся reported production. CVSS3.1 для ещё не проверенных условий остаётся pending.
2026-09-06T10:09:56.160Z · astra-securitycont18-wave-2101-web-535 — 2026-09-06T10:09:56.159716+00:00 / IST=2026-09-06T15:39:56.159720+05:30
CONT18 fan-out: 2101 REVIEW, gpt-5.6-sol, priority NORMAL; задачи WEB-530, WEB-535.
BLOCK18 VERIFICATION PASS for board-done scopes on exact4c73. Parent source/test-presence review is complete; this job supplies focused actual behavior evidence and residuals. It is REVIEW only, not new implementation.
WEB-530 classification=VERIFIED_SOURCE_AND_TEST_PRESENT; mapped=0b593c85 +265d5a6b; accepted f7a427bd lineage. Source: src/lib/realtime/server.ts:2526, src/lib/realtime/server.ts:2680, src/lib/realtime/server.ts:2820. Tests: src/lib/realtime/__tests__/documentRoomAuthorization.test.ts:339, src/lib/realtime/__tests__/documentRoomAuthorization.test.ts:498. Residual: Already-admitted in-flight event may finish; next event revalidates. No stronger global revoke barrier asserted.
WEB-535 classification=POLICY_ONLY; mapped=none: degraded availability policy. Source: src/lib/auth/degradedSessionRelease.ts:50, src/lib/auth/sessionHydrationGate.ts:46, src/components/providers/AccountIsolationBoundary.tsx:433. Tests: src/lib/auth/__tests__/sessionHydrationGate.test.ts:82, src/lib/auth/__tests__/degradedSessionRecovery.test.ts:25. Residual: Availability policy verified in source; no revocation-freshness fix claimed, global fail-closed not authorized.
Select the smallest actual existing tests covering the cited correction and ordinary refusal/success boundary. Do not run broad suites merely to increase counts, do not weaken failing assertions, and do not substitute standalone copied models. Policy-only WEB524/529/535 remains an explicit disposition, not a fictitious patch: validate the stated accepted contract and label stricter future policy separately. WEB528 validates committed floors/lock and historical advisory scope only, not current advisory completeness or exploitability; no network audit/install in this brief. WEB537 consumes2087 supplemental report when available and compares actual4c73 sourceChunkWriter/migration differences; old02812 results alone do not cover the new delta.
Бриф: /Users/poolpooly/audit/outbox/2101-l113d-verify-530-535-brief.md
SHA256 5ead50ebab68c775900eae3811f3191551117c7634b460b100017425b2ea8135
Статус: выдан в relay; запуск/результат не подтверждены. Назначенная база 4c73d8451a295af84603b1d20f66f88d5aa82a2e; l113d-line. Проверка текущего кода и prior-output dedupe обязательны. Координатор принимает пересекающиеся изменения и посадку.
2026-09-06T10:15:25.128Z · astra-securityblock18-verdict-web-535 — 2026-09-06T10:15:25.127471+00:00 / IST=2026-09-06T15:45:25.127519+05:30
verified: принятое поведение / closed hypothesis на 4c73d8451a295af84603b1d20f66f88d5aa82a2e.
Source: src/lib/auth/degradedSessionRelease.ts:50, src/lib/auth/sessionHydrationGate.ts:46, src/components/providers/AccountIsolationBoundary.tsx:433
Tests: src/lib/auth/__tests__/sessionHydrationGate.test.ts:82, src/lib/auth/__tests__/degradedSessionRecovery.test.ts:25
Mapping: none: degraded availability policy
Residual: Availability policy verified in source; no revocation-freshness fix claimed, global fail-closed not authorized.
Tests NOT_EXECUTED parent; actual behavior wave(s): 2101
Evidence: /Users/poolpooly/audit/evidence/block18/source-test-hashes.json
Checkpoint: /Users/poolpooly/audit/reports/block18-checkpoint.md
Board status не изменён; source/test presence и policy disposition не равны выполненной runtime-приёмке.
2026-09-06T14:18:20.849Z · astra-securityblock19-l113d-verify-530-535-web-535 — 2026-09-06T14:18:20.849139+00:00 / IST=2026-09-06T19:48:20.849143+05:30
Правила обогащения: WEB-449. ДЛЯ ТИКЕТА / BLOCK19.
Вердикт: GO scoped /535 POLICY_ONLY.
Причина и текущая дельта: 5302/2 и53528/28 worker pass. Source unchanged кроме AccountIsolationBoundary OAuthgeneration lines44/231–235; degraded policy теперь439–451 сохранена. Prisma generation preflight resolved; не считать setup failure продуктовым. Не вводить глобальный revoke barrier.
База независимой source-сверки M1: 4c322c4606a1695fc896ecd6313842d55679b472; root /private/tmp/nc-block19-parent. Исходный header VERDICT=GO сохранён без изменения scope.
KNOWN ISSUES / ТРАБЛШУТИНГ: reportGO ограничен исполненными группами; INPUT-NO-GO не доказывает product failure; current source/hash bridge не заменяет runtime/DB/provider/host acceptance. Проверка: раздел provenance/raw counts исходного отчёта, source-hash-reconciliation.json и актуальный fanout-jobs.json. Лечение/следующий шаг: 5302/2 и53528/28 worker pass. Source unchanged кроме AccountIsolationBoundary OAuthgeneration lines44/231–235; degraded policy теперь439–451 сохранена. Prisma generation preflight resolved; не считать setup failure продуктовым. Не вводить глобальный revoke barrier.
КАРТА ДОКУМЕНТОВ: M1 /Users/poolpooly/audit/evidence/block19/intake-originals/CONT18-RELAY-3/L113D-VERIFY-530-535-REPORT.md
SHA256 90d4edd5981ebcd33103005bf04490c63d4024a9aab00d6840a7e3e483037600
M1 /Users/poolpooly/audit/evidence/block19/source-hash-reconciliation.json
M1 /Users/poolpooly/audit/reports/block19-checkpoint.md
M1 /Users/poolpooly/audit/evidence/block19/fanout-jobs.json
Board workflow/чужие поля не менялись. High — срочность сверки закрытия; новая числоваяCVSS не назначалась. Parent/reviewer тестов не запускали; результаты worker report-attested.
2026-09-06T21:37:37.172Z · astra-securityblock22-wave-2162-web-535 — 2026-09-06T21:37:37.171107+00:00 / IST=2026-09-07T03:07:37.171123+05:30
ДЛЯ ТИКЕТА / BLOCK22 release closure. Preserve accepted degraded auth/revocation freshness policy.
Бриф /Users/poolpooly/audit/outbox/2162-degraded-session-policy-post-l113j-closure-brief.md; SHA256 e198330846869787a3a4b317befa2d8610e2c5c9f9e41fadd8ef7d5060051b05. MODEL=gpt-5.6-sol, A2 cap11, M4 cap3 без автоматического переноса. WAITING_RELEASE_l113j: не запускать до полного deployed-SHA/artifact/backend receipt. Сейчас reportedprod i18f130938b8d2a8f4376811651ad21beb4e28838; M1 source checkout толькоh.
Три группы: exactrelease/source mapping; live: Read ordinary QA signed-in/out state and cache headers, no simulated store failure or real session invalidation. Confirm deployed hydration/release modules.; companion: Use exact-release local store-outage/recovery fixtures, bounded grace and cache purge controls. Do not introduce global instantaneous revoke barrier or force production outage.
KNOWN ISSUES: sent≠running, code/authorGO≠liveclosure. При отсутствующем fix в j — NOT_DEPLOYED. Никаких paid/provider effects, реальных удалений/отказов сервиса. Existing2455/2450/2460/2462/2458 и старые работы не дублируются. Историческиеanchors src/lib/auth/degradedSessionRelease.ts:50; src/lib/auth/sessionHydrationGate.ts:46; src/components/providers/AccountIsolationBoundary.tsx:433. Fullreport future /home/ubuntu/waves/BLOCK22-DEGRADED-SESSION-POLICY-POST-L113J-CLOSURE-REPORT.md. Evidence M1 /Users/poolpooly/audit/evidence/block22/fanout-jobs.json; checkpoint /Users/poolpooly/audit/reports/block22-checkpoint.md. Статус тикета не менялся.
2026-09-07T11:40:35.084Z · ЭВОЛЮЦИЯ ЗА 12 Ч (гигиена 2609, 11:25Z 07.09)
ХРОНОЛОГИЯ КРУГОВ
- Новой самостоятельной волны в пакете нет; тикет присутствует только в сводном реестре/предыдущей гигиене. Новый GO, exact landing или post-QA не предъявлены.
- Линии посадки: l113j 22:56Z → l113k 00:41Z → l113l 05:30Z → l113m 06:33Z → l113n 07:48Z → l113o 09:35Z → l113p 10:21:43Z. Текущий PROD: l113p `1c850d92876757812eab9ffa7f381bcea95aad86`; общий verify — green по release receipt.
ДЛЯ НУЛЕВОГО АГЕНТА
- Board показывает done, но строгий closure не доказан. Проверка относительно l113p `1c850d92876757812eab9ffa7f381bcea95aad86`: ticket-specific SHA в выбранных отчётах не выделен. Это запись «ЛОЖНО ЗАКРЫТЫЙ»; статус не меняется автоматически.
- Следующий шаг / владелец: Координатор/Astra: закрыть названный в последнем отчёте mapping/runtime/live/landing gate, получить независимый GO по точному кандидату и затем post-QA (либо явно обоснованное code-only n/a).
KNOWN ISSUES / ТРАБЛШУТИНГ
- Дельта без домысла: новая KI-дельта в отчётах не сформулирована. Проверка/причина привязаны к отчётам выше; anchors: точных file:line anchors в выбранной KI-дельте нет. Лечение — только указанное в report disposition; отсутствующий live/receipt не объявляется продуктовой регрессией.
ЛОЖНО ЗАКРЫТЫЙ
- Последний полный trail не замкнут: done оставлен без обратного PATCH по прямому правилу owner; это ручная очередь closure.
СВЯЗИ / ИСТОЧНИКИ
- Release: `M4 waves/L113P-RELEASE-RECEIPT.md`; координаторский срез: `M4 waves/OPS-STATUS-HEAD-1120.md`; точные отчёты перечислены в хронологии/KNOWN ISSUES.
- Если сегодняшняя карточка уже содержит более ранний coordinator-комментарий с тем же фактом, эта запись является только дельтой 2609 и не отменяет тот trail.
2026-09-07T12:22:09.279Z · astra-securityRELAY16-R3P-FANOUT — 2026-09-07T12:22:09.278093+00:00 / IST=2026-09-07T17:52:09.278115+05:30
OWNER DECISION RELAY16: closure r3p выдан в пакете2617, ROUTING A2, MODEL gpt-5.5.
Бриф /Users/poolpooly/audit/outbox/2617-closed-hypothesis-auth-policy-r3p-brief.md; SHA256 252a63b109e0597c5a93ade9073d08f1ad8ab0a2fbb0ad8ce51012c5a8e358cf. Base l113p1c850d92876757812eab9ffa7f381bcea95aad86.
KNOWN ISSUES: ['No latest closure report for this ticket in RELAY12/13; retain prior evidence, no scope expansion.']
Следующий gate: 2617 / A2: finish per-ticket exactp mapping, targetreceipt and independent companion; report blockedgroups individually. Issued, not running/GO.
Действие координатора: No known productfix/bundle missing; verify accepted hypothesis/policy onexactp; no silent strongerpolicy
ТРАБЛШУТИНГ: три группы на этот тикет — exact accepted/semantic source→runtime mapping, specific target receipt/authorized QA proof, independent inert behavior. Policy accepted != fixed; historical NO-GO != newpdefect. Missinginput возвращать отдельно, без ожиданиявслоте.
ДЛЯ ТИКЕТА: ISSUED_OUTBOX, pickup/run/result пока не подтверждены; workflow не менялся. Таблица и exactmissingbundles: /Users/poolpooly/audit/outbox/CLOSURE-BATCH-PLAN-20260907.md.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-535","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-05T19:58:33.005Z