docs(scratch): handoff — триаж #5 закрыт, ревью APPROVED, идёт приёмка

- Зачем:
  - зафиксировать состояние конвейера #5 перед долгой живой приёмкой,
    чтобы новая сессия продолжила без потери контекста.
- Что:
  - в handoff добавлена дельта 23:10: обе находки FIXED (фрагменты ID
    с SHA-256-цепочкой), перепроверка линией B — APPROVED;
  - обновлено состояние стенда: им владеет сценарий приёмки;
  - в .scratch/issue5-run добавлены свежие отчёты, перепроверка и
    сценарий приёмки acceptance-issue5.sh.
- Проверка:
  - git show --stat; лог приёмки — до строки SCRIPT_EXIT_CODE=.
This commit is contained in:
2026-07-22 23:11:44 +03:00
parent ceb30a95c0
commit f4971e94ca
10 changed files with 803 additions and 3 deletions
@@ -0,0 +1,70 @@
# Narrow recheck: issue #5 fix round (findings CODE-1, CODE-2 only)
You are review line B (code quality) doing a NARROW recheck after a fix
round. Fresh session, no executor history. Do NOT modify sources, git
state, or permanent environment. You may read anything and run focused
tests (pytest of specific files is fine).
Repo: /home/dementev/sources/clickstream-ch-kafka-superset-demo, branch
feature/mentee-path. Scope: ALL uncommitted working-tree changes
(git status / git diff vs HEAD), but ONLY re-verify the two findings below.
This is NOT a full re-review — do not open new lines of critique unless
you find a defect introduced BY the fix itself.
Context files (same directory as this file):
- review-issue5-code.md — your line's original full report (CODE-1..CODE-2)
- report-issue5.md — executor's report; section "## Triage round 1"
describes the fix design and measurements
- mandate-issue5.md — original executor mandate (invariants)
## Finding CODE-1 (was High, == TASK-1): manifest payload ceiling
Original defect: cumulative manifest embedded exact click_id/uid sets,
~0.81 MB already on the reference world, Kafka 1 MiB default message limit
not overridden → save fails after ~1 more next-day; storage O(history) in
a SINGLE message.
Executor's claimed fix: exact ID sets moved out of the manifest into
content-addressed chunks (≤10,000 IDs each, SHA-256 chain, separate compact
topic generator_startup_history_counter_chunks); main manifest keeps totals
+ rolling checksums + chain head/count; next-day appends only new-ID
chunks, never rewrites or scans history; explicit 900,000-byte pre-send
guard with Russian error on both manifest and chunks.
Verify:
1. The single-message ceiling is genuinely gone: no code path serializes
the full ID history into one Kafka message (check import, backfill AND
next-day paths).
2. Chunk chain integrity: hash chain actually validated on read; chain
head/count in manifest actually checked; a broken/missing chunk fails
loudly (Russian error), not silently.
3. next-day is still O(new day): no full chunk-chain scan or historical
chunk rewrite on the incremental path.
4. Exactness preserved: uniqExact comparison against ClickHouse still uses
exact counts; the required incremental-vs-full-recompute equality test
still genuinely compares incremental vs full recompute after the
restructure (not weakened to pass).
5. The 900,000-byte guard is real (applied before send on every producer
path for these payloads) and its failure mode is explicit.
6. Boundary-ID sourcing from generator state (active visits + users with
visits, pre-created unused users excluded) does not break determinism
or the day-boundary duplicate handling the tests claim.
## Finding CODE-2 (was Low): write ordering
Original defect: next-day saved state BEFORE manifest (import did reverse),
widening the half-advanced window.
Verify: order is now chunks → manifest → state on ALL three paths (import,
backfill, next-day), and the two-day test actually asserts it.
## Report
Write full report (English) to recheck-issue5-code.md in this same
directory. Structure: per finding — RESOLVED / NOT_RESOLVED / REGRESSION
(new defect introduced by the fix, with severity, file:line, scenario).
End with VERDICT: APPROVED (both resolved, no regressions) or
CHANGES_REQUESTED.
Final message: VERDICT, one line per finding status, one line per
regression if any, report path.