on the critical path
핵심 경로에 있는 · 지연을 직접 결정하는 호출이나 작업을 설명할 때
Daniel, tell us which call chain is on the critical path, and identify anything you are inferring rather than observing.
응용 연습
Could we use on the critical path in the next review?
SYSTEM SW / 2026-10-12 / System issue triage
Android 잠금 해제 직후 Binder 응답 지연 원인 분석
가상의 Android 단말 개발팀이 잠금 해제 직후 런처 응답 지연을 분석하고 검증 실험과 출시 판단 기준을 정합니다. 등장하는 인물·제품·빌드·로그·수치·일정 및 결함은 모두 영어 학습을 위한 교육용 설정입니다.
가상의 비즈니스 회의 · 중급~고급 · 2,528단어 · 약 21분
Good morning. I can see Daniel from Framework, Sora from Performance, and Elias and Priya from Device Quality. Before we begin, please confirm that everyone has the same capture from build L42. We are looking at a slow first unlock after a warm reboot, not a slow boot animation. The screen accepts the PIN promptly, then the launcher remains unresponsive for several seconds. I want us to leave with a defensible owner and a narrow experiment, because the current issue tracker blends that delay with unrelated fingerprint failures.
I have the trace, the bug report, and the framework event log with matching boot identifiers. I also checked the device clock against the trace clock, so the timestamps are comparable within a few milliseconds. There is one correction to the invite: the problem reproduces after both warm reboot and user switch, but not after every unlock. I will keep those paths separate. If we mix them now, a change that helps a freshly started process could look like a general fix when it only moves the work elsewhere.
Performance has twelve paired runs on the same four devices, six with the feature flag enabled and six without it. Three of the flagged runs exceed the proposed response budget; none of the unflagged runs do. That is a useful clue, not proof of causation. The flag also changes when a companion service starts, and thermal history differs between runs. I would like us to compare thread states at the first missed frame rather than argue from a single summary percentile.
Quality can reproduce it in the lab, but the field report is much less precise. The affected group submitted a screen recording and a wall-clock estimate, not a trace. I have asked support to avoid calling it a freeze until we know whether input is queued, rejected, or delivered to a busy launcher. That distinction matters for user impact. We should define what the user can and cannot do during the pause, then use exactly that criterion for the verification pass.
I have the device matrix and the proposed test script. Two products share the framework branch but use different memory configurations, while the third has a different launcher build. We should not assume the common framework branch makes all three failures identical. For today's decision I can run a controlled matrix on one reference product first, then repeat the winning configuration on the others. That keeps our evidence readable and prevents a long overnight run from hiding which variable actually changed.
Let us put the events in order. The PIN acknowledgment is at zero, the user-unlocked broadcast is at about forty milliseconds, and the first responsive launcher frame arrives much later. Daniel, tell us which call chain is on the critical path, and identify anything you are inferring rather than observing. I want a shared timeline before we discuss fixes. In particular, the system server may be busy during the interval without being the component that makes the launcher wait.
The trace shows the launcher waiting on a synchronous Binder reply while it initializes the workspace model. That reply enters the system service quickly, but its worker does not run for roughly eight hundred milliseconds. The worker pool is occupied by callbacks from the newly started companion service. I can point to the queueing gap; I cannot yet say the callback itself is defective. The framework change added one lookup at unlock, and that lookup happens to land behind several longer operations already in the pool.
I agree with the queueing observation, but I do not agree that it explains the whole pause. The launcher main thread wakes after the reply and then performs nearly a second of local model work. The trace slice ends before the first touch response, so the visible delay could have two contributors. We need to separate queueing time from post-reply work. Otherwise a Binder adjustment may produce a beautiful service metric while the person holding the phone still sees an inert home screen.
That distinction changes the acceptance test. I would record three markers: successful credential entry, first drawn launcher frame, and first accepted tap that opens an app. A drawn frame is not sufficient if the input queue remains blocked. I can instrument the test with an external camera and the existing UI automation, then compare the timestamps without modifying production code. We also need a negative control on an ordinary unlock, because a test harness that always waits for launch could exaggerate the regression.
For repeatability, I will freeze the setup before each run: the same account state, the same set of pinned apps, battery above the agreed threshold, and a cooling interval. I will capture device temperature rather than discard a run merely because it looks inconvenient. Any exclusion must be recorded with a reason before we inspect the latency. That gives us an audit trail if the result changes between products. I can publish the raw timestamps alongside a short chart, so nobody has to trust a colored dashboard alone.
We have two hypotheses on the table: worker contention delays the synchronous response, and launcher work after that response extends the user-visible pause. Is there a third explanation we could falsify cheaply? I am particularly concerned that we might misread normal initialization as a regression because we changed the trace boundary. Please keep proposals reversible. We are one week from the branch decision, and a broad threading change is harder to validate than a targeted reduction in work.
There is another possibility: the service cache is cold only on the first unlocked user. A cache miss calls into package metadata and holds a pool worker longer than our steady-state measurements suggest. I can add temporary trace points around cache population and compare the same build with warm and cold cache. That would tell us whether queue depth is the cause or simply a symptom. I would not increase the pool size yet; more workers may increase memory pressure and merely make the race less visible.
I would run that experiment, but please preserve the baseline trace untouched. When trace points are dense, they can shift scheduling on a borderline device. I can calculate the interval from the PIN event to Binder enqueue, enqueue to worker start, worker execution, and reply to accepted tap. The sum must reconcile with the camera measurement within our tolerance. If it does not, we have a missing interval, and optimizing one slice would be premature. We should measure the experience, not just the convenient subsystem.
One objection to a cache-only fix: after a user switch, the service process can stay alive, yet we still see an occasional pause. That may be a separate trigger, or it may mean the cache is keyed by user and becomes cold again. We need the test script to capture both paths without pretending they are interchangeable. I can label each result by trigger and build rather than merging the distributions. If the treatments diverge, we will split the issue instead of forcing one explanation onto two symptoms.
I can make that distinction visible in the run sheet. For each trigger we will record whether the companion service starts, whether package state was previously queried, and whether the launcher process survives. The matrix will be smaller than a full factorial test because some combinations are impossible on the device. I will mark those cells as impossible rather than leaving them blank. The key question is whether we can reproduce a delay with the feature flag off after matching these conditions; that would weaken the simple flag explanation.
Let us compare remedies against evidence and rollback cost. Daniel, you mentioned making the lookup asynchronous, warming the cache, and adding a dedicated worker. Which one preserves the launcher contract most clearly? A faster result is not useful if the launcher renders stale entitlements or misses a change in user state. I want us to state what correctness means before anyone edits the code. Then we can choose a small patch whose behavior Quality can observe directly.
The synchronous lookup currently guarantees that the launcher receives the current user's policy snapshot before it exposes shortcuts. Turning it asynchronous would require a new invalidation protocol, which is too large for this branch. Cache warming could preserve the same contract if it happens after user identity is established and before the launcher requests the snapshot. However, it must not block the unlock broadcast. I propose a limited prototype that precomputes only the policy key and leaves the final permission check on the existing synchronous path.
That is plausible, but precomputation still consumes CPU at a sensitive moment. I would prefer a bounded experiment rather than calling it a fix. Compare the baseline, policy-key warmup, and a diagnostic build that defers the companion callbacks, using the same test matrix. The diagnostic build will never ship; it tells us whether contention is material. If warmup improves the service wait but worsens first-frame time, we should reject it. My proposed budget is an end-to-end tap response, not a Binder-only target.
We also need correctness checks for a rapid user switch and for a policy change during the pause. The first scenario can expose a cache keyed to the wrong user; the second can expose a stale snapshot. I can write tests that compare visible shortcuts against the policy service after the first accepted tap. A pass requires both the timing threshold and correct content. If either fails, the candidate does not advance to the release branch, even if its median latency looks excellent.
I will add a memory observation to that gate. The warmup must not create a per-user cache that grows with each switch; we can sample proportional set size before and after a sequence of ten switches. I will also check that the trace tags used for the experiment are removed or disabled before the candidate build. Keeping diagnostic hooks accidentally enabled could change power behavior and complicate later analysis. I can deliver one results table that places latency, correctness, and memory side by side.
Here is the decision I am recording. We will not change the public framework contract or increase the Binder pool for this release. Daniel will prepare the policy-key warmup prototype and a separate callback-deferral diagnostic build by Tuesday at noon Seoul time. Sora will publish the timing decomposition and reconcile it with camera observations by Tuesday evening. These are experiments, not an approval to merge. The existing feature flag remains available as the immediate rollback control if our release criteria are missed.
I accept those two builds and will keep them on separate change lists. For the prototype, I will document the exact cache key, its invalidation event, and why the final policy check still uses the existing path. I will include a unit test for two users whose shortcut policies differ. The diagnostic build will only delay companion callbacks behind a test switch, so it cannot be mistaken for a production solution. I will attach both build identifiers and a change summary to the issue before Priya starts her runs.
I will publish the baseline breakdown first, before looking at the prototype result. That order protects us from redefining a favorable metric after seeing the data. I propose a pass threshold of a first accepted tap within two seconds on at least nineteen of twenty controlled trials, with no correctness failure and no material memory growth. That is stricter than the current observation but achievable on the unflagged baseline. I will report every trial and its thermal state, not only the passing subset.
Quality will own the acceptance wording and the user-switch checks. I will send the finalized script by Tuesday afternoon, after Daniel confirms the diagnostic switch name. A failed correctness case is a stop condition even if the aggregate timing passes; there is no averaging away a wrong user's shortcut. I will keep the ordinary-unlock control in every batch. If the reference device passes, we can expand to the other two configurations on Wednesday, but I will not collapse their results into a single green label.
I can begin the controlled runs as soon as the identifiers and script are frozen. I will reserve the reference device for Tuesday evening and the additional configurations for Wednesday morning. Each row will include build, trigger, feature flag, temperature, queue time, first frame, first accepted tap, shortcut correctness, and memory delta. I will stop the batch after any reproducible wrong-user content and notify the group immediately. Otherwise I will post the complete table, including failed and excluded attempts, by Wednesday at four Seoul time.
The follow-up review is Thursday, October fifteenth, at ten in the morning Seoul time. At that meeting we will choose among merging the narrow prototype, leaving the flag off for this release, or holding the branch decision for more evidence. The choice will use the agreed table, not a narrative built around the best run. Daniel, please confirm that the original baseline artifacts stay linked in the issue. I want someone outside this room to be able to reproduce our reasoning next week.
Confirmed. I will keep the original trace, event log, and bug report read-only and link their hashes in the issue. The prototype trace will be a separate attachment with its own build identifier. If the warmup wins only on the first unlock and loses on user switch, I will say so plainly rather than broaden the claim. I will also add a short note explaining how to disable the prototype without changing the existing launcher behavior. That makes rollback a practical option rather than a line in a meeting record.
I will bring a plot that shows the full distribution and each interval, with the camera-based user measure highlighted. I will annotate outliers before discussing the median, because one long pause may matter more to the user than a small improvement in typical cases. If the service wait disappears but the tap delay remains, I will ask us to open a launcher investigation rather than declare this issue closed. The measurement plan should let us make that call without another week of instrumentation.
I will send support a concise status that separates observed behavior from the two unproven causes. They can tell affected users that we are measuring first interaction after unlock, without promising a particular patch or date. For the lab report I will preserve video clips for failing trials and one representative passing control. I will also note whether repeated taps are buffered or lost. That detail may influence the severity assessment even if the measured delay falls just under our numerical threshold.
I have the owners and dates. I will share the run sheet in the issue today, and everyone can comment on missing conditions before the script is locked tomorrow afternoon. After that, any new condition goes into a separate follow-up rather than silently changing the denominator. I will call out incomplete data in the Thursday review, even if the charts look encouraging. We have a clear experiment, an explicit stop condition, and a meeting to decide what ships. That is enough for me to start preparing the devices.
좋은 아침입니다. Framework의 Daniel, Performance의 Sora, Device Quality의 Elias와 Priya가 보이네요. 시작하기 전에 모두 L42 빌드에서 수집한 동일한 자료를 갖고 있는지 확인해 주세요. 지금 보는 것은 부팅 애니메이션 지연이 아니라 웜 재부팅 후 첫 잠금 해제 지연입니다. 화면은 PIN을 바로 받지만 그다음 런처가 몇 초 동안 반응하지 않습니다. 현재 이슈 추적기에는 이 지연과 무관한 지문 인식 실패가 섞여 있으므로, 오늘은 근거가 있는 담당자와 범위를 좁힌 실험을 정하고 싶습니다.
동일한 부팅 식별자가 있는 트레이스, 버그 리포트, 프레임워크 이벤트 로그를 갖고 있습니다. 기기 시계와 트레이스 시계도 비교해서 타임스탬프를 수 밀리초 범위에서 대조할 수 있습니다. 초대장에 적힌 내용을 하나 바로잡겠습니다. 문제는 웜 재부팅 후와 사용자 전환 후에 재현되지만 매번 잠금 해제할 때마다 발생하지는 않습니다. 두 경로는 구분하겠습니다. 지금 이를 섞으면 새로 시작한 프로세스에만 도움이 되는 변경이 단지 작업을 다른 곳으로 옮겼는데도 일반적인 수정처럼 보일 수 있습니다.
Performance 팀에는 동일한 네 대의 기기에서 수행한 열두 번의 짝지은 실행 결과가 있습니다. 기능 플래그를 켠 경우와 끈 경우가 각각 여섯 번입니다. 플래그를 켠 실행 세 번이 제안된 응답 시간 한도를 넘었고, 끈 경우는 한 번도 넘지 않았습니다. 이는 유용한 단서이지만 인과관계의 증명은 아닙니다. 플래그는 보조 서비스 시작 시점도 바꾸고 실행 사이의 발열 이력도 다릅니다. 요약 백분위 하나로 논쟁하기보다 첫 프레임을 놓친 시점의 스레드 상태를 비교하고 싶습니다.
Quality 팀은 실험실에서 재현할 수 있지만 현장 보고는 훨씬 덜 정확합니다. 영향을 받은 그룹은 트레이스가 아니라 화면 녹화와 실제 시계 기준의 추정 시간을 제출했습니다. 입력이 대기열에 쌓이는지, 거절되는지, 바쁜 런처에 전달되는지 알기 전까지는 이를 멈춤 현상이라고 부르지 말라고 지원팀에 요청했습니다. 이 구분은 사용자 영향 평가에 중요합니다. 일시 정지 동안 사용자가 할 수 있는 것과 없는 것을 정의하고 검증 과정에도 정확히 같은 기준을 써야 합니다.
기기 매트릭스와 제안된 테스트 스크립트를 준비했습니다. 두 제품은 같은 프레임워크 브랜치를 쓰지만 메모리 구성이 다르고, 세 번째는 런처 빌드가 다릅니다. 공통 프레임워크 브랜치를 사용한다고 세 제품의 실패가 같다고 가정해서는 안 됩니다. 오늘 결정에 따라 우선 기준 제품 하나에서 통제된 매트릭스를 실행하고, 효과가 확인된 설정을 다른 제품에도 반복할 수 있습니다. 그러면 증거를 읽기 쉽고 긴 야간 실행에서 실제로 바뀐 변수가 가려지는 일을 막을 수 있습니다.
사건을 시간순으로 놓아 봅시다. PIN 승인 시점을 0으로 잡으면 사용자 잠금 해제 브로드캐스트는 약 40밀리초 뒤이고, 런처가 처음 반응하는 프레임은 훨씬 나중에 도착합니다. Daniel, 어떤 호출 연쇄가 핵심 경로에 있는지 설명하고 관찰이 아니라 추론인 부분은 표시해 주세요. 수정 방안을 논의하기 전에 공통된 시간표가 필요합니다. 특히 이 구간에 시스템 서버가 바쁘더라도 런처를 기다리게 하는 구성 요소는 다른 곳일 수 있습니다.
트레이스에서는 런처가 작업 공간 모델을 초기화하는 동안 동기 Binder 응답을 기다립니다. 요청은 시스템 서비스에 빨리 들어가지만 작업자 스레드는 약 800밀리초 동안 실행되지 않습니다. 작업자 풀이 새로 시작된 보조 서비스의 콜백으로 점유되어 있습니다. 대기열에서 기다리는 구간은 확인할 수 있지만 콜백 자체가 잘못됐다고는 아직 말할 수 없습니다. 프레임워크 변경으로 잠금 해제 시 조회 하나가 추가됐고, 그 조회가 풀에 이미 있는 긴 작업 여러 개 뒤에 놓입니다.
대기열 관찰에는 동의하지만 그것만으로 전체 멈춤을 설명한다는 데는 동의하지 않습니다. 런처 메인 스레드는 응답 후 깨어나서 거의 1초 동안 로컬 모델 작업을 수행합니다. 트레이스 구간은 첫 터치 응답 전에 끝나므로 눈에 보이는 지연에는 두 가지 기여 요인이 있을 수 있습니다. 대기 시간과 응답 이후의 작업 시간을 분리해야 합니다. 그렇지 않으면 Binder 조정으로 서비스 지표는 멋지게 개선되어도 실제 사용자는 여전히 반응하지 않는 홈 화면을 보게 됩니다.
그 구분은 인수 테스트를 바꿉니다. 세 시점을 기록하겠습니다. 인증 정보 입력 성공, 런처의 첫 프레임 표시, 앱을 여는 첫 탭의 수락입니다. 입력 대기열이 막혀 있다면 프레임이 그려진 것만으로는 충분하지 않습니다. 외부 카메라와 기존 UI 자동화를 이용해 제품 코드를 수정하지 않고 타임스탬프를 비교할 수 있습니다. 또한 일반적인 잠금 해제를 대조군으로 넣어야 합니다. 테스트 도구가 언제나 런처 시작을 기다리면 회귀가 과장될 수 있습니다.
재현성을 위해 각 실행 전 계정 상태, 고정된 앱 목록, 합의한 수준 이상의 배터리, 냉각 간격을 동일하게 맞추겠습니다. 불편한 결과처럼 보인다는 이유로 실행을 버리는 대신 기기 온도를 기록하겠습니다. 제외가 필요하다면 지연 시간을 살펴보기 전에 이유를 기록해야 합니다. 그러면 제품별 결과가 달라질 때 추적할 수 있습니다. 누구도 색깔 있는 대시보드만 믿지 않아도 되도록 간단한 차트와 원본 타임스탬프를 함께 공개하겠습니다.
지금 두 가지 가설이 있습니다. 작업자 스레드 경쟁으로 동기 응답이 늦어지고, 응답 후 런처 작업이 사용자에게 보이는 멈춤을 늘린다는 것입니다. 적은 비용으로 반증할 수 있는 세 번째 설명이 있나요? 특히 트레이스 경계를 바꿔 정상 초기화를 회귀로 오해할 가능성이 걱정됩니다. 제안은 되돌릴 수 있게 해 주세요. 브랜치 결정까지 일주일 남았고, 광범위한 스레딩 변경은 표적 작업 감소보다 검증하기 어렵습니다.
다른 가능성도 있습니다. 처음 잠금 해제한 사용자에게만 서비스 캐시가 차갑다는 것입니다. 캐시 미스가 패키지 메타데이터를 조회해 작업자 하나를 정상 상태 측정치보다 오래 점유할 수 있습니다. 캐시 채우기 전후에 임시 트레이스 지점을 넣고 동일한 빌드에서 캐시가 따뜻할 때와 차가울 때를 비교하겠습니다. 그러면 대기열 깊이가 원인인지 단순한 증상인지 알 수 있습니다. 아직 풀 크기를 늘리지는 않겠습니다. 작업자를 늘리면 메모리 압박이 커지고 경쟁 상태만 덜 보이게 할 수 있습니다.
그 실험은 하되 기준 트레이스는 손대지 않고 보존해 주세요. 트레이스 지점이 조밀하면 경계에 있는 기기의 스케줄링이 달라질 수 있습니다. PIN 이벤트부터 Binder 대기열 진입, 대기열에서 작업자 시작, 작업자 실행, 응답부터 수락된 탭까지의 구간을 계산할 수 있습니다. 그 합이 허용 오차 안에서 카메라 측정치와 맞아야 합니다. 맞지 않으면 빠진 구간이 있다는 뜻이므로 한 구간만 최적화하기에는 이릅니다. 측정하기 쉬운 하위 시스템만이 아니라 사용 경험을 측정해야 합니다.
캐시만 고치는 방안에는 이견이 있습니다. 사용자 전환 뒤에는 서비스 프로세스가 살아 있을 수 있는데도 간헐적으로 멈춤이 발생합니다. 별도 원인일 수도 있고 캐시가 사용자별로 구분되어 다시 차가워진다는 뜻일 수도 있습니다. 두 경로를 서로 같다고 여기지 않고 모두 기록하도록 테스트 스크립트를 만들어야 합니다. 분포를 합치지 않고 각 결과에 유발 조건과 빌드를 표시하겠습니다. 처치의 효과가 다르면 두 증상을 하나의 설명에 억지로 맞추지 않고 이슈를 분리하겠습니다.
실행 기록표에서 그 구분이 보이게 하겠습니다. 각 유발 조건마다 보조 서비스가 시작되는지, 패키지 상태를 이전에 조회했는지, 런처 프로세스가 유지되는지 기록하겠습니다. 기기에서 불가능한 조합도 있어 매트릭스는 완전 요인 실험보다 작습니다. 그런 칸은 공란이 아니라 불가능하다고 표시하겠습니다. 핵심 질문은 이 조건들을 맞춘 후 기능 플래그를 꺼도 지연이 재현되는지입니다. 그렇다면 플래그만으로 설명하는 가설은 약해집니다.
증거와 롤백 비용을 기준으로 수정 후보를 비교합시다. Daniel, 조회를 비동기로 바꾸는 방안, 캐시를 미리 채우는 방안, 전용 작업자를 추가하는 방안을 말씀했죠. 어느 것이 런처와의 계약을 가장 분명히 유지하나요? 런처가 오래된 권한 정보를 표시하거나 사용자 상태 변경을 놓친다면 빠른 결과는 소용없습니다. 누가 코드를 수정하기 전에 정확성이 무엇인지 명시하고 싶습니다. 그런 다음 Quality가 동작을 직접 관찰할 수 있는 작은 패치를 선택합시다.
현재 동기 조회는 런처가 바로 가기를 노출하기 전에 현재 사용자의 정책 스냅샷을 받도록 보장합니다. 비동기로 바꾸려면 새 무효화 프로토콜이 필요하므로 이 브랜치에는 범위가 너무 큽니다. 사용자 신원이 확정된 뒤 런처가 스냅샷을 요청하기 전에 캐시를 준비하면 같은 계약을 유지할 수 있습니다. 다만 잠금 해제 브로드캐스트를 막아서는 안 됩니다. 정책 키만 미리 계산하고 최종 권한 검사는 기존 동기 경로에 남기는 제한된 시제품을 제안합니다.
그럴듯하지만 사전 계산도 민감한 시점에 CPU를 사용합니다. 바로 수정이라고 부르기보다 범위가 정해진 실험으로 다루고 싶습니다. 동일한 테스트 매트릭스로 기준 빌드, 정책 키 사전 준비 빌드, 보조 서비스 콜백을 늦춘 진단 빌드를 비교합시다. 진단 빌드는 출시하지 않고 경쟁이 실제로 중요한지를 알려주는 용도입니다. 사전 준비가 서비스 대기는 줄여도 첫 프레임 시간을 악화시키면 버려야 합니다. 제가 제안하는 기준은 Binder만의 목표가 아니라 처음부터 끝까지의 탭 응답 시간입니다.
빠른 사용자 전환과 일시 정지 중 정책 변경에 대한 정확성 검사도 필요합니다. 첫 시나리오는 잘못된 사용자에 연결된 캐시를 드러낼 수 있고, 두 번째는 오래된 스냅샷을 드러낼 수 있습니다. 처음 탭이 수락된 후 표시되는 바로 가기를 정책 서비스와 비교하는 테스트를 작성하겠습니다. 시간 기준과 콘텐츠 정확성이 모두 충족되어야 통과입니다. 어느 하나라도 실패하면 중앙값 지연이 아주 좋아 보여도 릴리스 브랜치로 진행하지 않습니다.
그 통과 기준에 메모리 관찰도 추가하겠습니다. 사전 준비가 사용자 전환마다 계속 늘어나는 사용자별 캐시를 만들면 안 됩니다. 열 번 전환하기 전후의 비례 집합 크기를 측정할 수 있습니다. 실험용 트레이스 태그가 후보 빌드 전에 제거되거나 꺼졌는지도 확인하겠습니다. 진단용 후크가 실수로 켜진 채 남으면 전력 동작이 바뀌고 나중 분석도 복잡해집니다. 지연 시간, 정확성, 메모리를 나란히 둔 결과표 하나를 제공하겠습니다.
결정을 기록하겠습니다. 이번 릴리스에서는 공개 프레임워크 계약을 바꾸거나 Binder 풀을 늘리지 않습니다. Daniel은 서울 시간 화요일 정오까지 정책 키 사전 준비 시제품과 별도의 콜백 지연 진단 빌드를 준비합니다. Sora는 화요일 저녁까지 시간 구간별 분석을 발표하고 카메라 관찰과 대조합니다. 이는 실험이지 병합 승인 명령이 아닙니다. 릴리스 기준을 충족하지 못하면 즉시 되돌리는 수단으로 기존 기능 플래그를 유지합니다.
두 빌드를 맡고 변경 목록도 분리하겠습니다. 시제품에는 정확한 캐시 키, 무효화 이벤트, 최종 정책 검사가 기존 경로를 계속 쓰는 이유를 문서화하겠습니다. 바로 가기 정책이 다른 두 사용자를 대상으로 한 단위 테스트를 포함합니다. 진단 빌드는 테스트 스위치 뒤에서 보조 서비스 콜백만 지연시키므로 제품용 해결책으로 오인되지 않게 하겠습니다. Priya가 실행을 시작하기 전에 두 빌드 식별자와 변경 요약을 이슈에 첨부하겠습니다.
시제품 결과를 보기 전에 기준 구간 분석을 먼저 공개하겠습니다. 그러면 데이터를 보고 유리한 지표로 정의를 바꾸는 일을 막을 수 있습니다. 통제된 20회 실행 중 최소 19회에서 첫 탭이 2초 안에 수락되고, 정확성 실패와 유의한 메모리 증가가 없는 것을 통과 기준으로 제안합니다. 현재 관찰보다 엄격하지만 플래그를 끈 기준 빌드에서는 달성할 수 있습니다. 통과한 일부만이 아니라 모든 실행과 발열 상태를 보고하겠습니다.
Quality 팀이 인수 기준 문구와 사용자 전환 검사를 맡겠습니다. Daniel이 진단 스위치 이름을 확인한 뒤 화요일 오후까지 최종 스크립트를 보내겠습니다. 전체 시간 기준을 통과하더라도 정확성 사례 하나가 실패하면 중단 조건입니다. 다른 사용자의 바로 가기를 평균으로 덮을 수는 없습니다. 매 배치마다 일반 잠금 해제 대조군을 유지하겠습니다. 기준 기기가 통과하면 수요일에 나머지 두 구성으로 확대하되 그 결과를 녹색 표시 하나로 합치지는 않겠습니다.
빌드 식별자와 스크립트가 확정되는 대로 통제된 실행을 시작할 수 있습니다. 기준 기기는 화요일 저녁, 추가 구성은 수요일 오전에 확보하겠습니다. 각 행에는 빌드, 유발 조건, 기능 플래그, 온도, 대기 시간, 첫 프레임, 첫 수락된 탭, 바로 가기 정확성, 메모리 차이를 담겠습니다. 다른 사용자의 콘텐츠가 재현되면 배치를 중단하고 즉시 그룹에 알리겠습니다. 그렇지 않으면 실패하거나 제외된 시도까지 포함한 전체 표를 서울 시간 수요일 4시까지 게시하겠습니다.
후속 검토 회의는 10월 15일 목요일 서울 시간 오전 10시입니다. 그 자리에서 제한된 시제품 병합, 이번 릴리스의 플래그 비활성화 유지, 추가 증거 확보까지 브랜치 결정을 보류하는 선택지 중 하나를 고르겠습니다. 최고 성적의 실행에 맞춘 이야기가 아니라 합의한 표로 판단합니다. Daniel, 원래 기준 자료가 이슈에 계속 연결되어 있는지 확인해 주세요. 다음 주에 이 회의실 밖의 사람도 우리의 판단 과정을 재현할 수 있어야 합니다.
확인했습니다. 원본 트레이스, 이벤트 로그, 버그 리포트를 읽기 전용으로 유지하고 각 해시를 이슈에 연결하겠습니다. 시제품 트레이스는 자체 빌드 식별자를 가진 별도 첨부 파일로 둡니다. 사전 준비가 첫 잠금 해제에서만 효과가 있고 사용자 전환에서는 손해라면 주장을 넓히지 않고 명확히 말하겠습니다. 기존 런처 동작을 바꾸지 않고 시제품을 끄는 방법도 짧게 적겠습니다. 그래야 롤백이 회의록 한 줄이 아니라 실제 선택지가 됩니다.
전체 분포와 구간별 시간을 보여주는 그래프를 가져오고 카메라로 측정한 사용자 체감치를 강조하겠습니다. 중앙값을 논의하기 전에 이상치를 표시하겠습니다. 일반적인 경우의 소폭 개선보다 한 번의 긴 멈춤이 사용자에게 더 중요할 수 있기 때문입니다. 서비스 대기는 사라져도 탭 지연이 남으면 이 이슈를 종료하기보다 런처 조사를 새로 열자고 제안하겠습니다. 측정 계획만으로 추가 일주일의 계측 없이 그 판단을 할 수 있어야 합니다.
지원팀에는 관찰된 동작과 아직 입증되지 않은 두 원인을 구분한 간결한 현황을 보내겠습니다. 특정 패치나 날짜를 약속하지 않고 잠금 해제 후 첫 상호작용을 측정 중이라고 안내할 수 있습니다. 실험실 보고서에는 실패한 실행의 영상과 대표적인 통과 대조 영상 하나를 남기겠습니다. 반복 탭이 보관되는지 사라지는지도 기록하겠습니다. 측정 지연이 수치 기준 바로 아래이더라도 그 정보가 심각도 평가에 영향을 줄 수 있습니다.
담당자와 기한을 확인했습니다. 오늘 이슈에 실행 기록표를 공유하니 내일 오후 스크립트를 확정하기 전에 빠진 조건을 의견으로 남겨 주세요. 그 이후의 새 조건은 분모를 조용히 바꾸지 않고 별도의 후속 항목으로 넣겠습니다. 차트가 좋아 보여도 목요일 검토 회의에서는 불완전한 데이터를 분명히 알리겠습니다. 실험, 명확한 중단 조건, 출시 대상을 결정할 회의가 정해졌습니다. 이제 기기를 준비할 수 있습니다.
핵심 경로에 있는 · 지연을 직접 결정하는 호출이나 작업을 설명할 때
Daniel, tell us which call chain is on the critical path, and identify anything you are inferring rather than observing.
응용 연습
Could we use on the critical path in the next review?
인과관계의 증명은 아닌 · 상관관계만 확인됐을 때
That is a useful clue, not proof of causation.
응용 연습
Could we use not proof of causation in the next review?
대기 시간과 응답 이후 작업을 분리하다 · 지연 구간을 나눠 측정할 때
We need to separate queueing time from post-reply work.
응용 연습
Could we use separate queueing time from post-reply work in the next review?
사용자에게 가능한 행동과 불가능한 행동을 정의하다 · 체감 문제의 범위를 정할 때
We should define what the user can and cannot do during the pause, then use exactly that criterion for the verification pass.
응용 연습
Could we use define what the user can and cannot do in the next review?
각 실행 전에 설정을 고정하다 · 재현 실험의 조건을 맞출 때
For repeatability, I will freeze the setup before each run: the same account state, the same set of pinned apps, battery above the agreed threshold, and a cooling interval.
응용 연습
Could we use freeze the setup before each run in the next review?
논의 중인 두 가지 가설 · 원인 후보를 정리할 때
We have two hypotheses on the table: worker contention delays the synchronous response, and launcher work after that response extends the user-visible pause.
응용 연습
Could we use two hypotheses on the table in the next review?
기준 트레이스를 손대지 않고 보존하다 · 원본 증거를 보호할 때
I would run that experiment, but please preserve the baseline trace untouched.
응용 연습
Could we use preserve the baseline trace untouched in the next review?
이슈를 분리하다 · 서로 다른 원인을 따로 추적할 때
If the treatments diverge, we will split the issue instead of forcing one explanation onto two symptoms.
응용 연습
Could we use split the issue in the next review?
증거와 롤백 비용을 기준으로 해결책을 비교하다 · 수정 방안을 평가할 때
Let us compare remedies against evidence and rollback cost.
응용 연습
Could we use compare remedies against evidence and rollback cost in the next review?
범위가 정해진 실험 · 제한된 변경을 제안할 때
I would prefer a bounded experiment rather than calling it a fix.
응용 연습
Could we use a bounded experiment in the next review?
중단 조건 · 검증 실패 시 진행을 막을 때
A failed correctness case is a stop condition even if the aggregate timing passes; there is no averaging away a wrong user's shortcut.
응용 연습
Could we use a stop condition in the next review?
별도 변경 목록으로 유지하다 · 실험 빌드와 제품 변경을 구분할 때
I accept those two builds and will keep them on separate change lists.
응용 연습
Could we use keep them on separate change lists in the next review?
모든 실행을 보고하다 · 선별 보고를 피할 때
I will report every trial and its thermal state, not only the passing subset.
응용 연습
Could we use report every trial in the next review?
실제로 가능한 선택지 · 롤백 절차가 준비됐을 때
That makes rollback a practical option rather than a line in a meeting record.
응용 연습
Could we use a practical option in the next review?
특정 패치나 날짜를 약속하지 않고 · 확정 전 대외 현황을 설명할 때
They can tell affected users that we are measuring first interaction after unlock, without promising a particular patch or date.
응용 연습
Could we use without promising a particular patch or date in the next review?