|
1 | 1 | # Issues Log — Open + Resolved (double-entry, append-only) |
2 | 2 |
|
| 3 | +## ISS-NO-PER-THREAD-TEMPORAL-PROJECTION-IS-EVER-CONSTRUCTED (2026-07-29) — OPEN, UPSTREAM OF `meta_basin` |
| 4 | + |
| 5 | +> **⊘ RE-GRADED AND RELOCATED (Codex, #869) — my first filing mislocated this.** |
| 6 | +> I recorded it as "P1 correctness, shipped in #868". Both halves were wrong: |
| 7 | +> |
| 8 | +> - **`WitnessLens` is not the defect.** It borrows a caller-supplied |
| 9 | +> `&[NodeRow]` and indexes it. Hand it an as-of projection and it reads that |
| 10 | +> projection **correctly**. The type is agnostic to which version its rows came |
| 11 | +> from — that is a property, not a bug. |
| 12 | +> - **#868 did not introduce it.** The gathered `(stream_position, facet)` API it |
| 13 | +> replaced had **no version parameter either**. The migration changed nothing |
| 14 | +> about temporal behaviour in either direction. |
| 15 | +> |
| 16 | +> The real gap is a **capability that has never existed anywhere**: nothing |
| 17 | +> upstream ever *constructs* a per-thread as-of projection to hand down. Filing |
| 18 | +> it against `meta_basin` would have aimed the fix — and its regression test — at |
| 19 | +> the wrong component, which is worse than not filing it, because a green test on |
| 20 | +> the wrong layer reads as coverage. |
| 21 | +> |
| 22 | +> **Severity: an unbuilt capability, not a regression.** Nothing that works today |
| 23 | +> stops working. It bounds what the substrate can express: while every thread is |
| 24 | +> handed the same rows, "corpus-as-of" is inexpressible regardless of how |
| 25 | +> `meta_basin` is written. |
| 26 | +
|
| 27 | +**The defect (Codex, #868, verified against the code).** `WitnessLens::at(pos)` |
| 28 | +always reads the **current snapshot**. `visible(pos)` can only *include or |
| 29 | +exclude* an address — it structurally **cannot** select the historical row |
| 30 | +revision that `QueryReference::at(v, rung)` + `deinterlace` produce. So when the |
| 31 | +standing wave holds threads pinned to different Lance versions: |
| 32 | + |
| 33 | +- a thread whose row was modified after its horizon is graded from the **newer** |
| 34 | + register — it reads a future it should not be able to see; |
| 35 | +- one invocation shares **one** peer domain, so quorum, trajectory and basin |
| 36 | + membership describe a **global snapshot**, not each thread's corpus-as-of view. |
| 37 | + |
| 38 | +**Why no better predicate fixes it.** Include/exclude is the wrong *arity* for |
| 39 | +the question. The row bytes are fetched from the wrong version **before** the |
| 40 | +predicate is consulted, so no `visible` implementation can recover the right |
| 41 | +ones. The input must carry the focal thread's **temporal projection / address |
| 42 | +set**, not a spatial filter over the current lens. |
| 43 | + |
| 44 | +**Scope — CORRECTED (Codex, #869). It subsumes nothing.** My first filing claimed |
| 45 | +`GradedRow::pos`, the Θ(N·k) peer scan, and `MetaBasin::members` were all |
| 46 | +downstream of one cause and could not be fixed separately. That was the same |
| 47 | +flattening reflex as the rest of this arc: three things felt like one, so I made |
| 48 | +them one. |
| 49 | + |
| 50 | +**`TD-LENS-QUORUM-SCANS-THE-WHOLE-LENS` STAYS OPEN and is NOT superseded.** For a |
| 51 | +plain single-version sparse window with `N` corpus rows and `k` visible, |
| 52 | +`grade_rows` calls `quorum_mantissa_lens` once per focal and each call scans all |
| 53 | +`N` positions — `Θ(N·k)`, measured at 4608 probes for N=512/k=8 against 64 |
| 54 | +gathered peer comparisons. **Temporal projection does not reduce that by one |
| 55 | +probe.** The two are orthogonal: an as-of projection fixes *which rows* a thread |
| 56 | +sees; the address list fixes *how many it touches to find its peers*. Declaring |
| 57 | +the address-list plan superseded would have closed a measured performance |
| 58 | +regression by rhetoric. |
| 59 | + |
| 60 | +**Why the suite is silent.** Every fixture in `meta_basin` builds one snapshot at |
| 61 | +one version, so the entire temporal axis is **constant across every comparison**, |
| 62 | +including the equivalence test that feeds the *same* fixture to both sides. Third |
| 63 | +instance today of `E-THE-EQUALITY-PASSED-WHILE-AN-AXIS-WAS-CONSTANT-1` — and this |
| 64 | +one was found by asking a reviewer "what else is constant across my fixtures?" |
| 65 | +rather than by the suite. **Any fix must land with a multi-version fixture**, or |
| 66 | +the same silence repeats. |
| 67 | + |
| 68 | +**Operator framing that produced it:** ~64k reasoning threads, each temporally |
| 69 | +situated, reconciled through `temporal.rs`. The merged code models rows as data |
| 70 | +swept at one instant; the substrate is threads reading their own corpus-as-of. |
| 71 | + |
| 72 | + |
3 | 73 | ## 2026-07-27 — ISS-841-856-NEVER-ANSWERED-REVIEW-COMMENTS — the forensic recovery's full ledger of GitHub review/issue comments across #849–#856 that never received a reply, sorted by whether the underlying finding was fixed anyway |
4 | 74 |
|
5 | 75 | > Filed by the arc-841-856-postmortem recovery session. Every item below was |
|
0 commit comments