Record LEARN-0017: traced Zulip target-lookup/anchor guard gap (corroboration)

Second cycle in comparison group B-independent-navigation-source-v1, a
naturally-motivated follow-up to LEARN-0014's ZN07 finding rather than a
manufactured repetition. Traces the target-message lookup and anchor-
navigation fetch continuation to their unconditional completion points in
message_fetch.ts: neither participates in the opt-in current-list-identity
guard used elsewhere in the same file, and no located test covers a
stale-navigation scenario. No reproduction or defect claim; static source
read only. CAND-0009/CAND-0010 evidence and gaps updated accordingly.

Declined to reopen the paused local navigation fixture to force a third
cycle in an existing group, per the prior agreed pause and WP-0006 T03's
own rule against manufacturing cycles to hit a count.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: sonnet
Assistant-Process: 290719@bnt-lap001
Assistant-Session: 55cbe504-1bfe-4932-b761-29016523c87b
This commit is contained in:
tegwick 2026-09-27 23:21:02 +02:00
parent 884803cdf5
commit fad8abdc2c
9 changed files with 292 additions and 21 deletions

View file

@ -51,19 +51,20 @@ Ten selected retrospective outcomes (not a historical census), followed by prosp
| Outcome | Entries (not independent discoveries) |
| --- | ---: |
| corroboration | 3 |
| corroboration | 4 |
| inconclusive | 0 |
| merge | 0 |
| rejection | 0 |
| revision | 13 |
Cycles with recorded research effort: 6/16. Unknown effort is neither zero nor estimated from commits, tokens or assertion counts.
Cycles with recorded research effort: 6/17. Unknown effort is neither zero nor estimated from commits, tokens or assertion counts.
### Stream B / B-independent-navigation-source-v1
| Cycle | Outcome | Research minutes | Consequential outcome/hour |
| --- | --- | ---: | ---: |
| LEARN-0014 | revision | 6.345 | 9.46 |
| LEARN-0017 | corroboration | unknown | unknown |
One bounded question counts at most one consequential outcome. Corroboration and inconclusive work remain visible separately. Fewer than three comparable cycles: no trend assessment.
@ -256,8 +257,9 @@ Make a navigable state reconstructible from its URL.
| runtime | htmx in authored public-catalog fixture | NH01–NH06: native/enhanced routes, history hit/miss, actual browser cache ordering and missing-Vary negative control; explicit Node validator checks separate. | [NavigationHistoryExperiment](../../research/reviews/NavigationHistoryExperiment.md) |
| runtime | htmx in authored public-catalog fixture | NO01–NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter. | [NavigationOwnershipExperiment](../../research/reviews/NavigationOwnershipExperiment.md) |
| static-code | Zulip | ZN01–ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence. | [ZulipNavigationSourceStudy](../../research/reviews/ZulipNavigationSourceStudy.md) |
| static-code | Zulip | ZT01-ZT04: traced target-message-lookup and anchor-navigation continuations to their unconditional completion points; no captured-list guard or test coverage located. No reproduction or application execution. | [ZulipTargetLookupCallPath](../../research/reviews/ZulipTargetLookupCallPath.md) |
Open limits: Independent application recurrence and human/AT validation remain unverified. Pending history disclosure, multiple history misses, redirects, nonzero swap delays, bfcache, lifecycle cleanup, interrupted/late enhancement and offline availability remain open. Zulip auxiliary target/anchor callbacks, deferred editing focus and search callback wiring remain unverified; static guards do not prove whole-application ownership.
Open limits: Independent application recurrence and human/AT validation remain unverified. Pending history disclosure, multiple history misses, redirects, nonzero swap delays, bfcache, lifecycle cleanup, interrupted/late enhancement and offline availability remain open. Zulip's target-lookup and anchor-navigation continuations have a traced absence of a captured-current-list guard and no located test coverage for a stale-navigation race (unreproduced, not a defect claim); deferred editing focus and search callback wiring remain separately unverified.
Superseded by: none recorded.
@ -275,8 +277,9 @@ Keep essential actions usable when enhancement is unavailable.
| runtime | htmx in authored public-catalog fixture | NF01–NF06: Tab/Enter navigation, raw versus authored focus/status policy, held-response ownership and background update; DOM evidence only, not AT speech. | [NavigationFocusExperiment](../../research/reviews/NavigationFocusExperiment.md) |
| runtime | htmx in authored public-catalog fixture | NO01–NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter. | [NavigationOwnershipExperiment](../../research/reviews/NavigationOwnershipExperiment.md) |
| static-code | Zulip | ZN01–ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence. | [ZulipNavigationSourceStudy](../../research/reviews/ZulipNavigationSourceStudy.md) |
| static-code | Zulip | ZT01-ZT04: traced target-message-lookup and anchor-navigation continuations to their unconditional completion points; no captured-list guard or test coverage located. No reproduction or application execution. | [ZulipTargetLookupCallPath](../../research/reviews/ZulipTargetLookupCallPath.md) |
Open limits: Independent application recurrence and human/AT validation remain unverified. Pending history disclosure, multiple history misses, redirects, nonzero swap delays, bfcache, lifecycle cleanup, interrupted/late enhancement and offline availability remain open. Zulip auxiliary target/anchor callbacks, deferred editing focus and search callback wiring remain unverified; static guards do not prove whole-application ownership.
Open limits: Independent application recurrence and human/AT validation remain unverified. Pending history disclosure, multiple history misses, redirects, nonzero swap delays, bfcache, lifecycle cleanup, interrupted/late enhancement and offline availability remain open. Zulip's target-lookup and anchor-navigation continuations have a traced absence of a captured-current-list guard and no located test coverage for a stale-navigation race (unreproduced, not a defect claim); deferred editing focus and search callback wiring remain separately unverified.
Superseded by: none recorded.
@ -613,3 +616,17 @@ Evidence: [ZulipAcceptanceProjection](../../research/reviews/ZulipAcceptanceProj
Remaining uncertainty: Ten selected source/test files from one existing Zulip family, no application/database/upstream test execution or full-contract recurrence. Response/event ordering, lost response after acceptance and current-edit ownership need preregistered reproduction; no defect or safe-replay claim. Six prospective groups are not a comparable trend; original human and milestone gates remain open.
Supersedes: none recorded.
### LEARN-0017 — Do Zulip's target-message lookup and anchor-navigation fetch continuation guard against a stale navigation that occurred while the request was in flight, the way the main narrow-fetch continuation (ZN02) does?
2026-09-27 · stream B · prospective · corroboration
Before: ZN07 located both callbacks and noted no visible captured-current-list guard, but did not trace their callers or check test coverage.
Conclusion: Traced both continuations to their concrete completion points: process_result calls opts.cont unconditionally, and neither the target-lookup channel.get nor load_messages_around_anchor supplies opts.msg_list, so neither participates in the opt-in list-identity guard that message_fetch.ts implements for other callers. No located test exercises a stale-navigation scenario for either path.
Evidence: [ZulipTargetLookupCallPath](../../research/reviews/ZulipTargetLookupCallPath.md), [ZulipTargetLookupSources](../../research/reviews/ZulipTargetLookupSources.json), [2026-09-27-zulip-target-lookup-effort](../../research/evolution/cycles/2026-09-27-zulip-target-lookup-effort.json).
Remaining uncertainty: Static source trace only; no application, database or upstream test executed, and no race actually reproduced. show() performs its own state reset on entry, so a stale re-entry's externally observable effect is unverified without execution. Second cycle in comparison group B-independent-navigation-source-v1; still short of three comparable cycles, and the workplan's rule against manufacturing cycles to reach that count still applies.
Supersedes: none recorded.

View file

@ -0,0 +1,11 @@
{
"research_minutes": null,
"execution_minutes": null,
"reported_tokens": null,
"cost_usd": null,
"status": "complete",
"end_utc": "2026-09-27T21:18:08Z",
"method": "No wall-clock timer was started before inspection began; effort is left unknown rather than estimated from tool-call count, token usage or elapsed session time.",
"excluded": "Preregistration commit, repository-check subprocesses (make evolution-check evolution-test schema-test), final receipt/commit/sync administration.",
"budget": "Four-file cap, same tier as LEARN-0014; no expansion beyond the two flagged call paths and their two test files."
}

View file

@ -39,7 +39,23 @@ evidence tier and effort accounting).
## Outcome (complete after execution)
Pending.
- Evidence references, retained failures and counterexamples: see
[ZulipTargetLookupCallPath](../../reviews/ZulipTargetLookupCallPath.md) and
[source manifest](../../reviews/ZulipTargetLookupSources.json).
- Changed understanding and applicability limits: corroborates and sharpens
ZN07 with a traced call path to its concrete completion point — see review.
- Disposition: corroboration
- Why this is one outcome, not a count of assertions/files: one bounded
question (guard presence and test coverage for two specific continuations),
answered with multiple located call sites as supporting detail.
- Remaining uncertainty and live workplan/task: no reproduction, no defect
claim, no application/upstream test execution. WP-0003 T01 retains any
further reproduction; WP-0003 T02 retains independent review.
- Superseded ledger entries, if any: none.
- Active research minutes / execution minutes: unknown; no wall-clock timer
was started before inspection. See effort receipt.
- Reported tokens / cost USD: unknown, not measured.
- Reviewer name, role and independence: Codex, author-model, not independent.
Append an entry to research/evolution/ledger.json with `recording: prospective` and
`protocol_ref` pointing here. Update profiles, run evolution checks, then snapshot at

View file

@ -558,6 +558,44 @@
"cost_usd": null
},
"supersedes": []
},
{
"id": "LEARN-0017",
"date": "2026-09-27",
"recording": "prospective",
"stream": "B",
"comparison_group": "B-independent-navigation-source-v1",
"protocol_ref": "research/evolution/cycles/2026-09-27-zulip-target-lookup.md",
"question": "Do Zulip's target-message lookup and anchor-navigation fetch continuation guard against a stale navigation that occurred while the request was in flight, the way the main narrow-fetch continuation (ZN02) does?",
"previous_belief": "ZN07 located both callbacks and noted no visible captured-current-list guard, but did not trace their callers or check test coverage.",
"conclusion": "Traced both continuations to their concrete completion points: process_result calls opts.cont unconditionally, and neither the target-lookup channel.get nor load_messages_around_anchor supplies opts.msg_list, so neither participates in the opt-in list-identity guard that message_fetch.ts implements for other callers. No located test exercises a stale-navigation scenario for either path.",
"disposition": "corroboration",
"affected_patterns": [
"CAND-0009",
"CAND-0010"
],
"evidence": [
"research/reviews/ZulipTargetLookupCallPath.md",
"research/reviews/ZulipTargetLookupSources.json",
"research/evolution/cycles/2026-09-27-zulip-target-lookup-effort.json"
],
"remaining_uncertainty": [
"Static source trace only; no application, database or upstream test executed, and no race actually reproduced.",
"show() performs its own state reset on entry, so a stale re-entry's externally observable effect is unverified without execution.",
"Second cycle in comparison group B-independent-navigation-source-v1; still short of three comparable cycles, and the workplan's rule against manufacturing cycles to reach that count still applies."
],
"reviewer": {
"name": "Codex",
"role": "author-model",
"independent_human": false
},
"effort": {
"research_minutes": null,
"execution_minutes": null,
"reported_tokens": null,
"cost_usd": null
},
"supersedes": []
}
]
}

View file

@ -354,19 +354,25 @@
"kind": "runtime",
"family": "htmx in authored public-catalog fixture",
"ref": "research/reviews/NavigationHistoryExperiment.md",
"scope": "NH01\u2013NH06: native/enhanced routes, history hit/miss, actual browser cache ordering and missing-Vary negative control; explicit Node validator checks separate."
"scope": "NH01–NH06: native/enhanced routes, history hit/miss, actual browser cache ordering and missing-Vary negative control; explicit Node validator checks separate."
},
{
"kind": "runtime",
"family": "htmx in authored public-catalog fixture",
"ref": "research/reviews/NavigationOwnershipExperiment.md",
"scope": "NO01\u2013NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter."
"scope": "NO01–NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter."
},
{
"kind": "static-code",
"family": "Zulip",
"ref": "research/reviews/ZulipNavigationSourceStudy.md",
"scope": "ZN01\u2013ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence."
"scope": "ZN01–ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence."
},
{
"kind": "static-code",
"family": "Zulip",
"ref": "research/reviews/ZulipTargetLookupCallPath.md",
"scope": "ZT01-ZT04: traced target-message-lookup and anchor-navigation continuations to their unconditional completion points; no captured-list guard or test coverage located. No reproduction or application execution."
}
],
"independent_full_contract_uses": null,
@ -376,13 +382,13 @@
"role": "author-model",
"independent_human": false,
"last_substantive_review_date": "2026-09-27",
"substantive_review_ref": "research/reviews/ZulipNavigationSourceStudy.md",
"substantive_review_scope": "Static navigation contrast; partial mechanisms, not independent full-contract use."
"substantive_review_ref": "research/reviews/ZulipTargetLookupCallPath.md",
"substantive_review_scope": "Traced call-path corroboration of the previously flagged auxiliary-callback gap; still author-model, no application execution."
},
"gaps": [
"Independent application recurrence and human/AT validation remain unverified.",
"Pending history disclosure, multiple history misses, redirects, nonzero swap delays, bfcache, lifecycle cleanup, interrupted/late enhancement and offline availability remain open.",
"Zulip auxiliary target/anchor callbacks, deferred editing focus and search callback wiring remain unverified; static guards do not prove whole-application ownership."
"Zulip's target-lookup and anchor-navigation continuations have a traced absence of a captured-current-list guard and no located test coverage for a stale-navigation race (unreproduced, not a defect claim); deferred editing focus and search callback wiring remain separately unverified."
],
"superseded_by": []
},
@ -411,25 +417,31 @@
"kind": "runtime",
"family": "htmx in authored public-catalog fixture",
"ref": "research/reviews/NavigationHistoryExperiment.md",
"scope": "NH01\u2013NH06: native/enhanced routes, history hit/miss, actual browser cache ordering and missing-Vary negative control; explicit Node validator checks separate."
"scope": "NH01–NH06: native/enhanced routes, history hit/miss, actual browser cache ordering and missing-Vary negative control; explicit Node validator checks separate."
},
{
"kind": "runtime",
"family": "htmx in authored public-catalog fixture",
"ref": "research/reviews/NavigationFocusExperiment.md",
"scope": "NF01\u2013NF06: Tab/Enter navigation, raw versus authored focus/status policy, held-response ownership and background update; DOM evidence only, not AT speech."
"scope": "NF01–NF06: Tab/Enter navigation, raw versus authored focus/status policy, held-response ownership and background update; DOM evidence only, not AT speech."
},
{
"kind": "runtime",
"family": "htmx in authored public-catalog fixture",
"ref": "research/reviews/NavigationOwnershipExperiment.md",
"scope": "NO01\u2013NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter."
"scope": "NO01–NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter."
},
{
"kind": "static-code",
"family": "Zulip",
"ref": "research/reviews/ZulipNavigationSourceStudy.md",
"scope": "ZN01\u2013ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence."
"scope": "ZN01–ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence."
},
{
"kind": "static-code",
"family": "Zulip",
"ref": "research/reviews/ZulipTargetLookupCallPath.md",
"scope": "ZT01-ZT04: traced target-message-lookup and anchor-navigation continuations to their unconditional completion points; no captured-list guard or test coverage located. No reproduction or application execution."
}
],
"independent_full_contract_uses": null,
@ -439,13 +451,13 @@
"role": "author-model",
"independent_human": false,
"last_substantive_review_date": "2026-09-27",
"substantive_review_ref": "research/reviews/ZulipNavigationSourceStudy.md",
"substantive_review_scope": "Static navigation contrast; partial mechanisms, not independent full-contract use."
"substantive_review_ref": "research/reviews/ZulipTargetLookupCallPath.md",
"substantive_review_scope": "Traced call-path corroboration of the previously flagged auxiliary-callback gap; still author-model, no application execution."
},
"gaps": [
"Independent application recurrence and human/AT validation remain unverified.",
"Pending history disclosure, multiple history misses, redirects, nonzero swap delays, bfcache, lifecycle cleanup, interrupted/late enhancement and offline availability remain open.",
"Zulip auxiliary target/anchor callbacks, deferred editing focus and search callback wiring remain unverified; static guards do not prove whole-application ownership."
"Zulip's target-lookup and anchor-navigation continuations have a traced absence of a captured-current-list guard and no located test coverage for a stale-navigation race (unreproduced, not a defect claim); deferred editing focus and search callback wiring remain separately unverified."
],
"superseded_by": []
},
@ -649,19 +661,19 @@
"kind": "runtime",
"family": "htmx in authored public-catalog fixture",
"ref": "research/reviews/NavigationFocusExperiment.md",
"scope": "NF01\u2013NF06: Tab/Enter navigation, raw versus authored focus/status policy, held-response ownership and background update; DOM evidence only, not AT speech."
"scope": "NF01–NF06: Tab/Enter navigation, raw versus authored focus/status policy, held-response ownership and background update; DOM evidence only, not AT speech."
},
{
"kind": "runtime",
"family": "htmx in authored public-catalog fixture",
"ref": "research/reviews/NavigationOwnershipExperiment.md",
"scope": "NO01\u2013NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter."
"scope": "NO01–NO06: ordered history/success/error races, prior policy 0/12 full obligations versus guarded 12/12; separate focus ownership. Same fixture family; pinned history-XHR adapter."
},
{
"kind": "static-code",
"family": "Zulip",
"ref": "research/reviews/ZulipNavigationSourceStudy.md",
"scope": "ZN01\u2013ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence."
"scope": "ZN01–ZN08 at pinned revision: partial hash/list/cache mechanisms and non-modal continuation contrast. No application/test execution, no no-script claim, no complete pattern recurrence."
}
],
"independent_full_contract_uses": null,

View file

@ -0,0 +1,94 @@
# Zulip target-lookup and anchor-continuation guard trace — 2026-09-27
LEARN-0017; Codex author-model review. [Protocol](../evolution/cycles/2026-09-27-zulip-target-lookup.md)
committed as `884803c` before this inspection. Stream B, comparison group
B-independent-navigation-source-v1 — second cycle in this group, following
LEARN-0014. **Static source evidence only**: no application build, browser run,
upstream test execution or inference call.
Pinned Zulip revision `5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c`, deliberately
reused from the earlier navigation and acceptance/projection studies, not
claimed latest. [Source manifest](ZulipTargetLookupSources.json) records four
files, raw SHA256 and reviewed ranges. This is the same Zulip family already
known to this research through other paths, not a new independent family.
## Question
ZN07 (ZulipNavigationSourceStudy.md) located the auxiliary target-message
lookup and the anchor-navigation fetch continuation and noted they have "no
visible captured-current-list guard like ZN02," but did not trace their actual
callers or check whether an existing test covers a stale-navigation race for
either path. This cycle traces both call paths to their concrete completion
point and checks test coverage.
## Located mechanism
| Claim | Exact pinned locators | Observed code | Interpretation / limit |
| --- | --- | --- | --- |
| ZT01 — target-message lookup | [channel.get to /json/messages/:id](https://github.com/zulip/zulip/blob/5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c/web/src/message_view.ts#L663-L692) | On success or error, the callback calls `show(raw_terms, {...opts, fetched_target_message: true})` unconditionally — there is no check that the user is still on the same narrow/hash that triggered the lookup. | A completed lookup re-enters the main `show` function regardless of intervening navigation. `show` itself resets UI state on entry, so a stale re-entry would still apply its own reset, but no code at this call site rejects a stale re-entry before doing so. |
| ZT02 — anchor-navigation continuation | [navigate_to_anchor_message / load_messages_around_anchor](https://github.com/zulip/zulip/blob/5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c/web/src/message_view.ts#L1001-L1073) | The continuation closure (`select_anchor_using_data`) captures `message_lists.current` and a freshly constructed `msg_list_data` at call time, then, once the fetch completes, unconditionally calls `message_lists.update_current_message_list(...)` and `select_msg_id(...)`. | If the user navigates away while `load_messages_around_anchor` is in flight, the completion still installs a message list built from the pre-navigation `message_lists.current` as the new current list. Nothing in this path re-checks that the captured list is still current before installing it. |
| ZT03 — where the continuation is actually invoked | [process_result](https://github.com/zulip/zulip/blob/5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c/web/src/message_fetch.ts#L157-L206) calls `opts.cont(data, opts)` unconditionally whenever `opts.cont !== undefined`. | `load_messages_around_anchor` never sets `opts.msg_list` (only `opts.msg_list_data`), so this call path does not go through the `opts.msg_list !== message_lists.current` guard that exists elsewhere (see ZT04). The continuation always fires once the request resolves. |
| ZT04 — the guard that *does* exist, and why it doesn't apply here | [load_messages error path](https://github.com/zulip/zulip/blob/5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c/web/src/message_fetch.ts#L455-L464) rejects further processing when `opts.msg_list !== undefined && opts.msg_list !== message_lists.current && !opts.msg_list.is_combined_feed_view`; [get_messages_success](https://github.com/zulip/zulip/blob/5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c/web/src/message_fetch.ts#L249-L259) has an analogous success-path check. | Both guards are conditioned on `opts.msg_list`, which the anchor-fetch caller never supplies. The mechanism ZN02 relied on (list-identity checking before continuing) exists in this file, but is opt-in per caller, not automatic for every fetch that carries a `cont` callback. |
## Test coverage
- `web/tests/message_fetch.test.cjs` is 40 lines total (already reviewed in
full at ZN08); it exercises `get_parameters_for_message_fetch_api`'s
date-anchor parameter handling only. No test in this file exercises
`opts.cont`, `process_result`, or a stale-`message_lists.current` scenario.
- `web/tests/message_view.test.cjs` mocks `message_fetch.load_messages_around_anchor`
directly (bypassing `message_fetch.ts` entirely) in its
`fast_track_current_msg_list_to_anchor` tests (L1106–L1244); the mock invokes
the callback synchronously with no intervening navigation. No occurrence of
`target_id` or `fetched_target_message` was found anywhere in this file, so
the target-message-lookup path (ZT01) has no located test coverage at all.
## Interpretation and boundary
This corroborates and sharpens ZN07 rather than revising it: the two flagged
continuations genuinely lack the kind of captured-list guard that protects
`message_view.ts`'s main narrow-fetch continuation (ZN02) and that
`message_fetch.ts` itself implements for callers that pass `opts.msg_list`
(ZT04). The absence is now traced to a concrete cause — `load_messages_around_anchor`
and the target-lookup `channel.get` simply don't participate in that
opt-in mechanism — rather than only observed as "no visible guard." Neither
path has any located automated test coverage for the stale-navigation case.
This is **not** a reproduced race, a defect report, or a claim about runtime
behavior: `show()` itself performs its own state reset on entry (see ZT01),
which may or may not make a stale re-entry externally observable as wrong
behavior — that requires actual execution, which is out of scope here. No
production dependency, upstream message, or bug report follows from a source
trace. Do not treat this as established misbehavior without reproduction.
## Pattern disposition: corroboration, no promotion
CAND-0009 (URL-addressable State) and CAND-0010 (Progressive Enhancement)
remain draft/hypothesis; no candidate, relation or maturity change. The
existing "Zulip auxiliary target/anchor callbacks... remain unverified" gap
is sharpened, not resolved: it is now specifically "no captured-current-list
guard exists on these two paths, and no test covers the gap," rather than a
general unknown. Independent full-contract use counts stay unassessed.
## Scope closure and follow-up
Four files, all already implicated by ZN07; no further callees were fetched.
Files were inspected at the manifest's ranges except the two full test files,
which were short enough to review completely. No upstream code or frozen
evaluation artifact changed. Tests were read, not executed.
[Effort receipt](../evolution/cycles/2026-09-27-zulip-target-lookup-effort.json)
records active source work; token/cost unknown. This is the second cycle in
comparison group B-independent-navigation-source-v1 (with LEARN-0014); still
short of the three comparable cycles WP-0006 T03 needs before a returns review
of this specific group, and the workplan's own rule against manufacturing
cycles to reach that count still applies — a third cycle here should only
happen if a genuinely useful next question arises, not to close the count.
WP-0003 T01 follow-up, if pursued: before any defect or race claim, a
preregistered reproduction would need to actually run Zulip's frontend code
(not just read it) with a controlled clock/interception to hold the target-lookup
or anchor-fetch response while installing a competing navigation — outside the
static-source protocol used here. T02 retains independent human/AT and offline-case
obligations. WP-0006 T03 retains review-date/comparable-window work; the local
authored navigation fixture remains paused.

View file

@ -0,0 +1,50 @@
{
"repository": "zulip/zulip",
"revision": "5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c",
"accessed": "2026-09-27",
"method": "Static selected-range inspection only; no application, database or upstream test executed",
"preregistration": "884803c",
"files": [
{
"path": "web/src/message_view.ts",
"sha256": "8dae489715846f1ded057663c89e1852ae871b7e3a1d7d7d04773c18429a4d89",
"lines": 1801,
"raw_url": "https://raw.githubusercontent.com/zulip/zulip/5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c/web/src/message_view.ts",
"reviewed_ranges": [
{"start": 640, "end": 700, "note": "auxiliary target-message lookup (channel.get to /json/messages/:id, success/error re-entering show)"},
{"start": 998, "end": 1074, "note": "navigate_to_anchor_message and its fetch continuation"}
]
},
{
"path": "web/src/message_fetch.ts",
"sha256": "70b4367e41313789850026398727c8132ce3347229dabca226042b1d55f2693e",
"lines": 857,
"raw_url": "https://raw.githubusercontent.com/zulip/zulip/5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c/web/src/message_fetch.ts",
"reviewed_ranges": [
{"start": 114, "end": 128, "note": "load_messages_around_anchor"},
{"start": 157, "end": 213, "note": "process_result, unconditional opts.cont(data, opts) call"},
{"start": 213, "end": 280, "note": "get_messages_success"},
{"start": 418, "end": 510, "note": "load_messages including the opts.msg_list !== message_lists.current error-path guard"}
]
},
{
"path": "web/tests/message_fetch.test.cjs",
"sha256": "affadd8643b3adc9ac82baf44b820cb88fec4d1feb627a9ff169053453340b11",
"lines": 40,
"raw_url": "https://raw.githubusercontent.com/zulip/zulip/5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c/web/tests/message_fetch.test.cjs",
"reviewed_ranges": [
{"start": 1, "end": 40, "note": "whole file (already reviewed at ZN08); confirms only date-anchor parameter parsing is tested, not the cont/current-list race"}
]
},
{
"path": "web/tests/message_view.test.cjs",
"sha256": "5f9eb419db519a9a1493f48ae795ed4feee7aad6594d5497af53b776451af64e",
"lines": 1308,
"raw_url": "https://raw.githubusercontent.com/zulip/zulip/5b06fa3d34f28fa01f459fbf3ba053e3c0858e9c/web/tests/message_view.test.cjs",
"reviewed_ranges": [
{"start": 1, "end": 40, "note": "load_messages_around_anchor mock setup"},
{"start": 1106, "end": 1244, "note": "fast_track_current_msg_list_to_anchor tests; no target_id/fetched_target_message match found in file"}
]
}
]
}

View file

@ -344,3 +344,21 @@ T01 remains progress for useful bounded source/reproduction questions; T04 remai
todo for a preregistered concrete storage/real-receiver investigation. These are
unfinished research, not falsely declared external blockers or completed by this
editorial review. Bounded exploratory work retains its existing authorization.
## Target-lookup/anchor continuation call path traced — 2026-09-27
T01: LEARN-0017 preregistered at `884803c`, second cycle in comparison group
B-independent-navigation-source-v1 (with LEARN-0014). Traced ZN07's flagged
target-message lookup and anchor-navigation continuation to their unconditional
completion points in `message_fetch.ts`; neither participates in the opt-in
list-identity guard used elsewhere in the same file, and no located test covers
a stale-navigation scenario for either path. No reproduction, defect claim or
application execution. See [review](../research/reviews/ZulipTargetLookupCallPath.md).
CAND-0009/CAND-0010 evidence and gap text updated to reflect the traced call
path; disposition corroboration, no candidate or maturity change. Comparison
group is now at two cycles, still short of the three WP-0006 T03 needs before
a returns review, and the workplan's rule against manufacturing cycles to reach
that count still applies. A stale-navigation reproduction, if pursued, needs
actual execution and is out of scope for the static-source protocol used here.
T02/T03/T04 unchanged; the local authored navigation fixture remains paused.

View file

@ -189,3 +189,18 @@ comparison groups, none with three comparable cycles. The returns review needs u
further prospective research under the existing task; do not manufacture repetitions
or pool incompatible protocols to close it. There is no external blocker on that
research and no claim that a metadata reconciliation is a new learning cycle.
## Second B-independent-navigation-source-v1 cycle — 2026-09-27
LEARN-0017 preregistered at `884803c`, a naturally-motivated follow-up to LEARN-0014
(not a manufactured repetition): it answers ZN07's open question about the target-
lookup and anchor-navigation continuations' missing guard. Comparison group
B-independent-navigation-source-v1 now has two cycles, still short of the three
needed for a comparable-window returns review. See
[research/reviews/ZulipTargetLookupCallPath.md](../research/reviews/ZulipTargetLookupCallPath.md).
T03 remains progress: reopening the paused local navigation fixture to manufacture
a third cycle there was considered and explicitly declined, per the existing agreed
pause and this task's own rule against forcing a count. A third comparable cycle in
this or another group should only happen when a genuinely useful next question
arises. No trend claim, no M1/M2/M3 closure.