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:
parent
884803cdf5
commit
fad8abdc2c
9 changed files with 292 additions and 21 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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."
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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": []
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
94
research/reviews/ZulipTargetLookupCallPath.md
Normal file
94
research/reviews/ZulipTargetLookupCallPath.md
Normal 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.
|
||||
50
research/reviews/ZulipTargetLookupSources.json
Normal file
50
research/reviews/ZulipTargetLookupSources.json
Normal 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"}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue