diff --git a/research/evolution/EvolutionReport.md b/research/evolution/EvolutionReport.md index 46d6951..d571804 100644 --- a/research/evolution/EvolutionReport.md +++ b/research/evolution/EvolutionReport.md @@ -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. diff --git a/research/evolution/cycles/2026-09-27-zulip-target-lookup-effort.json b/research/evolution/cycles/2026-09-27-zulip-target-lookup-effort.json new file mode 100644 index 0000000..1a391c7 --- /dev/null +++ b/research/evolution/cycles/2026-09-27-zulip-target-lookup-effort.json @@ -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." +} diff --git a/research/evolution/cycles/2026-09-27-zulip-target-lookup.md b/research/evolution/cycles/2026-09-27-zulip-target-lookup.md index 5857474..ab32eb7 100644 --- a/research/evolution/cycles/2026-09-27-zulip-target-lookup.md +++ b/research/evolution/cycles/2026-09-27-zulip-target-lookup.md @@ -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 diff --git a/research/evolution/ledger.json b/research/evolution/ledger.json index 6794a83..068b247 100644 --- a/research/evolution/ledger.json +++ b/research/evolution/ledger.json @@ -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": [] } ] } diff --git a/research/evolution/profiles.json b/research/evolution/profiles.json index 13535f6..1c13f81 100644 --- a/research/evolution/profiles.json +++ b/research/evolution/profiles.json @@ -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, diff --git a/research/reviews/ZulipTargetLookupCallPath.md b/research/reviews/ZulipTargetLookupCallPath.md new file mode 100644 index 0000000..019b2aa --- /dev/null +++ b/research/reviews/ZulipTargetLookupCallPath.md @@ -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. diff --git a/research/reviews/ZulipTargetLookupSources.json b/research/reviews/ZulipTargetLookupSources.json new file mode 100644 index 0000000..1760e1d --- /dev/null +++ b/research/reviews/ZulipTargetLookupSources.json @@ -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"} + ] + } + ] +} diff --git a/workplans/FEP-WP-0003-contrasting-schools.md b/workplans/FEP-WP-0003-contrasting-schools.md index 045d8b5..a7f4834 100644 --- a/workplans/FEP-WP-0003-contrasting-schools.md +++ b/workplans/FEP-WP-0003-contrasting-schools.md @@ -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. diff --git a/workplans/FEP-WP-0006-language-evolution.md b/workplans/FEP-WP-0006-language-evolution.md index c627296..fac929e 100644 --- a/workplans/FEP-WP-0006-language-evolution.md +++ b/workplans/FEP-WP-0006-language-evolution.md @@ -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.