feat: add bounded call history recorder - #220
Conversation
|
Review-manager classification: What passed locally on the PR head:
Blockers to resolve or explicitly narrow before this can be marked safe-to-land:
No product/security human decision is needed yet; this looks like a narrow helper slice, but the public-renderer privacy contract should be tightened before merge. |
|
Release review: needs-human. This is a clean, well-scoped foundation, but it establishes a new call-history data/retention contract and privacy-facing representation without wiring it into a user-facing lifecycle yet. Retention semantics and the intended public integration should be explicitly confirmed before autonomous landing. No behavior was approved or merged in this pass. |
|
Release-captain review: needs-fix before landing. This helper-only foundation is not yet the scoped #219 feature: no production call lifecycle or authenticated history API uses the recorder. In addition, active calls can make the purportedly bounded recorder grow without limit, and No human product decision is required for these correctness/privacy fixes. |
|
Release review: needs-fix; not ready to land. Two independent reviews found that the proposed
Please use fresh RED tests to define a hard active-record bound (or explicit rejection/finalization policy) and an allowlisted/redacted public rendering contract for all free-text metadata. Do not silently patch production code first. After the focused and full gates pass on a rebase of current |
|
Release review: needs-fix. The helper is not bounded under active-call load ( Required TDD follow-up: define/enforce a strict active-record bound; make the default renderer safe for every rendered field; validate direction/type and lifecycle chronology before state changes. This PR is only a helper and is not yet wired into call lifecycle/API paths, so keep feature claims scoped accordingly. Rebase on current |
|
Release review: needs-fix. The proposed recorder can exceed |
|
Release review classification: needs-human. This introduces or documents a product-level capability/data-retention/deployment decision beyond a narrow behavior-preserving fix. It will not be auto-merged in this lane. Please retain the branch for Korgo’s product/operational decision, then request a focused follow-up review against current |
|
Release-lane classification: needs fix/revalidation before merge. This draft was not independently reviewed or integration-tested in this pass and its GitHub mergeability is stale/unknown after current-main advances. Please rebase or otherwise validate it against current |
|
Release classification: needs-human. This is a material product/API/data-lifecycle feature rather than a narrow corrective maintenance patch. It needs Korgo’s decision on product scope, compatibility, and operational/privacy semantics before autonomous landing. Keep it draft; after a decision, rebase/repackage over current |
|
Release review: needs-fix. |
|
Release classification: needs-human decision. This is a new externally visible product capability (call-history foundation/replay semantics). The scheduled release lane requires product confirmation of retention, privacy, exposure, and integration priority before landing. |
Summary
callstack.voice.historywith a frozenCallRecord, process-localCallHistoryRecorder, and JSON-readyrender_call_record()helper.Linked issue: #219
Tests
PYTHONPATH=. uv run --no-project --with pytest --with pytest-asyncio --with pytest-aiohttp --with pyserial-asyncio --with aiosqlite pytest tests/test_call_history.py -qPYTHONPATH=. uv run --no-project --with pytest --with pytest-asyncio --with pytest-aiohttp --with pyserial-asyncio --with aiosqlite pytest tests/test_call_history.py tests/test_call_service.py tests/test_api_auth.py -qgit diff --checkgit diff --cached --checkPYTHONPATH=. uv run --no-project --with pytest --with pytest-asyncio --with pytest-aiohttp --with pyserial-asyncio --with aiosqlite pytest tests/ -qRisks / notes
CallServicelifecycle hooks or exposeGET /calls/history.max_records; if active calls outnumber the limit, retained in-memory records can temporarily exceed the configured bound until calls finalize.