From 8a6e836b8a42184550f87682bcf6fdc8fad948cc Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 10:47:46 +0000 Subject: [PATCH 01/22] =?UTF-8?q?duckdb=20harvest:=20make=20it=20reproduci?= =?UTF-8?q?ble,=20discharging=20the=20matrix's=20=C2=A76?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The translation matrix's §6 recorded that the 22-TU .cpp harvest yielded seven TUs at 100% Empty, because DuckDB's execution is template-dispatched and lives in headers. A header pass was run on 2026-09-14 and its counts written into the README — but that file's own honesty note says the complaint was NOT discharged: the TSVs, the args and the DuckDB source were all absent, so what existed was "a README quoting counts from a TSV that is absent." Now committed beside it: run.sh (one command), headers.txt, args.txt.in (a template, so include paths follow DUCKDB_SRC instead of being pinned to one machine), the 40 TSVs at 348K, and provenance.txt carrying the DuckDB commit, origin, ruff commit and clang version. Source is the AdaWorldAPI fork per P0; upstream duckdb/duckdb is out of scope and returns 403. Methods re-derive to 123 — an exact match with the recorded table on all ten rows, so that observation is confirmed rather than quoted. Events land at 1620 against 1622, differing on four rows (+1, -5, +1, +1). Methods matching exactly means no method was added or removed, so the deltas are inside bodies — source drift between two checkouts. The earlier run recorded no commit, so there is nothing to diff against, and that is exactly the gap provenance.txt closes. Recorded because it nearly went the other way: the first run.sh subtracted a header row from each TSV and reported 115/1612, a clean uniform -1 on every non-empty header, which reads as "the earlier numbers were inflated." Neither TSV has a header row; line 1 is already data. What caught it was the shape of the disagreement — uniform -1 with 0 on the two empty headers is an off-by-one, not source drift. A measurement harness is code and earns the same scepticism as what it measures. Also names what is still unrun: harvest_events is the BEHAVIOURAL arm. The STRUCTURAL arm (extract_tree -> ModelGraph, has_function / inherits_from / virtually_overrides, feeding ruff_spo_triplet and ruff_cpp_codegen) has never been pointed at DuckDB. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .claude/harvest/duckdb-headers/README.md | 73 ++ .claude/harvest/duckdb-headers/args.txt.in | 14 + .claude/harvest/duckdb-headers/headers.txt | 10 + .claude/harvest/duckdb-headers/ore/args.txt | 14 + .../events.tsv | 39 + .../methods.tsv | 5 + .../scopes.tsv | 5 + .../symbols.tsv | 10 + .../events.tsv | 0 .../methods.tsv | 0 .../scopes.tsv | 0 .../symbols.tsv | 0 .../events.tsv | 0 .../methods.tsv | 0 .../scopes.tsv | 0 .../symbols.tsv | 0 .../common_types_selection_vector/events.tsv | 311 +++++++ .../common_types_selection_vector/methods.tsv | 26 + .../common_types_selection_vector/scopes.tsv | 34 + .../common_types_selection_vector/symbols.tsv | 66 ++ .../ore/common_types_validity_mask/events.tsv | 836 ++++++++++++++++++ .../common_types_validity_mask/methods.tsv | 61 ++ .../ore/common_types_validity_mask/scopes.tsv | 122 +++ .../common_types_validity_mask/symbols.tsv | 93 ++ .../ore/common_types_vector/events.tsv | 42 + .../ore/common_types_vector/methods.tsv | 6 + .../ore/common_types_vector/scopes.tsv | 8 + .../ore/common_types_vector/symbols.tsv | 17 + .../events.tsv | 281 ++++++ .../methods.tsv | 10 + .../scopes.tsv | 44 + .../symbols.tsv | 32 + .../events.tsv | 7 + .../methods.tsv | 1 + .../scopes.tsv | 1 + .../symbols.tsv | 6 + .../events.tsv | 12 + .../methods.tsv | 2 + .../scopes.tsv | 2 + .../symbols.tsv | 10 + .../ore/execution_ht_entry/events.tsv | 92 ++ .../ore/execution_ht_entry/methods.tsv | 12 + .../ore/execution_ht_entry/scopes.tsv | 12 + .../ore/execution_ht_entry/symbols.tsv | 22 + .../harvest/duckdb-headers/ore/per-header.tsv | 12 + .../harvest/duckdb-headers/ore/provenance.txt | 5 + .claude/harvest/duckdb-headers/run.sh | 85 ++ 47 files changed, 2440 insertions(+) create mode 100644 .claude/harvest/duckdb-headers/args.txt.in create mode 100644 .claude/harvest/duckdb-headers/headers.txt create mode 100644 .claude/harvest/duckdb-headers/ore/args.txt create mode 100644 .claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_operator_constant_operators/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_operator_constant_operators/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_operator_constant_operators/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_operator_constant_operators/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_selection_vector/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_selection_vector/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_selection_vector/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_selection_vector/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_validity_mask/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_validity_mask/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_validity_mask/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_validity_mask/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_vector/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_vector/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_vector/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_types_vector/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/execution_expression_executor_state/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/execution_expression_executor_state/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/execution_expression_executor_state/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/execution_expression_executor_state/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/execution_ht_entry/events.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/execution_ht_entry/methods.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/execution_ht_entry/scopes.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/execution_ht_entry/symbols.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/per-header.tsv create mode 100644 .claude/harvest/duckdb-headers/ore/provenance.txt create mode 100755 .claude/harvest/duckdb-headers/run.sh diff --git a/.claude/harvest/duckdb-headers/README.md b/.claude/harvest/duckdb-headers/README.md index 6e02048e5..954f5cc68 100644 --- a/.claude/harvest/duckdb-headers/README.md +++ b/.claude/harvest/duckdb-headers/README.md @@ -156,3 +156,76 @@ ht_entry_t.SetPointer ht_entry_t.SetSalt ht_entry_t.ht_entry_t ``` + +--- + +## ⊘ §6 IS NOW DISCHARGED — the harvest is reproducible, 2026-09-16 + +The honesty note above says what was missing: *"The TSV is not committed, there +is no `args.txt` here, and no DuckDB source is in this tree."* All three are +fixed, and the fix is committed beside this file: + +| file | what it is | +|---|---| +| `run.sh` | the whole harvest, one command, `DUCKDB_SRC=… ./run.sh` | +| `headers.txt` | the ten headers, by path | +| `args.txt.in` | the clang args as a TEMPLATE — `@DUCKDB_SRC@` is substituted at run time, so the include paths are not pinned to one machine | +| `ore/**` | the 40 TSVs (4 per header), 348 K, committed | +| `ore/per-header.tsv` | the counts table, regenerated | +| `ore/provenance.txt` | DuckDB commit + origin + ruff commit + clang version | + +**The source is `AdaWorldAPI/duckdb`** (P0: the fork, never upstream — +`duckdb/duckdb` is correctly out of this session's scope and returns 403). +Read-clone: `GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 +https://github.com/AdaWorldAPI/duckdb /home/user/adaworldapi/duckdb`. + +### The counts, re-derived rather than quoted + +**Methods: 123 — an EXACT match with the table above, on every one of the ten +rows.** The recorded observation is confirmed reproducibly; it is no longer a +number quoting an absent TSV. + +Events land at **1620** against the recorded 1622, differing on four rows: + +| header | events now | recorded | Δ | +|---|---|---|---| +| `common_types_selection_vector` | 311 | 310 | +1 | +| `common_vector_operations_scalar_executor` | 281 | 286 | **−5** | +| `common_vector_unified_vector_format` | 7 | 6 | +1 | +| `execution_expression_executor_state` | 12 | 11 | +1 | + +**The cause is not determinable, and that is itself the point.** Methods match +exactly, so no method was added or removed — the deltas are inside bodies, +which is what source drift between two DuckDB checkouts looks like. The +2026-09-14 run recorded no commit, so there is nothing to diff against. That +is precisely the gap `ore/provenance.txt` now closes: every future run carries +`duckdb_head`, and a count without its commit is an anecdote. + +> **⚠ MY OWN HARNESS NEARLY PRODUCED A FALSE FINDING AGAINST THIS FILE.** The +> first `run.sh` subtracted a header row from each TSV before counting, and +> reported **115 / 1612** against the recorded 123 / 1622 — a clean, uniform +> −1 on every non-empty header, which reads exactly like "the earlier numbers +> were inflated." They were not. **Neither `methods.tsv` nor `events.tsv` has +> a header row**; line 1 of each is already data +> (`duckdb::TemplatedValidityData.EntryCount(idx_t)…`), so the raw line count +> IS the count. +> +> What caught it was the SHAPE of the disagreement: −1 on every non-empty +> header and 0 on the two empty ones is not how source drift behaves, it is +> how an off-by-one behaves. **A measurement harness is code and gets the same +> scepticism as the thing it measures** — this workspace's own rule that a +> null result is a claim about the apparatus until proven otherwise, applied +> to a counting script. The corrected rule is now stated at the counting site +> rather than assumed. + +### What this does NOT yet do — the structural arm is still unrun + +`harvest_events` is the BEHAVIOURAL arm (four TSVs of ordered method-body +events). `ruff_cpp_spo` also carries a STRUCTURAL arm that has never been +pointed at DuckDB: `extract_tree(root, args) -> ModelGraph` (`lib.rs:338`), +yielding `CppClass` / `CppFunction` / `CppEnum` with `has_function` / +`inherits_from` / `virtually_overrides` — the ClassView method-resolution +manifest — which then feeds `ruff_spo_triplet::reassemble` and +`ruff_cpp_codegen::{project, render}`. That is the arm that answers *what +DuckDB's operator class tree IS*, where this one answers *what one method +body does*. Running it on DuckDB is the next step, not a claim made here. diff --git a/.claude/harvest/duckdb-headers/args.txt.in b/.claude/harvest/duckdb-headers/args.txt.in new file mode 100644 index 000000000..b57dd05d2 --- /dev/null +++ b/.claude/harvest/duckdb-headers/args.txt.in @@ -0,0 +1,14 @@ +-x +c++ +-std=c++11 +-I@DUCKDB_SRC@/src/include +-I@DUCKDB_SRC@/third_party/fmt/include +-I@DUCKDB_SRC@/third_party/re2 +-I@DUCKDB_SRC@/third_party/fsst +-I@DUCKDB_SRC@/third_party/fastpforlib +-I@DUCKDB_SRC@/third_party/utf8proc/include +-I@DUCKDB_SRC@/third_party/concurrentqueue +-I@DUCKDB_SRC@/third_party/pcg +-I@DUCKDB_SRC@/third_party/tdigest +-I@DUCKDB_SRC@/third_party/mbedtls/include +-DDUCKDB_BUILD_LIBRARY diff --git a/.claude/harvest/duckdb-headers/headers.txt b/.claude/harvest/duckdb-headers/headers.txt new file mode 100644 index 000000000..192e0f178 --- /dev/null +++ b/.claude/harvest/duckdb-headers/headers.txt @@ -0,0 +1,10 @@ +common/operator/comparison_operators +common/operator/constant_operators +common/row_operations/row_matcher +common/types/selection_vector +common/types/validity_mask +common/types/vector +common/vector_operations/scalar_executor +common/vector/unified_vector_format +execution/expression_executor_state +execution/ht_entry diff --git a/.claude/harvest/duckdb-headers/ore/args.txt b/.claude/harvest/duckdb-headers/ore/args.txt new file mode 100644 index 000000000..ed809925e --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/args.txt @@ -0,0 +1,14 @@ +-x +c++ +-std=c++11 +-I/home/user/adaworldapi/duckdb/src/include +-I/home/user/adaworldapi/duckdb/third_party/fmt/include +-I/home/user/adaworldapi/duckdb/third_party/re2 +-I/home/user/adaworldapi/duckdb/third_party/fsst +-I/home/user/adaworldapi/duckdb/third_party/fastpforlib +-I/home/user/adaworldapi/duckdb/third_party/utf8proc/include +-I/home/user/adaworldapi/duckdb/third_party/concurrentqueue +-I/home/user/adaworldapi/duckdb/third_party/pcg +-I/home/user/adaworldapi/duckdb/third_party/tdigest +-I/home/user/adaworldapi/duckdb/third_party/mbedtls/include +-DDUCKDB_BUILD_LIBRARY diff --git a/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/events.tsv b/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/events.tsv new file mode 100644 index 000000000..fb2233303 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/events.tsv @@ -0,0 +1,39 @@ +duckdb::Equals.Operation(const interval_t &,const interval_t &) 0 ScopeEnter s0 - c0 - 7900 - - walk +duckdb::Equals.Operation(const interval_t &,const interval_t &) 1 Param s1 - c0 - 7942 - s7 clang +duckdb::Equals.Operation(const interval_t &,const interval_t &) 2 Param s3 - c0 - 7966 - s7 clang +duckdb::Equals.Operation(const interval_t &,const interval_t &) 3 Return - - c0 - 7994 - - walk +duckdb::Equals.Operation(const interval_t &,const interval_t &) 4 Call - s8 c0 - 8001 - static clang +duckdb::Equals.Operation(const interval_t &,const interval_t &) 5 Read s1 - c0 - 8018 - - clang +duckdb::Equals.Operation(const interval_t &,const interval_t &) 6 Read s3 - c0 - 8024 - - clang +duckdb::Equals.Operation(const interval_t &,const interval_t &) 7 ScopeExit s0 - c0 - 7900 - - walk +duckdb::Equals.Operation(const string_t &,const string_t &) 0 ScopeEnter s0 - c0 - 7463 - - walk +duckdb::Equals.Operation(const string_t &,const string_t &) 1 Param s1 - c0 - 7505 - s4 clang +duckdb::Equals.Operation(const string_t &,const string_t &) 2 Param s3 - c0 - 7527 - s4 clang +duckdb::Equals.Operation(const string_t &,const string_t &) 3 Return - - c0 - 7553 - - walk +duckdb::Equals.Operation(const string_t &,const string_t &) 4 Call - s5 c0 - 7560 - member clang +duckdb::Equals.Operation(const string_t &,const string_t &) 5 Read s1 - c0 - 7560 - - clang +duckdb::Equals.Operation(const string_t &,const string_t &) 6 Read s3 - c0 - 7568 - - clang +duckdb::Equals.Operation(const string_t &,const string_t &) 7 ScopeExit s0 - c0 - 7463 - - walk +duckdb::GreaterThan.Operation(const bool &,const bool &) 0 ScopeEnter s0 - c0 - 7149 - - walk +duckdb::GreaterThan.Operation(const bool &,const bool &) 1 Param s1 - c0 - 7196 - s2 clang +duckdb::GreaterThan.Operation(const bool &,const bool &) 2 Param s3 - c0 - 7214 - s2 clang +duckdb::GreaterThan.Operation(const bool &,const bool &) 3 Return - - c0 - 7236 - - walk +duckdb::GreaterThan.Operation(const bool &,const bool &) 4 Read s3 - c0 - 7244 - - clang +duckdb::GreaterThan.Operation(const bool &,const bool &) 5 Read s1 - c0 - 7253 - - clang +duckdb::GreaterThan.Operation(const bool &,const bool &) 6 ScopeExit s0 - c0 - 7149 - - walk +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) 0 ScopeEnter s0 - c0 - 8034 - - walk +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) 1 Param s1 - c0 - 8081 - s7 clang +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) 2 Param s3 - c0 - 8105 - s7 clang +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) 3 Return - - c0 - 8133 - - walk +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) 4 Call - s9 c0 - 8140 - static clang +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) 5 Read s1 - c0 - 8162 - - clang +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) 6 Read s3 - c0 - 8168 - - clang +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) 7 ScopeExit s0 - c0 - 8034 - - walk +duckdb::GreaterThan.Operation(const string_t &,const string_t &) 0 ScopeEnter s0 - c0 - 7578 - - walk +duckdb::GreaterThan.Operation(const string_t &,const string_t &) 1 Param s1 - c0 - 7625 - s4 clang +duckdb::GreaterThan.Operation(const string_t &,const string_t &) 2 Param s3 - c0 - 7647 - s4 clang +duckdb::GreaterThan.Operation(const string_t &,const string_t &) 3 Return - - c0 - 7673 - - walk +duckdb::GreaterThan.Operation(const string_t &,const string_t &) 4 Call - s6 c0 - 7680 - member clang +duckdb::GreaterThan.Operation(const string_t &,const string_t &) 5 Read s1 - c0 - 7680 - - clang +duckdb::GreaterThan.Operation(const string_t &,const string_t &) 6 Read s3 - c0 - 7687 - - clang +duckdb::GreaterThan.Operation(const string_t &,const string_t &) 7 ScopeExit s0 - c0 - 7578 - - walk diff --git a/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/methods.tsv b/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/methods.tsv new file mode 100644 index 000000000..bb894d900 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/methods.tsv @@ -0,0 +1,5 @@ +duckdb::Equals.Operation(const interval_t &,const interval_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp duckdb::Equals 8 1 Empty 0 0 0 0 0 0 1 0 0 method public 2 - +duckdb::Equals.Operation(const string_t &,const string_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp duckdb::Equals 8 1 Empty 0 0 0 0 0 0 1 0 0 method public 2 - +duckdb::GreaterThan.Operation(const bool &,const bool &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp duckdb::GreaterThan 7 1 Empty 0 0 0 0 0 0 1 0 0 method public 2 - +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp duckdb::GreaterThan 8 1 Empty 0 0 0 0 0 0 1 0 0 method public 2 - +duckdb::GreaterThan.Operation(const string_t &,const string_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/operator/comparison_operators.hpp duckdb::GreaterThan 8 1 Empty 0 0 0 0 0 0 1 0 0 method public 2 - diff --git a/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/scopes.tsv b/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/scopes.tsv new file mode 100644 index 000000000..19a6696c2 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/scopes.tsv @@ -0,0 +1,5 @@ +duckdb::Equals.Operation(const interval_t &,const interval_t &) c0 - Function 0 0 7 +duckdb::Equals.Operation(const string_t &,const string_t &) c0 - Function 0 0 7 +duckdb::GreaterThan.Operation(const bool &,const bool &) c0 - Function 0 0 6 +duckdb::GreaterThan.Operation(const interval_t &,const interval_t &) c0 - Function 0 0 7 +duckdb::GreaterThan.Operation(const string_t &,const string_t &) c0 - Function 0 0 7 diff --git a/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/symbols.tsv b/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/symbols.tsv new file mode 100644 index 000000000..ff7feaa09 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_operator_comparison_operators/symbols.tsv @@ -0,0 +1,10 @@ +s0 scope_kind - Function walk +s1 param param left clang +s2 type - const bool & clang +s3 param param right clang +s4 type - const string_t & clang +s5 callee this operator== clang +s6 callee this operator> clang +s7 type - const interval_t & clang +s8 callee this Equals clang +s9 callee this GreaterThan clang diff --git a/.claude/harvest/duckdb-headers/ore/common_operator_constant_operators/events.tsv b/.claude/harvest/duckdb-headers/ore/common_operator_constant_operators/events.tsv new file mode 100644 index 000000000..e69de29bb diff --git a/.claude/harvest/duckdb-headers/ore/common_operator_constant_operators/methods.tsv b/.claude/harvest/duckdb-headers/ore/common_operator_constant_operators/methods.tsv new file mode 100644 index 000000000..e69de29bb diff --git a/.claude/harvest/duckdb-headers/ore/common_operator_constant_operators/scopes.tsv b/.claude/harvest/duckdb-headers/ore/common_operator_constant_operators/scopes.tsv new file mode 100644 index 000000000..e69de29bb diff --git a/.claude/harvest/duckdb-headers/ore/common_operator_constant_operators/symbols.tsv b/.claude/harvest/duckdb-headers/ore/common_operator_constant_operators/symbols.tsv new file mode 100644 index 000000000..e69de29bb diff --git a/.claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/events.tsv b/.claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/events.tsv new file mode 100644 index 000000000..e69de29bb diff --git a/.claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/methods.tsv b/.claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/methods.tsv new file mode 100644 index 000000000..e69de29bb diff --git a/.claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/scopes.tsv b/.claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/scopes.tsv new file mode 100644 index 000000000..e69de29bb diff --git a/.claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/symbols.tsv b/.claude/harvest/duckdb-headers/ore/common_row_operations_row_matcher/symbols.tsv new file mode 100644 index 000000000..e69de29bb diff --git a/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/events.tsv b/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/events.tsv new file mode 100644 index 000000000..b973fb569 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/events.tsv @@ -0,0 +1,311 @@ +duckdb::SelectionVector.Capacity() const 0 ScopeEnter s0 - c0 - 4937 - - walk +duckdb::SelectionVector.Capacity() const 1 Return - - c0 - 4964 - - walk +duckdb::SelectionVector.Capacity() const 2 Read s2 - c0 - 4971 - - walk +duckdb::SelectionVector.Capacity() const 3 ScopeExit s0 - c0 - 4937 - - walk +duckdb::SelectionVector.Incremental(idx_t) 0 ScopeEnter s0 - c0 - 2306 - - walk +duckdb::SelectionVector.Incremental(idx_t) 1 Param s8 - c0 - 2341 - s6 clang +duckdb::SelectionVector.Incremental(idx_t) 2 Return - - c0 - 2358 - - walk +duckdb::SelectionVector.Incremental(idx_t) 3 Call - s32 c0 - 2365 - - walk +duckdb::SelectionVector.Incremental(idx_t) 4 Call - s33 c0 - 2365 - static clang +duckdb::SelectionVector.Incremental(idx_t) 5 Read s8 - c0 - 2383 - - clang +duckdb::SelectionVector.Incremental(idx_t) 6 ScopeExit s0 - c0 - 2306 - - walk +duckdb::SelectionVector.Incremental(idx_t,idx_t) 0 ScopeEnter s0 - c0 - 1992 - - walk +duckdb::SelectionVector.Incremental(idx_t,idx_t) 1 Param s9 - c0 - 2027 - s6 clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 2 Param s8 - c0 - 2040 - s6 clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 3 Decl s27 - c0 - 2057 - s28 clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 4 Call - s29 c0 - 2073 - ctor clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 5 Call - s10 c0 - 2080 - free clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 6 Read s8 - c0 - 2096 - - clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 7 ScopeEnter s11 - c1 c0 2129 - - walk +duckdb::SelectionVector.Incremental(idx_t,idx_t) 8 Decl s12 - c1 c0 2134 for_init s6 clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 9 Read s12 - c1 c0 2147 for_cond - clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 10 Read s8 - c1 c0 2151 for_cond - clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 11 ReadWrite s12 - c1 c0 2158 for_inc - clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 12 Condition - - c1 c0 2129 for - walk +duckdb::SelectionVector.Incremental(idx_t,idx_t) 13 Call s30 s31 c1 c0 2168 - member clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 14 Read s27 - c1 c0 2168 - - clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 15 Read s12 - c1 c0 2185 - - clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 16 Read s9 - c1 c0 2188 - - clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 17 Read s12 - c1 c0 2196 - - clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 18 ScopeExit s11 - c1 c0 2129 back_edge - walk +duckdb::SelectionVector.Incremental(idx_t,idx_t) 19 Return - - c0 - 2206 - - walk +duckdb::SelectionVector.Incremental(idx_t,idx_t) 20 Call - s29 c0 - 2213 - ctor clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 21 Read s27 - c0 - 2213 - - clang +duckdb::SelectionVector.Incremental(idx_t,idx_t) 22 ScopeExit s0 - c0 - 1992 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 0 ScopeEnter s0 - c0 - 3325 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 1 Param s24 - c0 - 3341 - s25 clang +duckdb::SelectionVector.Initialize(buffer_ptr) 2 Call - s26 c0 - 3377 - member clang +duckdb::SelectionVector.Initialize(buffer_ptr) 3 Read s19 - c0 - 3377 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 4 Call - s21 c0 - 3394 - free clang +duckdb::SelectionVector.Initialize(buffer_ptr) 5 Read s24 - c0 - 3404 - - clang +duckdb::SelectionVector.Initialize(buffer_ptr) 6 ScopeEnter s40 - c1 c0 3413 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 7 Call s46 s53 c1 c0 3417 - member clang +duckdb::SelectionVector.Initialize(buffer_ptr) 8 Read s19 - c1 c0 3417 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 9 Condition - - c1 c0 3417 if - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 10 Branch - - c1 c0 3433 then - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 11 ScopeEnter s43 - c2 c1 3433 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 12 Write s1 - c2 c1 3438 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 13 Cast - - c2 c1 3451 - reinterpret walk +duckdb::SelectionVector.Initialize(buffer_ptr) 14 Call s49 s50 c2 c1 3477 - member clang +duckdb::SelectionVector.Initialize(buffer_ptr) 15 Read s51 - c2 c1 3477 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 16 Call - s52 c2 c1 3477 - member clang +duckdb::SelectionVector.Initialize(buffer_ptr) 17 Read s19 - c2 c1 3477 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 18 Write s2 - c2 c1 3515 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 19 Call s49 s54 c2 c1 3526 - member clang +duckdb::SelectionVector.Initialize(buffer_ptr) 20 Read s51 - c2 c1 3526 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 21 Call - s52 c2 c1 3526 - member clang +duckdb::SelectionVector.Initialize(buffer_ptr) 22 Read s19 - c2 c1 3526 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 23 ScopeExit s43 - c2 c1 3433 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 24 Branch - - c1 c0 3589 else - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 25 ScopeEnter s55 - c3 c1 3589 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 26 Write s1 - c3 c1 3594 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 27 Write s2 - c3 c1 3619 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 28 ScopeExit s55 - c3 c1 3589 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 29 ScopeExit s40 - c1 c0 3413 - - walk +duckdb::SelectionVector.Initialize(buffer_ptr) 30 ScopeExit s0 - c0 - 3325 - - walk +duckdb::SelectionVector.Initialize(const SelectionVector &) 0 ScopeEnter s0 - c0 - 3644 - - walk +duckdb::SelectionVector.Initialize(const SelectionVector &) 1 Param s16 - c0 - 3660 - s15 clang +duckdb::SelectionVector.Initialize(const SelectionVector &) 2 Call - s26 c0 - 3694 - member clang +duckdb::SelectionVector.Initialize(const SelectionVector &) 3 Read s19 - c0 - 3694 - - walk +duckdb::SelectionVector.Initialize(const SelectionVector &) 4 Read s22 - c0 - 3711 - - walk +duckdb::SelectionVector.Initialize(const SelectionVector &) 5 Read s16 - c0 - 3711 - - clang +duckdb::SelectionVector.Initialize(const SelectionVector &) 6 Write s1 - c0 - 3735 - - walk +duckdb::SelectionVector.Initialize(const SelectionVector &) 7 Read s18 - c0 - 3748 - - walk +duckdb::SelectionVector.Initialize(const SelectionVector &) 8 Read s16 - c0 - 3748 - - clang +duckdb::SelectionVector.Initialize(const SelectionVector &) 9 Write s2 - c0 - 3768 - - walk +duckdb::SelectionVector.Initialize(const SelectionVector &) 10 Read s23 - c0 - 3779 - - walk +duckdb::SelectionVector.Initialize(const SelectionVector &) 11 Read s16 - c0 - 3779 - - clang +duckdb::SelectionVector.Initialize(const SelectionVector &) 12 ScopeExit s0 - c0 - 3644 - - walk +duckdb::SelectionVector.Initialize(idx_t) 0 ScopeEnter s0 - c0 - 3113 - - walk +duckdb::SelectionVector.Initialize(idx_t) 1 Param s8 - c0 - 3129 - s6 clang +duckdb::SelectionVector.Initialize(idx_t) 2 Call - s26 c0 - 3169 - member clang +duckdb::SelectionVector.Initialize(idx_t) 3 Read s19 - c0 - 3169 - - walk +duckdb::SelectionVector.Initialize(idx_t) 4 Call - s48 c0 - 3186 - free clang +duckdb::SelectionVector.Initialize(idx_t) 5 Read s8 - c0 - 3217 - - clang +duckdb::SelectionVector.Initialize(idx_t) 6 Write s1 - c0 - 3227 - - walk +duckdb::SelectionVector.Initialize(idx_t) 7 Cast - - c0 - 3240 - reinterpret walk +duckdb::SelectionVector.Initialize(idx_t) 8 Call s49 s50 c0 - 3266 - member clang +duckdb::SelectionVector.Initialize(idx_t) 9 Read s51 - c0 - 3266 - - walk +duckdb::SelectionVector.Initialize(idx_t) 10 Call - s52 c0 - 3266 - member clang +duckdb::SelectionVector.Initialize(idx_t) 11 Read s19 - c0 - 3266 - - walk +duckdb::SelectionVector.Initialize(idx_t) 12 Write s2 - c0 - 3303 - - walk +duckdb::SelectionVector.Initialize(idx_t) 13 Read s8 - c0 - 3314 - - clang +duckdb::SelectionVector.Initialize(idx_t) 14 ScopeExit s0 - c0 - 3113 - - walk +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 0 ScopeEnter s0 - c0 - 2869 - - walk +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 1 Param s3 - c0 - 2885 - s4 clang +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 2 Param s45 - c0 - 2897 - s6 clang +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 3 Call s46 s47 c0 - 3040 - member clang +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 4 Read s19 - c0 - 3040 - - walk +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 5 Write s1 - c0 - 3066 - - walk +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 6 Read s3 - c0 - 3079 - - clang +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 7 Write s2 - c0 - 3086 - - walk +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 8 Read s45 - c0 - 3097 - - clang +duckdb::SelectionVector.Initialize(sel_t *,idx_t) 9 ScopeExit s0 - c0 - 2869 - - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 0 ScopeEnter s0 - c0 - 2395 - - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 1 Param s34 - c0 - 2417 - s15 clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 2 Param s35 - c0 - 2445 - s36 clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 3 Param s37 - c0 - 2467 - s6 clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 4 Param s8 - c0 - 2486 - s6 clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 5 Decl s38 - c0 - 2503 - s6 clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 6 Decl s39 - c0 - 2524 - s6 clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 7 ScopeEnter s11 - c1 c0 2545 - - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 8 Decl s12 - c1 c0 2550 for_init s6 clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 9 Read s12 - c1 c0 2563 for_cond - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 10 Read s8 - c1 c0 2567 for_cond - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 11 ReadWrite s12 - c1 c0 2574 for_inc - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 12 Condition - - c1 c0 2545 for - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 13 ScopeEnter s40 - c2 c1 2584 - - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 14 Read s38 - c2 c1 2588 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 15 Read s37 - c2 c1 2598 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 16 Call s41 s42 c2 c1 2613 - member clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 17 Read s34 - c2 c1 2613 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 18 Read s38 - c2 c1 2627 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 19 Read s12 - c2 c1 2639 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 20 Condition - - c2 c1 2588 if - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 21 Branch - - c2 c1 2642 then - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 22 ScopeEnter s43 - c3 c2 2642 - - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 23 ReadWrite s38 - c3 c2 2648 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 24 Continue - - c3 c2 2720 - - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 25 ScopeExit s43 - c3 c2 2642 - - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 26 ScopeExit s40 - c2 c1 2584 - - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 27 Call s44 s31 c1 c0 2813 - member clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 28 Read s35 - c1 c0 2813 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 29 ReadWrite s39 - c1 c0 2827 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 30 Read s12 - c1 c0 2838 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 31 ScopeExit s11 - c1 c0 2545 back_edge - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 32 Return - - c0 - 2848 - - walk +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 33 Read s39 - c0 - 2855 - - clang +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) 34 ScopeExit s0 - c0 - 2395 - - walk +duckdb::SelectionVector.IsSet() const 0 ScopeEnter s0 - c0 - 5423 - - walk +duckdb::SelectionVector.IsSet() const 1 Return - - c0 - 5453 - - walk +duckdb::SelectionVector.IsSet() const 2 Read s1 - c0 - 5460 - - walk +duckdb::SelectionVector.IsSet() const 3 ScopeExit s0 - c0 - 5423 - - walk +duckdb::SelectionVector.SelectionVector() 0 ScopeEnter s0 - c0 - 905 - - walk +duckdb::SelectionVector.SelectionVector() 1 CtorInit s1 - c0 - 925 - - clang +duckdb::SelectionVector.SelectionVector() 2 CtorInit s2 - c0 - 946 - - clang +duckdb::SelectionVector.SelectionVector() 3 ScopeExit s0 - c0 - 905 - - walk +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 0 ScopeEnter s0 - c0 - 1378 - - walk +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 1 Param s16 - c0 - 1394 - s17 clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 2 CtorInit s1 - c0 - 1435 - - clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 3 Read s18 - c0 - 1446 - - walk +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 4 Read s16 - c0 - 1446 - - clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 5 CtorInit s19 - c0 - 1465 - - clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 6 Call - s20 c0 - 1465 - ctor clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 7 Call - s21 c0 - 1480 - free clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 8 Read s22 - c0 - 1490 - - walk +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 9 Read s16 - c0 - 1490 - - clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 10 CtorInit s2 - c0 - 1514 - - clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 11 Read s23 - c0 - 1523 - - walk +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 12 Read s16 - c0 - 1523 - - clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 13 Write s1 - c0 - 1543 - - clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 14 Read s16 - c0 - 1543 - - clang +duckdb::SelectionVector.SelectionVector(SelectionVector &&) 15 ScopeExit s0 - c0 - 1378 - - walk +duckdb::SelectionVector.SelectionVector(buffer_ptr &&) 0 ScopeEnter s0 - c0 - 1575 - - walk +duckdb::SelectionVector.SelectionVector(buffer_ptr &&) 1 Param s24 - c0 - 1600 - s25 clang +duckdb::SelectionVector.SelectionVector(buffer_ptr &&) 2 Call - s7 c0 - 1638 - member clang +duckdb::SelectionVector.SelectionVector(buffer_ptr &&) 3 Call - s20 c0 - 1649 - ctor clang +duckdb::SelectionVector.SelectionVector(buffer_ptr &&) 4 Call - s21 c0 - 1649 - free clang +duckdb::SelectionVector.SelectionVector(buffer_ptr &&) 5 Read s24 - c0 - 1659 - - clang +duckdb::SelectionVector.SelectionVector(buffer_ptr &&) 6 ScopeExit s0 - c0 - 1575 - - walk +duckdb::SelectionVector.SelectionVector(const SelectionVector &) 0 ScopeEnter s0 - c0 - 1295 - - walk +duckdb::SelectionVector.SelectionVector(const SelectionVector &) 1 Param s14 - c0 - 1311 - s15 clang +duckdb::SelectionVector.SelectionVector(const SelectionVector &) 2 Call - s7 c0 - 1350 - member clang +duckdb::SelectionVector.SelectionVector(const SelectionVector &) 3 Read s14 - c0 - 1361 - - clang +duckdb::SelectionVector.SelectionVector(const SelectionVector &) 4 ScopeExit s0 - c0 - 1295 - - walk +duckdb::SelectionVector.SelectionVector(idx_t) 0 ScopeEnter s0 - c0 - 1052 - - walk +duckdb::SelectionVector.SelectionVector(idx_t) 1 Param s8 - c0 - 1077 - s6 clang +duckdb::SelectionVector.SelectionVector(idx_t) 2 Call - s7 c0 - 1094 - member clang +duckdb::SelectionVector.SelectionVector(idx_t) 3 Read s8 - c0 - 1105 - - clang +duckdb::SelectionVector.SelectionVector(idx_t) 4 ScopeExit s0 - c0 - 1052 - - walk +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 0 ScopeEnter s0 - c0 - 1117 - - walk +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 1 Param s9 - c0 - 1133 - s6 clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 2 Param s8 - c0 - 1146 - s6 clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 3 Call - s7 c0 - 1163 - member clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 4 Call - s10 c0 - 1174 - free clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 5 Read s8 - c0 - 1190 - - clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 6 ScopeEnter s11 - c1 c0 1223 - - walk +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 7 Decl s12 - c1 c0 1228 for_init s6 clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 8 Read s12 - c1 c0 1241 for_cond - clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 9 Read s8 - c1 c0 1245 for_cond - clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 10 ReadWrite s12 - c1 c0 1252 for_inc - clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 11 Condition - - c1 c0 1223 for - walk +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 12 Call - s13 c1 c0 1262 - member clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 13 Read s12 - c1 c0 1272 - - clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 14 Read s9 - c1 c0 1275 - - clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 15 Read s12 - c1 c0 1283 - - clang +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 16 ScopeExit s11 - c1 c0 1223 back_edge - walk +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) 17 ScopeExit s0 - c0 - 1117 - - walk +duckdb::SelectionVector.SelectionVector(sel_t *,idx_t) 0 ScopeEnter s0 - c0 - 964 - - walk +duckdb::SelectionVector.SelectionVector(sel_t *,idx_t) 1 Param s3 - c0 - 989 - s4 clang +duckdb::SelectionVector.SelectionVector(sel_t *,idx_t) 2 Param s5 - c0 - 1001 - s6 clang +duckdb::SelectionVector.SelectionVector(sel_t *,idx_t) 3 Call - s7 c0 - 1021 - member clang +duckdb::SelectionVector.SelectionVector(sel_t *,idx_t) 4 Read s3 - c0 - 1032 - - clang +duckdb::SelectionVector.SelectionVector(sel_t *,idx_t) 5 Read s5 - c0 - 1037 - - clang +duckdb::SelectionVector.SelectionVector(sel_t *,idx_t) 6 ScopeExit s0 - c0 - 964 - - walk +duckdb::SelectionVector.data() 0 ScopeEnter s0 - c0 - 4639 - - walk +duckdb::SelectionVector.data() 1 Return - - c0 - 4700 - - walk +duckdb::SelectionVector.data() 2 Read s1 - c0 - 4707 - - walk +duckdb::SelectionVector.data() 3 ScopeExit s0 - c0 - 4639 - - walk +duckdb::SelectionVector.data() const 0 ScopeEnter s0 - c0 - 4723 - - walk +duckdb::SelectionVector.data() const 1 Return - - c0 - 4796 - - walk +duckdb::SelectionVector.data() const 2 Read s1 - c0 - 4803 - - walk +duckdb::SelectionVector.data() const 3 ScopeExit s0 - c0 - 4723 - - walk +duckdb::SelectionVector.get_index(idx_t) const 0 ScopeEnter s0 - c0 - 4349 - - walk +duckdb::SelectionVector.get_index(idx_t) const 1 Param s56 - c0 - 4372 - s6 clang +duckdb::SelectionVector.get_index(idx_t) const 2 Return - - c0 - 4436 - - walk +duckdb::SelectionVector.get_index(idx_t) const 3 Read s1 - c0 - 4443 - - walk +duckdb::SelectionVector.get_index(idx_t) const 4 Call - s64 c0 - 4456 - member clang +duckdb::SelectionVector.get_index(idx_t) const 5 Read s56 - c0 - 4473 - - clang +duckdb::SelectionVector.get_index(idx_t) const 6 Read s56 - c0 - 4480 - - clang +duckdb::SelectionVector.get_index(idx_t) const 7 ScopeExit s0 - c0 - 4349 - - walk +duckdb::SelectionVector.get_index_unsafe(idx_t) const 0 ScopeEnter s0 - c0 - 4489 - - walk +duckdb::SelectionVector.get_index_unsafe(idx_t) const 1 Param s56 - c0 - 4519 - s6 clang +duckdb::SelectionVector.get_index_unsafe(idx_t) const 2 Cast - - c0 - 4583 - static walk +duckdb::SelectionVector.get_index_unsafe(idx_t) const 3 Read s56 - c0 - 4592 - - clang +duckdb::SelectionVector.get_index_unsafe(idx_t) const 4 Read s2 - c0 - 4598 - - walk +duckdb::SelectionVector.get_index_unsafe(idx_t) const 5 Cast - - c0 - 4583 - functional walk +duckdb::SelectionVector.get_index_unsafe(idx_t) const 6 Call - s58 c0 - 4583 - free clang +duckdb::SelectionVector.get_index_unsafe(idx_t) const 7 Return - - c0 - 4611 - - walk +duckdb::SelectionVector.get_index_unsafe(idx_t) const 8 Read s1 - c0 - 4618 - - walk +duckdb::SelectionVector.get_index_unsafe(idx_t) const 9 Read s56 - c0 - 4629 - - clang +duckdb::SelectionVector.get_index_unsafe(idx_t) const 10 ScopeExit s0 - c0 - 4489 - - walk +duckdb::SelectionVector.operator=(SelectionVector &&) 0 ScopeEnter s0 - c0 - 1671 - - walk +duckdb::SelectionVector.operator=(SelectionVector &&) 1 Param s16 - c0 - 1698 - s17 clang +duckdb::SelectionVector.operator=(SelectionVector &&) 2 Write s1 - c0 - 1736 - - walk +duckdb::SelectionVector.operator=(SelectionVector &&) 3 Read s18 - c0 - 1749 - - walk +duckdb::SelectionVector.operator=(SelectionVector &&) 4 Read s16 - c0 - 1749 - - clang +duckdb::SelectionVector.operator=(SelectionVector &&) 5 Write s1 - c0 - 1769 - - clang +duckdb::SelectionVector.operator=(SelectionVector &&) 6 Read s16 - c0 - 1769 - - clang +duckdb::SelectionVector.operator=(SelectionVector &&) 7 Call - s26 c0 - 1799 - member clang +duckdb::SelectionVector.operator=(SelectionVector &&) 8 Read s19 - c0 - 1799 - - walk +duckdb::SelectionVector.operator=(SelectionVector &&) 9 Call - s21 c0 - 1816 - free clang +duckdb::SelectionVector.operator=(SelectionVector &&) 10 Read s22 - c0 - 1826 - - walk +duckdb::SelectionVector.operator=(SelectionVector &&) 11 Read s16 - c0 - 1826 - - clang +duckdb::SelectionVector.operator=(SelectionVector &&) 12 Write s2 - c0 - 1851 - - walk +duckdb::SelectionVector.operator=(SelectionVector &&) 13 Read s23 - c0 - 1862 - - walk +duckdb::SelectionVector.operator=(SelectionVector &&) 14 Read s16 - c0 - 1862 - - clang +duckdb::SelectionVector.operator=(SelectionVector &&) 15 Return - - c0 - 1880 - - walk +duckdb::SelectionVector.operator=(SelectionVector &&) 16 ScopeExit s0 - c0 - 1671 - - walk +duckdb::SelectionVector.operator[](idx_t) 0 ScopeEnter s0 - c0 - 5321 - - walk +duckdb::SelectionVector.operator[](idx_t) 1 Param s65 - c0 - 5346 - s6 clang +duckdb::SelectionVector.operator[](idx_t) 2 Cast - - c0 - 5363 - static walk +duckdb::SelectionVector.operator[](idx_t) 3 Read s65 - c0 - 5372 - - clang +duckdb::SelectionVector.operator[](idx_t) 4 Read s2 - c0 - 5380 - - walk +duckdb::SelectionVector.operator[](idx_t) 5 Cast - - c0 - 5363 - functional walk +duckdb::SelectionVector.operator[](idx_t) 6 Call - s58 c0 - 5363 - free clang +duckdb::SelectionVector.operator[](idx_t) 7 Return - - c0 - 5393 - - walk +duckdb::SelectionVector.operator[](idx_t) 8 Read s1 - c0 - 5400 - - walk +duckdb::SelectionVector.operator[](idx_t) 9 Read s65 - c0 - 5411 - - clang +duckdb::SelectionVector.operator[](idx_t) 10 ScopeExit s0 - c0 - 5321 - - walk +duckdb::SelectionVector.operator[](idx_t) const 0 ScopeEnter s0 - c0 - 5207 - - walk +duckdb::SelectionVector.operator[](idx_t) const 1 Param s65 - c0 - 5238 - s6 clang +duckdb::SelectionVector.operator[](idx_t) const 2 Cast - - c0 - 5261 - static walk +duckdb::SelectionVector.operator[](idx_t) const 3 Read s65 - c0 - 5270 - - clang +duckdb::SelectionVector.operator[](idx_t) const 4 Read s2 - c0 - 5278 - - walk +duckdb::SelectionVector.operator[](idx_t) const 5 Cast - - c0 - 5261 - functional walk +duckdb::SelectionVector.operator[](idx_t) const 6 Call - s58 c0 - 5261 - free clang +duckdb::SelectionVector.operator[](idx_t) const 7 Return - - c0 - 5291 - - walk +duckdb::SelectionVector.operator[](idx_t) const 8 Read s1 - c0 - 5298 - - walk +duckdb::SelectionVector.operator[](idx_t) const 9 Read s65 - c0 - 5309 - - clang +duckdb::SelectionVector.operator[](idx_t) const 10 ScopeExit s0 - c0 - 5207 - - walk +duckdb::SelectionVector.sel_data() 0 ScopeEnter s0 - c0 - 4819 - - walk +duckdb::SelectionVector.sel_data() 1 Return - - c0 - 4910 - - walk +duckdb::SelectionVector.sel_data() 2 Read s19 - c0 - 4917 - - walk +duckdb::SelectionVector.sel_data() 3 ScopeExit s0 - c0 - 4819 - - walk +duckdb::SelectionVector.set_index(idx_t,idx_t) 0 ScopeEnter s0 - c0 - 3800 - - walk +duckdb::SelectionVector.set_index(idx_t,idx_t) 1 Param s56 - c0 - 3822 - s6 clang +duckdb::SelectionVector.set_index(idx_t,idx_t) 2 Param s57 - c0 - 3833 - s6 clang +duckdb::SelectionVector.set_index(idx_t,idx_t) 3 Cast - - c0 - 3891 - static walk +duckdb::SelectionVector.set_index(idx_t,idx_t) 4 Read s56 - c0 - 3900 - - clang +duckdb::SelectionVector.set_index(idx_t,idx_t) 5 Read s2 - c0 - 3906 - - walk +duckdb::SelectionVector.set_index(idx_t,idx_t) 6 Cast - - c0 - 3891 - functional walk +duckdb::SelectionVector.set_index(idx_t,idx_t) 7 Call - s58 c0 - 3891 - free clang +duckdb::SelectionVector.set_index(idx_t,idx_t) 8 Write s1 - c0 - 3919 - - walk +duckdb::SelectionVector.set_index(idx_t,idx_t) 9 Read s1 - c0 - 3919 - - walk +duckdb::SelectionVector.set_index(idx_t,idx_t) 10 Read s56 - c0 - 3930 - - clang +duckdb::SelectionVector.set_index(idx_t,idx_t) 11 Call - s59 c0 - 3937 - free clang +duckdb::SelectionVector.set_index(idx_t,idx_t) 12 Read s57 - c0 - 3962 - - clang +duckdb::SelectionVector.set_index(idx_t,idx_t) 13 ScopeExit s0 - c0 - 3800 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 0 ScopeEnter s0 - c0 - 4138 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 1 Param s60 - c0 - 4155 - s6 clang +duckdb::SelectionVector.swap(idx_t,idx_t) 2 Param s61 - c0 - 4164 - s6 clang +duckdb::SelectionVector.swap(idx_t,idx_t) 3 Cast - - c0 - 4220 - static walk +duckdb::SelectionVector.swap(idx_t,idx_t) 4 Read s60 - c0 - 4229 - - clang +duckdb::SelectionVector.swap(idx_t,idx_t) 5 Read s2 - c0 - 4233 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 6 Read s61 - c0 - 4245 - - clang +duckdb::SelectionVector.swap(idx_t,idx_t) 7 Read s2 - c0 - 4249 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 8 Cast - - c0 - 4220 - functional walk +duckdb::SelectionVector.swap(idx_t,idx_t) 9 Call - s58 c0 - 4220 - free clang +duckdb::SelectionVector.swap(idx_t,idx_t) 10 Decl s62 - c0 - 4262 - s63 clang +duckdb::SelectionVector.swap(idx_t,idx_t) 11 Read s1 - c0 - 4274 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 12 Read s60 - c0 - 4285 - - clang +duckdb::SelectionVector.swap(idx_t,idx_t) 13 Write s1 - c0 - 4291 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 14 Read s1 - c0 - 4291 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 15 Read s60 - c0 - 4302 - - clang +duckdb::SelectionVector.swap(idx_t,idx_t) 16 Read s1 - c0 - 4307 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 17 Read s61 - c0 - 4318 - - clang +duckdb::SelectionVector.swap(idx_t,idx_t) 18 Write s1 - c0 - 4324 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 19 Read s1 - c0 - 4324 - - walk +duckdb::SelectionVector.swap(idx_t,idx_t) 20 Read s61 - c0 - 4335 - - clang +duckdb::SelectionVector.swap(idx_t,idx_t) 21 Read s62 - c0 - 4340 - - clang +duckdb::SelectionVector.swap(idx_t,idx_t) 22 ScopeExit s0 - c0 - 4138 - - walk diff --git a/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/methods.tsv b/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/methods.tsv new file mode 100644 index 000000000..826e8469b --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/methods.tsv @@ -0,0 +1,26 @@ +duckdb::SelectionVector.Capacity() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::SelectionVector.Incremental(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 7 1 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::SelectionVector.Incremental(idx_t,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 23 2 Empty 0 0 0 0 0 0 1 0 0 method public 2 - +duckdb::SelectionVector.Initialize(buffer_ptr) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 31 4 Compute 1 3 0 0 0 0 0 0 0 method public 1 - +duckdb::SelectionVector.Initialize(const SelectionVector &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 13 1 Compute 0 3 0 0 0 0 0 0 0 method public 1 - +duckdb::SelectionVector.Initialize(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 15 1 Compute 1 3 0 0 0 0 0 0 0 method public 1 - +duckdb::SelectionVector.Initialize(sel_t *,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 10 1 Compute 1 2 0 0 0 0 0 0 0 method public 2 - +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 35 4 Empty 0 0 0 0 0 0 1 0 0 method public 4 - +duckdb::SelectionVector.IsSet() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::SelectionVector.SelectionVector() /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 4 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 0 - +duckdb::SelectionVector.SelectionVector(SelectionVector &&) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 16 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 1 - +duckdb::SelectionVector.SelectionVector(buffer_ptr &&) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 7 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 1 - +duckdb::SelectionVector.SelectionVector(const SelectionVector &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 5 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 1 - +duckdb::SelectionVector.SelectionVector(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 5 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 1 - +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 18 2 Empty 0 0 0 0 0 0 0 0 0 ctor public 2 - +duckdb::SelectionVector.SelectionVector(sel_t *,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 7 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 2 - +duckdb::SelectionVector.data() /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 4 1 Observe 1 0 0 0 0 0 0 0 0 method public 0 - +duckdb::SelectionVector.data() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::SelectionVector.get_index(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 8 1 Observe 1 0 0 0 0 1 0 0 0 method public 1 - +duckdb::SelectionVector.get_index_unsafe(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 11 1 Observe 2 0 0 0 0 1 0 0 0 method public 1 - +duckdb::SelectionVector.operator=(SelectionVector &&) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 17 1 Compute 0 3 0 0 0 0 0 0 0 operator public 1 - +duckdb::SelectionVector.operator[](idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 11 1 Observe 2 0 0 0 0 0 0 0 0 operator public 1 - +duckdb::SelectionVector.operator[](idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 11 1 Observe 2 0 0 0 0 1 0 0 0 operator public 1 - +duckdb::SelectionVector.sel_data() /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 4 1 Observe 1 0 0 0 0 0 0 0 0 method public 0 - +duckdb::SelectionVector.set_index(idx_t,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 14 1 Compute 1 1 0 0 0 0 0 0 0 method public 2 - +duckdb::SelectionVector.swap(idx_t,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/selection_vector.hpp duckdb::SelectionVector 23 1 Normalize 2 1 0 0 0 0 0 0 0 method public 2 - diff --git a/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/scopes.tsv b/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/scopes.tsv new file mode 100644 index 000000000..ba913cd49 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/scopes.tsv @@ -0,0 +1,34 @@ +duckdb::SelectionVector.Capacity() const c0 - Function 0 0 3 +duckdb::SelectionVector.Incremental(idx_t) c0 - Function 0 0 6 +duckdb::SelectionVector.Incremental(idx_t,idx_t) c0 - Function 0 0 22 +duckdb::SelectionVector.Incremental(idx_t,idx_t) c1 c0 For 1 7 18 +duckdb::SelectionVector.Initialize(buffer_ptr) c0 - Function 0 0 30 +duckdb::SelectionVector.Initialize(buffer_ptr) c1 c0 If 1 6 29 +duckdb::SelectionVector.Initialize(buffer_ptr) c2 c1 Then 2 11 23 +duckdb::SelectionVector.Initialize(buffer_ptr) c3 c1 Else 2 25 28 +duckdb::SelectionVector.Initialize(const SelectionVector &) c0 - Function 0 0 12 +duckdb::SelectionVector.Initialize(idx_t) c0 - Function 0 0 14 +duckdb::SelectionVector.Initialize(sel_t *,idx_t) c0 - Function 0 0 9 +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) c0 - Function 0 0 34 +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) c1 c0 For 1 7 31 +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) c2 c1 If 2 13 26 +duckdb::SelectionVector.Inverted(const SelectionVector &,SelectionVector &,idx_t,idx_t) c3 c2 Then 3 22 25 +duckdb::SelectionVector.IsSet() const c0 - Function 0 0 3 +duckdb::SelectionVector.SelectionVector() c0 - Function 0 0 3 +duckdb::SelectionVector.SelectionVector(SelectionVector &&) c0 - Function 0 0 15 +duckdb::SelectionVector.SelectionVector(buffer_ptr &&) c0 - Function 0 0 6 +duckdb::SelectionVector.SelectionVector(const SelectionVector &) c0 - Function 0 0 4 +duckdb::SelectionVector.SelectionVector(idx_t) c0 - Function 0 0 4 +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) c0 - Function 0 0 17 +duckdb::SelectionVector.SelectionVector(idx_t,idx_t) c1 c0 For 1 6 16 +duckdb::SelectionVector.SelectionVector(sel_t *,idx_t) c0 - Function 0 0 6 +duckdb::SelectionVector.data() c0 - Function 0 0 3 +duckdb::SelectionVector.data() const c0 - Function 0 0 3 +duckdb::SelectionVector.get_index(idx_t) const c0 - Function 0 0 7 +duckdb::SelectionVector.get_index_unsafe(idx_t) const c0 - Function 0 0 10 +duckdb::SelectionVector.operator=(SelectionVector &&) c0 - Function 0 0 16 +duckdb::SelectionVector.operator[](idx_t) c0 - Function 0 0 10 +duckdb::SelectionVector.operator[](idx_t) const c0 - Function 0 0 10 +duckdb::SelectionVector.sel_data() c0 - Function 0 0 3 +duckdb::SelectionVector.set_index(idx_t,idx_t) c0 - Function 0 0 13 +duckdb::SelectionVector.swap(idx_t,idx_t) c0 - Function 0 0 22 diff --git a/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/symbols.tsv b/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/symbols.tsv new file mode 100644 index 000000000..ba7638ef5 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_selection_vector/symbols.tsv @@ -0,0 +1,66 @@ +s0 scope_kind - Function walk +s1 member own sel_vector clang +s2 member own capacity clang +s3 param param sel clang +s4 type - sel_t * clang +s5 param param capacity clang +s6 type - idx_t clang +s7 callee this Initialize clang +s8 param param count clang +s9 param param start clang +s10 callee this MaxValue clang +s11 scope_kind - For walk +s12 local local i clang +s13 callee this set_index clang +s14 param param sel_vector clang +s15 type - const SelectionVector & clang +s16 param param other clang +s17 type - SelectionVector && clang +s18 member ext sel_vector walk +s19 member own selection_data clang +s20 callee this shared_ptr clang +s21 callee this move clang +s22 member ext selection_data walk +s23 member ext capacity walk +s24 param param data clang +s25 type - buffer_ptr clang +s26 callee this operator= clang +s27 local local result clang +s28 type - SelectionVector clang +s29 callee this SelectionVector clang +s30 callee ext result walk +s31 callee ext set_index clang +s32 callee this walk +s33 callee this Incremental clang +s34 param param src clang +s35 param param dst clang +s36 type - SelectionVector & clang +s37 param param source_size clang +s38 local local src_idx clang +s39 local local dst_idx clang +s40 scope_kind - If walk +s41 callee ext src walk +s42 callee ext get_index clang +s43 scope_kind - Then walk +s44 callee ext dst walk +s45 param param capacity_p clang +s46 callee ext selection_data walk +s47 callee ext reset clang +s48 callee this make_shared_ptr clang +s49 callee ext owned_data walk +s50 callee ext get clang +s51 member ext owned_data walk +s52 callee this operator-> clang +s53 callee ext operator bool clang +s54 callee ext GetSize clang +s55 scope_kind - Else walk +s56 param param idx clang +s57 param param loc clang +s58 callee this __assert_fail clang +s59 callee this UnsafeNumericCast clang +s60 param param i clang +s61 param param j clang +s62 local local tmp clang +s63 type - sel_t clang +s64 callee this get_index_unsafe clang +s65 param param index clang diff --git a/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/events.tsv b/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/events.tsv new file mode 100644 index 000000000..e04f6ddd0 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/events.tsv @@ -0,0 +1,836 @@ +duckdb::TemplatedValidityData.EntryCount(idx_t) 0 ScopeEnter s0 - c0 - 1306 - - walk +duckdb::TemplatedValidityData.EntryCount(idx_t) 1 Param s1 - c0 - 1337 - s2 clang +duckdb::TemplatedValidityData.EntryCount(idx_t) 2 Return - - c0 - 1354 - - walk +duckdb::TemplatedValidityData.EntryCount(idx_t) 3 Read s1 - c0 - 1362 - - clang +duckdb::TemplatedValidityData.EntryCount(idx_t) 4 Read s12 - c0 - 1371 - - clang +duckdb::TemplatedValidityData.EntryCount(idx_t) 5 Read s12 - c0 - 1394 - - clang +duckdb::TemplatedValidityData.EntryCount(idx_t) 6 ScopeExit s0 - c0 - 1306 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 0 ScopeEnter s0 - c0 - 927 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 1 Param s10 - c0 - 956 - s11 clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 2 Param s1 - c0 - 980 - s2 clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 3 Cast - - c0 - 997 - static walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 4 Read s10 - c0 - 1006 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 5 Cast - - c0 - 997 - functional walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 6 Call - s6 c0 - 997 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 7 Decl s3 - c0 - 1024 - s2 clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 8 Call - s4 c0 - 1043 - static clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 9 Read s1 - c0 - 1054 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 10 Write s5 - c0 - 1064 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 11 Call - s6 c0 - 1077 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 12 Read s3 - c0 - 1117 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 13 ScopeEnter s7 - c1 c0 1133 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 14 Decl s8 - c1 c0 1138 for_init s2 clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 15 Read s8 - c1 c0 1159 for_cond - clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 16 Read s3 - c1 c0 1171 for_cond - clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 17 ReadWrite s8 - c1 c0 1184 for_inc - clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 18 Condition - - c1 c0 1133 for - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 19 Write s5 - c1 c0 1202 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 20 Read s5 - c1 c0 1202 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 21 Read s8 - c1 c0 1213 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 22 Read s10 - c1 c0 1226 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 23 Read s8 - c1 c0 1240 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 24 ScopeExit s7 - c1 c0 1133 back_edge - walk +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) 25 ScopeExit s0 - c0 - 927 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 0 ScopeEnter s0 - c0 - 651 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 1 Param s1 - c0 - 689 - s2 clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 2 Decl s3 - c0 - 706 - s2 clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 3 Call - s4 c0 - 725 - static clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 4 Read s1 - c0 - 736 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 5 Write s5 - c0 - 746 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 6 Call - s6 c0 - 759 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 7 Read s3 - c0 - 799 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 8 ScopeEnter s7 - c1 c0 815 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 9 Decl s8 - c1 c0 820 for_init s2 clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 10 Read s8 - c1 c0 841 for_cond - clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 11 Read s3 - c1 c0 853 for_cond - clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 12 ReadWrite s8 - c1 c0 866 for_inc - clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 13 Condition - - c1 c0 815 for - walk +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 14 Write s5 - c1 c0 884 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 15 Read s5 - c1 c0 884 - - walk +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 16 Read s8 - c1 c0 895 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 17 Read s9 - c1 c0 908 - - clang +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 18 ScopeExit s7 - c1 c0 815 back_edge - walk +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) 19 ScopeExit s0 - c0 - 651 - - walk +duckdb::TemplatedValidityMask.AllValid() const 0 ScopeEnter s0 - c0 - 2856 - - walk +duckdb::TemplatedValidityMask.AllValid() const 1 Return - - c0 - 2889 - - walk +duckdb::TemplatedValidityMask.AllValid() const 2 Call - s22 c0 - 2896 - member clang +duckdb::TemplatedValidityMask.AllValid() const 3 ScopeExit s0 - c0 - 2856 - - walk +duckdb::TemplatedValidityMask.AllValid(V) 0 ScopeEnter s0 - c0 - 4661 - - walk +duckdb::TemplatedValidityMask.AllValid(V) 1 Param s44 - c0 - 4689 - s45 clang +duckdb::TemplatedValidityMask.AllValid(V) 2 Return - - c0 - 4785 - - walk +duckdb::TemplatedValidityMask.AllValid(V) 3 Call - s6 c0 - 4792 - - walk +duckdb::TemplatedValidityMask.AllValid(V) 4 Read s44 - c0 - 4792 - - clang +duckdb::TemplatedValidityMask.AllValid(V) 5 ScopeExit s0 - c0 - 4661 - - walk +duckdb::TemplatedValidityMask.CanHaveNull() const 0 ScopeEnter s0 - c0 - 2700 - - walk +duckdb::TemplatedValidityMask.CanHaveNull() const 1 Return - - c0 - 2736 - - walk +duckdb::TemplatedValidityMask.CanHaveNull() const 2 Read s13 - c0 - 2743 - - walk +duckdb::TemplatedValidityMask.CanHaveNull() const 3 ScopeExit s0 - c0 - 2700 - - walk +duckdb::TemplatedValidityMask.CannotHaveNull() const 0 ScopeEnter s0 - c0 - 2634 - - walk +duckdb::TemplatedValidityMask.CannotHaveNull() const 1 Return - - c0 - 2673 - - walk +duckdb::TemplatedValidityMask.CannotHaveNull() const 2 Read s13 - c0 - 2681 - - walk +duckdb::TemplatedValidityMask.CannotHaveNull() const 3 ScopeExit s0 - c0 - 2634 - - walk +duckdb::TemplatedValidityMask.CheckAllInvalid(idx_t) const 0 ScopeEnter s0 - c0 - 3006 - - walk +duckdb::TemplatedValidityMask.CheckAllInvalid(idx_t) const 1 Param s1 - c0 - 3034 - s2 clang +duckdb::TemplatedValidityMask.CheckAllInvalid(idx_t) const 2 Return - - c0 - 3057 - - walk +duckdb::TemplatedValidityMask.CheckAllInvalid(idx_t) const 3 Call - s6 c0 - 3064 - - walk +duckdb::TemplatedValidityMask.CheckAllInvalid(idx_t) const 4 Call - s23 c0 - 3064 - member clang +duckdb::TemplatedValidityMask.CheckAllInvalid(idx_t) const 5 Read s1 - c0 - 3075 - - clang +duckdb::TemplatedValidityMask.CheckAllInvalid(idx_t) const 6 ScopeExit s0 - c0 - 3006 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const 0 ScopeEnter s0 - c0 - 2918 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const 1 Param s1 - c0 - 2944 - s2 clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const 2 Return - - c0 - 2967 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const 3 Call - s6 c0 - 2974 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const 4 Call - s23 c0 - 2974 - member clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const 5 Read s1 - c0 - 2985 - - clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const 6 Read s1 - c0 - 2995 - - clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const 7 ScopeExit s0 - c0 - 2918 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 0 ScopeEnter s0 - c0 - 3093 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 1 Param s24 - c0 - 3119 - s2 clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 2 Param s25 - c0 - 3129 - s2 clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 3 ScopeEnter s26 - c1 c0 3151 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 4 Call - s22 c1 c0 3155 - member clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 5 Condition - - c1 c0 3155 if - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 6 Branch - - c1 c0 3173 then - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 7 ScopeEnter s27 - c2 c1 3173 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 8 Return - - c2 c1 3178 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 9 ScopeExit s27 - c2 c1 3173 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 10 ScopeExit s26 - c1 c0 3151 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 11 ScopeEnter s7 - c3 c0 3197 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 12 Decl s28 - c3 c0 3202 for_init s2 clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 13 Read s25 - c3 c0 3212 for_init - clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 14 Read s28 - c3 c0 3218 for_cond - clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 15 Read s24 - c3 c0 3222 for_cond - clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 16 ReadWrite s28 - c3 c0 3226 for_inc - clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 17 Condition - - c3 c0 3197 for - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 18 ScopeEnter s26 - c4 c3 3236 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 19 Call - s6 c4 c3 3241 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 20 Read s29 - c4 c3 3241 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 21 Read s28 - c4 c3 3252 - - clang +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 22 Condition - - c4 c3 3240 if - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 23 Branch - - c4 c3 3256 then - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 24 ScopeEnter s27 - c5 c4 3256 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 25 Return - - c5 c4 3262 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 26 ScopeExit s27 - c5 c4 3256 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 27 ScopeExit s26 - c4 c3 3236 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 28 ScopeExit s7 - c3 c0 3197 back_edge - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 29 Return - - c0 - 3287 - - walk +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const 30 ScopeExit s0 - c0 - 3093 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 0 ScopeEnter s0 - c0 - 10625 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 1 Param s69 - c0 - 10642 - s20 clang +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 2 Param s1 - c0 - 10678 - s2 clang +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 3 Write s14 - c0 - 10695 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 4 Read s1 - c0 - 10706 - - clang +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 5 ScopeEnter s26 - c1 c0 10715 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 6 Call - s6 c1 c0 10719 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 7 Read s29 - c1 c0 10719 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 8 Read s69 - c1 c0 10719 - - clang +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 9 Condition - - c1 c0 10719 if - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 10 Branch - - c1 c0 10743 then - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 11 ScopeEnter s27 - c2 c1 10743 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 12 Write s41 - c2 c1 10748 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 13 Write s13 - c2 c1 10776 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 14 ScopeExit s27 - c2 c1 10743 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 15 Branch - - c1 c0 10810 else - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 16 ScopeEnter s38 - c3 c1 10810 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 17 Write s41 - c3 c1 10815 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 18 Call - s6 c3 c1 10831 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 19 Read s29 - c3 c1 10859 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 20 Read s69 - c3 c1 10859 - - clang +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 21 Read s1 - c3 c1 10880 - - clang +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 22 Write s13 - c3 c1 10891 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 23 Call - s6 c3 c1 10907 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 24 Read s29 - c3 c1 10907 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 25 Read s29 - c3 c1 10907 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 26 Read s41 - c3 c1 10907 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 27 ScopeExit s38 - c3 c1 10810 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 28 ScopeExit s26 - c1 c0 10715 - - walk +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) 29 ScopeExit s0 - c0 - 10625 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 0 ScopeEnter s0 - c0 - 3305 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 1 Param s1 - c0 - 3322 - s30 clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 2 ScopeEnter s26 - c1 c0 3351 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 3 Call - s22 c1 c0 3355 - member clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 4 Read s1 - c1 c0 3375 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 5 Condition - - c1 c0 3355 if - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 6 Branch - - c1 c0 3387 then - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 7 ScopeEnter s27 - c2 c1 3387 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 8 Return - - c2 c1 3392 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 9 Read s1 - c2 c1 3399 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 10 ScopeExit s27 - c2 c1 3387 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 11 ScopeExit s26 - c1 c0 3351 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 12 Decl s31 - c0 - 3413 - s2 clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 13 Decl s3 - c0 - 3432 - s30 clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 14 Call - s4 c0 - 3457 - static clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 15 Read s1 - c0 - 3468 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 16 ScopeEnter s7 - c3 c0 3478 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 17 Decl s8 - c3 c0 3483 for_init s2 clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 18 Read s8 - c3 c0 3504 for_cond - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 19 Read s3 - c3 c0 3516 for_cond - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 20 Condition - - c3 c0 3478 for - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 21 Decl s32 - c3 c0 3535 - s33 clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 22 Call - s34 c3 c0 3548 - member clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 23 ReadWrite s8 - c3 c0 3565 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 24 ScopeEnter s26 - c4 c3 3650 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 25 Read s8 - c4 c3 3654 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 26 Read s3 - c4 c3 3667 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 27 Read s1 - c4 c3 3682 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 28 Read s12 - c4 c3 3690 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 29 Condition - - c4 c3 3654 if - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 30 Branch - - c4 c3 3711 then - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 31 ScopeEnter s27 - c5 c4 3711 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 32 Decl s35 - c5 c4 3717 - s30 clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 33 Read s12 - c5 c4 3736 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 34 Read s1 - c5 c4 3754 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 35 Read s12 - c5 c4 3762 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 36 Decl s36 - c5 c4 3783 - s37 clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 37 Read s29 - c5 c4 3801 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 38 Read s35 - c5 c4 3830 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 39 ReadWrite s32 - c5 c4 3841 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 40 Read s36 - c5 c4 3850 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 41 ScopeExit s27 - c5 c4 3711 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 42 Branch - - c4 c3 3866 else - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 43 ScopeEnter s38 - c6 c4 3866 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 44 ScopeEnter s26 - c7 c6 3866 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 45 Call - s6 c7 c6 3870 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 46 Read s29 - c7 c6 3870 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 47 Read s32 - c7 c6 3879 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 48 Condition - - c7 c6 3870 if - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 49 Branch - - c7 c6 3887 then - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 50 ScopeEnter s27 - c8 c7 3887 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 51 ReadWrite s31 - c8 c7 3915 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 52 Read s12 - c8 c7 3924 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 53 Continue - - c8 c7 3944 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 54 ScopeExit s27 - c8 c7 3887 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 55 ScopeExit s26 - c7 c6 3866 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 56 ScopeExit s38 - c6 c4 3866 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 57 ScopeExit s26 - c4 c3 3650 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 58 ScopeEnter s39 - c9 c3 4013 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 59 Read s32 - c9 c3 4020 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 60 Condition - - c9 c3 4013 while - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 61 ReadWrite s32 - c9 c3 4033 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 62 Read s32 - c9 c3 4043 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 63 ReadWrite s31 - c9 c3 4061 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 64 ScopeExit s39 - c9 c3 4013 back_edge - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 65 ScopeExit s7 - c3 c0 3478 back_edge - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 66 Return - - c0 - 4080 - - walk +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 67 Read s31 - c0 - 4087 - - clang +duckdb::TemplatedValidityMask.CountValid(const idx_t) const 68 ScopeExit s0 - c0 - 3305 - - walk +duckdb::TemplatedValidityMask.EnsureWritable() 0 ScopeEnter s0 - c0 - 8270 - - walk +duckdb::TemplatedValidityMask.EnsureWritable() 1 ScopeEnter s26 - c1 c0 8303 - - walk +duckdb::TemplatedValidityMask.EnsureWritable() 2 Read s13 - c1 c0 8308 - - walk +duckdb::TemplatedValidityMask.EnsureWritable() 3 Condition - - c1 c0 8307 if - walk +duckdb::TemplatedValidityMask.EnsureWritable() 4 Branch - - c1 c0 8323 then - walk +duckdb::TemplatedValidityMask.EnsureWritable() 5 ScopeEnter s27 - c2 c1 8323 - - walk +duckdb::TemplatedValidityMask.EnsureWritable() 6 Call - s6 c2 c1 8328 - - walk +duckdb::TemplatedValidityMask.EnsureWritable() 7 Read s29 - c2 c1 8328 - - walk +duckdb::TemplatedValidityMask.EnsureWritable() 8 ScopeExit s27 - c2 c1 8323 - - walk +duckdb::TemplatedValidityMask.EnsureWritable() 9 ScopeExit s26 - c1 c0 8303 - - walk +duckdb::TemplatedValidityMask.EnsureWritable() 10 ScopeExit s0 - c0 - 8270 - - walk +duckdb::TemplatedValidityMask.EntryCount(idx_t) 0 ScopeEnter s0 - c0 - 4306 - - walk +duckdb::TemplatedValidityMask.EntryCount(idx_t) 1 Param s1 - c0 - 4337 - s2 clang +duckdb::TemplatedValidityMask.EntryCount(idx_t) 2 Return - - c0 - 4354 - - walk +duckdb::TemplatedValidityMask.EntryCount(idx_t) 3 Call - s6 c0 - 4361 - - walk +duckdb::TemplatedValidityMask.EntryCount(idx_t) 4 Read s1 - c0 - 4388 - - clang +duckdb::TemplatedValidityMask.EntryCount(idx_t) 5 ScopeExit s0 - c0 - 4306 - - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 0 ScopeEnter s0 - c0 - 5273 - - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 1 Param s51 - c0 - 5308 - s2 clang +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 2 ScopeEnter s26 - c1 c0 5321 - - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 3 Read s51 - c1 c0 5325 - - clang +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 4 Condition - - c1 c0 5325 if - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 5 Branch - - c1 c0 5333 then - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 6 ScopeEnter s27 - c2 c1 5333 - - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 7 Return - - c2 c1 5338 - - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 8 Call - s6 c2 c1 5345 - - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 9 ScopeExit s27 - c2 c1 5333 - - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 10 ScopeExit s26 - c1 c0 5321 - - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 11 Return - - c0 - 5357 - - walk +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 12 Read s12 - c0 - 5394 - - clang +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 13 Read s51 - c0 - 5411 - - clang +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) 14 ScopeExit s0 - c0 - 5273 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 0 ScopeEnter s0 - c0 - 9949 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 1 ScopeEnter s26 - c1 c0 9985 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 2 Read s13 - c1 c0 9990 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 3 Condition - - c1 c0 9989 if - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 4 Branch - - c1 c0 10005 then - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 5 ScopeEnter s27 - c2 c1 10005 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 6 Return - - c2 c1 10010 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 7 ScopeExit s27 - c2 c1 10005 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 8 ScopeExit s26 - c1 c0 9985 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 9 Return - - c0 - 10026 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 10 Call - s4 c0 - 10033 - static clang +duckdb::TemplatedValidityMask.GetAllocationSize() const 11 Read s14 - c0 - 10044 - - walk +duckdb::TemplatedValidityMask.GetAllocationSize() const 12 ScopeExit s0 - c0 - 9949 - - walk +duckdb::TemplatedValidityMask.GetData() const 0 ScopeEnter s0 - c0 - 4099 - - walk +duckdb::TemplatedValidityMask.GetData() const 1 Return - - c0 - 4129 - - walk +duckdb::TemplatedValidityMask.GetData() const 2 Read s13 - c0 - 4136 - - walk +duckdb::TemplatedValidityMask.GetData() const 3 ScopeExit s0 - c0 - 4099 - - walk +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 0 ScopeEnter s0 - c0 - 5020 - - walk +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 1 Param s49 - c0 - 5053 - s2 clang +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 2 Param s42 - c0 - 5068 - s50 clang +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 3 Param s47 - c0 - 5086 - s50 clang +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 4 Write s42 - c0 - 5111 - - clang +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 5 Read s49 - c0 - 5123 - - clang +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 6 Read s12 - c0 - 5133 - - clang +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 7 Write s47 - c0 - 5151 - - clang +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 8 Read s49 - c0 - 5166 - - clang +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 9 Read s12 - c0 - 5176 - - clang +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) 10 ScopeExit s0 - c0 - 5020 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 0 ScopeEnter s0 - c0 - 4400 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 1 Param s42 - c0 - 4426 - s2 clang +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 2 ScopeEnter s26 - c1 c0 4453 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 3 Read s13 - c1 c0 4458 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 4 Condition - - c1 c0 4457 if - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 5 Branch - - c1 c0 4473 then - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 6 ScopeEnter s27 - c2 c1 4473 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 7 Return - - c2 c1 4478 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 8 Read s29 - c2 c1 4485 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 9 ScopeExit s27 - c2 c1 4473 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 10 ScopeExit s26 - c1 c0 4453 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 11 Return - - c0 - 4518 - - walk +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 12 Call - s43 c0 - 4525 - member clang +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 13 Read s42 - c0 - 4548 - - clang +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const 14 ScopeExit s0 - c0 - 4400 - - walk +duckdb::TemplatedValidityMask.GetValidityEntryUnsafe(idx_t) const 0 ScopeEnter s0 - c0 - 4564 - - walk +duckdb::TemplatedValidityMask.GetValidityEntryUnsafe(idx_t) const 1 Param s42 - c0 - 4597 - s2 clang +duckdb::TemplatedValidityMask.GetValidityEntryUnsafe(idx_t) const 2 Return - - c0 - 4624 - - walk +duckdb::TemplatedValidityMask.GetValidityEntryUnsafe(idx_t) const 3 Read s13 - c0 - 4631 - - walk +duckdb::TemplatedValidityMask.GetValidityEntryUnsafe(idx_t) const 4 Read s42 - c0 - 4645 - - clang +duckdb::TemplatedValidityMask.GetValidityEntryUnsafe(idx_t) const 5 ScopeExit s0 - c0 - 4564 - - walk +duckdb::TemplatedValidityMask.Initialize() 0 ScopeEnter s0 - c0 - 10570 - - walk +duckdb::TemplatedValidityMask.Initialize() 1 Call - s6 c0 - 10599 - - walk +duckdb::TemplatedValidityMask.Initialize() 2 Read s29 - c0 - 10599 - - walk +duckdb::TemplatedValidityMask.Initialize() 3 Read s14 - c0 - 10610 - - walk +duckdb::TemplatedValidityMask.Initialize() 4 ScopeExit s0 - c0 - 10570 - - walk +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 0 ScopeEnter s0 - c0 - 10231 - - walk +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 1 Param s69 - c0 - 10254 - s20 clang +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 2 Write s13 - c0 - 10294 - - walk +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 3 Read s29 - c0 - 10310 - - walk +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 4 Read s69 - c0 - 10310 - - clang +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 5 Write s41 - c0 - 10333 - - walk +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 6 Read s29 - c0 - 10349 - - walk +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 7 Read s69 - c0 - 10349 - - clang +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 8 Write s14 - c0 - 10372 - - walk +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 9 Read s29 - c0 - 10383 - - walk +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 10 Read s69 - c0 - 10383 - - clang +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) 11 ScopeExit s0 - c0 - 10231 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 0 ScopeEnter s0 - c0 - 10403 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 1 Param s1 - c0 - 10426 - s2 clang +duckdb::TemplatedValidityMask.Initialize(idx_t) 2 Write s14 - c0 - 10443 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 3 Read s1 - c0 - 10454 - - clang +duckdb::TemplatedValidityMask.Initialize(idx_t) 4 Write s41 - c0 - 10463 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 5 Call - s6 c0 - 10479 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 6 Read s1 - c0 - 10507 - - clang +duckdb::TemplatedValidityMask.Initialize(idx_t) 7 Write s13 - c0 - 10517 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 8 Call - s6 c0 - 10533 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 9 Read s29 - c0 - 10533 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 10 Read s29 - c0 - 10533 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 11 Read s41 - c0 - 10533 - - walk +duckdb::TemplatedValidityMask.Initialize(idx_t) 12 ScopeExit s0 - c0 - 10403 - - walk +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 0 ScopeEnter s0 - c0 - 10080 - - walk +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 1 Param s66 - c0 - 10103 - s67 clang +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 2 Param s68 - c0 - 10125 - s2 clang +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 3 Call - s6 c0 - 10149 - - walk +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 4 Read s29 - c0 - 10149 - - walk +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 5 Read s41 - c0 - 10149 - - walk +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 6 Write s13 - c0 - 10174 - - walk +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 7 Read s66 - c0 - 10190 - - clang +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 8 Write s14 - c0 - 10202 - - walk +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 9 Read s68 - c0 - 10213 - - clang +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) 10 ScopeExit s0 - c0 - 10080 - - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 0 ScopeEnter s0 - c0 - 9853 - - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 1 ScopeEnter s26 - c1 c0 9887 - - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 2 Read s13 - c1 c0 9891 - - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 3 Condition - - c1 c0 9891 if - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 4 Branch - - c1 c0 9906 then - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 5 ScopeEnter s27 - c2 c1 9906 - - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 6 Return - - c2 c1 9911 - - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 7 ScopeExit s27 - c2 c1 9906 - - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 8 ScopeExit s26 - c1 c0 9887 - - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 9 Return - - c0 - 9930 - - walk +duckdb::TemplatedValidityMask.IsMaskSet() const 10 ScopeExit s0 - c0 - 9853 - - walk +duckdb::TemplatedValidityMask.NoneValid(V) 0 ScopeEnter s0 - c0 - 4832 - - walk +duckdb::TemplatedValidityMask.NoneValid(V) 1 Param s44 - c0 - 4861 - s45 clang +duckdb::TemplatedValidityMask.NoneValid(V) 2 Return - - c0 - 4874 - - walk +duckdb::TemplatedValidityMask.NoneValid(V) 3 Call - s6 c0 - 4881 - - walk +duckdb::TemplatedValidityMask.NoneValid(V) 4 Read s44 - c0 - 4881 - - clang +duckdb::TemplatedValidityMask.NoneValid(V) 5 ScopeExit s0 - c0 - 4832 - - walk +duckdb::TemplatedValidityMask.Reset(idx_t) 0 ScopeEnter s0 - c0 - 4155 - - walk +duckdb::TemplatedValidityMask.Reset(idx_t) 1 Param s40 - c0 - 4173 - s2 clang +duckdb::TemplatedValidityMask.Reset(idx_t) 2 Write s13 - c0 - 4222 - - walk +duckdb::TemplatedValidityMask.Reset(idx_t) 3 Call - s6 c0 - 4249 - - walk +duckdb::TemplatedValidityMask.Reset(idx_t) 4 Read s29 - c0 - 4249 - - walk +duckdb::TemplatedValidityMask.Reset(idx_t) 5 Read s41 - c0 - 4249 - - walk +duckdb::TemplatedValidityMask.Reset(idx_t) 6 Write s14 - c0 - 4274 - - walk +duckdb::TemplatedValidityMask.Reset(idx_t) 7 Read s40 - c0 - 4285 - - clang +duckdb::TemplatedValidityMask.Reset(idx_t) 8 ScopeExit s0 - c0 - 4155 - - walk +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 0 ScopeEnter s0 - c0 - 4897 - - walk +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 1 Param s44 - c0 - 4927 - s46 clang +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 2 Param s47 - c0 - 4943 - s48 clang +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 3 Return - - c0 - 4974 - - walk +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 4 Read s44 - c0 - 4981 - - clang +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 5 Call - s6 c0 - 4990 - - walk +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 6 Call - s6 c0 - 4990 - - walk +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 7 Call - s6 c0 - 4998 - - walk +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 8 Read s47 - c0 - 5000 - - clang +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) 9 ScopeExit s0 - c0 - 4897 - - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 0 ScopeEnter s0 - c0 - 5987 - - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 1 Param s49 - c0 - 6010 - s2 clang +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 2 ScopeEnter s26 - c1 c0 6247 - - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 3 Read s13 - c1 c0 6252 - - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 4 Condition - - c1 c0 6251 if - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 5 Branch - - c1 c0 6267 then - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 6 ScopeEnter s27 - c2 c1 6267 - - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 7 Return - - c2 c1 6272 - - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 8 ScopeExit s27 - c2 c1 6267 - - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 9 ScopeExit s26 - c1 c0 6247 - - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 10 Return - - c0 - 6291 - - walk +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 11 Call - s54 c0 - 6298 - member clang +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 12 Read s49 - c0 - 6315 - - clang +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const 13 ScopeExit s0 - c0 - 5987 - - walk +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 0 ScopeEnter s0 - c0 - 5658 - - walk +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 1 Param s49 - c0 - 5687 - s2 clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 2 Cast - - c0 - 5712 - static walk +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 3 Read s13 - c0 - 5721 - - walk +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 4 Cast - - c0 - 5712 - functional walk +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 5 Call - s6 c0 - 5712 - - walk +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 6 Decl s8 - c0 - 5739 - s2 clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 7 Decl s52 - c0 - 5756 - s2 clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 8 Call - s53 c0 - 5772 - static clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 9 Read s49 - c0 - 5786 - - clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 10 Read s8 - c0 - 5795 - - clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 11 Read s52 - c0 - 5806 - - clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 12 Decl s32 - c0 - 5823 - s33 clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 13 Call - s43 c0 - 5836 - member clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 14 Read s8 - c0 - 5859 - - clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 15 Return - - c0 - 5873 - - walk +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 16 Call - s6 c0 - 5880 - - walk +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 17 Read s29 - c0 - 5880 - - walk +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 18 Read s32 - c0 - 5891 - - clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 19 Read s52 - c0 - 5898 - - clang +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const 20 ScopeExit s0 - c0 - 5658 - - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 0 ScopeEnter s0 - c0 - 8059 - - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 1 Param s49 - c0 - 8075 - s2 clang +duckdb::TemplatedValidityMask.Set(idx_t,bool) 2 Param s56 - c0 - 8090 - s57 clang +duckdb::TemplatedValidityMask.Set(idx_t,bool) 3 ScopeEnter s26 - c1 c0 8106 - - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 4 Read s56 - c1 c0 8110 - - clang +duckdb::TemplatedValidityMask.Set(idx_t,bool) 5 Condition - - c1 c0 8110 if - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 6 Branch - - c1 c0 8117 then - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 7 ScopeEnter s27 - c2 c1 8117 - - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 8 Call - s58 c2 c1 8122 - member clang +duckdb::TemplatedValidityMask.Set(idx_t,bool) 9 Read s49 - c2 c1 8131 - - clang +duckdb::TemplatedValidityMask.Set(idx_t,bool) 10 ScopeExit s27 - c2 c1 8117 - - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 11 Branch - - c1 c0 8150 else - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 12 ScopeEnter s38 - c3 c1 8150 - - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 13 Call - s59 c3 c1 8155 - member clang +duckdb::TemplatedValidityMask.Set(idx_t,bool) 14 Read s49 - c3 c1 8166 - - clang +duckdb::TemplatedValidityMask.Set(idx_t,bool) 15 ScopeExit s38 - c3 c1 8150 - - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 16 ScopeExit s26 - c1 c0 8106 - - walk +duckdb::TemplatedValidityMask.Set(idx_t,bool) 17 ScopeExit s0 - c0 - 8059 - - walk +duckdb::TemplatedValidityMask.SetAllInvalid(idx_t) 0 ScopeEnter s0 - c0 - 9134 - - walk +duckdb::TemplatedValidityMask.SetAllInvalid(idx_t) 1 Param s1 - c0 - 9160 - s2 clang +duckdb::TemplatedValidityMask.SetAllInvalid(idx_t) 2 Call - s65 c0 - 9177 - member clang +duckdb::TemplatedValidityMask.SetAllInvalid(idx_t) 3 Read s1 - c0 - 9193 - - clang +duckdb::TemplatedValidityMask.SetAllInvalid(idx_t) 4 Call - s4 c0 - 9203 - static clang +duckdb::TemplatedValidityMask.SetAllInvalid(idx_t) 5 Read s1 - c0 - 9214 - - clang +duckdb::TemplatedValidityMask.SetAllInvalid(idx_t) 6 ScopeExit s0 - c0 - 9134 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 0 ScopeEnter s0 - c0 - 9301 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 1 Param s1 - c0 - 9325 - s2 clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 2 Call - s62 c0 - 9342 - member clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 3 ScopeEnter s26 - c1 c0 9362 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 4 Read s1 - c1 c0 9366 - - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 5 Condition - - c1 c0 9366 if - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 6 Branch - - c1 c0 9378 then - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 7 ScopeEnter s27 - c2 c1 9378 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 8 Return - - c2 c1 9383 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 9 ScopeExit s27 - c2 c1 9378 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 10 ScopeExit s26 - c1 c0 9362 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 11 Decl s63 - c0 - 9397 - s33 clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 12 Call - s6 c0 - 9421 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 13 Read s29 - c0 - 9421 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 14 Read s1 - c0 - 9448 - - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 15 ScopeEnter s7 - c3 c0 9462 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 16 Decl s28 - c3 c0 9467 for_init s2 clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 17 Call - s6 c3 c0 9480 for_cond - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 18 Read s28 - c3 c0 9480 for_cond - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 19 Read s63 - c3 c0 9484 for_cond - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 20 ReadWrite s28 - c3 c0 9502 for_inc - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 21 Condition - - c3 c0 9462 for - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 22 Write s13 - c3 c0 9512 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 23 Read s13 - c3 c0 9512 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 24 Read s28 - c3 c0 9526 - - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 25 Read s29 - c3 c0 9531 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 26 ScopeExit s7 - c3 c0 9462 back_edge - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 27 Decl s64 - c0 - 9564 - s2 clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 28 Read s1 - c0 - 9587 - - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 29 Read s12 - c0 - 9595 - - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 30 ReadWrite s13 - c0 - 9613 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 31 Read s13 - c0 - 9613 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 32 Read s63 - c0 - 9627 - - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 33 Read s64 - c0 - 9649 - - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 34 Read s29 - c0 - 9714 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 35 Cast - - c0 - 9784 - static walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 36 Call - s6 c0 - 9799 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 37 Read s29 - c0 - 9799 - - walk +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 38 Read s64 - c0 - 9829 - - clang +duckdb::TemplatedValidityMask.SetAllValid(idx_t) 39 ScopeExit s0 - c0 - 9301 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 0 ScopeEnter s0 - c0 - 7631 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 1 Param s49 - c0 - 7654 - s2 clang +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 2 ScopeEnter s26 - c1 c0 7885 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 3 Read s13 - c1 c0 7890 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 4 Condition - - c1 c0 7889 if - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 5 Branch - - c1 c0 7905 then - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 6 ScopeEnter s27 - c2 c1 7905 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 7 Call - s6 c2 c1 7910 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 8 Read s29 - c2 c1 7910 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 9 Read s14 - c2 c1 7921 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 10 ScopeExit s27 - c2 c1 7905 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 11 ScopeExit s26 - c1 c0 7885 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 12 Call - s6 c0 - 7938 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 13 Read s29 - c0 - 7938 - - walk +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 14 Read s49 - c0 - 7955 - - clang +duckdb::TemplatedValidityMask.SetInvalid(idx_t) 15 ScopeExit s0 - c0 - 7631 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 0 ScopeEnter s0 - c0 - 7380 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 1 Param s49 - c0 - 7409 - s2 clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 2 Decl s8 - c0 - 7428 - s2 clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 3 Decl s52 - c0 - 7445 - s2 clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 4 Call - s53 c0 - 7461 - static clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 5 Read s49 - c0 - 7475 - - clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 6 Read s8 - c0 - 7484 - - clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 7 Read s52 - c0 - 7495 - - clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 8 Call - s6 c0 - 7512 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 9 Read s29 - c0 - 7512 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 10 Read s8 - c0 - 7529 - - clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 11 Read s52 - c0 - 7540 - - clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) 12 ScopeExit s0 - c0 - 7380 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 0 ScopeEnter s0 - c0 - 7153 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 1 Param s42 - c0 - 7182 - s2 clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 2 Param s47 - c0 - 7199 - s2 clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 3 Cast - - c0 - 7223 - static walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 4 Read s13 - c0 - 7232 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 5 Cast - - c0 - 7223 - functional walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 6 Call - s6 c0 - 7223 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 7 ReadWrite s13 - c0 - 7250 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 8 Read s13 - c0 - 7250 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 9 Read s42 - c0 - 7264 - - clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 10 Call - s6 c0 - 7280 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 11 Call - s6 c0 - 7280 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 12 Call - s6 c0 - 7288 - - walk +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 13 Read s47 - c0 - 7290 - - clang +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) 14 ScopeExit s0 - c0 - 7153 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 0 ScopeEnter s0 - c0 - 8482 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 1 Param s1 - c0 - 8510 - s30 clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 2 Param s60 - c0 - 8529 - s30 clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 3 Param s61 - c0 - 8554 - s30 clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 4 Call - s62 c0 - 8581 - member clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 5 ScopeEnter s26 - c1 c0 8601 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 6 Read s1 - c1 c0 8605 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 7 Condition - - c1 c0 8605 if - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 8 Branch - - c1 c0 8617 then - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 9 ScopeEnter s27 - c2 c1 8617 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 10 Return - - c2 c1 8622 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 11 ScopeExit s27 - c2 c1 8617 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 12 ScopeExit s26 - c1 c0 8601 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 13 Decl s63 - c0 - 8636 - s37 clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 14 Call - s6 c0 - 8666 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 15 Read s29 - c0 - 8666 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 16 Read s1 - c0 - 8693 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 17 ScopeEnter s7 - c3 c0 8707 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 18 Decl s28 - c3 c0 8712 for_init s2 clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 19 Read s60 - c3 c0 8722 for_init - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 20 Call - s6 c3 c0 8735 for_cond - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 21 Read s28 - c3 c0 8735 for_cond - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 22 Call - s6 c3 c0 8739 for_cond - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 23 Read s63 - c3 c0 8748 for_cond - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 24 Read s61 - c3 c0 8766 for_cond - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 25 ReadWrite s28 - c3 c0 8778 for_inc - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 26 Condition - - c3 c0 8707 for - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 27 Write s13 - c3 c0 8788 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 28 Read s13 - c3 c0 8788 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 29 Read s28 - c3 c0 8802 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 30 ScopeExit s7 - c3 c0 8707 back_edge - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 31 ScopeEnter s26 - c4 c0 8816 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 32 Read s61 - c4 c0 8820 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 33 Read s63 - c4 c0 8833 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 34 Condition - - c4 c0 8820 if - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 35 Branch - - c4 c0 8851 then - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 36 ScopeEnter s27 - c5 c4 8851 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 37 Return - - c5 c4 8856 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 38 ScopeExit s27 - c5 c4 8851 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 39 ScopeExit s26 - c4 c0 8816 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 40 Decl s64 - c0 - 8870 - s30 clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 41 Read s1 - c0 - 8899 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 42 Read s12 - c0 - 8907 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 43 Write s13 - c0 - 8925 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 44 Read s13 - c0 - 8925 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 45 Read s63 - c0 - 8939 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 46 Read s64 - c0 - 8966 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 47 Cast - - c0 - 8994 - static walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 48 Call - s6 c0 - 9009 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 49 Read s29 - c0 - 9009 - - walk +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 50 Read s64 - c0 - 9039 - - clang +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) 51 ScopeExit s0 - c0 - 8482 - - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 0 ScopeEnter s0 - c0 - 6683 - - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 1 Param s49 - c0 - 6704 - s2 clang +duckdb::TemplatedValidityMask.SetValid(idx_t) 2 ScopeEnter s26 - c1 c0 6933 - - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 3 Read s13 - c1 c0 6938 - - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 4 Condition - - c1 c0 6937 if - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 5 Branch - - c1 c0 6953 then - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 6 ScopeEnter s27 - c2 c1 6953 - - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 7 Return - - c2 c1 7044 - - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 8 ScopeExit s27 - c2 c1 6953 - - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 9 ScopeExit s26 - c1 c0 6933 - - walk +duckdb::TemplatedValidityMask.SetValid(idx_t) 10 Call - s55 c0 - 7058 - member clang +duckdb::TemplatedValidityMask.SetValid(idx_t) 11 Read s49 - c0 - 7073 - - clang +duckdb::TemplatedValidityMask.SetValid(idx_t) 12 ScopeExit s0 - c0 - 6683 - - walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 0 ScopeEnter s0 - c0 - 6393 - - walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 1 Param s49 - c0 - 6420 - s2 clang +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 2 Cast - - c0 - 6439 - static walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 3 Read s13 - c0 - 6448 - - walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 4 Cast - - c0 - 6439 - functional walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 5 Call - s6 c0 - 6439 - - walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 6 Decl s8 - c0 - 6466 - s2 clang +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 7 Decl s52 - c0 - 6483 - s2 clang +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 8 Call - s53 c0 - 6499 - static clang +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 9 Read s49 - c0 - 6513 - - clang +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 10 Read s8 - c0 - 6522 - - clang +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 11 Read s52 - c0 - 6533 - - clang +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 12 ReadWrite s13 - c0 - 6550 - - walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 13 Read s13 - c0 - 6550 - - walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 14 Read s8 - c0 - 6564 - - clang +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 15 Call - s6 c0 - 6579 - - walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 16 Call - s6 c0 - 6579 - - walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 17 Call - s6 c0 - 6587 - - walk +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 18 Read s52 - c0 - 6589 - - clang +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) 19 ScopeExit s0 - c0 - 6393 - - walk +duckdb::TemplatedValidityMask.SizeInBytes(idx_t) 0 ScopeEnter s0 - c0 - 5419 - - walk +duckdb::TemplatedValidityMask.SizeInBytes(idx_t) 1 Param s51 - c0 - 5451 - s2 clang +duckdb::TemplatedValidityMask.SizeInBytes(idx_t) 2 Return - - c0 - 5464 - - walk +duckdb::TemplatedValidityMask.SizeInBytes(idx_t) 3 Read s51 - c0 - 5472 - - clang +duckdb::TemplatedValidityMask.SizeInBytes(idx_t) 4 Read s12 - c0 - 5476 - - clang +duckdb::TemplatedValidityMask.SizeInBytes(idx_t) 5 Read s12 - c0 - 5498 - - clang +duckdb::TemplatedValidityMask.SizeInBytes(idx_t) 6 ScopeExit s0 - c0 - 5419 - - walk +duckdb::TemplatedValidityMask.TemplatedValidityMask() 0 ScopeEnter s0 - c0 - 2070 - - walk +duckdb::TemplatedValidityMask.TemplatedValidityMask() 1 CtorInit s13 - c0 - 2103 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask() 2 CtorInit s14 - c0 - 2127 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask() 3 ScopeExit s0 - c0 - 2070 - - walk +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) 0 ScopeEnter s0 - c0 - 2277 - - walk +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) 1 Param s16 - c0 - 2315 - s17 clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) 2 Param s18 - c0 - 2323 - s2 clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) 3 CtorInit s13 - c0 - 2341 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) 4 Read s16 - c0 - 2355 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) 5 CtorInit s14 - c0 - 2361 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) 6 Read s18 - c0 - 2370 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) 7 ScopeExit s0 - c0 - 2277 - - walk +duckdb::TemplatedValidityMask.TemplatedValidityMask(const TemplatedValidityMask &,idx_t) 0 ScopeEnter s0 - c0 - 2386 - - walk +duckdb::TemplatedValidityMask.TemplatedValidityMask(const TemplatedValidityMask &,idx_t) 1 Param s19 - c0 - 2415 - s20 clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(const TemplatedValidityMask &,idx_t) 2 Param s1 - c0 - 2454 - s2 clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(const TemplatedValidityMask &,idx_t) 3 Call - s21 c0 - 2471 - member clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(const TemplatedValidityMask &,idx_t) 4 Read s19 - c0 - 2476 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(const TemplatedValidityMask &,idx_t) 5 Read s1 - c0 - 2486 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(const TemplatedValidityMask &,idx_t) 6 ScopeExit s0 - c0 - 2386 - - walk +duckdb::TemplatedValidityMask.TemplatedValidityMask(idx_t) 0 ScopeEnter s0 - c0 - 2164 - - walk +duckdb::TemplatedValidityMask.TemplatedValidityMask(idx_t) 1 Param s15 - c0 - 2202 - s2 clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(idx_t) 2 CtorInit s13 - c0 - 2224 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(idx_t) 3 CtorInit s14 - c0 - 2248 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(idx_t) 4 Read s15 - c0 - 2257 - - clang +duckdb::TemplatedValidityMask.TemplatedValidityMask(idx_t) 5 ScopeExit s0 - c0 - 2164 - - walk +duckdb::TemplatedValidityMask.ValidityMaskSize(idx_t) 0 ScopeEnter s0 - c0 - 2499 - - walk +duckdb::TemplatedValidityMask.ValidityMaskSize(idx_t) 1 Param s1 - c0 - 2536 - s2 clang +duckdb::TemplatedValidityMask.ValidityMaskSize(idx_t) 2 Return - - c0 - 2576 - - walk +duckdb::TemplatedValidityMask.ValidityMaskSize(idx_t) 3 Call - s6 c0 - 2583 - - walk +duckdb::TemplatedValidityMask.ValidityMaskSize(idx_t) 4 Read s1 - c0 - 2610 - - clang +duckdb::TemplatedValidityMask.ValidityMaskSize(idx_t) 5 ScopeExit s0 - c0 - 2499 - - walk +duckdb::ValidityArray.AllValid() const 0 ScopeEnter s0 - c0 - 12821 - - walk +duckdb::ValidityArray.AllValid() const 1 Return - - c0 - 12854 - - walk +duckdb::ValidityArray.AllValid() const 2 Call - s22 c0 - 12861 - member clang +duckdb::ValidityArray.AllValid() const 3 ScopeExit s0 - c0 - 12821 - - walk +duckdb::ValidityArray.CanHaveNull() const 0 ScopeEnter s0 - c0 - 12665 - - walk +duckdb::ValidityArray.CanHaveNull() const 1 Return - - c0 - 12701 - - walk +duckdb::ValidityArray.CanHaveNull() const 2 Read s13 - c0 - 12708 - - walk +duckdb::ValidityArray.CanHaveNull() const 3 ScopeExit s0 - c0 - 12665 - - walk +duckdb::ValidityArray.CannotHaveNull() const 0 ScopeEnter s0 - c0 - 12599 - - walk +duckdb::ValidityArray.CannotHaveNull() const 1 Return - - c0 - 12638 - - walk +duckdb::ValidityArray.CannotHaveNull() const 2 Read s13 - c0 - 12646 - - walk +duckdb::ValidityArray.CannotHaveNull() const 3 ScopeExit s0 - c0 - 12599 - - walk +duckdb::ValidityArray.Capacity() const 0 ScopeEnter s0 - c0 - 13185 - - walk +duckdb::ValidityArray.Capacity() const 1 Return - - c0 - 13212 - - walk +duckdb::ValidityArray.Capacity() const 2 Read s14 - c0 - 13219 - - walk +duckdb::ValidityArray.Capacity() const 3 ScopeExit s0 - c0 - 13185 - - walk +duckdb::ValidityArray.Initialize(idx_t,bool) 0 ScopeEnter s0 - c0 - 12884 - - walk +duckdb::ValidityArray.Initialize(idx_t,bool) 1 Param s1 - c0 - 12907 - s2 clang +duckdb::ValidityArray.Initialize(idx_t,bool) 2 Param s72 - c0 - 12920 - s57 clang +duckdb::ValidityArray.Initialize(idx_t,bool) 3 Write s14 - c0 - 12945 - - walk +duckdb::ValidityArray.Initialize(idx_t,bool) 4 Read s1 - c0 - 12956 - - clang +duckdb::ValidityArray.Initialize(idx_t,bool) 5 Call - s73 c0 - 12965 - member clang +duckdb::ValidityArray.Initialize(idx_t,bool) 6 Read s41 - c0 - 12965 - - walk +duckdb::ValidityArray.Initialize(idx_t,bool) 7 Call - s74 c0 - 12981 - free clang +duckdb::ValidityArray.Initialize(idx_t,bool) 8 Read s1 - c0 - 13010 - - clang +duckdb::ValidityArray.Initialize(idx_t,bool) 9 Write s13 - c0 - 13020 - - walk +duckdb::ValidityArray.Initialize(idx_t,bool) 10 Call s75 s76 c0 - 13036 - member clang +duckdb::ValidityArray.Initialize(idx_t,bool) 11 Read s41 - c0 - 13036 - - walk +duckdb::ValidityArray.Initialize(idx_t,bool) 12 Call - s77 c0 - 13059 - free clang +duckdb::ValidityArray.Initialize(idx_t,bool) 13 Read s13 - c0 - 13066 - - walk +duckdb::ValidityArray.Initialize(idx_t,bool) 14 Read s72 - c0 - 13081 - - clang +duckdb::ValidityArray.Initialize(idx_t,bool) 15 Read s1 - c0 - 13105 - - clang +duckdb::ValidityArray.Initialize(idx_t,bool) 16 ScopeExit s0 - c0 - 12884 - - walk +duckdb::ValidityArray.InitializeEmpty(idx_t) 0 ScopeEnter s0 - c0 - 13117 - - walk +duckdb::ValidityArray.InitializeEmpty(idx_t) 1 Param s1 - c0 - 13145 - s2 clang +duckdb::ValidityArray.InitializeEmpty(idx_t) 2 Write s14 - c0 - 13162 - - walk +duckdb::ValidityArray.InitializeEmpty(idx_t) 3 Read s1 - c0 - 13173 - - clang +duckdb::ValidityArray.InitializeEmpty(idx_t) 4 ScopeExit s0 - c0 - 13117 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 0 ScopeEnter s0 - c0 - 14553 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 1 Param s79 - c0 - 14570 - s80 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 2 Param s1 - c0 - 14590 - s30 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 3 ScopeEnter s26 - c1 c0 14619 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 4 Call - s22 c1 c0 14623 - member clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 5 Condition - - c1 c0 14623 if - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 6 Branch - - c1 c0 14641 then - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 7 ScopeEnter s27 - c2 c1 14641 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 8 Call s81 s82 c2 c1 14646 - member clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 9 Read s79 - c2 c1 14646 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 10 Read s1 - c2 c1 14657 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 11 Return - - c2 c1 14668 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 12 ScopeExit s27 - c2 c1 14641 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 13 ScopeExit s26 - c1 c0 14619 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 14 Call s81 s83 c0 - 14682 - member clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 15 Read s79 - c0 - 14682 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 16 Read s1 - c0 - 14698 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 17 Decl s84 - c0 - 14709 - s30 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 18 Read s1 - c0 - 14737 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 19 Read s12 - c0 - 14745 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 20 Decl s85 - c0 - 14777 - s30 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 21 Read s1 - c0 - 14797 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 22 Read s12 - c0 - 14805 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 23 Decl s86 - c0 - 14837 - s87 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 24 Call s81 s88 c0 - 14849 - member clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 25 Read s79 - c0 - 14849 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 26 Decl s89 - c0 - 14867 - s2 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 27 ScopeEnter s7 - c3 c0 14888 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 28 Decl s28 - c3 c0 14893 for_init s2 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 29 Read s28 - c3 c0 14906 for_cond - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 30 Read s84 - c3 c0 14910 for_cond - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 31 ReadWrite s28 - c3 c0 14928 for_inc - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 32 Condition - - c3 c0 14888 for - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 33 Decl s32 - c3 c0 14936 - s90 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 34 ScopeEnter s7 - c4 c3 14961 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 35 Decl s91 - c4 c3 14966 for_init s2 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 36 Read s91 - c4 c3 14979 for_cond - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 37 Read s12 - c4 c3 14983 for_cond - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 38 ReadWrite s91 - c4 c3 15015 for_inc - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 39 Condition - - c4 c3 14961 for - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 40 ScopeEnter s26 - c5 c4 15024 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 41 Call - s54 c5 c4 15028 - member clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 42 ReadWrite s89 - c5 c4 15045 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 43 Condition - - c5 c4 15028 if - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 44 Branch - - c5 c4 15057 then - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 45 ScopeEnter s27 - c6 c5 15057 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 46 ReadWrite s32 - c6 c5 15064 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 47 Cast - - c6 c5 15073 - functional walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 48 Read s91 - c6 c5 15090 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 49 ScopeExit s27 - c6 c5 15057 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 50 ScopeExit s26 - c5 c4 15024 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 51 ScopeExit s7 - c4 c3 14961 back_edge - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 52 Write s92 - c3 c0 15107 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 53 ReadWrite s86 - c3 c0 15108 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 54 Read s32 - c3 c0 15117 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 55 ScopeExit s7 - c3 c0 14888 back_edge - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 56 ScopeEnter s26 - c7 c0 15130 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 57 Read s85 - c7 c0 15134 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 58 Condition - - c7 c0 15134 if - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 59 Branch - - c7 c0 15142 then - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 60 ScopeEnter s27 - c8 c7 15142 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 61 Decl s32 - c8 c7 15147 - s90 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 62 ScopeEnter s7 - c9 c8 15172 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 63 Decl s91 - c9 c8 15177 for_init s2 clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 64 Read s91 - c9 c8 15190 for_cond - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 65 Read s85 - c9 c8 15194 for_cond - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 66 ReadWrite s91 - c9 c8 15204 for_inc - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 67 Condition - - c9 c8 15172 for - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 68 ScopeEnter s26 - c10 c9 15213 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 69 Call - s54 c10 c9 15217 - member clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 70 ReadWrite s89 - c10 c9 15234 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 71 Condition - - c10 c9 15217 if - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 72 Branch - - c10 c9 15246 then - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 73 ScopeEnter s27 - c11 c10 15246 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 74 ReadWrite s32 - c11 c10 15253 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 75 Cast - - c11 c10 15262 - functional walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 76 Read s91 - c11 c10 15279 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 77 ScopeExit s27 - c11 c10 15246 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 78 ScopeExit s26 - c10 c9 15213 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 79 ScopeExit s7 - c9 c8 15172 back_edge - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 80 Write s92 - c8 c7 15296 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 81 ReadWrite s86 - c8 c7 15297 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 82 Read s32 - c8 c7 15306 - - clang +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 83 ScopeExit s27 - c8 c7 15142 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 84 ScopeExit s26 - c7 c0 15130 - - walk +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const 85 ScopeExit s0 - c0 - 14553 - - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 0 ScopeEnter s0 - c0 - 13559 - - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 1 Param s49 - c0 - 13582 - s2 clang +duckdb::ValidityArray.RowIsValid(idx_t) const 2 ScopeEnter s26 - c1 c0 13819 - - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 3 Read s13 - c1 c0 13824 - - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 4 Condition - - c1 c0 13823 if - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 5 Branch - - c1 c0 13839 then - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 6 ScopeEnter s27 - c2 c1 13839 - - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 7 Return - - c2 c1 13844 - - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 8 ScopeExit s27 - c2 c1 13839 - - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 9 ScopeExit s26 - c1 c0 13819 - - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 10 Return - - c0 - 13863 - - walk +duckdb::ValidityArray.RowIsValid(idx_t) const 11 Call - s54 c0 - 13870 - member clang +duckdb::ValidityArray.RowIsValid(idx_t) const 12 Read s49 - c0 - 13887 - - clang +duckdb::ValidityArray.RowIsValid(idx_t) const 13 ScopeExit s0 - c0 - 13559 - - walk +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 0 ScopeEnter s0 - c0 - 13373 - - walk +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 1 Param s49 - c0 - 13402 - s2 clang +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 2 Cast - - c0 - 13427 - static walk +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 3 Read s13 - c0 - 13436 - - walk +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 4 Cast - - c0 - 13427 - functional walk +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 5 Call - s78 c0 - 13427 - free clang +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 6 Return - - c0 - 13454 - - walk +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 7 Read s13 - c0 - 13461 - - walk +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 8 Read s49 - c0 - 13475 - - clang +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const 9 ScopeExit s0 - c0 - 13373 - - walk +duckdb::ValidityArray.SetValid(idx_t) 0 ScopeEnter s0 - c0 - 14147 - - walk +duckdb::ValidityArray.SetValid(idx_t) 1 Param s49 - c0 - 14168 - s2 clang +duckdb::ValidityArray.SetValid(idx_t) 2 ScopeEnter s26 - c1 c0 14397 - - walk +duckdb::ValidityArray.SetValid(idx_t) 3 Read s13 - c1 c0 14402 - - walk +duckdb::ValidityArray.SetValid(idx_t) 4 Condition - - c1 c0 14401 if - walk +duckdb::ValidityArray.SetValid(idx_t) 5 Branch - - c1 c0 14417 then - walk +duckdb::ValidityArray.SetValid(idx_t) 6 ScopeEnter s27 - c2 c1 14417 - - walk +duckdb::ValidityArray.SetValid(idx_t) 7 Return - - c2 c1 14508 - - walk +duckdb::ValidityArray.SetValid(idx_t) 8 ScopeExit s27 - c2 c1 14417 - - walk +duckdb::ValidityArray.SetValid(idx_t) 9 ScopeExit s26 - c1 c0 14397 - - walk +duckdb::ValidityArray.SetValid(idx_t) 10 Call - s55 c0 - 14523 - member clang +duckdb::ValidityArray.SetValid(idx_t) 11 Read s49 - c0 - 14538 - - clang +duckdb::ValidityArray.SetValid(idx_t) 12 ScopeExit s0 - c0 - 14147 - - walk +duckdb::ValidityArray.SetValidUnsafe(idx_t) 0 ScopeEnter s0 - c0 - 13965 - - walk +duckdb::ValidityArray.SetValidUnsafe(idx_t) 1 Param s49 - c0 - 13992 - s2 clang +duckdb::ValidityArray.SetValidUnsafe(idx_t) 2 Cast - - c0 - 14011 - static walk +duckdb::ValidityArray.SetValidUnsafe(idx_t) 3 Read s13 - c0 - 14020 - - walk +duckdb::ValidityArray.SetValidUnsafe(idx_t) 4 Cast - - c0 - 14011 - functional walk +duckdb::ValidityArray.SetValidUnsafe(idx_t) 5 Call - s78 c0 - 14011 - free clang +duckdb::ValidityArray.SetValidUnsafe(idx_t) 6 Write s13 - c0 - 14038 - - walk +duckdb::ValidityArray.SetValidUnsafe(idx_t) 7 Read s13 - c0 - 14038 - - walk +duckdb::ValidityArray.SetValidUnsafe(idx_t) 8 Read s49 - c0 - 14052 - - clang +duckdb::ValidityArray.SetValidUnsafe(idx_t) 9 ScopeExit s0 - c0 - 13965 - - walk +duckdb::ValidityArray.ValidityArray() 0 ScopeEnter s0 - c0 - 12569 - - walk +duckdb::ValidityArray.ValidityArray() 1 ScopeExit s0 - c0 - 12569 - - walk +duckdb::ValidityMask.ValidityMask() 0 ScopeEnter s0 - c0 - 11116 - - walk +duckdb::ValidityMask.ValidityMask() 1 Call - s70 c0 - 11140 - ctor clang +duckdb::ValidityMask.ValidityMask() 2 ScopeExit s0 - c0 - 11116 - - walk +duckdb::ValidityMask.ValidityMask(const ValidityMask &,idx_t) 0 ScopeEnter s0 - c0 - 11391 - - walk +duckdb::ValidityMask.ValidityMask(const ValidityMask &,idx_t) 1 Param s19 - c0 - 11411 - s71 clang +duckdb::ValidityMask.ValidityMask(const ValidityMask &,idx_t) 2 Param s1 - c0 - 11441 - s2 clang +duckdb::ValidityMask.ValidityMask(const ValidityMask &,idx_t) 3 Call - s70 c0 - 11456 - ctor clang +duckdb::ValidityMask.ValidityMask(const ValidityMask &,idx_t) 4 Read s19 - c0 - 11478 - - clang +duckdb::ValidityMask.ValidityMask(const ValidityMask &,idx_t) 5 Read s1 - c0 - 11488 - - clang +duckdb::ValidityMask.ValidityMask(const ValidityMask &,idx_t) 6 ScopeExit s0 - c0 - 11391 - - walk +duckdb::ValidityMask.ValidityMask(idx_t) 0 ScopeEnter s0 - c0 - 11199 - - walk +duckdb::ValidityMask.ValidityMask(idx_t) 1 Param s18 - c0 - 11228 - s2 clang +duckdb::ValidityMask.ValidityMask(idx_t) 2 Call - s70 c0 - 11246 - ctor clang +duckdb::ValidityMask.ValidityMask(idx_t) 3 Read s18 - c0 - 11268 - - clang +duckdb::ValidityMask.ValidityMask(idx_t) 4 ScopeExit s0 - c0 - 11199 - - walk +duckdb::ValidityMask.ValidityMask(validity_t *,idx_t) 0 ScopeEnter s0 - c0 - 11284 - - walk +duckdb::ValidityMask.ValidityMask(validity_t *,idx_t) 1 Param s16 - c0 - 11313 - s67 clang +duckdb::ValidityMask.ValidityMask(validity_t *,idx_t) 2 Param s18 - c0 - 11330 - s2 clang +duckdb::ValidityMask.ValidityMask(validity_t *,idx_t) 3 Call - s70 c0 - 11348 - ctor clang +duckdb::ValidityMask.ValidityMask(validity_t *,idx_t) 4 Read s16 - c0 - 11370 - - clang +duckdb::ValidityMask.ValidityMask(validity_t *,idx_t) 5 Read s18 - c0 - 11375 - - clang +duckdb::ValidityMask.ValidityMask(validity_t *,idx_t) 6 ScopeExit s0 - c0 - 11284 - - walk diff --git a/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/methods.tsv b/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/methods.tsv new file mode 100644 index 000000000..f00a658e1 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/methods.tsv @@ -0,0 +1,61 @@ +duckdb::TemplatedValidityData.EntryCount(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityData 7 1 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityData 26 2 Compute 0 1 0 0 0 0 0 0 0 ctor public 2 - +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityData 20 2 Compute 0 1 0 0 0 0 0 0 0 ctor public 1 - +duckdb::TemplatedValidityMask.AllValid() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 4 1 Empty 0 0 0 0 0 1 0 0 0 method public 0 - +duckdb::TemplatedValidityMask.AllValid(V) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 6 1 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::TemplatedValidityMask.CanHaveNull() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::TemplatedValidityMask.CannotHaveNull() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::TemplatedValidityMask.CheckAllInvalid(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 7 1 Empty 0 0 0 0 0 1 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 8 1 Empty 0 0 0 0 0 1 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 31 6 Empty 0 0 0 0 0 1 0 0 0 method public 2 - +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 30 4 Compute 1 3 0 0 0 0 0 0 0 method public 2 - +duckdb::TemplatedValidityMask.CountValid(const idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 69 10 Empty 0 0 0 0 0 1 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.EnsureWritable() /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 11 3 Observe 1 0 0 0 0 0 0 0 0 method public 0 - +duckdb::TemplatedValidityMask.EntryCount(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 6 1 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 15 3 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::TemplatedValidityMask.GetAllocationSize() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 13 3 Observe 2 0 0 0 0 1 0 0 0 method public 0 - +duckdb::TemplatedValidityMask.GetData() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 11 1 Empty 0 0 0 0 0 0 1 0 0 method public 3 - +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 15 3 Observe 1 0 0 0 0 1 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.GetValidityEntryUnsafe(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 6 1 Observe 1 0 0 0 0 1 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.Initialize() /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 5 1 Observe 1 0 0 0 0 0 0 0 0 method public 0 - +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 12 1 Compute 0 3 0 0 0 0 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.Initialize(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 13 1 Compute 1 3 0 0 0 0 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 11 1 Compute 1 2 0 0 0 0 0 0 0 method public 2 - +duckdb::TemplatedValidityMask.IsMaskSet() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 11 3 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::TemplatedValidityMask.NoneValid(V) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 6 1 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::TemplatedValidityMask.Reset(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 9 1 Compute 1 2 0 0 0 0 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 10 1 Empty 0 0 0 0 0 0 1 0 0 method public 2 - +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 14 3 Observe 1 0 0 0 0 1 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 21 1 Observe 1 0 0 0 0 1 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.Set(idx_t,bool) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 18 4 Empty 0 0 0 0 0 0 0 0 0 method public 2 - +duckdb::TemplatedValidityMask.SetAllInvalid(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 7 1 Empty 0 0 0 0 0 0 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.SetAllValid(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 40 4 Normalize 1 1 0 0 0 0 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.SetInvalid(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 16 3 Observe 2 0 0 0 0 0 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 13 1 Empty 0 0 0 0 0 0 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 15 1 Normalize 1 1 0 0 0 0 0 0 0 method public 2 - +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 52 6 Compute 0 1 0 0 0 0 0 0 0 method public 3 - +duckdb::TemplatedValidityMask.SetValid(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 13 3 Observe 1 0 0 0 0 0 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 20 1 Normalize 1 1 0 0 0 0 0 0 0 method public 1 - +duckdb::TemplatedValidityMask.SizeInBytes(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 7 1 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::TemplatedValidityMask.TemplatedValidityMask() /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 4 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 0 - +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 8 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 2 - +duckdb::TemplatedValidityMask.TemplatedValidityMask(const TemplatedValidityMask &,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 7 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 2 - +duckdb::TemplatedValidityMask.TemplatedValidityMask(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 6 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 1 - +duckdb::TemplatedValidityMask.ValidityMaskSize(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::TemplatedValidityMask 6 1 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::ValidityArray.AllValid() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 4 1 Empty 0 0 0 0 0 1 0 0 0 method public 0 - +duckdb::ValidityArray.CanHaveNull() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::ValidityArray.CannotHaveNull() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::ValidityArray.Capacity() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::ValidityArray.Initialize(idx_t,bool) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 17 1 Compute 2 3 0 0 0 0 0 0 0 method public 2 - +duckdb::ValidityArray.InitializeEmpty(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 5 1 Compute 0 1 0 0 0 0 0 0 0 method public 1 - +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 86 12 Empty 0 0 0 0 0 1 0 0 0 method public 2 - +duckdb::ValidityArray.RowIsValid(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 14 3 Observe 1 0 0 0 0 1 0 0 0 method public 1 - +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 10 1 Observe 1 0 0 0 0 1 0 0 0 method public 1 - +duckdb::ValidityArray.SetValid(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 13 3 Observe 1 0 0 0 0 0 0 0 0 method public 1 - +duckdb::ValidityArray.SetValidUnsafe(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 10 1 Normalize 1 1 0 0 0 0 0 0 0 method public 1 - +duckdb::ValidityArray.ValidityArray() /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityArray 2 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 0 - +duckdb::ValidityMask.ValidityMask() /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityMask 3 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 0 - +duckdb::ValidityMask.ValidityMask(const ValidityMask &,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityMask 7 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 2 - +duckdb::ValidityMask.ValidityMask(idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityMask 5 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 1 - +duckdb::ValidityMask.ValidityMask(validity_t *,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/validity_mask.hpp duckdb::ValidityMask 7 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 2 - diff --git a/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/scopes.tsv b/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/scopes.tsv new file mode 100644 index 000000000..8828b32af --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/scopes.tsv @@ -0,0 +1,122 @@ +duckdb::TemplatedValidityData.EntryCount(idx_t) c0 - Function 0 0 6 +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) c0 - Function 0 0 25 +duckdb::TemplatedValidityData.TemplatedValidityData(const V *,idx_t) c1 c0 For 1 13 24 +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) c0 - Function 0 0 19 +duckdb::TemplatedValidityData.TemplatedValidityData(idx_t) c1 c0 For 1 8 18 +duckdb::TemplatedValidityMask.AllValid() const c0 - Function 0 0 3 +duckdb::TemplatedValidityMask.AllValid(V) c0 - Function 0 0 5 +duckdb::TemplatedValidityMask.CanHaveNull() const c0 - Function 0 0 3 +duckdb::TemplatedValidityMask.CannotHaveNull() const c0 - Function 0 0 3 +duckdb::TemplatedValidityMask.CheckAllInvalid(idx_t) const c0 - Function 0 0 6 +duckdb::TemplatedValidityMask.CheckAllValid(idx_t) const c0 - Function 0 0 7 +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const c0 - Function 0 0 30 +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const c1 c0 If 1 3 10 +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const c2 c1 Then 2 7 9 +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const c3 c0 For 1 11 28 +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const c4 c3 If 2 18 27 +duckdb::TemplatedValidityMask.CheckAllValid(idx_t,idx_t) const c5 c4 Then 3 24 26 +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) c0 - Function 0 0 29 +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) c1 c0 If 1 5 28 +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) c2 c1 Then 2 11 14 +duckdb::TemplatedValidityMask.Copy(const TemplatedValidityMask &,idx_t) c3 c1 Else 2 16 27 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c0 - Function 0 0 68 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c1 c0 If 1 2 11 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c2 c1 Then 2 7 10 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c3 c0 For 1 16 65 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c4 c3 If 2 24 57 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c5 c4 Then 3 31 41 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c6 c4 Else 3 43 56 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c7 c6 If 4 44 55 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c8 c7 Then 5 50 54 +duckdb::TemplatedValidityMask.CountValid(const idx_t) const c9 c3 While 2 58 64 +duckdb::TemplatedValidityMask.EnsureWritable() c0 - Function 0 0 10 +duckdb::TemplatedValidityMask.EnsureWritable() c1 c0 If 1 1 9 +duckdb::TemplatedValidityMask.EnsureWritable() c2 c1 Then 2 5 8 +duckdb::TemplatedValidityMask.EntryCount(idx_t) c0 - Function 0 0 5 +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) c0 - Function 0 0 14 +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) c1 c0 If 1 2 10 +duckdb::TemplatedValidityMask.EntryWithValidBits(idx_t) c2 c1 Then 2 6 9 +duckdb::TemplatedValidityMask.GetAllocationSize() const c0 - Function 0 0 12 +duckdb::TemplatedValidityMask.GetAllocationSize() const c1 c0 If 1 1 8 +duckdb::TemplatedValidityMask.GetAllocationSize() const c2 c1 Then 2 5 7 +duckdb::TemplatedValidityMask.GetData() const c0 - Function 0 0 3 +duckdb::TemplatedValidityMask.GetEntryIndex(idx_t,idx_t &,idx_t &) c0 - Function 0 0 10 +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const c0 - Function 0 0 14 +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const c1 c0 If 1 2 10 +duckdb::TemplatedValidityMask.GetValidityEntry(idx_t) const c2 c1 Then 2 6 9 +duckdb::TemplatedValidityMask.GetValidityEntryUnsafe(idx_t) const c0 - Function 0 0 5 +duckdb::TemplatedValidityMask.Initialize() c0 - Function 0 0 4 +duckdb::TemplatedValidityMask.Initialize(const TemplatedValidityMask &) c0 - Function 0 0 11 +duckdb::TemplatedValidityMask.Initialize(idx_t) c0 - Function 0 0 12 +duckdb::TemplatedValidityMask.Initialize(validity_t *,idx_t) c0 - Function 0 0 10 +duckdb::TemplatedValidityMask.IsMaskSet() const c0 - Function 0 0 10 +duckdb::TemplatedValidityMask.IsMaskSet() const c1 c0 If 1 1 8 +duckdb::TemplatedValidityMask.IsMaskSet() const c2 c1 Then 2 5 7 +duckdb::TemplatedValidityMask.NoneValid(V) c0 - Function 0 0 5 +duckdb::TemplatedValidityMask.Reset(idx_t) c0 - Function 0 0 8 +duckdb::TemplatedValidityMask.RowIsValid(const V &,const idx_t &) c0 - Function 0 0 9 +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const c0 - Function 0 0 13 +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const c1 c0 If 1 2 9 +duckdb::TemplatedValidityMask.RowIsValid(idx_t) const c2 c1 Then 2 6 8 +duckdb::TemplatedValidityMask.RowIsValidUnsafe(idx_t) const c0 - Function 0 0 20 +duckdb::TemplatedValidityMask.Set(idx_t,bool) c0 - Function 0 0 17 +duckdb::TemplatedValidityMask.Set(idx_t,bool) c1 c0 If 1 3 16 +duckdb::TemplatedValidityMask.Set(idx_t,bool) c2 c1 Then 2 7 10 +duckdb::TemplatedValidityMask.Set(idx_t,bool) c3 c1 Else 2 12 15 +duckdb::TemplatedValidityMask.SetAllInvalid(idx_t) c0 - Function 0 0 6 +duckdb::TemplatedValidityMask.SetAllValid(idx_t) c0 - Function 0 0 39 +duckdb::TemplatedValidityMask.SetAllValid(idx_t) c1 c0 If 1 3 10 +duckdb::TemplatedValidityMask.SetAllValid(idx_t) c2 c1 Then 2 7 9 +duckdb::TemplatedValidityMask.SetAllValid(idx_t) c3 c0 For 1 15 26 +duckdb::TemplatedValidityMask.SetInvalid(idx_t) c0 - Function 0 0 15 +duckdb::TemplatedValidityMask.SetInvalid(idx_t) c1 c0 If 1 2 11 +duckdb::TemplatedValidityMask.SetInvalid(idx_t) c2 c1 Then 2 6 10 +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t) c0 - Function 0 0 12 +duckdb::TemplatedValidityMask.SetInvalidUnsafe(idx_t,idx_t) c0 - Function 0 0 14 +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) c0 - Function 0 0 51 +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) c1 c0 If 1 5 12 +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) c2 c1 Then 2 9 11 +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) c3 c0 For 1 17 30 +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) c4 c0 If 1 31 39 +duckdb::TemplatedValidityMask.SetRangeInvalid(const idx_t,const idx_t,const idx_t) c5 c4 Then 2 36 38 +duckdb::TemplatedValidityMask.SetValid(idx_t) c0 - Function 0 0 12 +duckdb::TemplatedValidityMask.SetValid(idx_t) c1 c0 If 1 2 9 +duckdb::TemplatedValidityMask.SetValid(idx_t) c2 c1 Then 2 6 8 +duckdb::TemplatedValidityMask.SetValidUnsafe(idx_t) c0 - Function 0 0 19 +duckdb::TemplatedValidityMask.SizeInBytes(idx_t) c0 - Function 0 0 6 +duckdb::TemplatedValidityMask.TemplatedValidityMask() c0 - Function 0 0 3 +duckdb::TemplatedValidityMask.TemplatedValidityMask(V *,idx_t) c0 - Function 0 0 7 +duckdb::TemplatedValidityMask.TemplatedValidityMask(const TemplatedValidityMask &,idx_t) c0 - Function 0 0 6 +duckdb::TemplatedValidityMask.TemplatedValidityMask(idx_t) c0 - Function 0 0 5 +duckdb::TemplatedValidityMask.ValidityMaskSize(idx_t) c0 - Function 0 0 5 +duckdb::ValidityArray.AllValid() const c0 - Function 0 0 3 +duckdb::ValidityArray.CanHaveNull() const c0 - Function 0 0 3 +duckdb::ValidityArray.CannotHaveNull() const c0 - Function 0 0 3 +duckdb::ValidityArray.Capacity() const c0 - Function 0 0 3 +duckdb::ValidityArray.Initialize(idx_t,bool) c0 - Function 0 0 16 +duckdb::ValidityArray.InitializeEmpty(idx_t) c0 - Function 0 0 4 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c0 - Function 0 0 85 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c1 c0 If 1 3 13 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c2 c1 Then 2 7 12 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c3 c0 For 1 27 55 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c4 c3 For 2 34 51 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c5 c4 If 3 40 50 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c6 c5 Then 4 45 49 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c7 c0 If 1 56 84 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c8 c7 Then 2 60 83 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c9 c8 For 3 62 79 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c10 c9 If 4 68 78 +duckdb::ValidityArray.Pack(ValidityMask &,const idx_t) const c11 c10 Then 5 73 77 +duckdb::ValidityArray.RowIsValid(idx_t) const c0 - Function 0 0 13 +duckdb::ValidityArray.RowIsValid(idx_t) const c1 c0 If 1 2 9 +duckdb::ValidityArray.RowIsValid(idx_t) const c2 c1 Then 2 6 8 +duckdb::ValidityArray.RowIsValidUnsafe(idx_t) const c0 - Function 0 0 9 +duckdb::ValidityArray.SetValid(idx_t) c0 - Function 0 0 12 +duckdb::ValidityArray.SetValid(idx_t) c1 c0 If 1 2 9 +duckdb::ValidityArray.SetValid(idx_t) c2 c1 Then 2 6 8 +duckdb::ValidityArray.SetValidUnsafe(idx_t) c0 - Function 0 0 9 +duckdb::ValidityArray.ValidityArray() c0 - Function 0 0 1 +duckdb::ValidityMask.ValidityMask() c0 - Function 0 0 2 +duckdb::ValidityMask.ValidityMask(const ValidityMask &,idx_t) c0 - Function 0 0 6 +duckdb::ValidityMask.ValidityMask(idx_t) c0 - Function 0 0 4 +duckdb::ValidityMask.ValidityMask(validity_t *,idx_t) c0 - Function 0 0 6 diff --git a/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/symbols.tsv b/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/symbols.tsv new file mode 100644 index 000000000..92bf722ae --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_validity_mask/symbols.tsv @@ -0,0 +1,93 @@ +s0 scope_kind - Function walk +s1 param param count clang +s2 type - idx_t clang +s3 local local entry_count clang +s4 callee this EntryCount clang +s5 member own owned_data walk +s6 callee this walk +s7 scope_kind - For walk +s8 local local entry_idx clang +s9 local local MAX_ENTRY clang +s10 param param validity_mask clang +s11 type - const V * clang +s12 local local BITS_PER_VALUE clang +s13 member own validity_mask clang +s14 member own capacity clang +s15 param param target_count clang +s16 param param ptr clang +s17 type - V * clang +s18 param param capacity clang +s19 param param original clang +s20 type - const TemplatedValidityMask clang +s21 callee this Copy clang +s22 callee this CannotHaveNull clang +s23 callee this CountValid clang +s24 param param to clang +s25 param param from clang +s26 scope_kind - If walk +s27 scope_kind - Then walk +s28 local local i clang +s29 member ext walk +s30 type - const idx_t clang +s31 local local valid clang +s32 local local entry clang +s33 type - auto clang +s34 callee this GetValidityEntry clang +s35 local local shift clang +s36 local local mask clang +s37 type - const auto clang +s38 scope_kind - Else walk +s39 scope_kind - While walk +s40 param param target_count_p clang +s41 member own validity_data walk +s42 param param entry_idx clang +s43 callee this GetValidityEntryUnsafe clang +s44 param param entry clang +s45 type - V clang +s46 type - const V & clang +s47 param param idx_in_entry clang +s48 type - const idx_t & clang +s49 param param row_idx clang +s50 type - idx_t & clang +s51 param param n clang +s52 local local idx_in_entry clang +s53 callee this GetEntryIndex clang +s54 callee this RowIsValidUnsafe clang +s55 callee this SetValidUnsafe clang +s56 param param valid clang +s57 type - bool clang +s58 callee this SetValid clang +s59 callee this SetInvalid clang +s60 param param begin_entry clang +s61 param param end_entry clang +s62 callee this EnsureWritable clang +s63 local local last_entry_index clang +s64 local local last_entry_bits clang +s65 callee this SetRangeInvalid clang +s66 param param validity clang +s67 type - validity_t * clang +s68 param param new_capacity clang +s69 param param other clang +s70 callee this TemplatedValidityMask clang +s71 type - const ValidityMask & clang +s72 param param initial clang +s73 callee this operator= clang +s74 callee this make_unsafe_uniq_array clang +s75 callee ext validity_data walk +s76 callee ext get clang +s77 callee this memset clang +s78 callee this __assert_fail clang +s79 param param mask clang +s80 type - ValidityMask & clang +s81 callee ext mask walk +s82 callee ext Reset clang +s83 callee ext Initialize clang +s84 local local entire_entries clang +s85 local local ragged clang +s86 local local bits clang +s87 type - unsigned long * clang +s88 callee ext GetData clang +s89 local local row_idx clang +s90 type - validity_t clang +s91 local local j clang +s92 other unknown ? walk diff --git a/.claude/harvest/duckdb-headers/ore/common_types_vector/events.tsv b/.claude/harvest/duckdb-headers/ore/common_types_vector/events.tsv new file mode 100644 index 000000000..db06d5e5f --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_vector/events.tsv @@ -0,0 +1,42 @@ +duckdb::Vector.Buffer() const 0 ScopeEnter s0 - c0 - 9574 - - walk +duckdb::Vector.Buffer() const 1 Return - - c0 - 9620 - - walk +duckdb::Vector.Buffer() const 2 Call - s11 c0 - 9627 - member clang +duckdb::Vector.Buffer() const 3 Read s12 - c0 - 9628 - - walk +duckdb::Vector.Buffer() const 4 ScopeExit s0 - c0 - 9574 - - walk +duckdb::Vector.BufferMutable() 0 ScopeEnter s0 - c0 - 9513 - - walk +duckdb::Vector.BufferMutable() 1 Return - - c0 - 9554 - - walk +duckdb::Vector.BufferMutable() 2 Call - s11 c0 - 9561 - member clang +duckdb::Vector.BufferMutable() 3 Read s12 - c0 - 9562 - - walk +duckdb::Vector.BufferMutable() 4 ScopeExit s0 - c0 - 9513 - - walk +duckdb::Vector.GetBufferRef() const 0 ScopeEnter s0 - c0 - 9640 - - walk +duckdb::Vector.GetBufferRef() const 1 Return - - c0 - 9704 - - walk +duckdb::Vector.GetBufferRef() const 2 Read s12 - c0 - 9711 - - walk +duckdb::Vector.GetBufferRef() const 3 ScopeExit s0 - c0 - 9640 - - walk +duckdb::Vector.GetType() const 0 ScopeEnter s0 - c0 - 9450 - - walk +duckdb::Vector.GetType() const 1 Return - - c0 - 9496 - - walk +duckdb::Vector.GetType() const 2 Read s10 - c0 - 9503 - - walk +duckdb::Vector.GetType() const 3 ScopeExit s0 - c0 - 9450 - - walk +duckdb::Vector.GetVectorType() const 0 ScopeEnter s0 - c0 - 9269 - - walk +duckdb::Vector.GetVectorType() const 1 Decl s1 - c0 - 9313 - s2 clang +duckdb::Vector.GetVectorType() const 2 Call - s3 c0 - 9332 - member clang +duckdb::Vector.GetVectorType() const 3 ScopeEnter s4 - c1 c0 9350 - - walk +duckdb::Vector.GetVectorType() const 4 Call s5 s6 c1 c0 9355 - member clang +duckdb::Vector.GetVectorType() const 5 Read s1 - c1 c0 9355 - - clang +duckdb::Vector.GetVectorType() const 6 Condition - - c1 c0 9354 if - walk +duckdb::Vector.GetVectorType() const 7 Branch - - c1 c0 9367 then - walk +duckdb::Vector.GetVectorType() const 8 ScopeEnter s7 - c2 c1 9367 - - walk +duckdb::Vector.GetVectorType() const 9 Return - - c2 c1 9372 - - walk +duckdb::Vector.GetVectorType() const 10 ScopeExit s7 - c2 c1 9367 - - walk +duckdb::Vector.GetVectorType() const 11 ScopeExit s4 - c1 c0 9350 - - walk +duckdb::Vector.GetVectorType() const 12 Return - - c0 - 9410 - - walk +duckdb::Vector.GetVectorType() const 13 Call - s8 c0 - 9417 - member clang +duckdb::Vector.GetVectorType() const 14 Call - s9 c0 - 9417 - member clang +duckdb::Vector.GetVectorType() const 15 Read s1 - c0 - 9417 - - clang +duckdb::Vector.GetVectorType() const 16 ScopeExit s0 - c0 - 9269 - - walk +duckdb::Vector.SetBuffer(buffer_ptr) 0 ScopeEnter s0 - c0 - 9723 - - walk +duckdb::Vector.SetBuffer(buffer_ptr) 1 Param s13 - c0 - 9738 - s14 clang +duckdb::Vector.SetBuffer(buffer_ptr) 2 Call - s15 c0 - 9777 - member clang +duckdb::Vector.SetBuffer(buffer_ptr) 3 Read s12 - c0 - 9777 - - walk +duckdb::Vector.SetBuffer(buffer_ptr) 4 Call - s16 c0 - 9786 - free clang +duckdb::Vector.SetBuffer(buffer_ptr) 5 Read s13 - c0 - 9796 - - clang +duckdb::Vector.SetBuffer(buffer_ptr) 6 ScopeExit s0 - c0 - 9723 - - walk diff --git a/.claude/harvest/duckdb-headers/ore/common_types_vector/methods.tsv b/.claude/harvest/duckdb-headers/ore/common_types_vector/methods.tsv new file mode 100644 index 000000000..887b162fd --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_vector/methods.tsv @@ -0,0 +1,6 @@ +duckdb::Vector.Buffer() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/vector.hpp duckdb::Vector 5 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::Vector.BufferMutable() /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/vector.hpp duckdb::Vector 5 1 Observe 1 0 0 0 0 0 0 0 0 method public 0 - +duckdb::Vector.GetBufferRef() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/vector.hpp duckdb::Vector 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::Vector.GetType() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/vector.hpp duckdb::Vector 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::Vector.GetVectorType() const /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/vector.hpp duckdb::Vector 17 3 Empty 0 0 0 0 0 1 0 0 0 method public 0 - +duckdb::Vector.SetBuffer(buffer_ptr) /home/user/adaworldapi/duckdb/src/include/duckdb/common/types/vector.hpp duckdb::Vector 7 1 Compute 0 1 0 0 0 0 0 0 0 method public 1 - diff --git a/.claude/harvest/duckdb-headers/ore/common_types_vector/scopes.tsv b/.claude/harvest/duckdb-headers/ore/common_types_vector/scopes.tsv new file mode 100644 index 000000000..85e8b4f2f --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_vector/scopes.tsv @@ -0,0 +1,8 @@ +duckdb::Vector.Buffer() const c0 - Function 0 0 4 +duckdb::Vector.BufferMutable() c0 - Function 0 0 4 +duckdb::Vector.GetBufferRef() const c0 - Function 0 0 3 +duckdb::Vector.GetType() const c0 - Function 0 0 3 +duckdb::Vector.GetVectorType() const c0 - Function 0 0 16 +duckdb::Vector.GetVectorType() const c1 c0 If 1 3 11 +duckdb::Vector.GetVectorType() const c2 c1 Then 2 8 10 +duckdb::Vector.SetBuffer(buffer_ptr) c0 - Function 0 0 6 diff --git a/.claude/harvest/duckdb-headers/ore/common_types_vector/symbols.tsv b/.claude/harvest/duckdb-headers/ore/common_types_vector/symbols.tsv new file mode 100644 index 000000000..9218f223e --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_types_vector/symbols.tsv @@ -0,0 +1,17 @@ +s0 scope_kind - Function walk +s1 local local buffer_ref clang +s2 type - const buffer_ptr clang +s3 callee this GetBufferRef clang +s4 scope_kind - If walk +s5 callee ext buffer_ref walk +s6 callee ext operator bool clang +s7 scope_kind - Then walk +s8 callee this GetVectorType clang +s9 callee this operator-> clang +s10 member own type walk +s11 callee this operator* clang +s12 member own buffer walk +s13 param param buffer_p clang +s14 type - buffer_ptr clang +s15 callee this operator= clang +s16 callee this move clang diff --git a/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/events.tsv b/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/events.tsv new file mode 100644 index 000000000..8db2c2072 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/events.tsv @@ -0,0 +1,281 @@ +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 0 ScopeEnter s0 - c0 - 20827 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 1 Param s10 - c0 - 20846 - s11 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 2 Param s12 - c0 - 20870 - s13 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 3 ScopeEnter s14 - c1 c0 20893 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 4 Read s4 - c1 c0 20897 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 5 Condition - - c1 c0 20897 if - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 6 Branch - - c1 c0 20913 then - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 7 ScopeEnter s15 - c2 c1 20913 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 8 Call s29 s30 c2 c1 20919 - member clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 9 Read s4 - c2 c1 20919 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 10 Read s16 - c2 c1 20945 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 11 Read s12 - c2 c1 20957 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 12 ReadWrite s16 - c2 c1 20974 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 13 Read s10 - c2 c1 20988 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 14 ScopeExit s15 - c2 c1 20913 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 15 ScopeExit s14 - c1 c0 20893 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 16 ScopeEnter s14 - c3 c0 21015 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 17 Read s7 - c3 c0 21019 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 18 Condition - - c3 c0 21019 if - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 19 Branch - - c3 c0 21036 then - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 20 ScopeEnter s15 - c4 c3 21036 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 21 Call s31 s30 c4 c3 21042 - member clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 22 Read s7 - c4 c3 21042 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 23 Read s17 - c4 c3 21069 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 24 Read s12 - c4 c3 21082 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 25 ReadWrite s17 - c4 c3 21099 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 26 Read s10 - c4 c3 21115 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 27 ScopeExit s15 - c4 c3 21036 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 28 ScopeExit s14 - c3 c0 21015 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) 29 ScopeExit s0 - c0 - 20827 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 0 ScopeEnter s0 - c0 - 21146 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 1 Param s18 - c0 - 21177 - s19 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 2 Param s20 - c0 - 21205 - s13 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 3 Param s21 - c0 - 21218 - s13 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 4 ScopeEnter s14 - c1 c0 21234 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 5 Read s7 - c1 c0 21238 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 6 Condition - - c1 c0 21238 if - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 7 Branch - - c1 c0 21255 then - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 8 ScopeEnter s15 - c2 c1 21255 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 9 ScopeEnter s22 - c3 c2 21261 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 10 Decl s23 - c3 c2 21266 for_init s13 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 11 Read s20 - c3 c2 21278 for_init - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 12 Read s23 - c3 c2 21285 for_cond - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 13 Read s21 - c3 c2 21291 for_cond - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 14 ReadWrite s23 - c3 c2 21296 for_inc - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 15 Condition - - c3 c2 21261 for - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 16 Call s31 s30 c3 c2 21310 - member clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 17 Read s7 - c3 c2 21310 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 18 ReadWrite s17 - c3 c2 21337 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 19 Call s24 s25 c3 c2 21352 - member clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 20 Read s18 - c3 c2 21352 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 21 Read s23 - c3 c2 21366 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 22 ScopeExit s22 - c3 c2 21261 back_edge - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 23 ScopeExit s15 - c2 c1 21255 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 24 ScopeExit s14 - c1 c0 21234 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 25 ScopeExit s0 - c0 - 21146 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 0 ScopeEnter s0 - c0 - 21391 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 1 Param s10 - c0 - 21410 - s11 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 2 Param s18 - c0 - 21434 - s19 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 3 Param s26 - c0 - 21462 - s13 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 4 ScopeEnter s14 - c1 c0 21480 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 5 Read s10 - c1 c0 21484 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 6 Condition - - c1 c0 21484 if - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 7 Branch - - c1 c0 21503 then - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 8 ScopeEnter s15 - c2 c1 21503 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 9 ScopeEnter s14 - c3 c2 21509 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 10 Read s4 - c3 c2 21513 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 11 Condition - - c3 c2 21513 if - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 12 Branch - - c3 c2 21529 then - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 13 ScopeEnter s15 - c4 c3 21529 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 14 ScopeEnter s22 - c5 c4 21536 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 15 Decl s23 - c5 c4 21541 for_init s13 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 16 Read s23 - c5 c4 21556 for_cond - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 17 Read s26 - c5 c4 21562 for_cond - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 18 ReadWrite s23 - c5 c4 21569 for_inc - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 19 Condition - - c5 c4 21536 for - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 20 Call s29 s30 c5 c4 21584 - member clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 21 Read s4 - c5 c4 21584 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 22 Read s23 - c5 c4 21610 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 23 Call s24 s25 c5 c4 21615 - member clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 24 Read s18 - c5 c4 21615 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 25 Read s23 - c5 c4 21629 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 26 ScopeExit s22 - c5 c4 21536 back_edge - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 27 Write s16 - c4 c3 21648 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 28 Read s26 - c4 c3 21661 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 29 ScopeExit s15 - c4 c3 21529 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 30 ScopeExit s14 - c3 c2 21509 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 31 ScopeExit s15 - c2 c1 21503 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 32 Branch - - c1 c0 21684 else - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 33 ScopeEnter s27 - c6 c1 21684 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 34 ScopeEnter s14 - c7 c6 21684 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 35 Read s7 - c7 c6 21688 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 36 Condition - - c7 c6 21688 if - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 37 Branch - - c7 c6 21705 then - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 38 ScopeEnter s15 - c8 c7 21705 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 39 ScopeEnter s22 - c9 c8 21711 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 40 Decl s23 - c9 c8 21716 for_init s13 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 41 Read s23 - c9 c8 21731 for_cond - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 42 Read s26 - c9 c8 21737 for_cond - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 43 ReadWrite s23 - c9 c8 21744 for_inc - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 44 Condition - - c9 c8 21711 for - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 45 Call s31 s30 c9 c8 21758 - member clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 46 Read s7 - c9 c8 21758 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 47 Read s23 - c9 c8 21785 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 48 Call s24 s25 c9 c8 21790 - member clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 49 Read s18 - c9 c8 21790 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 50 Read s23 - c9 c8 21804 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 51 ScopeExit s22 - c9 c8 21711 back_edge - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 52 Write s17 - c8 c7 21821 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 53 Read s26 - c8 c7 21835 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 54 ScopeExit s15 - c8 c7 21705 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 55 ScopeExit s14 - c7 c6 21684 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 56 ScopeExit s27 - c6 c1 21684 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 57 ScopeExit s14 - c1 c0 21480 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 58 Return - - c0 - 21850 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 59 Call - s28 c0 - 21857 - member clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 60 Read s26 - c0 - 21864 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 61 ScopeExit s0 - c0 - 21391 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const 0 ScopeEnter s0 - c0 - 21879 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const 1 Param s26 - c0 - 21899 - s13 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const 2 Return - - c0 - 21923 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const 3 Read s4 - c0 - 21930 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const 4 Read s16 - c0 - 21947 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const 5 Read s26 - c0 - 21960 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const 6 Read s17 - c0 - 21968 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const 7 ScopeExit s0 - c0 - 21879 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) 0 ScopeEnter s0 - c0 - 20649 - - walk +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) 1 Param s1 - c0 - 20670 - s2 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) 2 Param s3 - c0 - 20705 - s2 clang +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) 3 CtorInit s4 - c0 - 20749 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) 4 Read s1 - c0 - 20764 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) 5 CtorInit s7 - c0 - 20783 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) 6 Read s3 - c0 - 20799 - - clang +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) 7 ScopeExit s0 - c0 - 20649 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 0 ScopeEnter s0 - c0 - 19165 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 1 Param s10 - c0 - 19184 - s11 clang +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 2 Param s12 - c0 - 19208 - s13 clang +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 3 ScopeEnter s14 - c1 c0 19231 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 4 Condition - - c1 c0 19245 if - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 5 Branch - - c1 c0 19265 then - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 6 ScopeEnter s15 - c2 c1 19265 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 7 Write s4 - c2 c1 19271 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 8 Read s4 - c2 c1 19271 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 9 Read s16 - c2 c1 19286 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 10 Read s12 - c2 c1 19325 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 11 ReadWrite s16 - c2 c1 19342 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 12 Read s10 - c2 c1 19356 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 13 ScopeExit s15 - c2 c1 19265 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 14 ScopeExit s14 - c1 c0 19231 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 15 ScopeEnter s14 - c3 c0 19383 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 16 Condition - - c3 c0 19397 if - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 17 Branch - - c3 c0 19418 then - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 18 ScopeEnter s15 - c4 c3 19418 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 19 Write s7 - c4 c3 19424 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 20 Read s7 - c4 c3 19424 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 21 Read s17 - c4 c3 19440 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 22 Read s12 - c4 c3 19480 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 23 ReadWrite s17 - c4 c3 19497 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 24 Read s10 - c4 c3 19513 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 25 ScopeExit s15 - c4 c3 19418 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 26 ScopeExit s14 - c3 c0 19383 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) 27 ScopeExit s0 - c0 - 19165 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 0 ScopeEnter s0 - c0 - 19544 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 1 Param s18 - c0 - 19575 - s19 clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 2 Param s20 - c0 - 19603 - s13 clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 3 Param s21 - c0 - 19616 - s13 clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 4 ScopeEnter s14 - c1 c0 19632 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 5 Condition - - c1 c0 19646 if - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 6 Branch - - c1 c0 19667 then - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 7 ScopeEnter s15 - c2 c1 19667 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 8 ScopeEnter s22 - c3 c2 19673 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 9 Decl s23 - c3 c2 19678 for_init s13 clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 10 Read s20 - c3 c2 19690 for_init - clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 11 Read s23 - c3 c2 19697 for_cond - clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 12 Read s21 - c3 c2 19703 for_cond - clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 13 ReadWrite s23 - c3 c2 19708 for_inc - clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 14 Condition - - c3 c2 19673 for - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 15 Write s7 - c3 c2 19722 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 16 Read s7 - c3 c2 19722 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 17 ReadWrite s17 - c3 c2 19738 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 18 Call s24 s25 c3 c2 19780 - member clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 19 Read s18 - c3 c2 19780 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 20 Read s23 - c3 c2 19794 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 21 ScopeExit s22 - c3 c2 19673 back_edge - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 22 ScopeExit s15 - c2 c1 19667 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 23 ScopeExit s14 - c1 c0 19632 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) 24 ScopeExit s0 - c0 - 19544 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 0 ScopeEnter s0 - c0 - 19819 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 1 Param s10 - c0 - 19838 - s11 clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 2 Param s18 - c0 - 19862 - s19 clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 3 Param s26 - c0 - 19890 - s13 clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 4 ScopeEnter s14 - c1 c0 19908 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 5 Read s10 - c1 c0 19912 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 6 Condition - - c1 c0 19912 if - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 7 Branch - - c1 c0 19931 then - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 8 ScopeEnter s15 - c2 c1 19931 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 9 ScopeEnter s14 - c3 c2 19937 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 10 Condition - - c3 c2 19951 if - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 11 Branch - - c3 c2 19971 then - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 12 ScopeEnter s15 - c4 c3 19971 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 13 ScopeEnter s22 - c5 c4 19978 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 14 Decl s23 - c5 c4 19983 for_init s13 clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 15 Read s23 - c5 c4 19998 for_cond - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 16 Read s26 - c5 c4 20004 for_cond - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 17 ReadWrite s23 - c5 c4 20011 for_inc - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 18 Condition - - c5 c4 19978 for - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 19 Write s4 - c5 c4 20026 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 20 Read s4 - c5 c4 20026 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 21 Read s23 - c5 c4 20041 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 22 Call s24 s25 c5 c4 20073 - member clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 23 Read s18 - c5 c4 20073 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 24 Read s23 - c5 c4 20087 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 25 ScopeExit s22 - c5 c4 19978 back_edge - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 26 Write s16 - c4 c3 20106 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 27 Read s26 - c4 c3 20119 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 28 ScopeExit s15 - c4 c3 19971 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 29 ScopeExit s14 - c3 c2 19937 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 30 ScopeExit s15 - c2 c1 19931 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 31 Branch - - c1 c0 20142 else - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 32 ScopeEnter s27 - c6 c1 20142 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 33 ScopeEnter s14 - c7 c6 20142 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 34 Condition - - c7 c6 20156 if - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 35 Branch - - c7 c6 20177 then - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 36 ScopeEnter s15 - c8 c7 20177 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 37 ScopeEnter s22 - c9 c8 20183 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 38 Decl s23 - c9 c8 20188 for_init s13 clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 39 Read s23 - c9 c8 20203 for_cond - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 40 Read s26 - c9 c8 20209 for_cond - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 41 ReadWrite s23 - c9 c8 20216 for_inc - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 42 Condition - - c9 c8 20183 for - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 43 Write s7 - c9 c8 20230 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 44 Read s7 - c9 c8 20230 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 45 Read s23 - c9 c8 20246 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 46 Call s24 s25 c9 c8 20278 - member clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 47 Read s18 - c9 c8 20278 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 48 Read s23 - c9 c8 20292 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 49 ScopeExit s22 - c9 c8 20183 back_edge - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 50 Write s17 - c8 c7 20309 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 51 Read s26 - c8 c7 20323 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 52 ScopeExit s15 - c8 c7 20177 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 53 ScopeExit s14 - c7 c6 20142 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 54 ScopeExit s27 - c6 c1 20142 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 55 ScopeExit s14 - c1 c0 19908 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 56 Return - - c0 - 20338 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 57 Call - s28 c0 - 20345 - member clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 58 Read s26 - c0 - 20352 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) 59 ScopeExit s0 - c0 - 19819 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 0 ScopeEnter s0 - c0 - 20367 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 1 Param s26 - c0 - 20387 - s13 clang +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 2 ScopeEnter s14 - c1 c0 20411 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 3 Condition - - c1 c0 20425 if - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 4 Branch - - c1 c0 20445 then - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 5 ScopeEnter s15 - c2 c1 20445 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 6 Return - - c2 c1 20451 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 7 Read s16 - c2 c1 20458 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 8 ScopeExit s15 - c2 c1 20445 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 9 ScopeExit s14 - c1 c0 20411 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 10 Return - - c0 - 20478 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 11 Read s26 - c0 - 20485 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 12 Read s17 - c0 - 20493 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const 13 ScopeExit s0 - c0 - 20367 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 0 ScopeEnter s0 - c0 - 18799 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 1 Param s1 - c0 - 18819 - s2 clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 2 Param s3 - c0 - 18854 - s2 clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 3 CtorInit s4 - c0 - 18898 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 4 Read s1 - c0 - 18913 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 5 Call s5 s6 c0 - 18932 - member clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 6 Read s1 - c0 - 18932 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 7 CtorInit s7 - c0 - 18977 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 8 Read s3 - c0 - 18993 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 9 Call s8 s6 c0 - 19013 - member clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 10 Read s3 - c0 - 19013 - - clang +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 11 Cast - - c0 - 19055 - static walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 12 Read s4 - c0 - 19087 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 13 Cast - - c0 - 19055 - functional walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 14 Call - s9 c0 - 19055 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 15 Cast - - c0 - 19107 - static walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 16 Read s7 - c0 - 19140 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 17 Cast - - c0 - 19107 - functional walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 18 Call - s9 c0 - 19107 - - walk +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) 19 ScopeExit s0 - c0 - 18799 - - walk diff --git a/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/methods.tsv b/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/methods.tsv new file mode 100644 index 000000000..e2a034bc9 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/methods.tsv @@ -0,0 +1,10 @@ +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::RuntimeSelectionSink 30 5 Normalize 4 2 0 0 0 0 0 0 0 method public 2 - +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::RuntimeSelectionSink 26 4 Normalize 2 1 0 0 0 0 0 0 0 method public 3 - +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::RuntimeSelectionSink 62 10 Compute 2 2 0 0 0 0 0 0 0 method public 3 - +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::RuntimeSelectionSink 8 1 Observe 3 0 0 0 0 1 0 0 0 method public 1 - +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::RuntimeSelectionSink 8 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 2 - +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::StaticSelectionSink 28 5 Compute 2 4 0 0 0 0 0 0 0 method public 2 - +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::StaticSelectionSink 25 4 Compute 1 2 0 0 0 0 0 0 0 method public 3 - +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::StaticSelectionSink 60 10 Compute 0 4 0 0 0 0 0 0 0 method public 3 - +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::StaticSelectionSink 14 3 Observe 2 0 0 0 0 1 0 0 0 method public 1 - +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector_operations/scalar_executor.hpp duckdb::ScalarExecutor::StaticSelectionSink 20 1 Observe 2 0 0 0 0 0 0 0 0 ctor public 2 - diff --git a/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/scopes.tsv b/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/scopes.tsv new file mode 100644 index 000000000..e647cbf69 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/scopes.tsv @@ -0,0 +1,44 @@ +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) c0 - Function 0 0 29 +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) c1 c0 If 1 3 15 +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) c2 c1 Then 2 7 14 +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) c3 c0 If 1 16 28 +duckdb::ScalarExecutor::RuntimeSelectionSink.Append(bool,idx_t) c4 c3 Then 2 20 27 +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) c0 - Function 0 0 25 +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) c1 c0 If 1 4 24 +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) c2 c1 Then 2 8 23 +duckdb::ScalarExecutor::RuntimeSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) c3 c2 For 3 9 22 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c0 - Function 0 0 61 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c1 c0 If 1 4 57 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c2 c1 Then 2 8 31 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c3 c2 If 3 9 30 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c4 c3 Then 4 13 29 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c5 c4 For 5 14 26 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c6 c1 Else 2 33 56 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c7 c6 If 3 34 55 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c8 c7 Then 4 38 54 +duckdb::ScalarExecutor::RuntimeSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c9 c8 For 5 39 51 +duckdb::ScalarExecutor::RuntimeSelectionSink.Result(idx_t) const c0 - Function 0 0 7 +duckdb::ScalarExecutor::RuntimeSelectionSink.RuntimeSelectionSink(SelectionVector *,SelectionVector *) c0 - Function 0 0 7 +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) c0 - Function 0 0 27 +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) c1 c0 If 1 3 14 +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) c2 c1 Then 2 6 13 +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) c3 c0 If 1 15 26 +duckdb::ScalarExecutor::StaticSelectionSink.Append(bool,idx_t) c4 c3 Then 2 18 25 +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) c0 - Function 0 0 24 +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) c1 c0 If 1 4 23 +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) c2 c1 Then 2 7 22 +duckdb::ScalarExecutor::StaticSelectionSink.AppendInvalidRange(const SelectionVector &,idx_t,idx_t) c3 c2 For 3 8 21 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c0 - Function 0 0 59 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c1 c0 If 1 4 55 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c2 c1 Then 2 8 30 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c3 c2 If 3 9 29 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c4 c3 Then 4 12 28 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c5 c4 For 5 13 25 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c6 c1 Else 2 32 54 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c7 c6 If 3 33 53 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c8 c7 Then 4 36 52 +duckdb::ScalarExecutor::StaticSelectionSink.FillConstant(bool,const SelectionVector &,idx_t) c9 c8 For 5 37 49 +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const c0 - Function 0 0 13 +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const c1 c0 If 1 2 9 +duckdb::ScalarExecutor::StaticSelectionSink.Result(idx_t) const c2 c1 Then 2 5 8 +duckdb::ScalarExecutor::StaticSelectionSink.StaticSelectionSink(SelectionVector *,SelectionVector *) c0 - Function 0 0 19 diff --git a/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/symbols.tsv b/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/symbols.tsv new file mode 100644 index 000000000..f066b7023 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_vector_operations_scalar_executor/symbols.tsv @@ -0,0 +1,32 @@ +s0 scope_kind - Function walk +s1 param param true_selection_p clang +s2 type - SelectionVector * clang +s3 param param false_selection_p clang +s4 member own true_selection clang +s5 callee ext true_selection_p walk +s6 callee ext data clang +s7 member own false_selection clang +s8 callee ext false_selection_p walk +s9 callee this walk +s10 param param comparison_result clang +s11 type - bool clang +s12 param param result_idx clang +s13 type - idx_t clang +s14 scope_kind - If walk +s15 scope_kind - Then walk +s16 member own true_count walk +s17 member own false_count walk +s18 param param sel clang +s19 type - const SelectionVector & clang +s20 param param start clang +s21 param param end clang +s22 scope_kind - For walk +s23 local local row clang +s24 callee ext sel walk +s25 callee ext get_index clang +s26 param param count clang +s27 scope_kind - Else walk +s28 callee this Result clang +s29 callee ext true_selection walk +s30 callee ext set_index clang +s31 callee ext false_selection walk diff --git a/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/events.tsv b/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/events.tsv new file mode 100644 index 000000000..e839a7e68 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/events.tsv @@ -0,0 +1,7 @@ +duckdb::ConsecutiveChildListInfo.ConsecutiveChildListInfo() 0 ScopeEnter s0 - c0 - 3583 - - walk +duckdb::ConsecutiveChildListInfo.ConsecutiveChildListInfo() 1 CtorInit s1 - c0 - 3612 - - clang +duckdb::ConsecutiveChildListInfo.ConsecutiveChildListInfo() 2 CtorInit s2 - c0 - 3631 - - clang +duckdb::ConsecutiveChildListInfo.ConsecutiveChildListInfo() 3 CtorInit s3 - c0 - 3653 - - clang +duckdb::ConsecutiveChildListInfo.ConsecutiveChildListInfo() 4 Call - s4 c0 - 3653 - - walk +duckdb::ConsecutiveChildListInfo.ConsecutiveChildListInfo() 5 Call - s5 c0 - 3669 - ctor clang +duckdb::ConsecutiveChildListInfo.ConsecutiveChildListInfo() 6 ScopeExit s0 - c0 - 3583 - - walk diff --git a/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/methods.tsv b/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/methods.tsv new file mode 100644 index 000000000..2e99d9b1d --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/methods.tsv @@ -0,0 +1 @@ +duckdb::ConsecutiveChildListInfo.ConsecutiveChildListInfo() /home/user/adaworldapi/duckdb/src/include/duckdb/common/vector/unified_vector_format.hpp duckdb::ConsecutiveChildListInfo 7 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 0 - diff --git a/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/scopes.tsv b/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/scopes.tsv new file mode 100644 index 000000000..11476d8fb --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/scopes.tsv @@ -0,0 +1 @@ +duckdb::ConsecutiveChildListInfo.ConsecutiveChildListInfo() c0 - Function 0 0 6 diff --git a/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/symbols.tsv b/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/symbols.tsv new file mode 100644 index 000000000..58855ced7 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/common_vector_unified_vector_format/symbols.tsv @@ -0,0 +1,6 @@ +s0 scope_kind - Function walk +s1 member own is_constant clang +s2 member own needs_slicing clang +s3 member own child_list_info clang +s4 callee this walk +s5 callee this list_entry_t clang diff --git a/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/events.tsv b/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/events.tsv new file mode 100644 index 000000000..b8f14af7b --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/events.tsv @@ -0,0 +1,12 @@ +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 0 ScopeEnter s0 - c0 - 1679 - - walk +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 1 Param s1 - c0 - 1736 - s2 clang +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 2 Return - - c0 - 1764 - - walk +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 3 Call - s3 c0 - 1764 - - walk +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 4 Call - s4 c0 - 1771 - ctor clang +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 5 Call s5 s6 c0 - 1771 - member clang +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 6 Read s7 - c0 - 1771 - - walk +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 7 Call s8 s9 c0 - 1771 - member clang +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 8 Read s1 - c0 - 1771 - - clang +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) 9 ScopeExit s0 - c0 - 1679 - - walk +duckdb::ExpressionState.~ExpressionState() 0 ScopeEnter s0 - c0 - 647 - - walk +duckdb::ExpressionState.~ExpressionState() 1 ScopeExit s0 - c0 - 647 - - walk diff --git a/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/methods.tsv b/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/methods.tsv new file mode 100644 index 000000000..c728f5bd6 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/methods.tsv @@ -0,0 +1,2 @@ +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) /home/user/adaworldapi/duckdb/src/include/duckdb/execution/expression_executor_state.hpp duckdb::ExecuteFunctionState 10 1 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::ExpressionState.~ExpressionState() /home/user/adaworldapi/duckdb/src/include/duckdb/execution/expression_executor_state.hpp duckdb::ExpressionState 2 1 Empty 0 0 0 0 0 0 0 1 0 dtor public 0 - diff --git a/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/scopes.tsv b/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/scopes.tsv new file mode 100644 index 000000000..81952611f --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/scopes.tsv @@ -0,0 +1,2 @@ +duckdb::ExecuteFunctionState.GetFunctionState(ExpressionState &) c0 - Function 0 0 9 +duckdb::ExpressionState.~ExpressionState() c0 - Function 0 0 1 diff --git a/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/symbols.tsv b/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/symbols.tsv new file mode 100644 index 000000000..964f90a01 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/execution_expression_executor_state/symbols.tsv @@ -0,0 +1,10 @@ +s0 scope_kind - Function walk +s1 param param state clang +s2 type - ExpressionState & clang +s3 callee this walk +s4 callee this optional_ptr clang +s5 callee ext local_state walk +s6 callee ext get clang +s7 member ext local_state walk +s8 callee ext state walk +s9 callee ext Cast clang diff --git a/.claude/harvest/duckdb-headers/ore/execution_ht_entry/events.tsv b/.claude/harvest/duckdb-headers/ore/execution_ht_entry/events.tsv new file mode 100644 index 000000000..9324e8324 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/execution_ht_entry/events.tsv @@ -0,0 +1,92 @@ +duckdb.IncrementAndWrap(idx_t &,const uint64_t &) 0 ScopeEnter s0 - c0 - 3038 - - walk +duckdb.IncrementAndWrap(idx_t &,const uint64_t &) 1 Param s17 - c0 - 3067 - s18 clang +duckdb.IncrementAndWrap(idx_t &,const uint64_t &) 2 Param s19 - c0 - 3082 - s20 clang +duckdb.IncrementAndWrap(idx_t &,const uint64_t &) 3 ReadWrite s21 - c0 - 3116 - - walk +duckdb.IncrementAndWrap(idx_t &,const uint64_t &) 4 Read s17 - c0 - 3118 - - clang +duckdb.IncrementAndWrap(idx_t &,const uint64_t &) 5 Read s19 - c0 - 3128 - - clang +duckdb.IncrementAndWrap(idx_t &,const uint64_t &) 6 ScopeExit s0 - c0 - 3038 - - walk +duckdb::ht_entry_t.ExtractSalt(const hash_t &) 0 ScopeEnter s0 - c0 - 2376 - - walk +duckdb::ht_entry_t.ExtractSalt(const hash_t &) 1 Param s15 - c0 - 2409 - s5 clang +duckdb::ht_entry_t.ExtractSalt(const hash_t &) 2 Return - - c0 - 2433 - - walk +duckdb::ht_entry_t.ExtractSalt(const hash_t &) 3 Read s15 - c0 - 2440 - - clang +duckdb::ht_entry_t.ExtractSalt(const hash_t &) 4 Read s14 - c0 - 2447 - - clang +duckdb::ht_entry_t.ExtractSalt(const hash_t &) 5 ScopeExit s0 - c0 - 2376 - - walk +duckdb::ht_entry_t.GetPointer() const 0 ScopeEnter s0 - c0 - 1664 - - walk +duckdb::ht_entry_t.GetPointer() const 1 Cast - - c0 - 1705 - static walk +duckdb::ht_entry_t.GetPointer() const 2 Call - s10 c0 - 1714 - member clang +duckdb::ht_entry_t.GetPointer() const 3 Cast - - c0 - 1705 - functional walk +duckdb::ht_entry_t.GetPointer() const 4 Call - s11 c0 - 1705 - free clang +duckdb::ht_entry_t.GetPointer() const 5 Return - - c0 - 1731 - - walk +duckdb::ht_entry_t.GetPointer() const 6 Call - s12 c0 - 1738 - member clang +duckdb::ht_entry_t.GetPointer() const 7 ScopeExit s0 - c0 - 1664 - - walk +duckdb::ht_entry_t.GetPointerOrNull() const 0 ScopeEnter s0 - c0 - 1812 - - walk +duckdb::ht_entry_t.GetPointerOrNull() const 1 Return - - c0 - 1859 - - walk +duckdb::ht_entry_t.GetPointerOrNull() const 2 Call - s13 c0 - 1866 - free clang +duckdb::ht_entry_t.GetPointerOrNull() const 3 Read s1 - c0 - 1889 - - walk +duckdb::ht_entry_t.GetPointerOrNull() const 4 Read s14 - c0 - 1897 - - clang +duckdb::ht_entry_t.GetPointerOrNull() const 5 ScopeExit s0 - c0 - 1812 - - walk +duckdb::ht_entry_t.GetSalt() const 0 ScopeEnter s0 - c0 - 2466 - - walk +duckdb::ht_entry_t.GetSalt() const 1 Return - - c0 - 2500 - - walk +duckdb::ht_entry_t.GetSalt() const 2 Call - s16 c0 - 2507 - static clang +duckdb::ht_entry_t.GetSalt() const 3 Read s1 - c0 - 2519 - - walk +duckdb::ht_entry_t.GetSalt() const 4 ScopeExit s0 - c0 - 2466 - - walk +duckdb::ht_entry_t.GetSaltWithNulls() const 0 ScopeEnter s0 - c0 - 2532 - - walk +duckdb::ht_entry_t.GetSaltWithNulls() const 1 Return - - c0 - 2575 - - walk +duckdb::ht_entry_t.GetSaltWithNulls() const 2 Read s1 - c0 - 2582 - - walk +duckdb::ht_entry_t.GetSaltWithNulls() const 3 Read s9 - c0 - 2590 - - clang +duckdb::ht_entry_t.GetSaltWithNulls() const 4 ScopeExit s0 - c0 - 2532 - - walk +duckdb::ht_entry_t.IsOccupied() const 0 ScopeEnter s0 - c0 - 1522 - - walk +duckdb::ht_entry_t.IsOccupied() const 1 Return - - c0 - 1557 - - walk +duckdb::ht_entry_t.IsOccupied() const 2 Read s1 - c0 - 1564 - - walk +duckdb::ht_entry_t.IsOccupied() const 3 ScopeExit s0 - c0 - 1522 - - walk +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 0 ScopeEnter s0 - c0 - 1917 - - walk +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 1 Param s6 - c0 - 1940 - s7 clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 2 Cast - - c0 - 2009 - static walk +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 3 Call - s8 c0 - 2019 - free clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 4 Read s6 - c0 - 2042 - - clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 5 Read s9 - c0 - 2053 - - clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 6 Cast - - c0 - 2009 - functional walk +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 7 Call - s11 c0 - 2009 - free clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 8 Cast - - c0 - 2124 - static walk +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 9 Read s1 - c0 - 2134 - - walk +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 10 Read s14 - c0 - 2142 - - clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 11 Read s14 - c0 - 2159 - - clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 12 Cast - - c0 - 2124 - functional walk +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 13 Call - s11 c0 - 2124 - free clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 14 ReadWrite s1 - c0 - 2237 - - walk +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 15 Call - s8 c0 - 2246 - free clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 16 Read s6 - c0 - 2269 - - clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 17 Read s9 - c0 - 2280 - - clang +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) 18 ScopeExit s0 - c0 - 1917 - - walk +duckdb::ht_entry_t.SetSalt(const hash_t &) 0 ScopeEnter s0 - c0 - 2606 - - walk +duckdb::ht_entry_t.SetSalt(const hash_t &) 1 Param s4 - c0 - 2626 - s5 clang +duckdb::ht_entry_t.SetSalt(const hash_t &) 2 Cast - - c0 - 2694 - static walk +duckdb::ht_entry_t.SetSalt(const hash_t &) 3 Call - s10 c0 - 2704 - member clang +duckdb::ht_entry_t.SetSalt(const hash_t &) 4 Cast - - c0 - 2694 - functional walk +duckdb::ht_entry_t.SetSalt(const hash_t &) 5 Call - s11 c0 - 2694 - free clang +duckdb::ht_entry_t.SetSalt(const hash_t &) 6 Cast - - c0 - 2772 - static walk +duckdb::ht_entry_t.SetSalt(const hash_t &) 7 Read s4 - c0 - 2782 - - clang +duckdb::ht_entry_t.SetSalt(const hash_t &) 8 Read s14 - c0 - 2789 - - clang +duckdb::ht_entry_t.SetSalt(const hash_t &) 9 Read s14 - c0 - 2806 - - clang +duckdb::ht_entry_t.SetSalt(const hash_t &) 10 Cast - - c0 - 2772 - functional walk +duckdb::ht_entry_t.SetSalt(const hash_t &) 11 Call - s11 c0 - 2772 - free clang +duckdb::ht_entry_t.SetSalt(const hash_t &) 12 Write s1 - c0 - 2876 - - walk +duckdb::ht_entry_t.SetSalt(const hash_t &) 13 Read s4 - c0 - 2884 - - clang +duckdb::ht_entry_t.SetSalt(const hash_t &) 14 ScopeExit s0 - c0 - 2606 - - walk +duckdb::ht_entry_t.ht_entry_t() 0 ScopeEnter s0 - c0 - 1281 - - walk +duckdb::ht_entry_t.ht_entry_t() 1 CtorInit s1 - c0 - 1305 - - clang +duckdb::ht_entry_t.ht_entry_t() 2 ScopeExit s0 - c0 - 1281 - - walk +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) 0 ScopeEnter s0 - c0 - 1390 - - walk +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) 1 Param s4 - c0 - 1401 - s5 clang +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) 2 Param s6 - c0 - 1421 - s7 clang +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) 3 CtorInit s1 - c0 - 1455 - - clang +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) 4 Call - s8 c0 - 1461 - free clang +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) 5 Read s6 - c0 - 1484 - - clang +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) 6 Read s4 - c0 - 1496 - - clang +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) 7 Read s9 - c0 - 1503 - - clang +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) 8 ScopeExit s0 - c0 - 1390 - - walk +duckdb::ht_entry_t.ht_entry_t(hash_t) 0 ScopeEnter s0 - c0 - 1321 - - walk +duckdb::ht_entry_t.ht_entry_t(hash_t) 1 Param s2 - c0 - 1341 - s3 clang +duckdb::ht_entry_t.ht_entry_t(hash_t) 2 CtorInit s1 - c0 - 1368 - - clang +duckdb::ht_entry_t.ht_entry_t(hash_t) 3 Read s2 - c0 - 1374 - - clang +duckdb::ht_entry_t.ht_entry_t(hash_t) 4 ScopeExit s0 - c0 - 1321 - - walk diff --git a/.claude/harvest/duckdb-headers/ore/execution_ht_entry/methods.tsv b/.claude/harvest/duckdb-headers/ore/execution_ht_entry/methods.tsv new file mode 100644 index 000000000..4a673a1ee --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/execution_ht_entry/methods.tsv @@ -0,0 +1,12 @@ +duckdb.IncrementAndWrap(idx_t &,const uint64_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb 7 1 Empty 0 0 0 0 0 0 0 0 0 method public 2 - +duckdb::ht_entry_t.ExtractSalt(const hash_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 6 1 Empty 0 0 0 0 0 0 1 0 0 method public 1 - +duckdb::ht_entry_t.GetPointer() const /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 8 1 Empty 0 0 0 0 0 1 0 0 0 method public 0 - +duckdb::ht_entry_t.GetPointerOrNull() const /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 6 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::ht_entry_t.GetSalt() const /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 5 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::ht_entry_t.GetSaltWithNulls() const /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 5 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::ht_entry_t.IsOccupied() const /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 4 1 Observe 1 0 0 0 0 1 0 0 0 method public 0 - +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 19 1 Normalize 1 1 0 0 0 0 0 0 0 method public 1 - +duckdb::ht_entry_t.SetSalt(const hash_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 15 1 Compute 0 1 0 0 0 0 0 0 0 method public 1 - +duckdb::ht_entry_t.ht_entry_t() /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 3 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 0 - +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 9 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 2 - +duckdb::ht_entry_t.ht_entry_t(hash_t) /home/user/adaworldapi/duckdb/src/include/duckdb/execution/ht_entry.hpp duckdb::ht_entry_t 5 1 Empty 0 0 0 0 0 0 0 0 0 ctor public 1 - diff --git a/.claude/harvest/duckdb-headers/ore/execution_ht_entry/scopes.tsv b/.claude/harvest/duckdb-headers/ore/execution_ht_entry/scopes.tsv new file mode 100644 index 000000000..bfb9079d6 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/execution_ht_entry/scopes.tsv @@ -0,0 +1,12 @@ +duckdb.IncrementAndWrap(idx_t &,const uint64_t &) c0 - Function 0 0 6 +duckdb::ht_entry_t.ExtractSalt(const hash_t &) c0 - Function 0 0 5 +duckdb::ht_entry_t.GetPointer() const c0 - Function 0 0 7 +duckdb::ht_entry_t.GetPointerOrNull() const c0 - Function 0 0 5 +duckdb::ht_entry_t.GetSalt() const c0 - Function 0 0 4 +duckdb::ht_entry_t.GetSaltWithNulls() const c0 - Function 0 0 4 +duckdb::ht_entry_t.IsOccupied() const c0 - Function 0 0 3 +duckdb::ht_entry_t.SetPointer(const data_ptr_t &) c0 - Function 0 0 18 +duckdb::ht_entry_t.SetSalt(const hash_t &) c0 - Function 0 0 14 +duckdb::ht_entry_t.ht_entry_t() c0 - Function 0 0 2 +duckdb::ht_entry_t.ht_entry_t(const hash_t &,const data_ptr_t &) c0 - Function 0 0 8 +duckdb::ht_entry_t.ht_entry_t(hash_t) c0 - Function 0 0 4 diff --git a/.claude/harvest/duckdb-headers/ore/execution_ht_entry/symbols.tsv b/.claude/harvest/duckdb-headers/ore/execution_ht_entry/symbols.tsv new file mode 100644 index 000000000..16f2ed602 --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/execution_ht_entry/symbols.tsv @@ -0,0 +1,22 @@ +s0 scope_kind - Function walk +s1 member own value clang +s2 param param value_p clang +s3 type - hash_t clang +s4 param param salt clang +s5 type - const hash_t & clang +s6 param param pointer clang +s7 type - const data_ptr_t & clang +s8 callee this cast_pointer_to_uint64 clang +s9 local local SALT_MASK clang +s10 callee this IsOccupied clang +s11 callee this __assert_fail clang +s12 callee this GetPointerOrNull clang +s13 callee this cast_uint64_to_pointer clang +s14 local local POINTER_MASK clang +s15 param param hash clang +s16 callee this ExtractSalt clang +s17 param param offset clang +s18 type - idx_t & clang +s19 param param capacity_mask clang +s20 type - const uint64_t & clang +s21 other unknown ? walk diff --git a/.claude/harvest/duckdb-headers/ore/per-header.tsv b/.claude/harvest/duckdb-headers/ore/per-header.tsv new file mode 100644 index 000000000..354fd30bc --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/per-header.tsv @@ -0,0 +1,12 @@ +header methods events +common_operator_comparison_operators 5 39 +common_operator_constant_operators 0 0 +common_row_operations_row_matcher 0 0 +common_types_selection_vector 26 311 +common_types_validity_mask 61 836 +common_types_vector 6 42 +common_vector_operations_scalar_executor 10 281 +common_vector_unified_vector_format 1 7 +execution_expression_executor_state 2 12 +execution_ht_entry 12 92 +TOTAL 123 1620 diff --git a/.claude/harvest/duckdb-headers/ore/provenance.txt b/.claude/harvest/duckdb-headers/ore/provenance.txt new file mode 100644 index 000000000..899be276e --- /dev/null +++ b/.claude/harvest/duckdb-headers/ore/provenance.txt @@ -0,0 +1,5 @@ +duckdb_src=/home/user/adaworldapi/duckdb +duckdb_head=48edc2adb83cadc84e1e52fc0e976f277f0c706f +duckdb_origin=https://github.com/AdaWorldAPI/duckdb +ruff_head=d8ec10e5e6d3deedd0dcd5c03022e61020c9e885 +clang=Ubuntu clang version 18.1.3 (1ubuntu1) diff --git a/.claude/harvest/duckdb-headers/run.sh b/.claude/harvest/duckdb-headers/run.sh new file mode 100755 index 000000000..c2d1f24d4 --- /dev/null +++ b/.claude/harvest/duckdb-headers/run.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +# Reproducible DuckDB HEADER harvest — discharges §6 of +# `.claude/plans/duckdb-to-v3-translation-matrix-v1.md`. +# +# §6 recorded that the original 22-TU `.cpp` harvest yielded seven TUs at +# 100 % `Empty`, because DuckDB's execution is template-dispatched and lives in +# HEADERS. A header pass was then run (2026-09-14) and its counts written into +# this directory's README — but the TSVs, the args and the DuckDB source were +# all absent, so the README's own honesty note says the complaint was NOT +# discharged: "a README quoting counts from a TSV that is absent". +# +# This script is the discharge. Everything it needs is committed beside it: +# the header list, the clang args template, and (after a run) the TSVs. +# +# DUCKDB_SRC=/path/to/duckdb ./run.sh +# +# Defaults to the AdaWorldAPI fork's conventional read-clone path. The fork is +# the P0-correct source; upstream duckdb/duckdb is deliberately NOT used. +set -euo pipefail + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DUCKDB_SRC="${DUCKDB_SRC:-/home/user/adaworldapi/duckdb}" +RUFF_SRC="${RUFF_SRC:-/home/user/ruff}" +OUT="${OUT:-$HERE/ore}" +LIBCLANG_PATH="${LIBCLANG_PATH:-/usr/lib/llvm-18/lib}" + +[ -d "$DUCKDB_SRC/src/include/duckdb" ] || { + echo "DUCKDB_SRC=$DUCKDB_SRC has no src/include/duckdb." >&2 + echo "Clone it: GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 \\" >&2 + echo " https://github.com/AdaWorldAPI/duckdb $DUCKDB_SRC" >&2 + exit 2 +} + +HARVESTER="$RUFF_SRC/target/release/examples/harvest_events" +[ -x "$HARVESTER" ] || { + echo "Building the harvester ..." >&2 + ( cd "$RUFF_SRC" && CARGO_PROFILE_DEV_DEBUG=0 cargo build -p ruff_cpp_spo \ + --features libclang --example harvest_events --release ) +} + +# The args file is GENERATED from the committed template, so the include paths +# follow DUCKDB_SRC rather than being pinned to one machine's checkout. +ARGS="$OUT/args.txt" +mkdir -p "$OUT" +sed "s|@DUCKDB_SRC@|$DUCKDB_SRC|g" "$HERE/args.txt.in" > "$ARGS" + +# Provenance: which DuckDB the counts below were read from. A count without +# its commit is an anecdote — the same rule the parity probes follow. +{ + echo "duckdb_src=$DUCKDB_SRC" + echo "duckdb_head=$(git -C "$DUCKDB_SRC" rev-parse HEAD 2>/dev/null || echo UNKNOWN)" + echo "duckdb_origin=$(git -C "$DUCKDB_SRC" remote get-url origin 2>/dev/null || echo UNKNOWN)" + echo "ruff_head=$(git -C "$RUFF_SRC" rev-parse HEAD 2>/dev/null || echo UNKNOWN)" + echo "clang=$(clang --version 2>/dev/null | head -1 || echo UNKNOWN)" +} > "$OUT/provenance.txt" + +total_methods=0 +total_events=0 +: > "$OUT/per-header.tsv" +printf 'header\tmethods\tevents\n' >> "$OUT/per-header.tsv" + +while read -r rel; do + [ -n "$rel" ] || continue + tag="${rel//\//_}" + hdr="$DUCKDB_SRC/src/include/duckdb/$rel.hpp" + [ -f "$hdr" ] || { echo "MISSING $hdr" >&2; exit 3; } + ORE_FILE="$hdr" ORE_ARGS_FILE="$ARGS" ORE_OUT="$OUT/$tag" \ + LIBCLANG_PATH="$LIBCLANG_PATH" "$HARVESTER" >/dev/null 2>&1 || true + # NEITHER TSV carries a header row -- line 1 is already data, so the raw + # line count IS the count. An earlier version of this script subtracted a + # header row that does not exist and reported 115/1612 against the README's + # 123/1622, which read as the README being wrong. It was this script. The + # counting rule is asserted below rather than assumed. + m=0; e=0 + [ -f "$OUT/$tag/methods.tsv" ] && m=$(wc -l < "$OUT/$tag/methods.tsv") + [ -f "$OUT/$tag/events.tsv" ] && e=$(wc -l < "$OUT/$tag/events.tsv") + printf '%s\t%d\t%d\n' "$tag" "$m" "$e" >> "$OUT/per-header.tsv" + total_methods=$(( total_methods + m )) + total_events=$(( total_events + e )) +done < "$HERE/headers.txt" + +printf 'TOTAL\t%d\t%d\n' "$total_methods" "$total_events" >> "$OUT/per-header.tsv" +cat "$OUT/per-header.tsv" +echo +echo "provenance: $(sed -n 2p "$OUT/provenance.txt")" From c955fb8e7d3e55a820035f3a3e984267a6a8090d Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 10:53:05 +0000 Subject: [PATCH 02/22] =?UTF-8?q?plan:=20lance-graph=20AS=20the=20ModelGra?= =?UTF-8?q?ph=20=E2=80=94=20the=20chain=20is=20built=20except=20one=20step?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator endgame. The survey's point is that this is a wiring job, not a design job: extract_tree -> ruff_spo_address::mint (16B, byte-identical to FacetCascade, no dependency edge) -> ogar-from-ruff::mint -> lance_sink -> as_le_bytes() is all live, unstubbed code, stopping at a Dataset::write that lance_sink.rs names out of scope in its own words. That write is G-C. The direction is forced, not chosen: no ruff crate may compile against lance-graph — verified, "lance.graph" appears in ruff/crates/*/Cargo.toml only inside two description strings. So the spine can only be the HOME, fed across a byte boundary. Confirms two operator recollections, corrects one, adds a third arm. Codegen arms are ruff_cpp_codegen (Rust MethodSig source), ruff_spo_address (the part_of:is_a rank-mint) and — found after the operator named it — ruff_python_dto_check::codegen (handler + view template, kind-generalized by KindRecipe, with a jinja leg). NOT ruff_python_codegen, which is upstream ruff's Generator/Stylist. JSONML exists nowhere in the five repos. arm-discovery is the table->SPO arm exactly as described and already names ruff_spo_triplet::Triple as its downstream. Records why the OLD ModelGraph's SurrealQL AST DLL sink was wrong, because it names this plan's own risk: deprecated 2026-07-22 as "a separation-of-concerns error", the behavioural arm having no DDL vocabulary so it had to hijack DEFINE EVENT. The corrected shape is a wrapper wiring three legs — adapters, storage, Klickwege-parity askama — and G-C is only the storage leg. An implementation reaching into the other two would be the same mistake at a new target. The same trap in Java clothes is sql() becoming where behaviour lives, which the lance-graph-java ruling already forbids from the other side. G-E is the uncomfortable one and independent of all this: quack has no DuckDB in its loop at all, so what is called parity today is quack against its own hand-written oracle. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .claude/board/INTEGRATION_PLANS.md | 30 +++ .../plans/lance-graph-as-the-modelgraph-v1.md | 242 ++++++++++++++++++ 2 files changed, 272 insertions(+) create mode 100644 .claude/plans/lance-graph-as-the-modelgraph-v1.md diff --git a/.claude/board/INTEGRATION_PLANS.md b/.claude/board/INTEGRATION_PLANS.md index 6461c4857..c9558b00b 100644 --- a/.claude/board/INTEGRATION_PLANS.md +++ b/.claude/board/INTEGRATION_PLANS.md @@ -1,3 +1,33 @@ +## 2026-09-16 (1) — lance-graph-as-the-modelgraph-v1 — the ModelGraph stops being a transient Rust object and becomes addressed rows in the V3 SoA → `.claude/plans/lance-graph-as-the-modelgraph-v1.md` + +**Status:** PROPOSAL (operator-set endgame: *"endgame should be to wire +lance-graph as ModelGraph"*). No code. The document is a SURVEY whose point is +that the chain is **already built except one step**: `ruff_cpp_spo::extract_tree` +→ `ruff_spo_address::mint` (16 B, byte-identical to `FacetCascade`, **no +dependency edge**) → `ogar-from-ruff::mint` → `lance_sink` → `as_le_bytes()`, +all live and unstubbed, stopping at a `Dataset::write` that `lance_sink.rs` +names out of scope in its own words. G-C is that write. + +The direction is FORCED, not chosen: no ruff crate may compile against +lance-graph (verified — `lance.graph` appears in `ruff/crates/*/Cargo.toml` +only inside two `description =` strings), so the spine can only be the HOME, +fed across a byte boundary. Matches `assembler-vs-storage-substrate.md`. + +Confirms two operator recollections and corrects a third: **two codegen arms** +are `ruff_cpp_codegen` (→ Rust `MethodSig` source) and `ruff_spo_address` (→ the +`(part_of:is_a)` rank-mint) — NOT `ruff_python_codegen`, which is upstream +ruff's `Generator`/`Stylist`. **arm-discovery is the table→SPO arm** exactly as +described (`translator.rs`: ARM confidence → NARS frequency, evidence `m` → +`m/(m+k)`, canonical `TruthU8` = the `CausalEdge64` wire), and it already names +`ruff_spo_triplet::Triple` as its downstream. **JSONML does not exist** in any +of the five repos. + +Carries G-A..G-E and waves W1-W4, each with a falsifier. G-E is the +uncomfortable one and is independent of the endgame: **quack has no DuckDB in +its loop at all** — zero dependency, every "DuckDB" in it a doc comment, its +oracles hand-written Rust. What is called parity today is quack ↔ its own +oracle; task #8's DuckDB differential fixtures remain unstarted. + ## 2026-09-14 (4) — hexagon-plasticity-v1 — can six learned rails discover local adjacency, and can ARM promote a cue to a path? → `.claude/plans/hexagon-plasticity-v1.md` **Status:** ACTIVE (W-1 and W0 RUN before landing; §9 carries their results and diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md new file mode 100644 index 000000000..25b0e74e2 --- /dev/null +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -0,0 +1,242 @@ +# lance-graph AS the ModelGraph — v1 + +> **Status:** PROPOSAL (operator-set endgame, 2026-09-16). No code yet; this +> document is the survey that makes the next wave a wiring job instead of a +> design job. +> +> **Operator:** *"endgame should be to wire lance-graph as ModelGraph"*, arrived +> at through: *"sql() polyfill is next then / doublecheck and work on +> quack<>duckdb parity / always use ruff cpp to analyze the duckdb code"*, +> *"ruff has at least 2 codegen arms"*, *"lance-graph-arm-discovery supports +> pandas like table > spo based on frequency and confidence"*. + +## The claim + +`ModelGraph` is today a **transient Rust object** — `ruff_spo_triplet::ir::ModelGraph` +is `{ namespace: String, models: Vec }`, built by a harvest, consumed by +a codegen pass, then dropped. The endgame is that it stops being transient and +**becomes addressed rows in lance-graph's V3 SoA**: one substrate that the +harvest mints into, that `arm-discovery` mines, that codegen projects from, and +that `sql()`/quack queries. + +The payoff is that these four stop being four pipelines over three formats and +become four readers of one addressed surface. + +## The direction constraint — this is what decides the design + +**No ruff crate may compile against lance-graph.** The edge is forbidden and the +tree takes real trouble to respect it: + +- `ruff_cpp_codegen` — *"names `lance_graph_contract` types as text, never + compiles against lance-graph"*; the rendered Rust is type-checked downstream + in the consumer repo. +- `ruff_spo_address` — mints a 16-byte facet *"layout-identical to + `lance_graph_contract::facet::FacetCascade`"*. Layout-identical, **not + imported**. + +Verified 2026-09-16: `grep -rn "lance.graph" ruff/crates/*/Cargo.toml` finds the +string only inside two `description =` fields. Zero dependency edges. + +So "wire lance-graph as ModelGraph" can only mean **lance-graph becomes the +HOME**, fed across a byte boundary — never ruff importing the spine. This also +matches `assembler-vs-storage-substrate.md`: OGAR assembles, lance-graph is the +spine, Lance calcifies. + +## The chain, and it is ALREADY BUILT except one step + +``` + C++ corpus (e.g. AdaWorldAPI/duckdb) + │ + ├─(A) ruff_cpp_spo::extract_tree ─────────► ModelGraph [ruff] + │ CppClass / CppFunction / CppEnum + │ has_function · inherits_from · virtually_overrides + │ + ├─(B) ruff_spo_address::mint ─────────────► Facet, 16 B [ruff, no dep] + │ part_of = has_field/has_function (hi chain, mereology) + │ is_a = inherits_from/rdf:type (lo chain, taxonomy) + │ byte-identical to FacetCascade, CascadeShape::G6D2 + │ + ├─(C) ogar-from-ruff::mint ───────────────► CompiledClass [OGAR] + │ THINK arm Class + DO arm ActionDef + the rail Facet + │ + ├─(D) ogar-from-ruff::lance_sink ─────────► NodeRow 512 B + │ compiled_class_to_facet (a reinterpret no-op) + │ compiled_class_to_noderow (CANON key|edges|value) + │ compiled_classes_to_le_bytes ──► as_le_bytes() + │ + ├─(E) ✗✗✗ THE ONE MISSING LINK: Dataset::write ✗✗✗ + │ lance_sink.rs names it out of scope BY DESIGN: + │ "stops at as_le_bytes(), exactly as network::to_facet stops at + │ the facet … that column write needs the lance engine / ractor + │ runtime." + │ + └─(F) the readers, once (E) exists + quack / sql() — query it + arm-discovery — mine it, write truth back as edges + ruff_cpp_codegen — project Rust manifests FROM it +``` + +**(A)–(D) are live, unstubbed code.** `lance_sink.rs` is 263 lines with zero +`todo!`/`unimplemented!`. The endgame is not a rewrite; it is **(E) plus +pointing (A) at a second corpus**. + +## What arm-discovery contributes, confirmed in source + +`lance-graph-arm-discovery` is the **table → SPO** arm, exactly as the operator +described. `translator.rs`, verbatim: + +- ARM **confidence** = `cooccur / antecedent_count` → NARS **frequency** +- ARM **evidence** `m = cooccur` → NARS **confidence** `c = m / (m + k)` +- canonical carrier is `TruthU8` (`frequency`/`confidence` as `u8`) — *"exactly + the `CausalEdge64` wire, float-free"*; the `f32` `NarsTruth` exists only as an + edge *"because the downstream `spo::truth::TruthValue` and + `ruff_spo_triplet::Triple` are themselves f32"*. + +That last clause matters: **arm-discovery already names `ruff_spo_triplet::Triple` +as its downstream.** The seam is half-acknowledged in code today. + +Its input is `Dataset { spec: FeatureSpec, rows: Vec> }` — a +categorical table, one code per feature per row. That is precisely the shape of +the harvest ore (`events.tsv`: method × ordinal × EventKind × scope × …), so +the DuckDB event ore can be mined without inventing a format. **The encoder +from ore-TSV to `Dataset` does not exist yet** and is the cheapest real +deliverable in this plan. + +## The codegen arms — two, and the second is not the obvious one + +| arm | in | does | +|---|---|---| +| `ruff_cpp_codegen` | ruff | ModelGraph → `ClassManifest` → **Rust source** (`MethodSig` targeting the OGAR Core), gated by a `decompile ∘ project` signature-plane round-trip | +| `ruff_spo_address` | ruff | SPO triples → **`(part_of:is_a)` rank-mint** → the 16-byte address. Its own doc: *"the one genuinely-new brick between the `ruff_*_spo` SPO harvest and the lance-graph `(part_of:is_a)` GUID SoA … the carrier is already there; this crate fills the mint."* | + +`ruff_python_codegen` is **not** one of these — it is upstream ruff's +`Generator`/`Stylist` (Python AST → source) and unrelated to the SPO path. + +## Honest gaps, in dependency order + +| # | gap | size | +|---|---|---| +| G-A | `extract_tree` has **never been run on DuckDB** — only the behavioural `harvest_events` arm has. The structural arm is what yields the operator class tree. | small: run it | +| G-B | No ore-TSV → `arm_discovery::Dataset` encoder. | small | +| G-C | **(E)** — no `Dataset::write`. Everything upstream stops at `as_le_bytes()`. | the real one | +| G-D | `sql()` does not exist on the Java surface. Per `lance-graph-java/CLAUDE.md` it is the whole consumer story, and it needs a substrate to query. | gated on G-C | +| G-E | **quack has no DuckDB in its loop at all** — zero dependency; every "DuckDB" in it is a doc comment, and its oracles are hand-written Rust. What is called parity today is quack ↔ its own oracle. Task #8's "DuckDB semantic differential fixtures" remains genuinely unstarted. | independent, real | + +## Wave order (proposed, not started) + +1. **W1 — structural harvest of DuckDB** (G-A). Run `extract_tree` over the + operator/expression headers; commit the triples beside the event ore, same + provenance discipline. Falsifier: the class tree must contain the types the + translation matrix reasoned about by hand (`Vector`, `SelectionVector`, + `ValidityMask`, `ht_entry_t`, the `ScalarExecutor` sinks) — if the harvest + misses them, the structural arm has DuckDB's template problem too and that + is the finding. +2. **W2 — ore → Dataset encoder** (G-B), then mine the DuckDB event ore and + read the rules. Falsifier: rules must be non-vacuous — a rule set whose + confidence is ~1.0 everywhere is measuring the harvester's own grammar, not + DuckDB. +3. **W3 — the write** (G-C). The single highest-value step; unblocks G-D and + makes every earlier stage durable instead of transient. +4. **W4 — real DuckDB differential** (G-E). Independent of 1–3 and honest to + start now: it is the only thing that makes the word "parity" true. + +## What this plan does NOT claim + +It does not claim (A)–(D) work on DuckDB — they are proven on the Tesseract/ +C# corpora, and DuckDB is template-heavy in a way that already defeated one +harvest arm (`duckdb-to-v3-translation-matrix-v1.md` §6: seven TUs at 100 % +`Empty`). W1's falsifier exists precisely because that may recur. + +It does not claim (E) is small. `lance_sink.rs` names the blocker in its own +words, and `symbiont`'s tombstone write is recorded BLOCKED for the same +reason. + +--- + +## The OLD ModelGraph sank to the WRONG place — and the reason names this plan's risk + +Operator, 2026-09-16: *"OLD ModelGraph was sinking to surrealql AST DLL arm by +mistake which later was deprecated and switched to ogar IR with a wrapper to +wire adapters and storage and Klickwege parity via askama in ERB redmine ERB +fieldview ergonomics."* + +Confirmed in primary sources, and the deprecation's own words are the point: + +> `OGAR/crates/ogar-adapter-surrealql/src/lib.rs:3` — +> **"⊘ DEPRECATED (operator ruling 2026-07-22 — a separation-of-concerns +> error)"**, and *"The reason is not primarily 'it doesn't work'."* + +`docs/SURREAL-AST-AS-ADAPTER.md` records what went wrong: the behavioural arm +(`ActionDef` + `ActionInvocation` + `KausalSpec` + lifecycle) has **no +equivalent vocabulary in DDL**, so encoding it there means *"hijacking `DEFINE +EVENT … WHEN … THEN …`"* — §0 calls this the **negative-beauty workaround**: +*"it works in a narrow sense and rots immediately."* + +**Why this is load-bearing for THIS plan rather than history.** The +corrected shape is exactly the chain in the diagram above — ModelGraph sinks to +**OGAR IR**, and a **wrapper** then wires three separate things that the DDL +sink had collapsed into one: + +| the wrapper wires | today | +|---|---| +| **adapters** | `ogar-adapter-*` (SurrealQL demoted to one membrane among several, never the spine) | +| **storage** | `ogar-from-ruff::lance_sink` → `NodeRow` → `as_le_bytes()` — this plan's G-C | +| **Klickwege parity** | askama fieldview — `ogar-render-askama::render_field_view`, consumed by `a2ui-rs`; the ERB/redmine lineage | + +So G-C is not merely "add a write". It is the storage leg of a **three-leg +wrapper whose whole reason for existing is that collapsing the legs was the +original error.** A G-C implementation that reached back into adapter or render +concerns would be the 2026-07-22 mistake with a different target, and the +`layer-boundary-warden` / `bbb-warden` cards are the gate. + +**Direct consequence for `sql()` (G-D):** the same trap in its Java clothes. +`sql()` is an ADAPTER leg. It must never become the place behaviour is +expressed — which is precisely what `lance-graph-java/CLAUDE.md`'s ruling +already says from the other side (*"behavior travels by ADDRESS … `onClick: +` in a component tree is the same hijack as `DEFINE EVENT` in DDL"*, +a2ui-rs T2). Two repos, two rulings, one error. + +## The THIRD codegen arm — `ruff_python_dto_check` + +Operator: *"ruff dto crate is meant to deduplicate routes and … also to propose +Separation of concern optimizations."* + +It exists and is substantial — `bundle`/`calibrate`/`codegen`/`config`/ +`contract`/`emit`/`extractors`/`matcher`/`observations`/`preflight`, its own +`bin`. Self-described as *"config-driven extractor over `ruff_python_parser` +that harvests structured DTO/route/handler facts … with a preflight subcommand +that proposes a config from the tree itself"*, and **additive** — it depends on +`ruff_python_parser`/`_ast`/`ruff_source_file` and modifies no other crate. + +So the count is **three**, not two, and the plan's table above is corrected: + +| arm | emits | +|---|---| +| `ruff_cpp_codegen` | Rust `MethodSig` manifests from a C++ ModelGraph | +| `ruff_spo_address` | the `(part_of:is_a)` rank-mint → 16-byte facet | +| **`ruff_python_dto_check::codegen`** | **handler + view template** — `codegen/{dto,columns,jinja,pipeline,target}.rs`, kind-generalized by `KindRecipe` so *"the other 10 kinds slot in by adding a recipe entry — not new Rust per kind"* | + +**`jinja.rs` is the same fieldview ergonomics leg** the wrapper wires as +Klickwege parity — the template side of the askama/ERB lineage, reached from +route/handler facts instead of from a `DocIr`. That is a convergence worth +probing, not assuming: two producers, one view-template surface. + +Its guardrail is already the right one and should be inherited by anything this +plan generates: *"Generated code goes to a draft directory; it is never wired +into a build and never emits `unimplemented!()`/`todo!()` into a compiled +production path (the PR #102 failure guardrail)."* + +**Route dedup + SoC proposals are the capability to reuse, not rebuild.** Note +what the pairing means: the SurrealQL sink was deprecated *as a +separation-of-concerns error*, and this crate's stated job includes *proposing +separation-of-concern optimizations*. The tool that proposes the fix and the +mistake it would have caught are the same concept at two ends of the arc — so +pointing it at a corpus is a cheap, direct check on whether a sink is +collapsing legs, rather than a new analysis to invent. + +**Scope honesty:** it is a **Python** extractor (`ruff_python_parser`). DuckDB +is C++, so it does not apply to W1 directly; its relevance here is (a) the +third codegen arm for the count, (b) the view-template convergence with +askama fieldview, and (c) route-dedup/SoC as an existing capability for the +Python-shaped consumers (odoo-rs, woa-rs, the `list_for_tenant`/`soft_delete` +recipes it already implements end-to-end against the woa-rs oracle). From 2fb30a3ffb612b40792461b40a467a79b12d63c6 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:03:04 +0000 Subject: [PATCH 03/22] =?UTF-8?q?plan:=20G-C's=20blocker=20was=20stale=20?= =?UTF-8?q?=E2=80=94=20the=20write=20needs=20a=20version=20publish,=20not?= =?UTF-8?q?=20an=20actor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator correction: ractor is replaced by the SoA mailbox, and the supervisor's kanban_actor.rs is the read-only monitoring remnant. Confirmed in source, and it removes an imaginary blocker from the plan. lance_sink.rs says the column write "needs the lance engine / ractor runtime". The ractor half is out of date. kanban_actor.rs's own tombstone (2026-08-05, E-PROGRESSION-IS-EXISTENCE-NOT-COMMAND-1) says KanbanActor, KanbanMsg and the RPC drivers are "DELETED, not deprecated: a version tick was being read as permission to advance, and an ack-shaped RPC was being read as what makes the substrate progress." The model that replaced them is think -> seal -> publish Lance version -> next cycle reads it, and "nothing signals, acknowledges, or schedules that." The write discipline is in cognitive-shader-driver/src/mailbox_soa.rs — the operator's "soa_mailbox.rs" with the words swapped, which is why this was worth checking rather than restating; searching that filename finds nothing. It carries one-writer-per-mailbox as a compile-time property: rows consumed in place by the owner, no emission, ownership compile-proven. So G-C changes from "adopt an actor runtime we lack" to "publish a Lance version from an owned mailbox", and W3 gains a sharp falsifier: an implementation that introduces a message, an ack, a tick or a per-owner advance() RPC has re-created the deleted shape and fails on that ground whether or not the bytes land. lance-graph-java already carries this as an inherited rule; it applies with more force in the repo that did the deleting. Records the ractor residue (four Cargo.toml entries, two optional, symbiont operator-ruled no-go) so it is not read as the live model. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 25b0e74e2..38e473671 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -240,3 +240,68 @@ third codegen arm for the count, (b) the view-template convergence with askama fieldview, and (c) route-dedup/SoC as an existing capability for the Python-shaped consumers (odoo-rs, woa-rs, the `list_for_tenant`/`soft_delete` recipes it already implements end-to-end against the woa-rs oracle). + +--- + +## ⊘ G-C's BLOCKER AS STATED IS STALE — ractor is not what the write needs + +Operator, 2026-09-16: *"ractor is replaced by the lance-graph soa_mailbox.rs and +lance-graph-supervisor kanban_actor.rs is the readonly monitoring version."* + +Confirmed in source, and it **removes an imaginary blocker from this plan**. +G-C above quotes `lance_sink.rs`: *"that column write needs the lance engine / +ractor runtime."* The ractor half of that sentence is out of date. + +**`kanban_actor.rs` says so in its own module doc** (tombstone dated +2026-08-05, `E-PROGRESSION-IS-EXISTENCE-NOT-COMMAND-1`): + +> *"Message-free kanban **visibility + pure helpers** — what remains of the +> retired actor surface."* … `KanbanActor` + `KanbanMsg::{Advance, MulAdvance, +> Tick}` and the RPC drivers are *"DELETED, not deprecated: a version tick was +> being read as permission to advance, and an ack-shaped RPC was being read as +> what makes the substrate progress."* + +And it names the model that replaced them: + +```text +think → seal → publish Lance version → next cycle reads the published version +``` + +> *"Nothing signals, acknowledges, or schedules that."* + +**The write discipline lives in `mailbox_soa.rs`** — `crates/cognitive-shader-driver/ +src/mailbox_soa.rs` (the operator's "soa_mailbox.rs", words swapped; searching +the filename alone finds nothing, which is why this was worth checking rather +than restating). It carries one-writer-per-mailbox as a *compile-time* property, +not a convention: rows are *"consumed in place by the owner (no emission)"*, +*"ownership is compile-proven"*, and the *"mutated only via the owner trait +invariant is compiler-enforced"* (E-CE64-MB-4). + +### What this changes, concretely + +| | before this note | after | +|---|---|---| +| G-C is | "build or adopt an actor runtime we don't have" | **publish a Lance version from an owned mailbox** | +| the shape | an ack-shaped RPC per write | `think → seal → publish`; progression is existence, not command | +| the risk | none stated | porting actor-per-write would re-add the exact architecture this repo DELETED | + +The last row is the one to carry into W3. `lance-graph-java/CLAUDE.md` already +states it as an inherited rule — *"actor/message-per-write is the architecture +lance-graph itself DELETED — never port it… per-owner `advance(owner)` RPCs are +exactly the deleted shape"* — and it applies with equal force here, on the +repo that did the deleting. + +**Residue, so it is not mistaken for the live model:** `ractor` still appears in +four `Cargo.toml` files — `cognitive-stack`, `symbiont`, `onebrc-probe`, +`lance-graph-supervisor` (the last two `optional = true`, and the supervisor's +`description` still advertises a *"ractor-supervised actor tree"*). `symbiont` +is operator-ruled no-go (`CLAUDE.md`: *"⊘ DEPRECATED 2026-08-18, operator +no-go"*). Those entries are leftovers; none of them is evidence that the write +path wants an actor. + +**Consequence for the wave order:** W3 gets cheaper and its acceptance gate gets +sharper. It is not "stand up a runtime"; it is "seal a `NodeRow` batch and +publish one version, written by the mailbox that owns those rows." The +falsifier follows directly — a W3 implementation that introduces a message, an +ack, a tick, or a per-owner `advance()` RPC has re-created the deleted shape and +fails on that ground regardless of whether the bytes land. From f5e286f0858647aa02a7001a4cbf1d96ebdb05e5 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:09:59 +0000 Subject: [PATCH 04/22] plan: survey the BatchWriter arc, the Rubicon seam and the hot-plug spine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator named five loose ends. Surveyed, and four of them turn out to be built ends that do not meet rather than things to build. BatchWriter (#879, #908-912, #949): #912 landed the sole owned Lance writer, so Dataset::write is real at cycle_sink.rs:675/710 and this plan's own "no Dataset::write" was wrong when written. batch_writer.rs's status note claiming cast() has zero production call sites is stale too — three today, all production: mailbox_soa (the owner), owner_adapter (write-on-behalf), cycle_driver (P4a drain). The other ~17 .cast( hits are ractor ActorRef::cast and would have inflated the count. What IS unwired is the observation leg: deinterlace has zero production callers, every hit a doc comment. So G-C splits — G-C1 connect OGAR's bytes to the writer that already exists, G-C2 wire the durability read. A write nothing reads back is not yet a loop. revision.rs is Heckhausen's last phase (postactional evaluation), and that makes it the same gap seen from the other end: the court of appeal has no write-back because the durable read that would tell it what happened is missing. The Rubicon model is genuinely wired otherwise — five phases in cognitive-compiler, rubicon_witness.rs, D-ACR-8. The kanban seam is NOT unwired: lance-graph-ogar is a workspace member depending on both sides by design, and recipe_vocab.rs already carries the 34 NARS recipes as ogar-loco ops with the kanban census as the awareness surface. The palette arc's constraint is that it must not ride the deprecated substrate the recent PRs surfaced — Binary16K and the singleton BindSpace are superseded, and temporal.rs's version-range read is what replaced them, which lands on G-C2 again. And the remediation is hot-plug, not a Cargo edge: socket in the zero-dep contract, authority production at lance-graph-ogar lib.rs:524, consumer declares one HotPlug const and activates. The classid is the join key — plug and play mints the classid, the classid mints ogar-vocab, which triggers the loco vocabulary. All eight existing declarations are test fixtures and the planner has none. Three claims in this document were drafted false and corrected before commit by re-checking citations. Recorded, including that a fully qualified impl made a negative grep read as "unimplemented" — a negative grep is a claim about the pattern, not about the tree. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .claude/board/SUPERSESSION-INDEX.md | 9 +- .../plans/lance-graph-as-the-modelgraph-v1.md | 237 ++++++++++++++++++ 2 files changed, 242 insertions(+), 4 deletions(-) diff --git a/.claude/board/SUPERSESSION-INDEX.md b/.claude/board/SUPERSESSION-INDEX.md index bb9b9ce47..5543c30a6 100644 --- a/.claude/board/SUPERSESSION-INDEX.md +++ b/.claude/board/SUPERSESSION-INDEX.md @@ -14,7 +14,7 @@ ## What this table says **`BindSpace` is the shape of the problem.** Marked RETIRE, and simultaneously the -most-referenced symbol here: **68 crate files, 47 plans, 41 of them blind.** +most-referenced symbol here: **68 crate files, 48 plans, 42 of them blind.** That is a programme, not a cleanup. **`GateState` is the sharpest case: 1 plan names it and *every one* is blind.** @@ -60,11 +60,11 @@ coverage instead. | `GateState` | REPURPOSE | — | 14 | 1 | 1 | | `MergeMode` | REPURPOSE | — | 8 | 14 | 13 | | `ResonanceDto` | REPURPOSE | `PerturbationDto` | 2 | 12 | 7 | -| `BindSpace` | RETIRE | — | 68 | 47 | 41 | +| `BindSpace` | RETIRE | — | 68 | 48 | 42 | | `CollapseGateEmission` | RETIRE | — | 5 | 14 | 12 | | `ThinkingStyle` | RETIRE-toward-contract | — | 52 | 28 | 24 | -## Table 2 — plans naming a ruled symbol without citing the ruling (75) +## Table 2 — plans naming a ruled symbol without citing the ruling (76) Route is **mechanical triage, not a verdict**: `ARCHIVE?` = the plan's own status says it shipped; `RESCOPE` = it targets a symbol marked RETIRE; `READ` = neither signal fires @@ -141,6 +141,7 @@ a licence to act on it. | **RESCOPE** | `entropy-closure-causal-ground-v1` | `ThinkingStyle` | PROPOSAL (measured, unbuilt) — 2026-08-26. P | 3/8 | | **RESCOPE** | `foundry-consumer-parity-v1` | `BindSpace` | Active | 0/0 | | **RESCOPE** | `foundry-roadmap-unified-smb-medcare-v1` | `BindSpace` | Active | 0/0 | +| **RESCOPE** | `lance-graph-as-the-modelgraph-v1` | `BindSpace` | PROPOSAL (operator-set endgame, 2026-09-16). | 4/4 | | **RESCOPE** | `lf-integration-mapping-v1` | `BindSpace` | Active (2026-04-25) | 0/0 | | **RESCOPE** | `lite-unified-surrealql-lance-v1` | `BindSpace` | CONJECTURE / design. **Test via feature gate | 0/0 | | **RESCOPE** | `ogit-cascade-supabase-callcenter-v1` | `BindSpace` | plan, not implementation. | 0/16 | @@ -156,6 +157,6 @@ a licence to act on it. | **RESCOPE** | `unified-soa-rubikon-integration-v1` | `BindSpace` | — | 8/8 | - **ARCHIVE?**: 0 -- **RESCOPE**: 55 +- **RESCOPE**: 56 - **READ**: 20 - ruled symbols tracked: 14 diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 38e473671..92ad14f74 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -305,3 +305,240 @@ publish one version, written by the mailbox that owns those rows." The falsifier follows directly — a W3 implementation that introduces a message, an ack, a tick, or a per-owner `advance()` RPC has re-created the deleted shape and fails on that ground regardless of whether the bytes land. + +--- + +## ⊘ SECOND CORRECTION — G-C IS NOT "no write". The writer EXISTS; the READ is the gap. + +Operator, 2026-09-16: *"lance-graph 879 + 908..912 949 (?) started to migrate it +accordingly to batchwriter."* Followed. The arc, and what it left: + +| PR | landed | +|---|---| +| #879 | D-MBX-A6-P4 cycle loop-closure driver — sparse seal/apply + MUL-gate thought seam | +| #908-910 | boot config at `.config//config.yaml`; `soa_config` unknown-key rejection + classid doc corrections | +| #911 | `graph/cycle_sink` — the concrete Lance-backed `WalSink` | +| **#912** | **Phase A: artifact-backed commits + THE SOLE OWNED LANCE WRITER** (supersedes #911's contract) | +| #949 | D-WXS-2a half A — row-major vs Morton KILL fires, no code change | + +**So `Dataset::write` is real and in-tree**: `crates/lance-graph/src/graph/cycle_sink.rs:675` +and `:710`, under a module doc saying the I/O *"is INTERNAL to this one writer."* +The plan's G-C above — *"no `Dataset::write`"* — was **wrong when written.** + +### `batch_writer.rs`'s own status note is ALSO stale + +It carries, dated 2026-07-27: *"`cast()` itself has **zero production call +sites**."* Measured 2026-09-16 — **three**, all production, none in `#[cfg(test)]`: + +| site | role | +|---|---| +| `cognitive-shader-driver/src/mailbox_soa.rs:764` | the **owner** casting its own moves (`writer: &mut BatchWriter

` in a production signature) | +| `lance-graph-planner/src/owner_adapter.rs:100` | **write-on-behalf** (`//! write-on-behalf to the BatchWriter`) | +| `lance-graph-supervisor/src/cycle_driver.rs:407` | **P4a (drain)** — *"Map the fleet's staged `BatchWriter` casts into `SweepSlot`s"* | + +(The ~17 other `.cast(` hits are ractor `ActorRef::cast(SupervisorMsg::…)` — a +different method entirely. Counting them would have inflated this.) + +### What IS still unwired — and it is the observation leg, not the write + +**`deinterlace` has zero production callers.** Every hit outside `temporal.rs` +is a doc comment; `witness_fabric.rs:510` cites the same 2026-07-27 note. So: + +``` +intent staged (BatchWriter::cast) ✓ wired, 3 sites +bytes written (cycle_sink Dataset::write) ✓ exists, #912 +durability READ (deinterlace) ✗ ZERO production callers +OGAR bytes → that writer ✗ lance_sink still stops at as_le_bytes() +``` + +**G-C therefore splits, and neither half is what the plan said:** + +- **G-C1 — connect `ogar-from-ruff::lance_sink` to the writer that already + exists.** Smaller than "build a write": both ends are built and they do not + meet. +- **G-C2 — wire the durability read.** `batch_writer.rs` states the ruling it + obeys (`E-ACK-ELIMINATED-1`, no confirmation bookkeeping — durability is the + row's own `LanceVersion` read through `temporal`) and then says that read has + no production implementor. **A write nothing reads back is not yet a loop.** + +> **Third stale blocker this session.** `lance_sink`'s "needs the ractor +> runtime", `batch_writer`'s "zero call sites", and this plan's own "no +> `Dataset::write`" were all true once and all false when I quoted them. The +> pattern is specific enough to name: **a STATUS note dated months back is a +> measurement, and this workspace's own rule is that a measurement without a +> re-run is an anecdote.** Re-measure before citing — three for three. + +## The Rubicon connection — why `revision.rs` and the missing read are ONE gap + +Operator: *"ogar-loco and revision.rs are 2 of the loose ends"* … *"revision.rs +is supposed to be the rubikon heckhausen last phase."* + +Heckhausen's Rubicon model runs **predecisional → preactional → actional → +postactional**, and the last phase is *evaluating the achieved outcome against +the original goal*. The model is genuinely wired here — `cognitive-compiler/ +src/lib.rs:18` carries *"The five Rubicon phases (Heckhausen). A trace records +which phase produced…"*, `lance-graph-contract/src/rubicon_witness.rs` maps the +phases and asks *"why a focus mask can falsify it"*, and `lib.rs:167` names +**D-ACR-8 — reading the Heckhausen crossing from the focus of attention**. + +`revision.rs` (in the CONTRACT, not the planner) says of itself: + +> *"models revision, not truth persistence, and still has **no production write +> capability** — the output types stop before actual-world mutation by design"*, +> closing a gap where `entropy-closure-causal-ground-v1` (#1057) names revision +> *"the only write-back"* and *"the court of appeal."* + +**These are the same gap seen from two ends.** The postactional phase cannot +evaluate an outcome it cannot observe; observation is `deinterlace`; the court +of appeal has no write-back because the durable read that would tell it what +actually happened is unwired. G-C2 is therefore not plumbing — **it is what +closes the last Rubicon phase**, and "revision has no write capability" is a +symptom rather than an independent item. + +## The kanban seam — planner ↔ ogar-loco ↔ ogar-r2il + +Operator: *"lance-graph-planner <> ogar-loco <> ogar-r2il has a lot of gaps to +wire the kanban."* Measured — and the gap is NARROWER and more specific than +"unwired". + +> ⊘ **I drafted "unwired in both directions" and it was FALSE.** Caught before +> commit by re-checking a citation I had just written, which is the same +> re-measure rule this document states three paragraphs up. The bridge crate +> EXISTS. + +**`lance-graph-ogar` IS the seam, and it is built.** A workspace member +(`Cargo.toml:96`) that depends on BOTH sides — `lance-graph-contract` by path +(`:86`, `:159`) and `ogar-loco` by git (`:137`) — for the stated reason that +neither may import the other: + +> `recipe_vocab.rs` — *"the 34 NARS recipes as `ogar-loco` ops above +> `DOMAIN_FLOOR`, with the kanban census as the awareness surface +> (`D-ACR-9`)"* … *"`ogar_loco` is zero-dep by design and +> `lance_graph_contract` is zero-dep by charter. **Neither may import the +> other** … A vocabulary needs both, so it lives in a consumer that already +> depends on both"* … *"**The ladder IS a program**: `recipe_dispatch::ladder` +> returns an ordered `Vec`; loco executes ordered +> `(function : value)` calls. That is mechanism, not analogy."* + +So the 34-recipe → loco-op unification and the kanban census surface are +**already written**. What is missing is one edge: + +- **The planner does not depend on `lance-graph-ogar`** (verified: no such line + in `lance-graph-planner/Cargo.toml`). The seam exists in a crate the planner + cannot see. +- **`ogar-loco` / `ogar-r2il` themselves: zero `kanban` hits.** Correct by + design — the zero-dep rule above means the kanban vocabulary belongs in the + bridge, not in loco. Their silence is conformance, not a gap. +- The planner-side references stay forward-looking doc comments + (`cognitive_palette.rs:77` *"Growth from here is `ogar-loco`, not this + table"*; `recipe_dispatch.rs:301` *"what an ogar-loco `FunctionBody` WILL + carry"*) because nothing has connected them to the bridge that now exists. + +> ⊘ **AND THE REMEDIATION I FIRST WROTE HERE — "add a planner → lance-graph-ogar +> dependency" — IS ALSO WRONG.** The operator pointed at `hotplug.rs`, and it +> names a different mechanism entirely. Second correction to this same section, +> both caught before commit. + +### The sanctioned mechanism is HOT-PLUG, and a Cargo edge is not it + +`lance-graph-contract/src/hotplug.rs` — *"Generic consumer hot-plug — the +plug-and-play pattern EVERY consumer migrates to (operator, 2026-07-07)"* — +three roles, three homes: + +| role | home | note | +|---|---|---| +| **socket** | `lance-graph-contract::hotplug` | `HotPlug` + `CapabilityAuthority`, **zero-dep**: *"No OGAR dep — the contract … MUST stay dependency-free (a path dep here breaks every CI cargo invocation at workspace-load time; learned 2026-07-07)"* | +| **authority** | OGAR-side | resolves classids → vocab rows, action defs, and the storage reading (`Activation::read_modes`); verifies registration | +| **consumer** | its own crate | declares **one `HotPlug` const**, calls `activate` in its own binary/tests | + +> *"The classid is the join key on BOTH sides … drift bangs once, **no pins, no +> serialization, no per-consumer plug crate**."* + +**The activation cascade** (operator, 2026-09-16): *"plug and play mints the +classid. and classid mints ogar-vocab which triggers ogar-loco vocabulary."* + +``` +HotPlug const (consumer) → activate() → classid minted + → ogar-vocab rows (Class + ActionDef) + → ogar-loco vocabulary (the palette / + recipe ops, landing in recipe_vocab.rs) +``` + +That is why `recipe_vocab.rs` can carry *"the 34 NARS recipes as `ogar-loco` +ops … with the kanban census as the awareness surface (`D-ACR-9`)"* without +either zero-dep crate importing the other: **the classid is the join, not a +dependency edge.** + +### Measured state of the hot-plug spine + +| piece | state | +|---|---| +| socket (`HotPlug`, `CapabilityAuthority`) | **built**, zero-dep, in the contract | +| authority (`impl … CapabilityAuthority for OgarAuthority`) | **built and PRODUCTION** — `lance-graph-ogar/src/lib.rs:524`; `#[cfg(test)]` does not begin until `:612` | +| consumer declarations | **all eight are TEST FIXTURES** (`:618`–`:831`, inside the two `cfg(test)` modules at `:612` and `:681`) — including `BLOCKLY` | +| **the planner's own `HotPlug`** | **ABSENT** — zero `HotPlug`/`hotplug` hits anywhere in `lance-graph-planner/src` | + +> A grep note worth keeping: `impl.*CapabilityAuthority` found nothing on the +> first pass because the impl is written fully-qualified +> (`impl lance_graph_contract::hotplug::CapabilityAuthority for OgarAuthority`). +> I nearly recorded "the authority is unimplemented", which would have been the +> fourth false blocker of the session. **A negative grep result is a claim about +> the pattern, not about the tree.** + +**So G-F is: the planner declares a `HotPlug` const and calls `activate`.** No +dependency edge, no plug crate, no seam to build — socket, authority and the +loco landing are all in place; the one consumer that needs the kanban has never +plugged in. Third instance this session of two built ends that do not meet. + +### The palette arc — and what checking it turned up + +Operator: *"ogar loco has a palette arc to unify the 34 nars templates which +just have been checked last few PRs only to find old VSA bindspace singleton +and hamming 16kbit deprecated."* + +The palette surface is in `ogar-loco` (`registry.rs`, `basin.rs`, +`vocabulary.rs`, `lib.rs`), and `recipe_vocab.rs` above is its lance-side +landing. The deprecation the recent PRs surfaced is recorded in-tree — +`cognitive-shader-driver/src/engine_bridge.rs:370` calls the +`Vsa16kF32`/`Binary16K` set-bits plane *"the deprecated one"* — and this repo's +own `CLAUDE.md` carries both supersessions: PR #477's three-tier model +(no singleton, no inter-mailbox handoff type at all) and +`E-MARKOV-TEMPORAL-STREAM-1` (2026-07-10), which moves the Markov trajectory +**off the VSA braid onto the `temporal.rs` sorted stream** and demotes VSA to +its `I-VSA-IDENTITIES` four-test niche (N ≤ 32 lossless role superposition +inside ONE compartment). + +**Consequence for the palette arc, and it is a real constraint:** a unification +of the 34 templates must NOT be carried on a 16 Kbit Hamming plane or a +singleton BindSpace. Both are superseded substrate, and `temporal.rs`'s +version-range read (`QueryReference::at(v, rung)` + deinterlace) is what +replaced them — **which lands on G-C2 again**, since that read has no +production caller. The palette arc, the Rubicon last phase, and the durability +read are three names for the same missing leg. + +## The other loose end — alpha channel split tunnel ↔ SPOG + +`.claude/plans/spog-alpha-channel-v1.md` exists: **SPEC (Phase 0), 2026-09-07, +48 KB**, self-described *"Register-before-code. Every 'exists' claim below was +read this session … Every 'absent' claim names the search that backs it."* Its +operator mandate targets MedCare-rs, and it carries the lance-11 constraint +(*"rows are experimental in lance 11 and only required for tombstones which we +avoid by having sealed batch per cycle"*) — the same sealed-batch-per-cycle +shape #912's writer implements. + +**Not surveyed further here** — it is a private-consumer-facing spec and +deserves its own pass rather than a paragraph in this plan. Recorded as a named +open end with its status, not folded in. + +## Revised gap table + +| # | gap | was | now | +|---|---|---|---| +| G-A | `extract_tree` never run on DuckDB | small | unchanged | +| G-B | no ore-TSV → `Dataset` encoder | small | unchanged | +| **G-C1** | OGAR bytes → the existing owned writer | *"the real one"* | **smaller — both ends exist, they do not meet** | +| **G-C2** | `deinterlace` / durability read | not identified | **the real one — and it is what closes Heckhausen's last phase** | +| G-D | `sql()` | gated on G-C | gated on G-C2 (a surface over an unreadable write is not a surface) | +| G-E | quack has no DuckDB in its loop | real | unchanged | +| **G-F** | planner ↔ loco ↔ r2il kanban seam | not in plan | **unwired both ways; a build, not a wiring** | +| **G-G** | alpha-channel split tunnel ↔ SPOG | not in plan | **SPEC Phase 0 exists; needs its own pass** | From 9b9a7c41881405c175d086b1f124e97728b03f58 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:10:34 +0000 Subject: [PATCH 05/22] CLAUDE.md: grep finds, reading decides MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator rule. It names the exact failure this session produced three times in one document, each caught before commit only because a later read contradicted the earlier grep: - "planner has no dependency edge to loco" — lance-graph-ogar is a workspace member depending on both sides; its Cargo.toml says so. - "CapabilityAuthority is unimplemented" — it is implemented and production, written fully-qualified, so the pattern missed it. - "the kanban seam is unwired both directions" — the grep was CORRECT and the conclusion still wrong, because recipe_vocab.rs's module doc explains the design and was never opened. That third one is the instructive case: a correct grep can support a false conclusion. Absence under one pattern is not absence in the tree. Also records the counting half: the same session nearly reported 20 BatchWriter::cast sites when reading showed ~17 were ractor's unrelated ActorRef::cast and only 3 were real. Placed beside Read-before-Write, which protects files from a blind write; this protects conclusions from a blind read. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- CLAUDE.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 02598a188..d29fb3821 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1436,6 +1436,39 @@ No knowledge doc should contain unmarked conjectures. Label everything. ## In-Session Orchestration Discipline +**P0 Rule: grep FINDS, reading DECIDES (operator, 2026-09-16: *"when you +grep, only use it for finding and read after"*).** A grep result is a claim +about a PATTERN, never about the tree. Use it to locate candidates, then open +the file and read before concluding anything — especially before concluding +that something is ABSENT. + +Measured 2026-09-16, three false claims in ONE document, all from grep-as-verdict, +all caught before commit only because a later read contradicted them: + +| grep said | the truth | what reading found | +|---|---|---| +| planner→loco has "no dependency edge" | `lance-graph-ogar` is a workspace member depending on BOTH sides | its `Cargo.toml` (`ogar-loco` at `:137`, contract at `:86`) | +| `CapabilityAuthority` is "unimplemented" | it is implemented AND production | the impl is written fully-qualified — `impl lance_graph_contract::hotplug::CapabilityAuthority for OgarAuthority` — so `impl.*CapabilityAuthority` missed it | +| the kanban seam is "unwired both directions" | the seam is built; only one edge is missing | `recipe_vocab.rs`'s module doc states the design ("neither may import the other… so it lives in a consumer that already depends on both") | + +The third is the instructive one: the grep was CORRECT (those planner-side hits +really are doc comments) and the CONCLUSION was still wrong, because the file +that would have explained why was never opened. **A correct grep can support a +false conclusion.** + +Two corollaries: + +- **A negative result is the weakest thing grep produces.** Absence under one + pattern is not absence in the tree — fully-qualified paths, re-exports, + macros, aliases, and line breaks all defeat a reasonable-looking regex. Before + writing "X does not exist", open the place X would live. +- **Never count grep hits as evidence without reading them.** The same session + nearly reported 20 `BatchWriter::cast` call sites; reading showed ~17 were + ractor's unrelated `ActorRef::cast(SupervisorMsg::…)` and only 3 were real. + +Cross-ref: the sibling rule below (Read before Write) protects FILES from a +blind write; this one protects CONCLUSIONS from a blind read. + **P0 Rule: Read before Write, always.** Before calling `Write` on any path that may already exist, run `Read` (or `git status` for committed files). The `Edit` tool is the default for modifying existing files; `Write` is only From 3c6a7f0407fef48ad37efdcec0e2d488f96a2f45 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:14:42 +0000 Subject: [PATCH 06/22] plan: ogar-loco's emancipation is upward, and the boring floor is the moat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Read the crate rather than grepping it. The architecture is already emancipated; what has not moved is the identity. Its own lib.rs argues the point — blockly-rs "proved a storage shape" and this crate "generalizes it", with elixir templates and Power-Automate flows named as consumers two and three. Blockly is consumer #1 of three, not the purpose. vocabulary.rs does the emancipating and enforces it: below DOMAIN_FLOOR is the shared computational core whose arities live once, so IF cannot mean two things in two domains; at or above the floor belongs to the vocabulary; a core byte the core does not cover is refused everywhere rather than guessed. conformance::check is the gate, in the JVM-verifier / Wasm-validator posture — validate before trusting, refuse loudly. So emancipate does not mean become less boring. The Scratch-shaped floor is load-bearing: a drifting core is N dialects. Emancipation is upward, and it has already started — recipe_vocab carries the 34 NARS recipes as loco ops above the floor, in the same two-byte (function : value) call as repeat, with no ABI change. That is the vocabulary-agnostic claim cashed. Records that this is the Java ruling one tier down. Both surfaces are deliberately dumb, both resolve meaning through the classid, and in both the temptation is to make the surface cleverer. A loco emancipation that grew core opcodes, or let a vocabulary redefine a shared-core byte, would be Mask.minus() in block clothing. The Java ruling is already written down; it should be read as covering loco too. Consequence for G-F: the planner's missing HotPlug is how a kanban vocabulary gets to exist above the floor without anyone importing anyone. Plug and play mints the classid, the classid mints ogar-vocab, which triggers the loco vocabulary — the cascade IS the emancipation mechanism. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 92ad14f74..1d619a991 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -542,3 +542,84 @@ open end with its status, not folded in. | G-E | quack has no DuckDB in its loop | real | unchanged | | **G-F** | planner ↔ loco ↔ r2il kanban seam | not in plan | **unwired both ways; a build, not a wiring** | | **G-G** | alpha-channel split tunnel ↔ SPOG | not in plan | **SPEC Phase 0 exists; needs its own pass** | + +--- + +## `ogar-loco`'s emancipation — the boring floor is the MOAT, not the burden + +Operator, 2026-09-16: *"ogar-loco has the burden of being boring scratch / +blockly-rs but needs to emancipate."* + +Read rather than grepped, and the architecture is **already emancipated**; what +has not moved is the crate's IDENTITY. Its own `lib.rs` opens by arguing the +point: + +> *"`ogar-loco` — the **low-code program surface**: the vocabulary-agnostic call +> ABI that every block/template/flow frontend shares … The block-editor arc +> (the `blockly-rs` consumers) **proved a storage shape**; the operator +> direction that created this crate **generalizes it**: elixir-shaped templates +> are 'just a rails-shaped semantic over classid index, 256:256 — not much +> different than blockly, just different vocabulary — a reusable surface for +> any other purposes.' Power-Automate-style flows are the third consumer in +> line."* + +So Blockly is **consumer #1 of three named**, not the crate's purpose. The +burden is that it was born there and is still read as its storage crate. + +### The seam that does the emancipating, and it is enforced + +`vocabulary.rs` — *"One call-ABI, sibling vocabularies selected by classid"* — +splits at `DOMAIN_FLOOR`: + +| range | owner | rule | +|---|---|---| +| **below** `DOMAIN_FLOOR` | the **shared computational core** | arities live ONCE, *"so `IF` cannot quietly mean two things in two domains, and no sibling can drift on `ADD`'s arity"* | +| **at/above** the floor | the **vocabulary** | a `Vocabulary` impl answers for exactly that range via `domain_*` hooks | +| a core byte the core does not cover | **nobody** | *"refused everywhere — a vocabulary does not get to guess for it. Coverage grows in the core, once, for everyone."* | + +`conformance::check` is the mechanical gate, and its stated posture is exactly +right for a shared floor: *"the JVM-verifier / Wasm-validator posture: validate +before trusting, refuse loudly."* + +The two-quantity split is the other sign this is not a toy: `stack_arity` +(operands evaluated before the call, on the stack) vs `body_refs` (function +indices in the call's VALUE bytes). `forever` proves they are independent — +zero operands, one body — and *"a single conflated number cannot express it."* + +### So what "emancipate" actually means + +**Not "become less boring."** The boring floor is load-bearing: `ADD`, `IF`, +`repeat`, `forever` are Scratch-shaped *on purpose*, because a shared core that +every sibling vocabulary agrees on is what stops N dialects. That is the moat. + +**Emancipation is upward, above the floor — and it has already started.** +`lance-graph-ogar::recipe_vocab` is the first act: *"the 34 NARS recipes as +`ogar-loco` ops above `DOMAIN_FLOOR`, with the kanban census as the awareness +surface."* NARS tactics expressed in the same `(function : value)` two-byte call +as `repeat`. Nothing about the ABI had to change to carry them — which is the +claim "vocabulary-agnostic" was making, now cashed. + +### This is the JAVA RULING one tier down — same shape, same reasoning + +| | `sql()` (T3, Java) | `ogar-loco` (the program surface) | +|---|---|---| +| the surface | ordinary SQL a developer already knows | ordinary blocks an author already knows | +| why boring | *"novel API is the enemy, not slow API"* — every unit of novelty is lock-in-by-learning-curve | a drifting core is N dialects; the floor is what makes siblings composable | +| where power lives | lance-graph, reached by classid → ClassView | the vocabulary above `DOMAIN_FLOOR`, reached by classid → `Vocabulary` | +| what the caller learns | nothing | nothing | +| the join key | **the classid** | **the classid** | + +Both surfaces are deliberately dumb, both resolve meaning through the classid, +and in both the temptation is to make the SURFACE cleverer. **On the Java side +that temptation is already ruled out in writing; the same ruling should be read +as covering loco.** A loco emancipation that grew new core opcodes, or let a +vocabulary redefine a shared-core byte, would be `Mask.minus()` in block +clothing — power leaking into the front instead of arriving through the address. + +**Consequence for G-F:** the planner's missing `HotPlug` is not merely a wiring +chore, it is how the kanban vocabulary gets to exist above the floor without +anyone importing anyone. The cascade the operator named — +*"plug and play mints the classid; the classid mints ogar-vocab; which triggers +ogar-loco vocabulary"* — IS the emancipation mechanism, stated as a pipeline. +Every consumer that hot-plugs adds a sibling vocabulary and takes nothing from +the floor. From 39cb3f4901b58ce1bc4688e915793ef346027dc2 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:19:09 +0000 Subject: [PATCH 07/22] plan: the progress loop is fire-and-forget; sql() is just a classid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Third correction, and it retires a blocker I invented. I wrote that "a write nothing reads back is not yet a loop". Reading batch_writer.rs shows both halves of the operator's "fire and forget write + try progress kanban" already in its module doc: the sink drains eagerly, "the thinker reports (casts) and moves on — melden macht frei — it is NEVER refused", and collect_casts seals one paired_move per owner which recover_and_apply applies via try_advance_phase, consulting no scheduler. So the loop closes on cast + try-advance, not on a read-back. deinterlace belongs to the observation arm and gates neither the write nor the advance. The kanban IS the Rubicon DAG rather than a separate subsystem: try_advance_phase returns Result and its body is from.can_transition_to(to). revision.rs is already bound to it contractually and by test — "whatever revise proposes must be an edge try_advance_phase accepts; it completes the Rubicon DAG, it does not route around it." Measured, the chain is wired at both ends and hollow in the middle: cast has 3 production callers, try_advance_phase 1, and recover_and_apply ZERO — its only two call sites sit inside mod tests. So G-C2 is a connect, not a build. Records the planner as the hot-plug home and what that unlocks: sql() becomes one classid in a loco vocabulary rather than a bespoke Java surface, and the same activation brings the whole DuckDB vocabulary with it. That reframes today's reproducible harvest — it is vocabulary source, not documentation of a competitor, which is what "always use ruff cpp to analyze the duckdb code" was for. Also notes the planner's DataFusion leg has both a standing ruling and a worked example (quack's lowering, pinned equal to plan_lower) to migrate onto. Wave order revised: extract_tree, then the planner's HotPlug const as the smallest change with the largest unlock, then connect recover_and_apply, then the DataFusion replacement, with the DuckDB differential still independent. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 1d619a991..4ea221200 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -623,3 +623,135 @@ anyone importing anyone. The cascade the operator named — ogar-loco vocabulary"* — IS the emancipation mechanism, stated as a pipeline. Every consumer that hot-plugs adds a sibling vocabulary and takes nothing from the floor. + +--- + +## ⊘ THIRD CORRECTION — the progress loop does NOT wait on `deinterlace` + +Operator, 2026-09-16: *"batchwrite fire and forget write + try progress kanban."* + +Read `batch_writer.rs` properly (not grepped) and both halves are already in its +module doc, in those words: + +> *"The sink drains EAGERLY (ASAP on cast, background), and the write masks the +> thinking and vice versa: the thinker reports (casts) and moves on — **'melden +> macht frei'** — it is NEVER refused."* + +And the progress half is named end to end: `cycle_driver::collect_casts` drains +the payloads, seals the FIRST move per owner as `SweepSlot::paired_move`, and +`persist_sink::recover_and_apply` applies it via +**`MailboxSoaOwner::try_advance_phase`** — *"consulting no scheduler at any +point."* + +**So G-C2 as I wrote it — "a write nothing reads back is not yet a loop" — is +wrong.** The loop closes on *fire-and-forget cast + try-advance*, not on a +read-back. `deinterlace` belongs to a DIFFERENT arm: the durable OBSERVATION +path (temporal queries, pinned-reference recovery). Conflating the two made an +observation gap look like a liveness blocker. Corrected: the loop's liveness +does not depend on it. + +### The kanban IS the Rubicon DAG — one mechanism, not two + +`try_advance_phase` (in `contract/soa_view.rs`) returns +**`Result`** and its whole body is +`from.can_transition_to(to)`. The kanban columns ARE the Heckhausen phases and +the transition DAG is the Rubicon crossing. That is why *"kanban rubikon and +revision.rs wrapping it"* is one chain rather than three subsystems. + +`revision.rs`'s binding to it is already stated AND tested in +`contract/kanban.rs:560`: + +> *"Whatever `revise` proposes must be an edge `try_advance_phase` accepts — **it +> completes the Rubicon DAG, it does not route around it.** And a column with no +> `Plan` successor must stay silent."* +> — test `revise_only_ever_proposes_a_legal_edge_and_is_silent_elsewhere` + +So revision is not bolted on: the contract already forbids it from inventing an +edge, and a test enforces both the legality and the silence half. + +### Measured wiring of the progress chain + +| piece | production callers | +|---|---| +| `BatchWriter::cast` | **3** — `mailbox_soa:764` (owner), `owner_adapter:100` (on-behalf), `cycle_driver:407` (P4a drain) | +| `MailboxSoaOwner::try_advance_phase` | **1** — `mailbox_soa.rs:1281` (`.try_advance_phase(mv.to)`); every other hit is a doc comment | +| `persist_sink::recover_and_apply` | **0** — its only two call sites (`:1128`, `:1146`) are inside `mod tests` at `:732` | + +**So the chain `batch_writer`'s doc describes is wired at both ends and hollow +in the middle**: casts land, the owner can advance, and the glue that turns +sealed slots into applied moves has no production caller. That is the honest +G-C2 — narrower than "no loop", and it is a connect, not a build. + +> **Caller consequence the doc flags as documented nowhere else**, worth +> carrying into any W3 work: *"at most ONE move per owner per cycle is sealed. +> Casting three transitions for one mailbox performs one and defers two — and +> because the deferred ones do eventually apply, **code assuming otherwise is +> wrong in a way nothing reports.**"* + +## The planner is the hot-plug home — and `sql()` is just a classid + +Operator: *"lance-graph-planner is the correct to get a ogar-loco and ogar-vocab +> hotplug.rs store for the vocabulary, which then ogar-loco is empowered to feed +into kanban rubikon and revision.rs wrapping it"* … *"eg ogar-loco could get the +classid for `sql()`"* … *"which then gets the whole duckdb vocabulary"* … +*"that would be the easiest and cleanest move."* + +This resolves G-D, and it dissolves it rather than solving it: + +``` +DuckDB C++ + ─(ruff_cpp_spo::extract_tree)──────► ModelGraph + ─(ruff_spo_address::mint)──────────► classids (part_of:is_a, 16 B facet) + ─(planner's HotPlug const + activate)─► ogar-vocab rows (Class + ActionDef) + ────────────────────────────────────► ogar-loco VOCABULARY above DOMAIN_FLOOR + ├─ sql() is ONE classid in it + └─ the whole DuckDB vocabulary beside it + ─(kanban = Rubicon DAG, try_advance_phase)─► executed + ─(revision.rs)─────────────────────────────► postactional phase wraps it +``` + +**`sql()` stops being a bespoke Java surface and becomes a vocabulary entry.** +That is why it is the cleanest move: there is nothing to design. The Java glove +calls a classid; loco defines what that classid means; the classid is the join — +the same join key the hot-plug socket already uses on both sides. It also keeps +the Java ruling intact for free: the surface stays boring because it is not a +surface at all, just an address. + +**And it is what the DuckDB harvest was FOR.** Today's reproducible header +harvest (123 methods / 1620 events, provenance-stamped) is not documentation of +a competitor — it is **vocabulary source**. W1's structural arm +(`extract_tree`) produces the class tree that becomes the vocabulary above the +floor. That reframes G-A from "a survey we owe" to "the first step of the +build". + +### The remaining DataFusion leg + +Operator: *"planner historically had datafusion stuff that we need to replace +with masked ops."* This is the standing ruling applied to the planner +specifically — `CLAUDE.md` already records *"every planning is in migration to +`ogar-loco` and `ogar-r2il`, especially datafusion is out of the picture, what +exists gets a grace period, nothing new will migrate to it"* +(`E-PLANNING-MIGRATES-TO-LOCO-R2IL-DATAFUSION-IS-GRACE-PERIOD-1`). + +The replacement target is not in doubt — `lance-graph-quack` already proves the +shape (every operator lowers to a `Program` executed by the ONE mask-risc +evaluator) and `plan_lower == quack::lower` is pinned by a differential. So the +planner's DataFusion surface has both a ruling and a worked example to migrate +onto; what it lacks is the migration itself. + +## Wave order, revised by everything above + +1. **W1 — `extract_tree` on DuckDB.** Now the first step of the vocabulary + build, not a survey. Same falsifier. +2. **W-HP — the planner's `HotPlug` const + `activate`.** Smallest change with + the largest unlock: it is G-F, it is the vocabulary store, and it is what + lets `sql()` and the DuckDB vocabulary exist above the floor. +3. **W3' — connect `recover_and_apply`** (not "build a write"). Both ends + exist; the glue is test-only. +4. **W-DF — planner DataFusion → masked ops**, onto quack's proven shape. +5. **W4 — the real DuckDB differential** (G-E), still independent and still the + only thing that makes "parity" true. + +`deinterlace` (the observation arm) drops out of the critical path entirely — +it is what `revision.rs` will eventually need to EVALUATE an outcome, but it +gates neither the write nor the advance. From 93387ff3f131ee03b4c0468ab5b377661e4a4991 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:20:08 +0000 Subject: [PATCH 08/22] =?UTF-8?q?plan:=20the=20join=20leg=20=E2=80=94=20a?= =?UTF-8?q?=20DuckDB=20version=20fed=20from=20loco,=20with=20its=20scope?= =?UTF-8?q?=20already=20bounded?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes the arc the harvest opened. The assessment exists: matrix row A3 reads JoinHashTable's probe path and rules it V3-better for the addressed case, because ht_entry_t's 16-bit salt is a probabilistic prefix derived from a hash while the V3 classid prefix is a contiguous row range (49-99 ns vs 22.4 us). DuckDB independently arrived at zero-is-absence, the same convention as the zero-fallback ladder. Fed from loco rather than ported: a join is a (function : value) call like any other, so the vocabulary names it, the classid selects it, and the existing lowering carries it to the one mask-risc evaluator — the same path quack already proves for scan/filter/project/group. The minted case collapses to a prefix range; only the unminted case needs hash machinery. Scope is bounded by two caveats derived independently and agreeing: A3's own ("holds only when both sides are minted into the same address space") and the queued PR5's ("no replacement claim for bag or cross-address-space joins"). A3 also flags that its row reads two functions, not the join — spilling, radix partitioning and chain building are unassessed. Final wave order: extract_tree, the planner's HotPlug, connect recover_and_apply, the DataFusion replacement, then the join leg, with the DuckDB differential independent throughout. The join is last of the build waves because it needs both the vocabulary and the harvest. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .claude/board/SUPERSESSION-INDEX.md | 2 +- .../plans/lance-graph-as-the-modelgraph-v1.md | 60 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/.claude/board/SUPERSESSION-INDEX.md b/.claude/board/SUPERSESSION-INDEX.md index 5543c30a6..6977b4ccb 100644 --- a/.claude/board/SUPERSESSION-INDEX.md +++ b/.claude/board/SUPERSESSION-INDEX.md @@ -141,7 +141,7 @@ a licence to act on it. | **RESCOPE** | `entropy-closure-causal-ground-v1` | `ThinkingStyle` | PROPOSAL (measured, unbuilt) — 2026-08-26. P | 3/8 | | **RESCOPE** | `foundry-consumer-parity-v1` | `BindSpace` | Active | 0/0 | | **RESCOPE** | `foundry-roadmap-unified-smb-medcare-v1` | `BindSpace` | Active | 0/0 | -| **RESCOPE** | `lance-graph-as-the-modelgraph-v1` | `BindSpace` | PROPOSAL (operator-set endgame, 2026-09-16). | 4/4 | +| **RESCOPE** | `lance-graph-as-the-modelgraph-v1` | `BindSpace` | PROPOSAL (operator-set endgame, 2026-09-16). | 5/5 | | **RESCOPE** | `lf-integration-mapping-v1` | `BindSpace` | Active (2026-04-25) | 0/0 | | **RESCOPE** | `lite-unified-surrealql-lance-v1` | `BindSpace` | CONJECTURE / design. **Test via feature gate | 0/0 | | **RESCOPE** | `ogit-cascade-supabase-callcenter-v1` | `BindSpace` | plan, not implementation. | 0/16 | diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 4ea221200..ec1b467a9 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -755,3 +755,63 @@ onto; what it lacks is the migration itself. `deinterlace` (the observation arm) drops out of the critical path entirely — it is what `revision.rs` will eventually need to EVALUATE an outcome, but it gates neither the write nor the advance. + +## The join leg — replace the inherited SQL joins with a DuckDB version fed from loco + +Operator: *"and then to replace the sql joins inherited from upstream +lance-graph with a duckdb version fed from ogar-loco."* + +This closes the arc the DuckDB harvest opened, and the assessment is already +written. `duckdb-to-v3-translation-matrix-v1.md` row **A3** reads +`JoinHashTable`'s probe path (`join_hashtable.cpp:248-296`, +`ht_entry.hpp:34-37/49-51`) and rules it **"V3 BETTER for the addressed case; +NEEDS FALSIFIER otherwise"**, because: + +> `ht_entry_t` packs **16 bits of salt + 48 bits of pointer** in one u64 and +> prefilters on the salt to avoid a full key compare. That is a *probabilistic* +> prefix derived from a hash. **The V3 classid prefix is the real thing**: +> matching it is not a filter that may be wrong, it is a **contiguous row +> range** (R5, D-GTM-0m: **49–99 ns vs 22.4 µs**). Also `IsOccupied() == (value +> != 0)` — DuckDB independently arrived at zero-is-absence, the same convention +> as the zero-fallback ladder. + +And it states its own limit, which is the falsifier this leg inherits: + +> *"The comparison only holds when **both sides are minted into the same address +> space**. A join between a minted V3 population and an external, unminted key +> set has no shared prefix and falls back to A2's hash question."* +> Plus: *"`join_hashtable.cpp` is 6,986 harvested events, by far the largest TU +> read — this row is a **reading of two functions, not of the join**; spilling, +> radix partitioning, and chain building are not assessed."* + +**Why "fed from ogar-loco" is the right shape rather than a port.** A join is a +`(function : value)` call like any other: the vocabulary above `DOMAIN_FLOOR` +names it, the classid selects it, and it lowers to a `Program` the one mask-risc +evaluator runs — exactly as quack already does for scan/filter/project/group. +So this is not "reimplement DuckDB's hash join in Rust"; it is **mint the join +into the vocabulary and let the existing lowering carry it**. The minted-address +case collapses to a prefix range (a mask), and only the unminted case needs the +hash machinery at all. + +It also lands on an already-queued deliverable: **task #10 / PR5** is the +join-elision experiment — `src_mask → hop → dst_mask` versus the DataFusion +node-edge-node join, with set semantics explicit and *"no replacement claim for +bag or cross-address-space joins."* That caveat and A3's are the same caveat, +arrived at independently, and together they bound the leg honestly: **the +replacement claim is for the minted, set-semantics case; bag semantics and +cross-address-space joins stay with the inherited path until measured.** + +### Revised final wave order + +| wave | what | why here | +|---|---|---| +| **W1** | `extract_tree` on DuckDB | first step of the vocabulary build, not a survey | +| **W-HP** | the planner's `HotPlug` const + `activate` | smallest change, largest unlock: G-F, the vocabulary store, and what lets `sql()` exist above the floor | +| **W3'** | connect `recover_and_apply` | both ends built; the glue is test-only | +| **W-DF** | planner DataFusion → masked ops | standing ruling + quack's proven shape to migrate onto | +| **W-JOIN** | the join leg, fed from loco | gated on W-HP (needs the vocabulary) and on W1 (needs the harvest); PR5 is its falsifier | +| **W4** | the real DuckDB differential (G-E) | independent; the only thing that makes "parity" true | + +W-JOIN is deliberately last of the build waves: it is the one that needs BOTH +the vocabulary (W-HP) and the harvest (W1) to exist, and its honest scope is +set by two independently-derived caveats rather than by ambition. From dde9e61d65da1919226d8ed1d3cecebb672a14e3 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:26:09 +0000 Subject: [PATCH 09/22] planner: remove the inert datafusion feature; the DataFusion is not here MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fourth correction of the session, and the target is not where it looks. lance-graph-planner has NO DataFusion dependency and no DataFusion code. All ten mentions across 10,028 LOC are doc comments crediting a pattern — RuleOptimizer "from DataFusion", ExtensionPlanner "from DataFusion's UserDefinedLogicalNode pattern", the optimizer "inspired by DataFusion's OptimizerRule trait", broadcast "analogous to DataFusion's Repartition". The `datafusion = []` line is a FEATURE, under [features] beside jit = [], and it is inert: nothing is cfg-gated on it and no manifest in the workspace enables it. Removed, with the reason inline — its only live effect was making every grep of the Cargo manifests misreport this crate as a DataFusion consumer. My own census script fell for exactly that, one turn after I added the rule forbidding it. Tests green: 435 passed, 0 failed, 2 ignored. The real surface is 8,044 LOC in lance-graph/src/datafusion_planner/ — the core crate. So reviving the planner as the center of gravity is a migration inward, not a deletion: move that capability in as masked-op lowerings, with quack as the worked example and plan_lower == quack::lower already pinned by a differential. The planner is already structurally central to the write path — cognitive-shader-driver depends on it, and batch_writer, owner_adapter and persist_sink all live there — so what is missing is the query side rejoining the write side. Records the intake reroute: parser.rs is 1,932 LOC of nom Cypher over a 544-line AST, and what it must stop feeding is semiring_map's HDR semirings over 16Kbit BitVec matrices — the substrate the recent PRs found deprecated. The parser stays; that leg is what the masked path replaces. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 93 +++++++++++++++++++ crates/lance-graph-planner/Cargo.toml | 9 +- 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index ec1b467a9..b02fdf82e 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -815,3 +815,96 @@ cross-address-space joins stay with the inherited path until measured.** W-JOIN is deliberately last of the build waves: it is the one that needs BOTH the vocabulary (W-HP) and the harvest (W1) to exist, and its honest scope is set by two independently-derived caveats rather than by ambition. + +--- + +## ⊘ FOURTH CORRECTION — there is no DataFusion in `lance-graph-planner` to remove + +Operator: *"the immediate endgame is to replace all the DataFusion shit in +lance-graph-planner to revive its status as the center of gravity and wire it +into `mailbox_soa.rs` <> kanban rubikon."* + +Measured before acting, and the target is not where it looks: + +| | | +|---|---| +| planner DataFusion **dependency** | **none** — no `[dependencies]` entry at all | +| planner DataFusion **code** | **none** | +| planner DataFusion **mentions** | **10, every one a DOC COMMENT** crediting a pattern: *"Strategy #4: RuleOptimizer — Composable rule-based optimization (from DataFusion)"*, *"From DataFusion's ExtensionPlanner + UserDefinedLogicalNode pattern"*, *"inspired by DataFusion's OptimizerRule trait"*, *"Analogous to DataFusion's Repartition but for fingerprint vectors"* — in 10,028 LOC | +| the `datafusion = []` line | a **FEATURE**, under `[features]` beside `jit = []` — **inert**: nothing `cfg`-gated on it, nothing in the workspace enabling it | + +**The real DataFusion is 8,044 LOC in `crates/lance-graph/src/datafusion_planner/`** +— `scan_ops`, `join_ops`, `predicate_pushdown`, `vector_ops`, `expression`, +`cost_estimation`, `udf`, `analysis`, `builder/`. In the CORE crate. The crates +carrying a real dep are `lance-graph` (4 entries), `lance-graph-callcenter` (3), +`holograph` (2), `lance-graph-catalog` (1), `lance-graph-python` (1). **Not the +planner.** + +> My own census script reported "planner: 1 entry" — its regex matched the +> FEATURE line. The trap is documented in this repo's own pin-rule comment +> (*"a FEATURE NAME, not a version pin. It is not a counter-example"*) and I +> walked into it anyway, one turn after adding the rule that forbids it. + +**Done now (small, gated):** the inert `datafusion = []` feature is REMOVED with +the reason inline. Its only live effect was making every +`grep datafusion crates/*/Cargo.toml` misreport this crate as a consumer. +`cargo test -p lance-graph-planner`: **435 passed, 0 failed, 2 ignored** (+4). + +### So "revive its status as the center of gravity" is a MIGRATION, not a deletion + +Nothing leaves the planner; capability **arrives**. The work is to move what +`lance-graph::datafusion_planner` does INTO the planner as masked-op lowerings — +and `lance-graph-quack` is the worked example, with `plan_lower == quack::lower` +already pinned by a differential. + +**And the planner is already structurally central to the write path**, which is +the strongest argument that "center of gravity" is a restoration rather than a +promotion: `cognitive-shader-driver` depends on `lance-graph-planner` (its +`mailbox_soa.rs:760` takes `&mut lance_graph_planner::batch_writer::BatchWriter

`), +and `owner_adapter.rs` / `batch_writer.rs` / `persist_sink.rs` all live in the +planner. The kanban write staging is the planner's already; what is missing is +the QUERY side rejoining it. + +## The intake vocabulary — the Cypher parser, and what it must stop feeding + +Operator: *"there is a parser upstream in lance-graph that is supposed to handle +table rows and column joins akin to cypher"* … *"if we could reroute that +vocabulary to replace semiring json to masked intake <> masked ops."* + +The parser is `crates/lance-graph/src/parser.rs` — **1,932 LOC of nom +combinators** over `ast.rs` (544 LOC), *"parsing … Cypher queries … focused on +graph pattern matching and property access."* That is the intake vocabulary: a +table row is a node, a column join is a pattern edge. + +**What it must stop feeding is dated substrate.** `graph/semiring_map.rs` maps +GraphBLAS semirings onto *"7 HDR semirings over **16Kbit BitVec matrices**"* — +and 16 Kbit Hamming is exactly what the recent PRs found deprecated, alongside +the singleton BindSpace (`E-MARKOV-TEMPORAL-STREAM-1`; `engine_bridge.rs:370` +calls that plane *"the deprecated one"*). + +So the reroute is a THREE-way convergence, not a rename: + +``` + parser.rs (Cypher AST) ← the intake vocabulary, keep + │ + ├─ TODAY ─► semiring_map ─► HDR semirings over 16Kbit BitVec ⊘ deprecated + │ + └─ TARGET ─► masked INTAKE ─► Program ─► the ONE mask-risc evaluator + (the quack shape, already proven) +``` + +The parser stays; the semiring/16Kbit leg is what the masked path replaces. That +also re-uses W-DF's own justification rather than opening a second argument — +one lowering, one evaluator, and the differential already pins them equal. + +### W-DF, restated concretely + +1. Delete nothing in the planner (there is nothing to delete) — **✓ done** for + the one inert artifact. +2. Lower the Cypher AST to `Program` via the quack-proven path, so intake is + masked from the parser onward. +3. Retire the `semiring_map` → 16 Kbit BitVec leg as those lowerings land — it + is deprecated substrate, not a design choice to preserve. +4. Migrate `datafusion_planner`'s capability (scan → filter → project → join) + crate-by-crate into planner lowerings; `join_ops` is W-JOIN and lands last + for the reasons already stated. diff --git a/crates/lance-graph-planner/Cargo.toml b/crates/lance-graph-planner/Cargo.toml index 59a1a014a..bafa3d309 100644 --- a/crates/lance-graph-planner/Cargo.toml +++ b/crates/lance-graph-planner/Cargo.toml @@ -85,7 +85,14 @@ jc = { path = "../jc" } [features] default = [] jit = [] -datafusion = [] +# ⊘ REMOVED 2026-09-16: `datafusion = []` was an INERT feature — nothing in +# this crate was `cfg`-gated on it and no manifest in the workspace enabled it, +# so turning it on was already a no-op. Its only live effect was to make every +# `grep datafusion crates/*/Cargo.toml` report this crate as a DataFusion +# consumer, which it has never been (the trap `CLAUDE.md`'s pin-rule comment +# already warns about by name). The planner's DataFusion content is ten doc +# comments crediting a pattern; the real 8,044 LOC live in +# `lance-graph/src/datafusion_planner/`. serve = ["dep:axum", "tokio/rt-multi-thread", "tokio/macros"] [[bin]] From ed187d3a2feef6d3cdc2a9067d4091f80ee5a5f9 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:27:46 +0000 Subject: [PATCH 10/22] =?UTF-8?q?plan:=20the=20upstream=20inventory=20and?= =?UTF-8?q?=20the=20seam=20=E2=80=94=20logical=5Fplan.rs=20is=20the=20boun?= =?UTF-8?q?dary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Censused the fork against upstream's tree: ~18,400 LOC inherited, of which datafusion_planner/ is 8,044 — 44% of the surface. Two divergences named: upstream's csr_index.rs is absent here (this fork went its own way with the planner's Kuzu-style adjacency), and our additions are soa_config.rs, reasoning.rs, dev_s3_env.rs. The seam is stated by the backend itself: datafusion_planner/mod.rs says it "translates graph logical plans into DataFusion logical plans" and maps "Nodes -> Table scans, Relationships -> Linking tables, Traversals -> Joins". So logical_plan.rs is the boundary, and the migration does not touch the vocabulary above it — parser, ast, semantic and logical_plan are 5,612 LOC that stay. "Traversals -> Joins" is precisely the inherited SQL join to replace, and its masked counterpart is already queued as task #10 / PR5: src_mask -> hop -> dst_mask versus the node-edge-node join. Two halves specified independently, meeting at this seam. Variable-length paths are not an obstacle — upstream unrolls *1..3 into fixed plans plus a UNION, which in mask terms is N hops OR'd, a MaskOp composition. This also answers the semiring-json reroute in the same move: the graph-side leg (semiring_map over 16Kbit BitVec, deprecated) and the SQL-side leg (datafusion_planner) are two backends under one vocabulary. One seam, two legs retired, one replacement. Migration order within W-DF: scan_ops, predicate_pushdown, expression, projection/aggregate, then join_ops last. vector_ops and lance_vector_search are explicitly out of scope — the Lance ANN path is not a DataFusion artifact and no masked equivalent is claimed for it. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index b02fdf82e..5da21e2d3 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -908,3 +908,85 @@ one lowering, one evaluator, and the differential already pins them equal. 4. Migrate `datafusion_planner`'s capability (scan → filter → project → join) crate-by-crate into planner lowerings; `join_ops` is W-JOIN and lands last for the reasons already stated. + +--- + +## The upstream inventory, and where the seam actually is + +Operator: *"everything what upstream has is here — +`github.com/lance-format/lance-graph/tree/main/crates/lance-graph/src`."* +Censused against our fork: + +| upstream file | LOC | role | +|---|---|---| +| **`datafusion_planner/`** | **8,044** | the DataFusion backend — 44 % of the whole surface | +| `query.rs` | 2,171 | entry | +| `parser.rs` | 1,932 | nom Cypher | +| `semantic.rs` | 1,719 | semantic analysis | +| `logical_plan.rs` | 1,417 | the graph logical plan | +| `lance_vector_search.rs` | 560 | Lance ANN path | +| `ast.rs` | 544 | the AST | +| `config.rs` / `case_insensitive.rs` / `sql_query.rs` | 465 / 377 / 356 | | +| `parameter_substitution.rs` / `lance_native_planner.rs` | 280 / 121 | | +| `error.rs` / `spark_dialect.rs` / `lib.rs` / `table_readers.rs` / `sql_catalog.rs` | 111 / 107 / 83 / 69 / 47 | | + +≈ **18,400 LOC inherited**, and two divergences worth naming: upstream's +`csr_index.rs` (its #160 "CSR adjacency index for native graph traversal") is +**ABSENT here** — this fork went its own way with the planner's Kuzu-style +`adjacency/` — and our three additions are `soa_config.rs`, `reasoning.rs`, +`dev_s3_env.rs`. + +### `logical_plan.rs` is the seam, stated by the backend itself + +`datafusion_planner/mod.rs` opens: + +> *"**Translates graph logical plans into DataFusion logical plans** … Phase 2: +> Plan Building — **Nodes → Table scans, Relationships → Linking tables, +> Traversals → Joins.** Variable-length paths (`*1..3`) use unrolling: generate +> fixed-length plans + UNION."* + +So the boundary is unambiguous, and the migration does not touch the vocabulary: + +``` +parser.rs → ast.rs → semantic.rs → logical_plan.rs 5,612 LOC — the VOCABULARY, KEEP + │ + ── THE SEAM ── + │ + TODAY datafusion_planner/ 8,044 LOC TARGET Program → the ONE + "Traversals → Joins" mask-risc evaluator + (+ UNION-unrolled var-length paths) traversal = src_mask + → hop → dst_mask +``` + +**"Traversals → Joins" IS the inherited SQL join the operator wants replaced**, +and its masked counterpart is already a queued deliverable: task #10 / PR5 is +exactly `src_mask → hop → dst_mask` versus the DataFusion node-edge-node join. +The two halves were specified independently and meet here. + +Variable-length paths are the interesting sub-case rather than an obstacle: +upstream UNROLLS `*1..3` into fixed-length plans plus a UNION, which in mask +terms is N hops OR'd together — a `MaskOp` composition, not a plan rewrite. + +### What W-DF actually is, now that the seam is located + +**Re-point `logical_plan.rs` at a `Program`, not at DataFusion.** Everything +above the seam stays; the 8,044-LOC backend is what the masked path replaces, +operator by operator, with quack as the worked example and +`plan_lower == quack::lower` already pinned by a differential. + +That also answers the *"semiring json → masked intake"* reroute in the same +move: the graph-side leg (`semiring_map` → HDR semirings over 16 Kbit BitVec, +deprecated substrate) and the SQL-side leg (`datafusion_planner`) are two +backends under one vocabulary. **One seam, two legs retired, one replacement.** + +**Migration order within W-DF**, cheapest and most-proven first, matching the +operators quack already ships: + +1. `scan_ops` → the plane leaf + survivor-skip gate (quack ships this) +2. `predicate_pushdown` → gating is the lowering (`under`), already the default +3. `expression` → `Pred` (a filter IS a predicate; no expression interpreter) +4. projection / aggregate → quack's Keep/Blend + two-phase GROUP BY +5. `join_ops` → **W-JOIN**, last, bounded by the two independently-derived + caveats already recorded +6. `vector_ops` / `lance_vector_search` → NOT in scope: the Lance ANN path is + not a DataFusion artifact and has no masked equivalent claimed. From 9767a32bd72294c9adca8cc9b056189b62f4ac63 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:29:54 +0000 Subject: [PATCH 11/22] =?UTF-8?q?plan:=20the=20planner=20sits=20BELOW=20co?= =?UTF-8?q?re=20=E2=80=94=20which=20route=20makes=20it=20central=20is=20a?= =?UTF-8?q?=20fork?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Measured before writing a lowering. lance-graph core depends on lance-graph-planner (optional, behind the planner feature, plus a dev-dep); the reverse edge does not exist and would be a cycle. Only quack depends on mask-risc. So the planner cannot hold a logical_plan -> Program lowering today: the plan lives in core, reaching it is a cycle, and a planner-local copy would be the parallel-IR anti-pattern the arc exists to avoid. Two facts make that position honest rather than awkward: the planner's own Cypher/GQL/Gremlin/SPARQL strategies are regex stubs — this repo's open list already says "wire planner strategies to lance-graph core (actual parser, not regex)" — and the real 1,932-LOC nom parser is in core. The planner is genuinely downstream of the vocabulary. Three routes recorded: the lowering in core (smallest, but leaves the query side there permanently), the plan vocabulary moved down into the zero-dep contract (largest, and what actually makes the planner central), or a bridge crate depending on both. The third is established precedent — lance-graph-ogar exists for exactly this "neither may import the other" shape and says so in its module doc. Left as an operator call because the routes produce materially different repos and neither reverses cheaply. Everything else is settled either way: the seam is logical_plan.rs by the backend's own description, the 5,612-LOC vocabulary above it is kept, the 8,044-LOC DataFusion backend and the semiring_map/16Kbit leg are the two legs retired, and quack is the worked shape. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 5da21e2d3..5346490b0 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -990,3 +990,62 @@ operators quack already ships: caveats already recorded 6. `vector_ops` / `lance_vector_search` → NOT in scope: the Lance ANN path is not a DataFusion artifact and has no masked equivalent claimed. + +--- + +## ⚠ THE BLOCKER FOR "planner as centre of gravity" — it sits BELOW core, not above + +Measured before writing any lowering: + +| edge | state | +|---|---| +| `lance-graph` core → `lance-graph-planner` | **EXISTS** — optional dep (`Cargo.toml:72`, behind the `planner` feature) **and** a dev-dep (`:155`) | +| `lance-graph-planner` → `lance-graph` core | **NONE** — and adding it would be a **cycle** | +| planner → `lance-graph-mask-risc` | **NONE** (only `lance-graph-quack` depends on mask-risc) | + +So the planner **cannot** hold a `logical_plan → Program` lowering as things +stand: the logical plan lives in core, and reaching it from the planner is a +cycle. Defining a planner-local copy would be the parallel-IR anti-pattern this +whole arc exists to avoid. + +Two further facts make the position honest rather than merely awkward: the +planner's own `CypherParse`/`GqlParse`/`GremlinParse`/`SparqlParse` strategies +are **regex stubs** — this repo's own open list says *"Wire planner strategies +to lance-graph core (actual parser, not regex)"* — and the real 1,932-LOC nom +parser is in core. The planner is genuinely downstream of the vocabulary today. + +### Three routes, and the repo has already solved this exact shape once + +| | route | cost | does it make the planner central? | +|---|---|---|---| +| **A** | lowering lives in **core**, beside `logical_plan.rs`; core gains `mask-risc` | smallest — no cycle, no new crate, no new IR | **No.** Planner stays centre for STRATEGY + the write path only | +| **B** | move the plan/AST vocabulary **down into `lance-graph-contract`** (zero-dep), planner then owns the lowering | largest — touches the contract's surface | **Yes**, and durably | +| **C** | a **bridge crate** depending on both | one more crate | Yes, by delegation | + +**C is established precedent here.** `lance-graph-ogar` exists for precisely +this situation and says so: *"`ogar_loco` is zero-dep by design and +`lance_graph_contract` is zero-dep by charter. **Neither may import the other** … +A vocabulary needs both, so it lives in a consumer that already depends on +both."* The same reasoning transfers verbatim. + +**B is what the operator's words actually ask for** — *"revive its status as the +centre of gravity"* — because A leaves the query side in core permanently, and C +puts the centre in a fourth crate rather than in the planner. B is also what the +zero-dep contract is FOR: it already hosts `kanban`, `soa_view`, `revision`, +`hotplug` — the shared vocabulary every tier reads. A plan vocabulary is the +same kind of thing. + +**This is a genuine fork and it is the operator's to call**, because A and B +produce materially different repos and neither is reversible cheaply. What is +NOT in doubt, whichever wins: + +- the seam is `logical_plan.rs` (the backend says so itself); +- the vocabulary above it (5,612 LOC) is kept; +- the 8,044-LOC DataFusion backend and the `semiring_map`/16 Kbit leg are the + two legs retired; +- quack is the worked shape and the migration order is scan → pushdown → + expression → projection/aggregate → join. + +**Recorded, not guessed.** The one thing already done is the inert +`datafusion = []` feature's removal (planner tests green, 435 passed) — real, +small, and independent of which route is chosen. From d5f0a89eb08d1e2708ada0fe4bdb5cff3c54033f Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:56:00 +0000 Subject: [PATCH 12/22] W0-b RUN: 46% of the Cypher corpus lowers fully, 0% is pure grace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The plan's own STOP gate, answered with a number instead of an opinion. `cypher-mask-lowering-v1.md` §7.0 says nothing is built until Wave 0 measures, and `mask_lower` exists nowhere in the tree — so the boring correct move was to measure, not to write a lowering. 62 literals extracted (40 parser.rs + 22 logical_plan.rs, 0 semantic.rs) 50 classified -> 23 Full (46.0%) / 27 Split (54.0%) / 0 Grace (0.0%) §7.0's STOP condition does not fire: "negligible" it is not. The corpus is `include_str!`-ed out of the committed sources and classified through the REAL parser + LogicalPlanner, so it cannot drift from the tests it mirrors, and every disposition cites the §3/§4 row that rules it. All 40 grace hits land in §4.6's table — 17 on strings and non-integer literals, 17 on order and position, nothing else above two — which is the check that the classifier reads the plan rather than inventing a boundary. Two findings the percentages do not contain: 1. 9 of the 10 plan-REFUSALS return a bare node variable — measured by inspecting the AST the planner refused, not by eye. `RETURN ` is §3.5 T-3, `Terminal::Keep`, "the mask itself": the cheapest thing the mask path can do. The incumbent planner refuses it, and because a refusal is excluded from the denominator, 46.0% understates the premise by exactly the shape that most favours it. 2. The extractor was wrong once and the bug moved the headline 29 points. `parser.rs:931-933` has `char('"')` three times; a scanner that does not know about char literals opens a string there and runs one quote out of phase for the rest of the file. First run: 15 of 20, 75.0%. Both runs exited 0. What caught it was ENUMERATING the exclusion buckets rather than counting them — "3 did not parse" is unfalsifiable; printing them showed raw Rust source on line one. Also records §14: the A/B/C placement fork §13 left open does not exist. `cypher-mask-lowering-v1.md` §5.2 ruled it months ago — Boolean combination CONSUMES the already-minted TERNLOG 0x86 (zero consumers today, so it is a net reduction in unconsumed surface); Pred/hop/ terminals are a lowering target that must never be minted, by the test "does a BYTE of this survive the query that produced it?"; and the trigger that would flip that is a stored artifact, whose home is already settled by `recipe_vocab.rs`'s precedent. Same failure the grep-FINDS-reading-DECIDES rule names, one level up: the dependency graph was measured correctly and a fork inferred from it, without reading the plan that had already closed it. §14 also answers the mindset question with what enforces it rather than with agreement: a `Program` has no spelling for an owner, a phase or a move, so a consumer holding the glove cannot express a kanban transition even if it wanted to; and mask-risc is the convergence point both core and the planner can depend on without a cycle, which is the p64 shape reused rather than a new one invented. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 243 +++++++++ .../lance-graph/examples/w0b_corpus_census.rs | 472 ++++++++++++++++++ 2 files changed, 715 insertions(+) create mode 100644 crates/lance-graph/examples/w0b_corpus_census.rs diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 5346490b0..2cbeb57f7 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -1049,3 +1049,246 @@ NOT in doubt, whichever wins: **Recorded, not guessed.** The one thing already done is the inert `datafusion = []` feature's removal (planner tests green, 435 passed) — real, small, and independent of which route is chosen. + +--- + +## §14 — The mindset check, and the correction I owe first + +Operator, three messages in one turn: *"make sure that you keep kanban soa +owned / the plans are the glove so that consumers dont have to care"*, *"check +if my mindset has it right or if you see a better way"*, and *"the consumers +should not care that the SoA mailboxes are smart, they still should have a +surface to be reached even if they were AGI and duckdb combined."* + +### §14.0 — The correction: §13's A/B/C fork was already ruled, three months ago + +`fe726fa` (§13) recorded an open placement fork — A (lowering in core) / B +(plan vocabulary into the zero-dep contract) / C (bridge crate) — and left it +for the operator on the grounds that *"the routes produce materially different +repos and neither reverses cheaply."* + +**That fork does not exist.** `.claude/plans/cypher-mask-lowering-v1.md` §5.2 +ruled it, in three parts, with a register I did not have: + +1. **Boolean combination CONSUMES `ogar_loco::TERNLOG = 0x86`** (`ogar-loco/src/lib.rs:607`, + arity 3, *"the call's ONE VALUE BYTE is the 8-bit truth table … the purest + `(function : value)` in the ABI"*), which has **zero consumers**. So the + Boolean half is a NET REDUCTION in unconsumed surface. **Nothing is minted.** +2. **`Pred`, the hop and the terminals are a LOWERING TARGET ONLY.** The + mechanical test, borrowed from `tesseract-rs/CLAUDE.md`'s *"types exist only + BEFORE the bake"*: **does a BYTE of this survive the query that produced it?** + No → it must never get a mint. A `Program` is built from one + `LogicalOperator`, executed once, and dropped. +3. **The trigger that would flip (2), written down before anyone hits it:** the + moment a mask program becomes a **stored artifact**, the ops must be minted as + a domain vocabulary **above `DOMAIN_FLOOR`** — and where is settled by + precedent, not choice: `lance-graph-ogar`, which git-deps `ogar-loco` and + path-deps `lance-graph-contract`, because *"neither may import the other … + a vocabulary needs both, so it lives in a consumer that already depends on + both"* (`recipe_vocab.rs:8-16`; the 34 NARS recipes already occupy + `0x90..=0xB1` there). + +So the answer to "where does the vocabulary live" is **nowhere — it is not a +vocabulary**, and the crate question I raised was the wrong question. This is +the `CLAUDE.md` § *grep FINDS, reading DECIDES* rule one level up: I measured the +dependency graph correctly and inferred a fork, without reading the plan that +had already closed it. The prior-art rule ("grep the existing ~100 files before +writing a new one") exists for exactly this. + +### §14.1 — The mindset is right, and three things already enforce it + +**"the plans are the glove so that consumers dont have to care."** Right, and it +is not aspiration — it is the shape the code already has AND has a *mechanical* +enforcement: + +| the claim | what enforces it | where | +|---|---|---| +| a plan describes, it never computes | `lance-graph-quack` has ONE dep (mask-risc) and its manifest says *"a `match` here that computed anything would be the duplicate evaluator the whole arc exists to avoid"* | `lance-graph-quack/Cargo.toml:9-12` | +| the executor borrows, the caller owns | law A1 — *"the plan describes, the executor borrows, ndarray computes, the caller owns memory"* | `mask-risc/src/lib.rs` A1 | +| a consumer cannot be coupled to it | §5.2's byte test: no byte of a `Program` is persisted, transmitted, or read by a reader that did not build it | `cypher-mask-lowering-v1.md` §5.2 Part 2 | + +The third row is the load-bearing one. *"Consumers don't have to care"* is +usually a promise about discipline; here it is a property: **you cannot couple +to something that does not persist.** + +**"keep kanban soa owned."** Already true, and fenced three ways — two by +convention and one structurally: + +1. `try_advance_phase` is a method on `MailboxSoaOwner`, in the **zero-dep + contract** (`lance-graph-contract/src/soa_view.rs:311`), returning + `Result` — the lifecycle DAG is the + owner's, not a caller's. +2. `lance-graph-supervisor/tests/probe_ignition.rs:1234-1241` asserts the + probe's own source contains **no** `.try_advance_phase(` and no + `.advance_phase(` — with a paired can-stay-silent assertion so the scan is + proven live rather than vacuously green. +3. **And the glove structurally cannot reach the ownership.** + `mask-risc::Program` is `{ ops: Vec, terminal: Terminal, + scratch_slots: u32 }`; `MaskOp` has 8 variants, `Terminal` has 8, `Operand` + is slot / plane / lane. **There is no spelling for an owner, a phase, or a + move.** A consumer holding a plan cannot express a kanban transition even if + it wanted to — the vocabulary does not contain one. + +**"a surface to be reached even if they were AGI and duckdb combined."** This is +the sharpest of the three, and it is what makes §5.2 Part 3's trigger +load-bearing rather than pedantic. A plan that does not persist lets the +substrate change arbitrarily underneath it. The moment one persists, a consumer +is coupled to a byte layout, and "AGI or duckdb" stops being free. Part 3 is +therefore not bureaucracy — it is the exact condition under which the operator's +sentence stops being true, written down in advance. + +### §14.2 — One correction to the instruction, and one better way + +**Correction — the DataFusion is not in the planner.** Measured: +`lance-graph-planner` contained exactly one `datafusion` token, `datafusion = []` +under `[features]` — a feature NAME with no body and no `cfg` reader. Removed in +`3cafd13`; 435 tests still pass. The 8,044 LOC of DataFusion lives in +`lance-graph` **core** (`datafusion_planner/`). So *"replace all the DataFusion +shit in lance-graph-planner"* is already discharged and it bought nothing, +because there was nothing there to remove. + +**And "revive the planner as the center of gravity" cannot be done as literally +stated**, because the arrow runs the other way: + +| edge | state | +|---|---| +| `lance-graph` core → `lance-graph-planner` | EXISTS (optional, `planner` feature, `Cargo.toml:72`) | +| planner → core | **NONE — would be a cycle** | + +**The better way: `mask-risc` is the convergence point, and neither side owns +the other.** `lance-graph-mask-risc` deps only `ndarray`; core deps `ndarray`; +planner deps `ndarray`. So **both can depend on mask-risc with no cycle**, and +neither has to import the other: + +```text +core: parser → AST → LogicalOperator ──mask_lower──┐ + ├──→ Program ──exec──→ ndarray::simd +planner: kanban / mailbox → what to ask ───lower──────┘ +``` + +That is not a new idea — it is the shape `p64` already plays between ndarray and +lance-graph (`CLAUDE.md`: *"p64 = convergence point (both repos meet, no circular +deps)"*). Reused, not invented. + +And it delivers the operator's stated GOAL without needing the planner to be +central in the dependency sense: + +- the glove is the **plan**, and the plan is stable because it does not persist; +- the planner keeps what it actually owns — kanban, mailbox, `batch_writer`, + `persist_sink`, `owner_adapter` — without importing a query pipeline; +- core keeps the parser it already has, and gains ONE new thing: §2's Phase 2.5. + +So: **"planner as center of gravity" is a MEANS; "the plan is the glove" is the +END.** The end is reachable; the means as literally stated is a cycle, and does +not need to be paid for. + +### §14.3 — What is actually next, and it is not code + +`cypher-mask-lowering-v1.md` §7.0 is a **STOP gate**: *"Nothing is built until +Wave 0 answers, with numbers."* And `mask_lower` exists nowhere in the tree — the +only hit is `mask-risc/src/lib.rs:20` naming it as an absence. So Wave 0 has not +run, and the boring correct move is to run it. §15 is W0-b. + +--- + +## §15 — W0-b RUN. The corpus census, measured + +`cypher-mask-lowering-v1.md` §7.0's second measurement, and half of its STOP +gate. Instrument: `crates/lance-graph/examples/w0b_corpus_census.rs` +(committed; run it, do not trust this table). Corpus: every Cypher literal in +`parser.rs`, `logical_plan.rs` and `semantic.rs`, extracted at runtime by +`include_str!` so it cannot drift from the tests it mirrors. Classification is +§3/§4's, row by row, through the REAL `parse_cypher_query` + +`LogicalPlanner::plan`. + +``` +candidate literals extracted : 62 + from parser.rs : 40 + from logical_plan.rs : 22 + from semantic.rs : 0 <- it holds no query literals at all + did not parse (negative tests): 2 + parsed but did not plan : 10 + CLASSIFIED : 50 + + Full (everything lowers) : 23 ( 46.0 %) + Split (mask prefix + DF) : 27 ( 54.0 %) + Grace (nothing lowers) : 0 ( 0.0 %) +``` + +**§7.0's STOP condition does NOT fire.** Its words were *"if the full-lowering +fraction is negligible, this plan's premise is wrong and Wave 1 does not +start."* 46.0 % full and **zero** pure-grace is not negligible. + +### §15.1 — Why a query is not Full (counted, not guessed) + +| n | plan row | the question it asks that a mask cannot answer | +|---|---|---| +| 10 | §4.2 G-3 string predicate | variable-width values | +| 7 | §4.2 P-9 non-integer literal | " | +| 6 | §4.1 G-2 `LIMIT` | which POSITION in an order | +| 6 | §4.1 G-2 `SKIP` | " | +| 5 | §4.1 G-1 `ORDER BY` | in what ORDER | +| 2 | §4.3 G-5 `UNWIND` | what VALUE, as a new relation | +| 2 | §4.4 G-7 vector distance / similarity | how CLOSE | +| 2 | §4.5 `Join` | across which ADDRESS SPACES | + +Every reason lands in §4.6's table, which is the check that the classifier is +reading the plan rather than inventing a boundary: **17 of 40 grace hits are +one axis — strings and non-integer literals**, i.e. §4.2 alone. Order and +position are the next 17. Nothing else is above 2. + +### §15.2 — The finding the percentages do not contain + +**9 of the 10 plan-refusals return a BARE NODE VARIABLE.** Measured, not read: +the example inspects the AST the planner refused and counts the returns whose +every item is `ValueExpression::Variable(_)`. + +``` +[T-3 RETURN ] MATCH (a:Person) RETURN a +[T-3 RETURN ] MATCH (a:Person) RETURN a AS b +[other] MATCH (a:Person)-[:KNOWS]->(shared:Person), (shared:Company)-… +[T-3 RETURN ] MATCH (n:Person {name: "John", age: 30}) RETURN n +[T-3 RETURN ] MATCH (n:Person) WHERE n.name CONTAINS 'Jo' … RETURN n +[T-3 RETURN ] MATCH (p:Person) WHERE p.age = $min_age RETURN p +… 3 more +``` + +`RETURN ` is §3.5 **T-3**: *"the mask itself — `Terminal::Keep`. Not a row +list. The caller reads the plane."* It is the cheapest thing the mask path can +do and it is graded `[G]`. + +So the incumbent planner **refuses** the query the mask path answers with no +work at all, and because a refusal is excluded from the denominator, **46.0 % +understates the premise by exactly the shape that most favours it.** That is +not an argument for a bigger number — those queries genuinely do not plan +today, and a census that silently counted them would be the vacuous kind. It is +a reason to read the refusal bucket, which is why the example enumerates both +exclusion buckets instead of counting them. + +### §15.3 — Three things this number is not + +1. **Conditional on OQ-1.** Every Full query scans by LABEL, and §1.4 states + the `label → classid` binding is ABSENT. The census counts the SHAPE as + lowering; that is what keeps the premise falsifiable, and it is not a claim + the route exists. **W0-a is still unrun and is the gate that matters most.** +2. **It measures the TEST corpus.** These queries exist to exercise a parser and + a planner, so the distribution is theirs, not a workload's. +3. **It says nothing about speed.** §7.0 is a correctness gate; no row above is + a performance claim. + +### §15.4 — The extractor was wrong once, and the bug moved the headline 29 points + +The first run reported **15 of 20 (75.0 %)**. The extractor did not know about +Rust char literals, and `parser.rs:931-933` contains `char('"')` three times — a +double quote inside `'…'`. The scanner opened a string there, ran one quote out +of phase for the rest of the file, and emitted raw Rust source as three +"queries" while swallowing real ones. Fixed: 62 candidates instead of 26, +50 classified instead of 20, and the headline fell from 75.0 % to **46.0 %**. + +Both numbers came from a green run that exited 0. What caught it was +**enumerating the exclusion buckets instead of counting them** — a bucket +labelled "3 did not parse" is unfalsifiable, and the same bucket printed showed +`); // Verify the AST structure let ast = result.unwrap(); …` on its first line. +The lesson is the repo's own and it recurred here: a measurement's REJECTS are +evidence about the instrument, and a census that only counts them cannot be +checked. diff --git a/crates/lance-graph/examples/w0b_corpus_census.rs b/crates/lance-graph/examples/w0b_corpus_census.rs new file mode 100644 index 000000000..7c46c8f5d --- /dev/null +++ b/crates/lance-graph/examples/w0b_corpus_census.rs @@ -0,0 +1,472 @@ +//! **W0-b — the corpus census.** `cypher-mask-lowering-v1.md` §7.0's second +//! measurement, and half of the plan's own STOP gate: +//! +//! > *"Take a real Cypher corpus (the parser's own 44 tests are the floor …). +//! > Classify every query by §3/§4: **what fraction lowers fully, what fraction +//! > splits, what fraction is pure grace?** (OQ-5.) If the full-lowering +//! > fraction is negligible, this plan's premise is wrong and Wave 1 does not +//! > start."* +//! +//! This is MEASUREMENT, not production code: it builds no mask program, mints +//! no byte, and changes no behaviour. It reports a number so that Wave 1 can be +//! started or abandoned on evidence. +//! +//! # The corpus is the committed corpus, by construction +//! +//! The query strings are not transcribed here — they are `include_str!`-ed out +//! of the three committed sources that hold them and extracted at runtime. A +//! transcribed corpus drifts silently from the tests it claims to mirror; an +//! extracted one cannot. Strings that are not queries (the planner's own error +//! messages, which also contain the word `MATCH`) self-eliminate: they fail to +//! parse and are reported in their own bucket rather than counted. +//! +//! # The classification is §3/§4's, not an opinion +//! +//! Every disposition below cites the plan row that rules it. The three outcomes +//! are §2's: +//! +//! - **Full** — every operator and every expression in the plan lowers. +//! - **Split** — at least one lowers and at least one does not (§2 property 3: +//! *"the realistic query is not 'all mask' or 'all SQL'"*). +//! - **Grace** — nothing lowers. +//! +//! Run: `cargo run -p lance-graph --example w0b_corpus_census` + +use std::collections::BTreeMap; + +use lance_graph::ast::{BooleanExpression, PropertyValue, ValueExpression}; +use lance_graph::logical_plan::{LogicalOperator, LogicalPlanner}; +use lance_graph::parser::parse_cypher_query; +use lance_graph::GraphConfig; + +/// Why a construct cannot lower. The string is the plan row that rules it, so a +/// census line can be checked against the plan without re-deriving anything. +type GraceReason = &'static str; + +/// Every committed source that carries Cypher query literals. Adding a fourth +/// is a one-line change here; the extractor never needs to know. +const SOURCES: &[(&str, &str)] = &[ + ("parser.rs", include_str!("../src/parser.rs")), + ("logical_plan.rs", include_str!("../src/logical_plan.rs")), + ("semantic.rs", include_str!("../src/semantic.rs")), +]; + +/// Pull every string literal out of Rust source: raw (`r#"…"#`) first, then +/// ordinary (`"…"`, honouring `\"`). Raw strings are taken first because an +/// ordinary-string scan would otherwise cut a raw query at its first inner +/// quote — which is exactly how a naive grep reports `MATCH (n:Person {name: ` +/// as a whole query. +/// +/// **Comments and CHAR literals are skipped, and the char case is not +/// hypothetical.** `parser.rs:931-933` contains `char('"')` three times — a +/// double quote inside a `'…'` literal. A scanner that does not know about char +/// literals opens a string there, goes one quote out of phase for the rest of +/// the file, and then reports raw Rust source as a query. The first run of this +/// census did exactly that: three "queries" came back reading +/// `); // Verify the AST structure let ast = result.unwrap(); …`. They were +/// harmless (they fail to parse, so they never reached the census) but they +/// were also proof the extractor was wrong, and a quieter version of the same +/// bug could have swallowed a real query instead of manufacturing a fake one. +fn string_literals(src: &str) -> Vec { + let b = src.as_bytes(); + let mut out = Vec::new(); + let mut i = 0usize; + while i < b.len() { + // line comment + if b[i] == b'/' && i + 1 < b.len() && b[i + 1] == b'/' { + while i < b.len() && b[i] != b'\n' { + i += 1; + } + continue; + } + // block comment + if b[i] == b'/' && i + 1 < b.len() && b[i + 1] == b'*' { + i += 2; + while i + 1 < b.len() && !(b[i] == b'*' && b[i + 1] == b'/') { + i += 1; + } + i = (i + 2).min(b.len()); + continue; + } + // char literal — but NOT a lifetime (`&'a str`). A `'` opens a char + // literal only when it is escaped (`'\''`) or closes two bytes later + // (`'x'`); `'a ` is a lifetime and must be walked past as ordinary text. + if b[i] == b'\'' && i + 1 < b.len() { + if b[i + 1] == b'\\' { + let mut j = i + 2; + while j < b.len() && b[j] != b'\'' { + j += 1; + } + i = j + 1; + continue; + } + if i + 2 < b.len() && b[i + 2] == b'\'' { + i += 3; + continue; + } + } + // raw string: r, then one or more '#', then '"' + if b[i] == b'r' && i + 1 < b.len() { + let mut h = i + 1; + while h < b.len() && b[h] == b'#' { + h += 1; + } + if h > i + 1 && h < b.len() && b[h] == b'"' { + let hashes = h - (i + 1); + let close = format!("\"{}", "#".repeat(hashes)); + if let Some(end) = src[h + 1..].find(&close) { + out.push(src[h + 1..h + 1 + end].to_string()); + i = h + 1 + end + close.len(); + continue; + } + } + } + if b[i] == b'"' { + let mut j = i + 1; + let mut lit = String::new(); + while j < b.len() { + if b[j] == b'\\' && j + 1 < b.len() { + // keep the escaped character; a `\"` must not end the literal + lit.push(b[j + 1] as char); + j += 2; + continue; + } + if b[j] == b'"' { + break; + } + lit.push(b[j] as char); + j += 1; + } + out.push(lit); + i = j + 1; + continue; + } + i += 1; + } + out +} + +/// A literal is a census candidate if it reads like a query rather than a +/// message. The parser is the real filter — this only avoids feeding it every +/// string in 66 KB of source. +fn looks_like_a_query(s: &str) -> bool { + let u = s.to_uppercase(); + (u.contains("MATCH ") || u.starts_with("UNWIND ")) && u.contains("RETURN") +} + +/// §3.5 / §4.1 — a projection's disposition. +fn classify_value(v: &ValueExpression, grace: &mut Vec) { + match v { + // T-3 `RETURN n` (the mask itself) · T-4 `RETURN n.prop` (mask + lane). + ValueExpression::Variable(_) | ValueExpression::Property(_) => {} + ValueExpression::Literal(PropertyValue::Integer(_)) + | ValueExpression::Literal(PropertyValue::Boolean(_)) + | ValueExpression::Parameter(_) => {} + // P-9 — a float or string constant is not a mask predicate's operand. + ValueExpression::Literal(_) => grace.push("§4.2 P-9 non-integer literal"), + ValueExpression::AggregateFunction { + name, + args, + distinct, + } => { + // T-12: DISTINCT over VALUES needs value identity a mask has not. + if *distinct { + grace.push("§4.1 T-12 count(DISTINCT …)"); + } + match name.to_lowercase().as_str() { + // T-1/T-2 count · T-5 sum · T-6 min/max · T-7 avg (`[H]`, OQ-7). + "count" | "sum" | "min" | "max" | "avg" => {} + // T-12 — collect is multiplicity, which a population has not. + "collect" => grace.push("§4.1 T-12 collect()"), + _ => grace.push("§4.2 G-4 unknown aggregate"), + } + for a in args { + classify_value(a, grace); + } + } + // G-4 — every scalar string function. + ValueExpression::ScalarFunction { .. } => grace.push("§4.2 G-4 scalar function"), + // No §3.5 terminal computes a value expression; arithmetic is a value, + // not a population. + ValueExpression::Arithmetic { .. } => grace.push("§4.2 arithmetic projection"), + // G-7 — §4.4, and the plan calls this one *the interesting one*. + ValueExpression::VectorDistance { .. } | ValueExpression::VectorSimilarity { .. } => { + grace.push("§4.4 G-7 vector distance/similarity") + } + ValueExpression::VectorLiteral(_) => grace.push("§4.4 G-7 vector literal"), + } +} + +/// §3.2 / §3.3 / §4.2 — a `WHERE` predicate's disposition. +fn classify_bool(e: &BooleanExpression, grace: &mut Vec) { + match e { + // P-1..P-5 — compare a lane to a constant. + BooleanExpression::Comparison { left, right, .. } => { + classify_value(left, grace); + classify_value(right, grace); + } + // §3.3 — three leaves are one TERNLOG immediate. + BooleanExpression::And(a, b) | BooleanExpression::Or(a, b) => { + classify_bool(a, grace); + classify_bool(b, grace); + } + BooleanExpression::Not(a) => classify_bool(a, grace), + // T-9 `mask_any`; and absence is a zero-fallback, never a validity bit. + BooleanExpression::Exists(_) => {} + BooleanExpression::IsNull(_) | BooleanExpression::IsNotNull(_) => {} + // P-7 — N compare→mask sweeps, `mask_or`-accumulated. + BooleanExpression::In { expression, list } => { + classify_value(expression, grace); + for v in list { + classify_value(v, grace); + } + } + // G-3 — §4.2, variable-width values. + BooleanExpression::Like { .. } + | BooleanExpression::ILike { .. } + | BooleanExpression::Contains { .. } + | BooleanExpression::StartsWith { .. } + | BooleanExpression::EndsWith { .. } => grace.push("§4.2 G-3 string predicate"), + } +} + +/// Walk the plan. `lowered` counts nodes that DO lower, so the Full / Split / +/// Grace verdict is a comparison of two counts rather than a guess. +fn classify_plan(op: &LogicalOperator, grace: &mut Vec, lowered: &mut usize) { + match op { + // §3.1 — N-2's `label → classid` binding is stated ABSENT by §1.4; the + // census counts the SHAPE as lowering and reports OQ-1 separately, + // because conflating "no route yet" with "cannot lower" would make the + // premise unfalsifiable. + LogicalOperator::ScanByLabel { .. } => *lowered += 1, + LogicalOperator::Filter { input, predicate } => { + *lowered += 1; + classify_bool(predicate, grace); + classify_plan(input, grace, lowered); + } + // §3.4 R-1 — the hop (Wave 2). + LogicalOperator::Expand { input, .. } => { + *lowered += 1; + classify_plan(input, grace, lowered); + } + // §3.4 R-7/R-8 — the fixpoint (Wave 3). + LogicalOperator::VariableLengthExpand { input, .. } => { + *lowered += 1; + classify_plan(input, grace, lowered); + } + LogicalOperator::Project { input, projections } => { + *lowered += 1; + for p in projections { + classify_value(&p.expression, grace); + } + classify_plan(input, grace, lowered); + } + // T-11 — `DISTINCT` over a node variable is the identity and lowers to + // nothing at all; over a value (T-12) it is grace. The distinction is + // made by what the projection under it holds, so it is decided there: + // this node itself is free either way. + LogicalOperator::Distinct { input } => classify_plan(input, grace, lowered), + // §4.1 — order and position. + LogicalOperator::Sort { input, .. } => { + grace.push("§4.1 G-1 ORDER BY"); + classify_plan(input, grace, lowered); + } + LogicalOperator::Offset { input, .. } => { + grace.push("§4.1 G-2 SKIP"); + classify_plan(input, grace, lowered); + } + LogicalOperator::Limit { input, .. } => { + grace.push("§4.1 G-2 LIMIT"); + classify_plan(input, grace, lowered); + } + // §4.3 — a new relation, not a population. + LogicalOperator::Unwind { input, .. } => { + grace.push("§4.3 G-5 UNWIND"); + if let Some(i) = input { + classify_plan(i, grace, lowered); + } + } + // §4.5 — cross-address-space. + LogicalOperator::Join { left, right, .. } => { + grace.push("§4.5 Join"); + classify_plan(left, grace, lowered); + classify_plan(right, grace, lowered); + } + } +} + +fn main() { + let config = GraphConfig::default(); + + let mut seen: BTreeMap = BTreeMap::new(); + for (file, src) in SOURCES { + for lit in string_literals(src) { + if looks_like_a_query(&lit) { + seen.entry(lit).or_insert(file); + } + } + } + + let mut parse_fail: Vec<&String> = Vec::new(); + let mut plan_fail: Vec<(&String, bool)> = Vec::new(); + let mut full: Vec<&String> = Vec::new(); + let mut split: Vec<(&String, Vec)> = Vec::new(); + let mut pure_grace: Vec<(&String, Vec)> = Vec::new(); + let mut reason_hist: BTreeMap = BTreeMap::new(); + + // Provenance per source, so a reader can see WHICH committed file supplied + // the corpus rather than taking "62 literals" on trust. + let mut per_source: BTreeMap<&'static str, usize> = BTreeMap::new(); + for file in seen.values() { + *per_source.entry(file).or_insert(0) += 1; + } + + for q in seen.keys() { + let Ok(ast) = parse_cypher_query(q) else { + parse_fail.push(q); + continue; + }; + let mut planner = LogicalPlanner::new(&config); + let Ok(plan) = planner.plan(&ast) else { + // A refusal is classified by the AST it refused, not by eye: does + // every RETURN item name a bare node variable? That shape is §3.5 + // T-3 — `Terminal::Keep`, "the mask itself" — the single most + // mask-native return there is. + let bare_node = !ast.return_clause.items.is_empty() + && ast + .return_clause + .items + .iter() + .all(|it| matches!(it.expression, ValueExpression::Variable(_))); + plan_fail.push((q, bare_node)); + continue; + }; + let mut grace = Vec::new(); + let mut lowered = 0usize; + classify_plan(&plan, &mut grace, &mut lowered); + for r in &grace { + *reason_hist.entry(r).or_insert(0) += 1; + } + if grace.is_empty() { + full.push(q); + } else if lowered > 0 { + split.push((q, grace)); + } else { + pure_grace.push((q, grace)); + } + } + + let classified = full.len() + split.len() + pure_grace.len(); + println!("W0-b — CORPUS CENSUS (cypher-mask-lowering-v1 §7.0)"); + println!("=================================================\n"); + println!("candidate literals extracted : {}", seen.len()); + for (file, n) in &per_source { + println!(" from {file:<16} : {n}"); + } + println!(" did not parse (not queries): {}", parse_fail.len()); + println!(" parsed but did not plan : {}", plan_fail.len()); + println!(" CLASSIFIED : {classified}\n"); + + let pct = |n: usize| { + if classified == 0 { + 0.0 + } else { + 100.0 * n as f64 / classified as f64 + } + }; + println!( + " Full (everything lowers) : {:>3} ({:5.1} %)", + full.len(), + pct(full.len()) + ); + println!( + " Split (mask prefix + DF) : {:>3} ({:5.1} %)", + split.len(), + pct(split.len()) + ); + println!( + " Grace (nothing lowers) : {:>3} ({:5.1} %)", + pure_grace.len(), + pct(pure_grace.len()) + ); + + println!("\nGRACE REASONS (why a query is not Full) — count, plan row"); + println!("---------------------------------------------------------"); + let mut rows: Vec<_> = reason_hist.iter().collect(); + rows.sort_by(|a, b| b.1.cmp(a.1).then(a.0.cmp(b.0))); + for (reason, n) in rows { + println!(" {n:>3} {reason}"); + } + + println!("\nFULL-LOWERING QUERIES (the premise, enumerated)"); + println!("----------------------------------------------"); + for q in &full { + println!(" {}", q.replace('\n', " ")); + } + + // Both exclusion buckets are ENUMERATED, not merely counted. A census that + // reports only "3 excluded" cannot be checked: the reader cannot tell a + // planner's error message from a real query the planner refused, and those + // two have opposite meanings for the premise. + println!("\nEXCLUDED — did not parse (the parser's own NEGATIVE tests live here)"); + println!("----------------------------------------------------------------------"); + for q in &parse_fail { + println!(" {}", q.replace('\n', " ")); + } + + // The refusals are the most informative bucket in this census, and the + // reason is counted rather than asserted: the incumbent planner REFUSES + // `RETURN ` — §3.5 T-3, `Terminal::Keep`, the query the mask + // path answers with no work at all. Those queries are excluded from the + // percentages above, so the Full fraction UNDERSTATES the premise by + // exactly the shape that most favours it. + let bare_node_refusals = plan_fail.iter().filter(|(_, b)| *b).count(); + println!("\nEXCLUDED — parsed but did not plan (a REFUSAL, read each one)"); + println!("-------------------------------------------------------------"); + for (q, bare) in &plan_fail { + let tag = if *bare { + "[T-3 RETURN ]" + } else { + "[other]" + }; + println!(" {tag} {}", q.replace('\n', " ")); + } + println!( + "\n {} of {} refusals return a BARE NODE VARIABLE (§3.5 T-3).", + bare_node_refusals, + plan_fail.len() + ); + + println!("\nVERDICT"); + println!("-------"); + if classified == 0 { + println!(" NO CORPUS — the extractor found nothing. Fix the extractor,"); + println!(" do not read this as a finding about the plan."); + } else if full.is_empty() { + println!(" STOP. No query lowers fully. §7.0's STOP condition fires:"); + println!(" the premise is wrong as stated and Wave 1 does not start."); + } else { + println!( + " {} of {} queries ({:.1} %) lower FULLY; {} more ({:.1} %) lower", + full.len(), + classified, + pct(full.len()), + split.len(), + pct(split.len()) + ); + println!(" as a mask PREFIX under a DataFusion residue (§2's `Split`)."); + println!(); + println!(" THREE THINGS THIS NUMBER IS NOT:"); + println!(" 1. It is CONDITIONAL on OQ-1. Every Full query below scans"); + println!(" by LABEL, and §1.4 states the `label -> classid` binding"); + println!(" is ABSENT. Counting the SHAPE as lowering is what keeps"); + println!(" the premise falsifiable; it is not a claim the route exists."); + println!(" 2. It measures the TEST corpus, not a workload. These queries"); + println!(" were written to exercise the parser and the planner, so the"); + println!(" shape distribution is theirs, not a user's."); + println!(" 3. It says nothing about SPEED. §7.0 is a correctness gate;"); + println!(" no row of this output is a performance claim."); + println!(" Whether that is 'negligible' is §7.0's word and the"); + println!(" operator's call; the number is the number."); + } +} From 399b4eff7db79b803104f4163e80c7e0153a3168 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 11:57:49 +0000 Subject: [PATCH 13/22] W0-a/OQ-1 answered by reading: LabelDTO is the binding, and it has zero consumers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §7.0's hardest STOP condition — "no label->classid route AND no cheap one can be minted" — does not fire, and the reason is a type that already ships. `lance-graph-contract::ogar_codebook::LabelDTO` is `{ label, id, canonical }`, doc-commented as "identity comparison uses `id`; AST/planner emission uses `canonical`", with `id` documented as "the classid low u16". `LabelDTO::from_canonical` resolves it. `mailbox_scan::match_nodes_by_class` already takes exactly that u16 at the far end. Consumers across the workspace: ZERO — the only hit outside its own module is its re-export in lib.rs. Same shape as TERNLOG 0x86: a minted, exported, unconsumed surface the lowering would CONSUME rather than duplicate. Two of this plan's "gaps" are now the same kind of thing — built ends that do not meet. What is missing is a FIELD, not a mechanism: `NodeMapping` is `{ label, id_field, property_fields, filter_conditions }` with nowhere to carry a canonical concept. One field wires a binding that already exists; no new codebook, no vocabulary, no byte minted, so §14.0 Part 2's test is untouched. The honest caveat, and it changes how §15's 46% reads: the corpus's labels are NOT in the codebook. Measured against its 123 entries — `Person` no, `Company` no, `Thing` no, `Node` no (osm_node and mars_node_template are different concepts). The codebook carries real domain concepts (project 0x0101, billing_party 0x0204, osm_node 0x0F01); the Cypher test labels are synthetic and were never minted, which is what a parser test corpus is. So 46% is a measurement of SHAPE, exactly as §15's own caveat 1 says, and a production number needs a real bake — the rest of W0-a, still unrun. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 2cbeb57f7..cf16035ac 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -1292,3 +1292,88 @@ labelled "3 did not parse" is unfalsifiable, and the same bucket printed showed The lesson is the repo's own and it recurred here: a measurement's REJECTS are evidence about the instrument, and a census that only counts them cannot be checked. + +--- + +## §16 — W0-a / OQ-1 ANSWERED BY READING: the binding exists, unconsumed, and the gap is one config field + +§7.0's STOP condition is sharper on W0-a than on W0-b: *"If W0-a says there is +no `label → classid` route AND no cheap one can be minted, §3.1 is unbuildable +and the plan is re-scoped … or shelved."* §1.4 finding (3) states the route +*"does not exist"* and names `canonical_concept_id` as a resolver. + +Read rather than grepped, and the picture is one piece larger than §1.4 records. + +### §16.1 — The binding is already minted, already exported, and has zero consumers + +`lance-graph-contract/src/ogar_codebook.rs` carries **`LabelDTO`**, and its own +doc comment is the specification of exactly this route: + +> *"A curator-agnostic label binding: a consumer-local `label`, its OGAR codebook +> `id` (binary identity), and the portable `canonical` symbol. … Identity +> comparison uses `id`; AST/planner emission uses `canonical`; presentation uses +> `label`."* — with `id` documented as *"the OGAR codebook binary identity (the +> classid low u16)."* + +`LabelDTO::from_canonical(concept) -> Option` resolves through +`canonical_concept_id`; curator-shaped aliases (`"Issue"` → `"project_work_item"`) +normalize through OGAR `ogar_vocab::canonical_concept` first, which stays out of +the zero-dep contract by design. + +And the far end already takes exactly that type: +`mailbox_scan::match_nodes_by_class(view, class_id: u16)`. + +**Consumers of `LabelDTO` across the workspace: ZERO.** The only hit outside its +own module is its re-export at `lance-graph-contract/src/lib.rs:234`. That is the +same shape as `TERNLOG = 0x86` (§14.0 Part 1): a minted, exported, unconsumed +surface that the lowering would *consume* rather than duplicate. Two of this +plan's supposed gaps are the same kind of thing — **built ends that do not +meet** — which is the pattern §13 already recorded as the session's recurring +finding. + +### §16.2 — What is actually missing: a field, not a mechanism + +`GraphConfig`'s `NodeMapping` (`crates/lance-graph/src/config.rs:60-71`) is +`{ label, id_field, property_fields, filter_conditions }`. There is nowhere to +put a canonical concept or an id. So the missing hop is: + +```text +Cypher label "Person" + ? <- THE GAP: NodeMapping has no field for this + ↓ +canonical concept ──canonical_concept_id──▶ u16 ──▶ match_nodes_by_class / a class-equality mask + ↑ ↑ + LabelDTO.canonical LabelDTO.id (both already exist, both unconsumed) +``` + +**§7.0's STOP does not fire.** A cheap mint exists: one field on `NodeMapping` +carrying the canonical concept, wiring a binding that already ships. No new +codebook, no new vocabulary, no byte minted — §14.0 Part 2's test is untouched, +because none of this persists a lowering. + +### §16.3 — The honest caveat, and it changes how §15's 46 % should be read + +**The corpus's labels are not in the codebook.** Measured against the 123 entries +of `ogar_codebook::CODEBOOK`: + +| label | in codebook? | +|---|---| +| `Person` | **no** | +| `Company` | **no** | +| `Thing` | **no** | +| `Node` | no (`osm_node`, `mars_node_template`, `osm_way_node`, `osm_street_node` are different concepts) | + +The codebook carries real domain concepts — `project` `0x0101`, +`project_work_item` `0x0102`, `billing_party` `0x0204`, `osm_node` `0x0F01`. The +Cypher test corpus's labels are synthetic and were never minted, which is +unsurprising: they exist to exercise a parser. + +So §15's caveat 1 is not a formality. The 46 % measures the **shape** of the +corpus, and a production number would have to be measured over queries whose +labels are minted concepts. That is a different census, and it needs a real bake +— which is the rest of W0-a (OQ-2 mint order, OQ-3 column widths, OQ-6 +transpose lanes), still unrun. + +**What §16 does settle:** the one gate that could have shelved the plan does not. +The route is buildable, it is buildable cheaply, and building it consumes +existing surface instead of adding any. From a8edc4bbbb19f31d5fcc0ed5f204301beb21ffaf Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 12:49:42 +0000 Subject: [PATCH 14/22] citation-decay: the anchor was a bare `:710`, not a symbol MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI red on #1240, one new decay, reproduced locally byte-for-byte before touching anything: DECAYED .claude/plans/lance-graph-as-the-modelgraph-v1.md:324 -> crates/lance-graph/src/graph/cycle_sink.rs:675 anchor=symbol:":710" (anchor absent within +-3 lines) The citation read ``…cycle_sink.rs:675`` followed by a bare `` `:710` `` as shorthand for the second call site. `extract_anchor` takes the NEAREST backticked token as the thing to go looking for at the cited line, so it adopted `:710` — which is not a symbol and appears nowhere near line 675. The gate's own message says the fix is not a corrected number, and it is right: both sites are real (`Dataset::write` is literally on 675 and on 710). What was wrong is the SHAPE. Each citation now carries `Dataset::write` adjacent to it, which is the string actually present on both cited lines, and names its enclosing function (`LanceCycleWriter::bootstrap` / `::raw_append`) for a reader. Generalizable, and recorded inline as a ⊘ note rather than silently fixed: a shorthand second reference is cheap to write and costs a real gate failure, because the anchor is chosen by proximity, not by intent. Gates, all four run locally against the PR base: citation-decay --since 31273cb -> 0 new decays, exit 0 (was 1, exit 1) supersession index -> regenerates byte-identical (current) added-plans-have-dids -> unchanged; no plan file added or removed no-shrink -> +16/-3 on one file, nothing shrank Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index cf16035ac..9ff5809a3 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -321,9 +321,22 @@ accordingly to batchwriter."* Followed. The arc, and what it left: | **#912** | **Phase A: artifact-backed commits + THE SOLE OWNED LANCE WRITER** (supersedes #911's contract) | | #949 | D-WXS-2a half A — row-major vs Morton KILL fires, no code change | -**So `Dataset::write` is real and in-tree**: `crates/lance-graph/src/graph/cycle_sink.rs:675` -and `:710`, under a module doc saying the I/O *"is INTERNAL to this one writer."* -The plan's G-C above — *"no `Dataset::write`"* — was **wrong when written.** +**So `Dataset::write` is real and in-tree** — two call sites, under a module doc +saying the I/O *"is INTERNAL to this one writer"*: +`Dataset::write` at `crates/lance-graph/src/graph/cycle_sink.rs:675` (the Create +inside `LanceCycleWriter::bootstrap`) and `Dataset::write` at +`crates/lance-graph/src/graph/cycle_sink.rs:710` (the Create-or-Append inside +`LanceCycleWriter::raw_append`). The plan's G-C above — *"no `Dataset::write`"* — +was **wrong when written.** + +> ⊘ The first spelling of this citation was `…rs:675` followed by a bare +> `` `:710` ``, and the citation-decay gate correctly failed it: its anchor is the +> NEAREST backticked token, so `:710` — which is not a symbol and appears nowhere +> near line 675 — became the thing it went looking for. The fix the gate asks for +> is not a corrected number but an anchor that is an ADDRESS, so each citation now +> carries `Dataset::write` adjacent to it, and that string is literally on both +> cited lines. A shorthand second reference is cheap to write and costs a real +> gate failure. ### `batch_writer.rs`'s own status note is ALSO stale From a99eed16e845da7173fe07136639bc0664c5956d Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 12:59:55 +0000 Subject: [PATCH 15/22] =?UTF-8?q?census:=20the=20corpus=20was=20a=20subset?= =?UTF-8?q?=20=E2=80=94=2046.0%=20over=2050=20was=20really=2037.3%=20over?= =?UTF-8?q?=20303?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Four P1s from codex on #1240. All four verified by reading before being fixed; three of them moved the number. 1. THE CORPUS WAS A HAND-LISTED SUBSET. The census read three files. A walk of the same tree with the same extractor finds Cypher queries in 27 files — the whole of `crates/lance-graph/tests/`, `src/query.rs`, the planner's strategy modules, the Python bindings. 50 classified -> 303. The defect before the defect: those three files were chosen after a grep for `"…MATCH …"` reported zero hits in the DataFusion builder modules. That grep cannot see a raw string or a literal spanning lines — the same blind spot that made the extractor itself wrong. I used grep as a verdict on the same day I added the rule to CLAUDE.md saying not to. So the fix is structural, not a longer list: the corpus is now a WALK from CARGO_MANIFEST_DIR. A file added to the tree enters the corpus with no edit here, and the run prints how many files it read and which carried a query — scope is now part of the output instead of being invisible. 2. INLINE PATTERN PROPERTIES WERE IGNORED. `MATCH (p:Person {name: "Alice"})` files its predicate in `ScanByLabel.properties` / `Expand.properties` / `.target_properties`, and all four maps went unread, so a string equality that is P-9 grace was counted as a lowered scan. New row: 53 hits. 3. T-12 NEVER FIRED. `DISTINCT n.p` is grace, `DISTINCT n` is free. The `Distinct` arm recursed and left the call to `classify_value`, which accepts a bare `Property` unconditionally — correctly, since T-4 (`RETURN n.prop`) is `[G]`. So nothing ever made the distinction and the histogram had no T-12 row at all, which is what codex noticed. What separates the two is the projection UNDER a `Distinct`, so the `Distinct` node is the only place that can tell them apart. New rows: 37 hits. 4. run.sh SUPPRESSED HARVESTER FAILURES. `|| true` plus an OUT that defaults to the already-committed TSVs meant a failed harvest left the old files in place, `wc` counted them, and the run exited 0 — while provenance.txt had already been rewritten with the CURRENT commits. Old measurements attributed to a new checkout, reported clean. Now the tag dir is removed before each header and a failure exits 4. Corrected measurement: 342 candidates (1451 rust files walked, 27 carrying a query) 303 classified -> 113 Full (37.3%) / 190 Split (62.7%) / 0 Grace (0.0%) STOP still does not fire. And the ordering of the boundary changed, not just the size: order-and-position is now the largest axis at 131, strings and non-integer literals second at 124 — where the three-file census had them tied at 17. A subset misranks a boundary as well as mis-measuring it. The T-3 finding strengthens: 21 of 22 plan-refusals return a bare node variable (was 9 of 10). The planner refuses the query the mask path answers with no work, and refusals sit outside the denominator. Gates: citation-decay --since 31273cb -> 0 new decays; supersession index byte-identical; fmt + clippy clean. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .claude/harvest/duckdb-headers/run.sh | 17 +- .../plans/lance-graph-as-the-modelgraph-v1.md | 161 +++++++++------- .../lance-graph/examples/w0b_corpus_census.rs | 182 +++++++++++++++--- 3 files changed, 266 insertions(+), 94 deletions(-) diff --git a/.claude/harvest/duckdb-headers/run.sh b/.claude/harvest/duckdb-headers/run.sh index c2d1f24d4..5e2b85df6 100755 --- a/.claude/harvest/duckdb-headers/run.sh +++ b/.claude/harvest/duckdb-headers/run.sh @@ -64,8 +64,23 @@ while read -r rel; do tag="${rel//\//_}" hdr="$DUCKDB_SRC/src/include/duckdb/$rel.hpp" [ -f "$hdr" ] || { echo "MISSING $hdr" >&2; exit 3; } + # The previous output for this header is REMOVED before the harvest, and a + # harvester failure ABORTS the run. + # + # ⊘ This line used to end `|| true`. Codex flagged it on lance-graph #1240 + # and was right: `OUT` defaults to the directory holding the ALREADY + # COMMITTED TSVs, so a failed harvest left the old files in place, the `wc` + # below counted them, and the run exited 0 — while `provenance.txt` had + # already been rewritten with the CURRENT DuckDB and ruff commits. The + # result is the exact failure this script exists to prevent: old + # measurements attributed to a new checkout, reported as a clean run. A + # harvest that cannot run is not a harvest that found nothing. + rm -rf "$OUT/$tag" ORE_FILE="$hdr" ORE_ARGS_FILE="$ARGS" ORE_OUT="$OUT/$tag" \ - LIBCLANG_PATH="$LIBCLANG_PATH" "$HARVESTER" >/dev/null 2>&1 || true + LIBCLANG_PATH="$LIBCLANG_PATH" "$HARVESTER" >/dev/null 2>&1 || { + echo "HARVEST FAILED for $rel -- rerun without the output redirect to see clang's error" >&2 + exit 4 + } # NEITHER TSV carries a header row -- line 1 is already data, so the raw # line count IS the count. An earlier version of this script subtracted a # header row that does not exist and reported 115/1612 against the README's diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 9ff5809a3..86c530012 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -1204,107 +1204,130 @@ run, and the boring correct move is to run it. §15 is W0-b. --- -## §15 — W0-b RUN. The corpus census, measured +## §15 — W0-b RUN. The corpus census, measured — and CORRECTED after review `cypher-mask-lowering-v1.md` §7.0's second measurement, and half of its STOP gate. Instrument: `crates/lance-graph/examples/w0b_corpus_census.rs` -(committed; run it, do not trust this table). Corpus: every Cypher literal in -`parser.rs`, `logical_plan.rs` and `semantic.rs`, extracted at runtime by -`include_str!` so it cannot drift from the tests it mirrors. Classification is -§3/§4's, row by row, through the REAL `parse_cypher_query` + -`LogicalPlanner::plan`. +(committed; run it, do not trust this table). + +**The corpus is every `.rs` file under the workspace's `crates/`, walked at run +time** — not a hand-listed set. Classification is §3/§4's, row by row, through +the REAL `parse_cypher_query` + `LogicalPlanner::plan`. ``` -candidate literals extracted : 62 - from parser.rs : 40 - from logical_plan.rs : 22 - from semantic.rs : 0 <- it holds no query literals at all - did not parse (negative tests): 2 - parsed but did not plan : 10 - CLASSIFIED : 50 - - Full (everything lowers) : 23 ( 46.0 %) - Split (mask prefix + DF) : 27 ( 54.0 %) +candidate literals extracted : 342 + rust files walked : 1451 + files carrying a query : 27 + did not parse : 17 + parsed but did not plan : 22 + CLASSIFIED : 303 + + Full (everything lowers) : 113 ( 37.3 %) + Split (mask prefix + DF) : 190 ( 62.7 %) Grace (nothing lowers) : 0 ( 0.0 %) ``` -**§7.0's STOP condition does NOT fire.** Its words were *"if the full-lowering +**§7.0's STOP condition does not fire.** Its words were *"if the full-lowering fraction is negligible, this plan's premise is wrong and Wave 1 does not -start."* 46.0 % full and **zero** pure-grace is not negligible. +start."* 37.3 % full and **zero** pure-grace is not negligible. + +### §15.0 — ⊘ THE FIRST RUN OF THIS CENSUS WAS WRONG, AND CODEX CAUGHT IT + +The version that landed in this plan first reported **46.0 % over 50 classified +queries**, from three hand-listed files. Codex filed four P1s on lance-graph +#1240. All four were correct, and three of them moved the number: + +| finding | what it was | effect | +|---|---|---| +| **the corpus was a subset** | the census read `parser.rs`, `logical_plan.rs`, `semantic.rs`. A walk of the same tree with the same extractor finds queries in **27 files** — the whole of `crates/lance-graph/tests/`, `src/query.rs`, the planner's strategy modules, the Python bindings | 50 classified → **303** | +| **inline pattern properties were ignored** | `MATCH (p:Person {name: "Alice"})` files its predicate in `ScanByLabel.properties` / `Expand.properties` / `.target_properties`, and all four maps went unread. A string equality there is P-9 grace | new row, **53** hits | +| **T-12 never fired** | `DISTINCT n.p` is grace, `DISTINCT n` is free. The `Distinct` arm recursed and left it to `classify_value`, which accepts a bare `Property` unconditionally (T-4 is legitimately `[G]`) — so the distinction was never made and the histogram had no T-12 row at all | new rows, **37** hits | + +**The defect before the defect.** The three files were chosen after a `grep` +for `"…MATCH …"` reported zero hits in the DataFusion builder modules. That +grep cannot see a raw string or a literal spanning lines — the same blind spot +that made the extractor itself wrong (§15.4). **I used grep as a verdict on the +same day I added the rule to `CLAUDE.md` saying not to.** The fix is therefore +structural rather than a longer list: the corpus is now a WALK, so a file added +to the tree enters it with no edit, and the list cannot go stale the way the +last one did. ### §15.1 — Why a query is not Full (counted, not guessed) | n | plan row | the question it asks that a mask cannot answer | |---|---|---| -| 10 | §4.2 G-3 string predicate | variable-width values | -| 7 | §4.2 P-9 non-integer literal | " | -| 6 | §4.1 G-2 `LIMIT` | which POSITION in an order | -| 6 | §4.1 G-2 `SKIP` | " | -| 5 | §4.1 G-1 `ORDER BY` | in what ORDER | -| 2 | §4.3 G-5 `UNWIND` | what VALUE, as a new relation | -| 2 | §4.4 G-7 vector distance / similarity | how CLOSE | -| 2 | §4.5 `Join` | across which ADDRESS SPACES | +| 93 | §4.1 G-1 `ORDER BY` | in what ORDER | +| 53 | §4.2 P-9 inline string property | variable-width values | +| 45 | §4.2 P-9 non-integer literal | " | +| 29 | §4.1 T-12 `DISTINCT` over a value | how many TIMES | +| 28 | §4.1 G-2 `LIMIT` | which POSITION in an order | +| 28 | §4.5 `Join` | across which ADDRESS SPACES | +| 24 | §4.2 G-3 string predicate | variable-width values | +| 23 | §4.4 G-7 vector distance / similarity | how CLOSE | +| 10 | §4.1 G-2 `SKIP` | which POSITION | +| 6 | §4.3 G-5 `UNWIND` | what VALUE, as a new relation | +| 5 | §4.1 T-12 `count(DISTINCT …)` | how many TIMES | +| 3 | §4.1 T-12 `collect()` | " | +| 2 | §4.2 G-4 scalar function | variable-width values | Every reason lands in §4.6's table, which is the check that the classifier is -reading the plan rather than inventing a boundary: **17 of 40 grace hits are -one axis — strings and non-integer literals**, i.e. §4.2 alone. Order and -position are the next 17. Nothing else is above 2. +reading the plan rather than inventing a boundary. **Order and position are the +largest axis (131), strings and non-integer literals the second (124)** — +inverting the three-file census, where the two were tied at 17 each. A subset +misranks the boundary as well as mis-measuring it. ### §15.2 — The finding the percentages do not contain -**9 of the 10 plan-refusals return a BARE NODE VARIABLE.** Measured, not read: +**21 of the 22 plan-refusals return a BARE NODE VARIABLE** — measured, not read: the example inspects the AST the planner refused and counts the returns whose -every item is `ValueExpression::Variable(_)`. - -``` -[T-3 RETURN ] MATCH (a:Person) RETURN a -[T-3 RETURN ] MATCH (a:Person) RETURN a AS b -[other] MATCH (a:Person)-[:KNOWS]->(shared:Person), (shared:Company)-… -[T-3 RETURN ] MATCH (n:Person {name: "John", age: 30}) RETURN n -[T-3 RETURN ] MATCH (n:Person) WHERE n.name CONTAINS 'Jo' … RETURN n -[T-3 RETURN ] MATCH (p:Person) WHERE p.age = $min_age RETURN p -… 3 more -``` +every item is `ValueExpression::Variable(_)`. (The three-file census said 9 of +10; the wider corpus strengthens it.) `RETURN ` is §3.5 **T-3**: *"the mask itself — `Terminal::Keep`. Not a row list. The caller reads the plane."* It is the cheapest thing the mask path can do and it is graded `[G]`. So the incumbent planner **refuses** the query the mask path answers with no -work at all, and because a refusal is excluded from the denominator, **46.0 % -understates the premise by exactly the shape that most favours it.** That is -not an argument for a bigger number — those queries genuinely do not plan -today, and a census that silently counted them would be the vacuous kind. It is -a reason to read the refusal bucket, which is why the example enumerates both -exclusion buckets instead of counting them. +work at all, and because a refusal is excluded from the denominator, **37.3 % +understates the premise by exactly the shape that most favours it.** ### §15.3 — Three things this number is not -1. **Conditional on OQ-1.** Every Full query scans by LABEL, and §1.4 states - the `label → classid` binding is ABSENT. The census counts the SHAPE as - lowering; that is what keeps the premise falsifiable, and it is not a claim - the route exists. **W0-a is still unrun and is the gate that matters most.** -2. **It measures the TEST corpus.** These queries exist to exercise a parser and - a planner, so the distribution is theirs, not a workload's. +1. **Conditional on OQ-1.** Every Full query scans by LABEL, and §1.4 states the + `label → classid` binding is ABSENT (see §16 — it is not, but the wiring + hop is). The census counts the SHAPE as lowering; that is what keeps the + premise falsifiable, and it is not a claim the route exists. +2. **It measures COMMITTED TEST SOURCE.** These queries exist to exercise a + parser, a planner and a DataFusion backend, so the distribution is theirs, + not a production workload's. 3. **It says nothing about speed.** §7.0 is a correctness gate; no row above is a performance claim. -### §15.4 — The extractor was wrong once, and the bug moved the headline 29 points - -The first run reported **15 of 20 (75.0 %)**. The extractor did not know about -Rust char literals, and `parser.rs:931-933` contains `char('"')` three times — a -double quote inside `'…'`. The scanner opened a string there, ran one quote out -of phase for the rest of the file, and emitted raw Rust source as three -"queries" while swallowing real ones. Fixed: 62 candidates instead of 26, -50 classified instead of 20, and the headline fell from 75.0 % to **46.0 %**. - -Both numbers came from a green run that exited 0. What caught it was -**enumerating the exclusion buckets instead of counting them** — a bucket -labelled "3 did not parse" is unfalsifiable, and the same bucket printed showed -`); // Verify the AST structure let ast = result.unwrap(); …` on its first line. -The lesson is the repo's own and it recurred here: a measurement's REJECTS are -evidence about the instrument, and a census that only counts them cannot be -checked. +The 17 that do not parse are also honest signal rather than noise: they are +`LET … IN`, `UNION`, `LEFT MATCH`, and `RESONATE(fp, $q, 0.3)` — dialect the +parser does not implement, sitting in planner and cognitive tests as +aspirational syntax. They are excluded because there is no plan to classify, +and they are ENUMERATED so that is checkable. + +### §15.4 — The extractor was wrong once too, and that bug moved the headline 29 points + +Before the corpus was widened, the first run reported **15 of 20 (75.0 %)**. +`parser.rs:931-933` contains `char('"')` three times. A scanner that does not +know about char literals opens a string there, runs one quote out of phase for +the rest of the file, and emits raw Rust source as three "queries" while +swallowing real ones. Fixed: 26 candidates → 62, and the headline fell from +75.0 % to 46.0 % — before codex's finding took it to 37.3 % over 303. + +All three runs exited 0. What caught the extractor was **enumerating the +exclusion buckets instead of counting them** — a bucket labelled "3 did not +parse" is unfalsifiable, and printed, its first line read +`); // Verify the AST structure let ast = result.unwrap(); …`. + +**Three measurements, three numbers, one instrument.** The lesson is not that +the census was careless; it is that a measurement's SCOPE is part of the +measurement, and nothing in a green run reports its own scope. The walk now +prints how many files it read and which ones carried a query, so the next +reader can see the scope without reconstructing it. --- diff --git a/crates/lance-graph/examples/w0b_corpus_census.rs b/crates/lance-graph/examples/w0b_corpus_census.rs index 7c46c8f5d..0d54d6873 100644 --- a/crates/lance-graph/examples/w0b_corpus_census.rs +++ b/crates/lance-graph/examples/w0b_corpus_census.rs @@ -33,6 +33,8 @@ //! Run: `cargo run -p lance-graph --example w0b_corpus_census` use std::collections::BTreeMap; +use std::fs; +use std::path::{Path, PathBuf}; use lance_graph::ast::{BooleanExpression, PropertyValue, ValueExpression}; use lance_graph::logical_plan::{LogicalOperator, LogicalPlanner}; @@ -43,13 +45,50 @@ use lance_graph::GraphConfig; /// census line can be checked against the plan without re-deriving anything. type GraceReason = &'static str; -/// Every committed source that carries Cypher query literals. Adding a fourth -/// is a one-line change here; the extractor never needs to know. -const SOURCES: &[(&str, &str)] = &[ - ("parser.rs", include_str!("../src/parser.rs")), - ("logical_plan.rs", include_str!("../src/logical_plan.rs")), - ("semantic.rs", include_str!("../src/semantic.rs")), -]; +/// The corpus is EVERY `.rs` file under the workspace's `crates/`, walked at +/// run time — not a hand-listed set. +/// +/// ⊘ The first version of this census listed three files by hand +/// (`parser.rs`, `logical_plan.rs`, `semantic.rs`) and reported **46.0 %** over +/// 50 classified queries. Codex flagged it on the PR and was right: a walk of +/// the same tree with the same extractor finds Cypher query literals in **33 +/// files** carrying **342 distinct queries** — the whole of +/// `crates/lance-graph/tests/`, `src/query.rs`, the planner's strategy modules, +/// the Python bindings. The hand list was 15 % of the corpus, and a STOP gate +/// cleared on 15 % of a corpus is cleared on a subset nobody chose +/// deliberately. +/// +/// The defect before the defect: the three files were picked after a `grep` for +/// `"…MATCH …"` reported zero hits in the DataFusion builder modules. That grep +/// cannot see a raw string or a literal spanning lines, which is the same blind +/// spot that made the extractor itself wrong (see [`string_literals`]). Hence a +/// WALK: a file added to the tree enters the corpus with no edit here, so this +/// list cannot silently go stale the way the last one did. +fn rust_sources(dir: &Path, out: &mut Vec) { + let Ok(entries) = fs::read_dir(dir) else { + return; + }; + for entry in entries.flatten() { + let path = entry.path(); + if path.is_dir() { + // `target/` is build output, not committed source. + if path.file_name().is_some_and(|n| n == "target") { + continue; + } + rust_sources(&path, out); + } else if path.extension().is_some_and(|e| e == "rs") { + out.push(path); + } + } +} + +/// The workspace's `crates/` directory, derived from this crate's manifest dir +/// so the walk is anchored to the checkout rather than to a working directory. +fn crates_root() -> PathBuf { + let mut p = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + p.pop(); // crates/lance-graph -> crates + p +} /// Pull every string literal out of Rust source: raw (`r#"…"#`) first, then /// ordinary (`"…"`, honouring `\"`). Raw strings are taken first because an @@ -197,6 +236,43 @@ fn classify_value(v: &ValueExpression, grace: &mut Vec) { } } +/// §3.2 / §4.2 — an INLINE PATTERN PROPERTY's disposition (`MATCH (p:Person +/// {name: "Alice"})`). These are `PropertyValue`, not `ValueExpression`, and +/// they are a different surface from `WHERE`: the planner stores them on the +/// operator (`ScanByLabel.properties`, `Expand.properties` / +/// `.target_properties`) rather than in a `Filter` node. +/// +/// ⊘ The first version of this census ignored all four maps and counted every +/// scan as lowered, so `MATCH (p:Person {name: "Alice"})-[:KNOWS]->…` came back +/// **Full** when its string equality is P-9 grace. Codex flagged it on the PR. +/// An inline property is a predicate wherever the planner chose to file it. +fn classify_property_value(v: &PropertyValue, grace: &mut Vec) { + match v { + // P-1..P-5 — an integer or boolean equality against a lane. + PropertyValue::Integer(_) | PropertyValue::Boolean(_) => {} + // A parameter is substituted before planning; its VALUE decides, and + // this census cannot see it, so it is counted maskable and said so. + PropertyValue::Parameter(_) => {} + // `IS NULL` has no NULL to test against — absence is a zero-fallback. + PropertyValue::Null => {} + // A property-to-property equality is two lanes, still Boolean. + PropertyValue::Property(_) => {} + // P-9 — §4.2. A string or float constant is not a mask operand. + PropertyValue::String(_) => grace.push("§4.2 P-9 inline string property"), + PropertyValue::Float(_) => grace.push("§4.2 P-9 inline float property"), + } +} + +/// Every inline property map on one operator. +fn classify_property_map( + props: &std::collections::HashMap, + grace: &mut Vec, +) { + for v in props.values() { + classify_property_value(v, grace); + } +} + /// §3.2 / §3.3 / §4.2 — a `WHERE` predicate's disposition. fn classify_bool(e: &BooleanExpression, grace: &mut Vec) { match e { @@ -238,20 +314,37 @@ fn classify_plan(op: &LogicalOperator, grace: &mut Vec, lowered: &m // census counts the SHAPE as lowering and reports OQ-1 separately, // because conflating "no route yet" with "cannot lower" would make the // premise unfalsifiable. - LogicalOperator::ScanByLabel { .. } => *lowered += 1, + LogicalOperator::ScanByLabel { properties, .. } => { + *lowered += 1; + classify_property_map(properties, grace); + } LogicalOperator::Filter { input, predicate } => { *lowered += 1; classify_bool(predicate, grace); classify_plan(input, grace, lowered); } - // §3.4 R-1 — the hop (Wave 2). - LogicalOperator::Expand { input, .. } => { + // §3.4 R-1 — the hop (Wave 2). Both property maps count: an inline + // property on the relationship and one on the target node are each a + // predicate the hop has to carry. + LogicalOperator::Expand { + input, + properties, + target_properties, + .. + } => { *lowered += 1; + classify_property_map(properties, grace); + classify_property_map(target_properties, grace); classify_plan(input, grace, lowered); } // §3.4 R-7/R-8 — the fixpoint (Wave 3). - LogicalOperator::VariableLengthExpand { input, .. } => { + LogicalOperator::VariableLengthExpand { + input, + target_properties, + .. + } => { *lowered += 1; + classify_property_map(target_properties, grace); classify_plan(input, grace, lowered); } LogicalOperator::Project { input, projections } => { @@ -261,11 +354,35 @@ fn classify_plan(op: &LogicalOperator, grace: &mut Vec, lowered: &m } classify_plan(input, grace, lowered); } - // T-11 — `DISTINCT` over a node variable is the identity and lowers to - // nothing at all; over a value (T-12) it is grace. The distinction is - // made by what the projection under it holds, so it is decided there: - // this node itself is free either way. - LogicalOperator::Distinct { input } => classify_plan(input, grace, lowered), + // T-11 vs T-12 — and the distinction has to be made HERE. + // + // `DISTINCT n` (a node variable) is FREE: a mask IS a set, so there is + // no multiplicity to collapse. `DISTINCT n.p` (a value) is GRACE: + // distinct over VALUES needs value identity, which a population mask + // does not carry. + // + // ⊘ The first version of this census recursed and left the decision to + // `classify_value`, whose comment even said so — but that function + // accepts a bare `Property` unconditionally (T-4, `RETURN n.prop`, is + // legitimately `[G]`), so T-12 never fired at all and the reason + // histogram carried no T-12 row. Codex flagged it on the PR. What + // distinguishes the two is not the projection alone but the projection + // UNDER A `Distinct`, so the `Distinct` node is the only place that can + // tell them apart. + LogicalOperator::Distinct { input } => { + // A guarded `matches!` rather than a let chain: this crate is + // edition 2021, where let chains are not available. + if matches!( + input.as_ref(), + LogicalOperator::Project { projections, .. } + if !projections + .iter() + .all(|p| matches!(p.expression, ValueExpression::Variable(_))) + ) { + grace.push("§4.1 T-12 DISTINCT over a value"); + } + classify_plan(input, grace, lowered); + } // §4.1 — order and position. LogicalOperator::Sort { input, .. } => { grace.push("§4.1 G-1 ORDER BY"); @@ -298,11 +415,24 @@ fn classify_plan(op: &LogicalOperator, grace: &mut Vec, lowered: &m fn main() { let config = GraphConfig::default(); - let mut seen: BTreeMap = BTreeMap::new(); - for (file, src) in SOURCES { - for lit in string_literals(src) { + let root = crates_root(); + let mut files = Vec::new(); + rust_sources(&root, &mut files); + files.sort(); + + let mut seen: BTreeMap = BTreeMap::new(); + for path in &files { + let Ok(src) = fs::read_to_string(path) else { + continue; + }; + let label = path + .strip_prefix(&root) + .unwrap_or(path) + .to_string_lossy() + .into_owned(); + for lit in string_literals(&src) { if looks_like_a_query(&lit) { - seen.entry(lit).or_insert(file); + seen.entry(lit).or_insert_with(|| label.clone()); } } } @@ -316,9 +446,9 @@ fn main() { // Provenance per source, so a reader can see WHICH committed file supplied // the corpus rather than taking "62 literals" on trust. - let mut per_source: BTreeMap<&'static str, usize> = BTreeMap::new(); + let mut per_source: BTreeMap<&str, usize> = BTreeMap::new(); for file in seen.values() { - *per_source.entry(file).or_insert(0) += 1; + *per_source.entry(file.as_str()).or_insert(0) += 1; } for q in seen.keys() { @@ -360,8 +490,12 @@ fn main() { println!("W0-b — CORPUS CENSUS (cypher-mask-lowering-v1 §7.0)"); println!("=================================================\n"); println!("candidate literals extracted : {}", seen.len()); - for (file, n) in &per_source { - println!(" from {file:<16} : {n}"); + println!(" rust files walked : {}", files.len()); + println!(" files carrying a query : {}", per_source.len()); + let mut by_count: Vec<_> = per_source.iter().collect(); + by_count.sort_by(|a, b| b.1.cmp(a.1).then(a.0.cmp(b.0))); + for (file, n) in by_count { + println!(" {n:>4} {file}"); } println!(" did not parse (not queries): {}", parse_fail.len()); println!(" parsed but did not plan : {}", plan_fail.len()); From 394c78e0050f2739df0ca9f95f48dbb2b67dd068 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 13:00:44 +0000 Subject: [PATCH 16/22] =?UTF-8?q?plan:=20operator=20rulings=20=E2=80=94=20?= =?UTF-8?q?alpha=20channel=20first,=20belief.rs,=20and=20the=2046%=20quest?= =?UTF-8?q?ion=20withdrawn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decision 1 is not a scheduling tie. The alpha channel is a STORAGE-tier change (multitenant table access) and a query lowering is a read; the write side settles first or the read side is built against an undecided contract. What it buys is simultaneous rungs — the prior state was ten rungs not talking to each other, with "one at a time" as the deprecated alternative, and levels of thinking interact only when their priors sit on the same level. The split tunnel is what lets attention write sparsely without rewriting the ontology. So the Cypher lowering consumes TERNLOG after it, and inherits whatever simultaneity contract it establishes. Decision 3: RevisionKind beside belief.rs. Historically correct home; the wiring is what needs adjusting. Decision 2 is withdrawn rather than answered. I asked for a ruling on a word from a plan the operator did not write, and on a number that had already moved from 46%/50 to 37.3%/303. It was never a decision: 0 of 303 queries fail to lower at all, so the premise covers some of every query in the corpus and no ruling is needed to say that is not negligible. §17.4 records the reporting defect behind all three — reporting in symbol names and section numbers hands the reader ADDRESSES, which only mean something to someone already holding the map. Same defect as citing a line number instead of an anchor, one layer up: it reads as precision and carries none. Plain words first, receipts last. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 86c530012..058e838dd 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -1413,3 +1413,91 @@ transpose lanes), still unrun. **What §16 does settle:** the one gate that could have shelved the plan does not. The route is buildable, it is buildable cheaply, and building it consumes existing surface instead of adding any. + +--- + +## §17 — Operator rulings, 2026-09-16 + +### §17.1 — TERNLOG sequencing: the alpha channel goes first, and NOT merely because it asked first + +I had framed this as a scheduling tie between two claimants on one opcode. +That was the wrong frame, and the operator's reason is structural: + +> *"spog alpha channel is important because it affects the underlying storage +> and table 'multitenant' access — meaning SPOG interactions writing to alpha +> split tunnel without changing ontologies itself as saccade focus of attention +> sparse write and meta awareness of simultaneous rung.* +> +> *before it was 10 rung not talking to each other despite `kanban_actor.rs`, +> or deprecated 'one at a time' — levels of thinking interact and require priors +> to be on the same level."* + +Three things follow, and none of them is about calendar order. + +**(a) The alpha channel is a STORAGE-tier change; a query lowering is not.** +It changes how a write lands and who can see it — multitenant table access. +A mask lowering reads. A reader must not define the semantics the writer will +have to honour, so the write side settles first or the read side is built +against a contract that has not been decided. + +**(b) The point of the split tunnel is that attention writes WITHOUT rewriting +the ontology.** A sparse, saccade-shaped write — focus lands, something is +recorded, the shared structure is untouched. That is what makes concurrent +attention safe, and it is a property of the channel, not of any consumer. + +**(c) The thing actually being bought is SIMULTANEOUS RUNGS.** The prior state +was ten rungs that did not talk to each other, and the deprecated alternative +was "one at a time". Levels of thinking interact, and interaction requires +priors to sit on the same level. So the alpha channel is what makes a rung's +prior legible to another rung at all — and "meta awareness of simultaneous +rung" is the capability, not a nice-to-have. + +**Consequence for the Cypher lowering:** it consumes `TERNLOG 0x86` AFTER the +alpha channel does, and it inherits whatever simultaneity contract that first +consumer establishes. §5.2's OQ-9 said "defer rather than race"; this says why +deferring is correct rather than merely polite. + +### §17.2 — `RevisionKind` lives beside `belief.rs`, and the wiring is the real work + +Operator: *"belief is historically correct but needs to be adjusted for proper +wiring."* + +So: the planner, beside `belief.rs` (option A in +`mask-algebra-revision-read-v1.md` §5 Q1), not the contract. The history is +right; what needs attention is the wiring, not the home. Recorded here; the +adjustment itself is that plan's D-MAR-2. + +### §17.3 — I withdraw the "is 46 % negligible?" question + +Operator: *"46% negligible how do i know what you are talking about"* — and +that is a fair hit, twice over. + +First, I asked for a ruling on a WORD from a plan the operator did not write +(§7.0's own "negligible"), without supplying what anyone would need to judge +it. Second, and worse, the number had already moved: codex's review took it +from 46.0 % over 50 queries to **37.3 % over 303** (§15.0). I put a stale +figure up for decision. + +**It was never a decision. It is a measurement, and the measurement answers +it:** zero queries out of 303 fail to lower at all. Every single one lowers +either fully or as a mask prefix with a DataFusion remainder. A premise that +covers some of every query in the corpus is not negligible, and no ruling is +required to say so. Wave 1's gate is open on the evidence. + +### §17.4 — The reporting defect this exposed, named so it stops + +Operator: *"i have no idea what you are talking about when you talk +incoherently which i call 'reverse grep' — throwing pattern matching that +doesn't make any context for me."* + +Correct, and it is a specific failure rather than a style complaint. I had been +reporting in symbol names and section numbers — `§5.2 Part 2`, `LabelDTO has +zero consumers`, `T-3`, `OQ-1` — which are ADDRESSES. An address is only +meaningful to a reader who already holds the map. Handing someone addresses +instead of meaning is the same defect as citing a line number instead of an +anchor, one layer up: it reads as precision and carries none. + +The rule for this plan and for session reporting: **say what a thing does and +why it matters in plain words first; the symbol, file and section go at the END +as receipts.** A decision request that cannot be understood without opening +three documents is not a decision request. From dcf1eeed191241f910dab97c32a48e5ad8533047 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 13:02:04 +0000 Subject: [PATCH 17/22] =?UTF-8?q?plan:=20operator=20redirect=20=E2=80=94?= =?UTF-8?q?=20quack=20is=20the=20spine,=20Cypher=20was=20a=20cheap=20PoC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Supersedes the DIRECTION of 14.2/15/16, not their measurements. I had Wave 1 of the Cypher plan queued next: a new mask_lower written from scratch. That is a THIRD lowering onto the same floor. quack already turns a query into a Program (2260 lines, 14 tests, "may build a Program and must never evaluate one"), and lgj-abi plan_lower is the second, pinned equal to quack by a differential so the two cannot drift. A third would be the second vocabulary both exist to prevent — and I would have been building it while writing, in this same document, that the recurring finding is two built ends that do not meet. The spine today is Query { filter, agg }: filter a population, reduce over the survivors, every operator a MaskOp, validity a resident plane, a group a mask. DuckDB shape minus the row iterator and the selection vector. Its one missing leg is the HOP. Nothing in quack or the IR beneath it can say src_mask -> edge lane -> dst_mask; mask-risc names it absent and assigns it to PR5, whose "only after PR1-4 green" gate lifted today. So: the hop lands in the spine, front-ends lower INTO quack rather than past it, and the DataFusion residue shrinks by subtraction — one change to quack that every front-end inherits. The W0-b census does not go stale; its target changes. It asked how much Cypher a new lowering could express; it now reads as a work order on the spine, because the grace rows are properties of masks rather than of any lowering: 131 order-and-position hits are outside it by construction, 124 string-and-float wait on a variable-width lane, the 28 Join hits ARE the hop, 23 are the vector boundary. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 058e838dd..43367335a 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -1501,3 +1501,95 @@ The rule for this plan and for session reporting: **say what a thing does and why it matters in plain words first; the symbol, file and section go at the END as receipts.** A decision request that cannot be understood without opening three documents is not a decision request. + +--- + +## §18 — ⊘ OPERATOR REDIRECT: quack is the spine. Cypher is a cheap proof of concept. + +> *"cypher is just a cheap proof of concept — and an even better proof of +> concept is quack."* +> *"my point is quack is the spine you need to rebuild from."* + +This supersedes the direction of §14.2, §15 and §16. Not their measurements — +those stand — but what they were measuring TOWARD. + +### §18.1 — What I was about to do, and why it was wrong + +I had Wave 1 of `cypher-mask-lowering-v1.md` queued as the next build: a new +`mask_lower(&LogicalOperator) -> Program`, written from scratch, with its own +six falsifiers. + +**That is a third lowering onto the same floor.** `lance-graph-quack` already +turns a query into a `Program` and has since PR3 — 2 260 lines, 14 tests, and +a manifest that states the rule it lives by: *"this crate may build a +`Program` and must never evaluate one."* `lgj-abi`'s `plan_lower` is the +second, and it is pinned equal to quack's by a differential precisely so the +two cannot drift. Adding a third would have been the "second vocabulary" +failure both of those exist to prevent — and I would have been building it +while writing, elsewhere in this same document, that the recurring finding is +*two built ends that do not meet*. + +### §18.2 — What the spine actually is today + +`quack::Query` is two fields: + +```rust +pub struct Query { + pub filter: Filter, // comparisons, AND/OR/NOT, IN, prefix, resident planes + pub agg: Agg, // Count · Any · All · SumI32 · MinI32 · MaxI32 · Rows · BlendI32 +} +``` + +Filter a population, reduce over the survivors. Every operator lowers to a +`MaskOp`; the validity bitmap is a resident plane rather than a second NULL +representation; a group is a mask rather than a hash table. That is DuckDB's +shape with the row iterator and the selection vector deliberately absent. + +**The spine's one missing leg is the HOP.** There is no `src_mask → edge lane → +dst_mask` in quack, and none in the IR beneath it — `mask-risc`'s own module +doc names `hop` as absent and assigns it to PR5. Without it the spine answers +"which rows of this table", never "which rows does this row reach". + +### §18.3 — The order this implies, replacing the Cypher wave plan + +1. **The hop lands in the spine** — `Program` gains it, quack gains a `Filter` + or operator spelling for it, both against the shipped `lgj_hop` shape, whose + selection algebra (`ternlog(class, src, struct)` then scatter) and + whose three rejected predecessors are already written down. This is the + existing PR5 / task #10, and its gate ("only after PR1-4 green") lifted + today when those four merged. +2. **Front-ends lower INTO quack, never past it.** Cypher's `LogicalOperator` + becomes one such front-end. So does `sql()`. So does whatever OGAR's loco + vocabulary addresses. One lowering to the floor, N front-ends above it. +3. **The DataFusion residue shrinks by subtraction, not by replacement.** A + construct leaves the residue when the spine grows a spelling for it — which + is a change to quack, in one place, that every front-end inherits. + +### §18.4 — What the W0-b census is still worth, re-targeted + +§15's measurement does not go stale; its TARGET changes. It asked *"how much +Cypher could a new mask lowering express?"* The question is now *"how much +Cypher can the SPINE express?"* — and the answer is read off the same +histogram, because the grace rows are properties of masks, not of any +particular lowering: + +- **The 131 order-and-position hits** (`ORDER BY`, `LIMIT`, `SKIP`, `DISTINCT` + over values, `collect`) are outside the spine by construction. A mask + answers *which rows*, never *in what order* or *how many times*. +- **The 124 string-and-float hits** are outside it until the spine carries a + variable-width lane, which is its own decision and not a lowering's. +- **The 28 `Join` hits are the hop**, i.e. exactly §18.3 step 1. +- **The 23 vector-distance hits** are the different-mechanism boundary (§4.4). + +So the census now reads as a work order on the SPINE rather than a feasibility +estimate for a lowering, which is a more useful thing than it was. + +### §18.5 — What this does NOT change + +`cypher-mask-lowering-v1.md` §5.2's placement ruling stands unaltered, and is +in fact reinforced: `Pred`, the hop and the terminals are a lowering target +that must never be minted, because no byte of them survives the query. A spine +does not change that — it makes it apply in ONE place instead of three. + +§17.1's ordering also stands: the alpha channel is storage-tier and settles +before the read side consumes `TERNLOG 0x86`. From 9161d6586238ffd7a67ea1359b539d1c3cbaa33f Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 13:02:41 +0000 Subject: [PATCH 18/22] plan: the spine argument is muscle memory, not elegance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator: any graph traversal is a modified version of it, any SPOG query is just another flavor, and the benefit is that nobody ever asks what DuckDB is. Deduplication (three lowerings onto one floor is two too many) is the smaller half. The larger half is that the spine is ALREADY KNOWN: filter, reduce, group, project is a shape every engineer and every model arrives holding. A novel graph IR has to be taught to every reader, every front-end author and every model that touches it. DuckDB shape does not, ever. And neither thing that looks like it needs its own IR does. A traversal is a population narrowing to a population — the hop is a new OPERATOR in a known algebra, not a new algebra. SPOG is four columns; asking for the objects of a subject under a predicate is a filter and a projection. Same test as the Java surface, one tier down: would a reader who has never read our documentation understand this plan from DuckDB habit alone? Boring is load-bearing at both tiers — the surface so a customer needs no manual, the spine so a reader, an author or a model needs none either. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 43367335a..978dcec76 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -1593,3 +1593,44 @@ does not change that — it makes it apply in ONE place instead of three. §17.1's ordering also stands: the alpha channel is storage-tier and settles before the read side consumes `TERNLOG 0x86`. + +### §18.6 — The real argument for the spine is MUSCLE MEMORY, not elegance + +> *"any graph traversal in the end will be a modified version of it. any SPOG +> query will be just another flavor. and the benefit is quack / duckdb — no AI +> will ever ask what it is, you can use muscle memory."* + +§18.2-18.4 argued the spine from deduplication: three lowerings onto one floor +is two too many. That is true and it is the smaller half. + +**The larger half is that the spine is ALREADY KNOWN.** quack is DuckDB's +shape. Filter a population, reduce over the survivors, group, project. Every +engineer and every model has that shape in hand before they arrive — nobody +asks what a `WHERE` is, or what `COUNT(*)` means, or why a filter composes with +`AND`. A novel graph IR would have to be taught to every reader, every +front-end author, and every model that ever touches it; DuckDB's shape does +not, ever. + +And the two things that look like they need their own IR do not: + +- **A graph traversal is a modified filter.** Reach is `src_mask → edge lane → + dst_mask` — still a population narrowing to a population. The hop is a new + OPERATOR in a known algebra, not a new algebra. +- **A SPOG query is another flavor of the same shape.** Subject, predicate, + object, graph are four columns. Asking for the objects of a subject under a + predicate is a filter and a projection. Nothing about it needs a vocabulary + that DuckDB does not already have a word for. + +**This is the `sql()` argument one layer down, and it is the same test.** +`lance-graph-java/CLAUDE.md` asks of any Java addition: *"would a customer who +has never read our documentation write this line by accident, from habit +alone?"* Applied to the IR: **would a reader who has never read our +documentation understand this plan by accident, from DuckDB habit alone?** A +spine that passes that costs nothing to adopt and nothing to explain. A novel +one charges rent forever, in onboarding, in review, and in every model that has +to be told what it is looking at. + +So "boring" is the load-bearing property at BOTH tiers: the Java surface is +boring so a customer needs no manual, and the spine is boring so a reader, +an author, or a model needs none either. The speed is somewhere neither of +them has to look. From b35757b09cdaeb50385b351902816a77129b6c68 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 13:03:20 +0000 Subject: [PATCH 19/22] plan: the circling is the symptom of building on what is not in training MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator: everything else is running in circles around what is not in your training. That diagnoses a mechanism, not a preference. A private vocabulary is re-derived from documents every time it is reasoned about, and re-derivation is where the circling comes from. This session is the receipt: three stale blockers quoted as current, a placement fork raised as open that had been ruled months earlier, three greps treated as verdicts, a corpus chosen from one of those greps (46% over 50 was really 37.3% over 303), and Wave 1 queued as the next build when it was a third lowering onto one floor. None of those is a hard problem. Each is a lookup that went stale, partial or confidently wrong — because the thing being looked up exists only in this workspace own documents. A filter, an aggregate, a group-by are never looked up. So boring is not a style choice at any tier: it removes the lookup, and removing the lookup removes the circling. Three statements, one read at three depths — a customer should not need a manual, a reader should not need one, and a model should not need one either, because when it does it spends the session re-deriving instead of building. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../plans/lance-graph-as-the-modelgraph-v1.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 978dcec76..1034d2268 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -1634,3 +1634,41 @@ So "boring" is the load-bearing property at BOTH tiers: the Java surface is boring so a customer needs no manual, and the spine is boring so a reader, an author, or a model needs none either. The speed is somewhere neither of them has to look. + +### §18.7 — And the circling is the SYMPTOM, not a separate problem + +> *"everything else is running in circles around what's not in your training."* + +This is the strongest form of §18.6, and it diagnoses a mechanism rather than +stating a preference. + +A private vocabulary has to be RE-DERIVED from documents every time it is +reasoned about. Re-derivation is where the circling comes from, and this +session is the receipt: + +| the circle | what it cost | +|---|---| +| three "blockers" quoted as current | each was true once and false when quoted | +| an A/B/C placement fork raised as open | §5.2 had ruled it months earlier | +| a grep treated as a verdict, three times | a dependency edge, an impl, a seam — all wrong | +| a corpus chosen from one of those greps | 46.0 % over 50 was 37.3 % over 303 | +| Wave 1 queued as the next build | it was a third lowering onto one floor | + +Not one of those is a hard problem. Every one is a re-derivation that went +wrong, and they went wrong because the thing being re-derived is **not in the +model's training** — it exists only in this workspace's own documents, so +every reasoning step is a lookup, and every lookup is a chance to be stale, +partial, or confidently wrong. + +DuckDB's shape does not have that failure mode. A filter, an aggregate, a +group-by, a projection are not looked up. They are known, by every model and +every engineer, before the session starts. Work on that shape does not circle +because there is nothing to reconstruct. + +**So "boring" is not a style choice at any tier.** It is what removes the +lookup, and removing the lookup is what removes the circling. The operator's +three statements are one statement read at three depths: a customer should not +need a manual (`sql()`), a reader should not need one (the spine), and a model +should not need one either — because when it does, it spends the session +re-deriving instead of building, which is exactly what happened here before +this redirect. From 42deee77d552267374ea1be354e83046c23016ae Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 13:16:14 +0000 Subject: [PATCH 20/22] =?UTF-8?q?board:=20the=20session's=20entry,=20then?= =?UTF-8?q?=20the=20index=20=E2=80=94=20in=20that=20order,=20which=20is=20?= =?UTF-8?q?the=20finding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `regenerate-and-diff` was red at four successive SHAs on #1240 for exactly the reason CLAUDE.md already records from #1085: the supersession index reads the BOARD as an input, so regenerating before the board writes produces a byte-identical file that reads as "already current" while CI, regenerating on the merge commit, sees the rows move. I regenerated first. The rule was right and I ran it backwards. So the entry lands first. E-THE-SPINE-IS-WHATEVER-THE-READER-ALREADY-HAS-AN-ADDRESS-FOR-1 records the operator's quack redirect (the argument is muscle memory, not elegance — a novel IR has to be taught to every reader, author and model, every time), what it cancels (Wave 1 would have been a third lowering onto one floor; the hop is one brick instead), the census correction (3 hand-listed files → a 27-file walk, 46.0%/50 → 37.3%/303, from using a grep as a verdict on the day the rule against it landed), and the three rulings that came with it. It also names the shape the session's four errors share: a grep for the corpus, a section number for the argument, a stale percentage for a decision, a fork raised as open that was already ruled. Each substitutes an ADDRESS for the thing — which is the same insight the redirect states positively. Then the index, regenerated LAST. Coverage closes in two plans, because the entry cites D-MAR-2 where nothing had: modelgraph 5/6 → 6/6, mask-algebra-revision-read 2/3 → 3/3. Gates, all run locally before push: regenerate-and-diff idempotent; append-only +127 EPIPHANIES / +30 INTEGRATION_PLANS, nothing shrank (9 checked); citation-decay 0 new (the entry carries no line-number citations by construction, which is what the gate asks for). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .claude/board/EPIPHANIES.md | 127 ++++++++++++++++++++++++++++ .claude/board/SUPERSESSION-INDEX.md | 4 +- 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index 6d29b5806..30e7c9792 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -1,3 +1,130 @@ +## 2026-09-16 (15) — E-THE-SPINE-IS-WHATEVER-THE-READER-ALREADY-HAS-AN-ADDRESS-FOR-1 — the operator's quack redirect, and the four errors of one session that all substituted an address for the thing + +**Status:** OPERATOR-RULED (the redirect, verbatim below) + MEASURED (the census +numbers, re-run over the whole tree after codex's review of #1240). +**Confidence:** HIGH on the census — the corpus mechanism is now a directory +walk, so the number is a property of the tree rather than of a file list I +chose. The spine ruling is the operator's; it is recorded, not derived. + +### The redirect, in the operator's own four messages + +> *"cypher is just a cheap proof of concept / and an even better proof of +> concept is quack"* → *"my point is quack is the spine you need to rebuild +> from"* → *"any graph traversal in the end will be a modified version of it / +> any SPOG query will be just another flavor / and the benefit is quack / +> duckdb no AI will ever ask what it is, you can use muscle memory"* → +> *"everything else is running in circles around whats not in your training"*. + +**The argument is muscle memory, not elegance, and reading it as elegance is +how it gets lost.** `lance_graph_quack::Query { filter, agg }` — filter a +population, reduce over the survivors — is a shape every reader, every author +and every model already holds without being taught. A novel IR has to be taught +to each of them, every time, and the teaching cost recurs on every future +session. That is the same test the Java surface passes one tier down +(lance-graph-java `CLAUDE.md` § *THE JAVA SURFACE IS `sql()`*): the boring front +wins because nobody has to learn it, not because it is nicer. + +The last message is the mechanism behind the other three, and it is the one +worth keeping: **circling is the symptom of building on what is not in +training.** Work that re-derives its own vocabulary every session does not +accumulate — each session pays the teaching cost again and mistakes paying it +for progress. + +### What it cancels, stated plainly because I had it queued + +The Cypher→mask lowering (`.claude/plans/cypher-mask-lowering-v1.md`, Wave 1) +would have been a **third** lowering onto one floor — beside quack's `lower` +and `lgj-abi`'s `plan_eval`, both already pinned equal to `lance-graph-mask-risc` +by a differential. Three dialects, one evaluator, and two of them novel. + +quack's one missing leg is the **hop** (`src_mask → edge lane → dst_mask`). That +is one brick, and it makes SPOG a *flavour* of a shape that already exists +rather than a fourth thing to learn. It is now the recommended next brick +(task #10 / PR5), where before it was gated behind PR1-4. + +### The census defect — same shape, and self-inflicted on the day the rule landed + +`w0b_corpus_census` was built to answer §7.0's STOP gate: what fraction of the +Cypher the tree actually contains lowers to a mask. Its first corpus was a +**hand list of three files**, chosen from a grep — and a grep structurally +cannot see a query built as a raw string literal. codex flagged it on #1240. + +| | corpus | classified | Full (mask-lowerable) | +|---|---|---|---| +| as first reported | 3 files, hand-listed | 20 | 15 — **75.0 %** | +| after a quote-parity fix | same 3 files | 50 | 23 — **46.0 %** | +| after codex: directory walk | **27 files** of 1451 walked | **303** | 113 — **37.3 %** | + +The corpus grew **17×** and the headline halved. The root cause is named in +this repo's own P0 rule — *grep FINDS, reading DECIDES* — which was written +into `CLAUDE.md` **the same day**. Writing a rule is not the same as being +immune to it. + +Three classifier defects rode in with the fix (inline pattern properties never +read, 4 maps → 53 hits; `DISTINCT`-over-a-value never firing, 37 hits; and +`run.sh`'s `|| true`, which let a failed harvest leave stale TSVs to be counted +while `provenance.txt` already carried the new commits — a clean exit reporting +old measurements against a new checkout). + +### The four errors of this session share ONE shape + +| what I substituted | for what | +|---|---| +| a grep pattern | the corpus | +| a section number and a symbol name | the argument (operator: *"reverse grep… pattern matching that doesnt make any context for me"*) | +| a stale 46 % | a decision I asked the operator to make (withdrawn — 0 of 303 fail to lower, so no ruling was ever needed) | +| an A/B/C fork I raised as open | a ruling `cypher-mask-lowering-v1` §5.2 had already made | + +**An address is not the thing.** Each one is cheap to produce and looks like +work. And the redirect above is the positive form of the same insight: build on +the spine the reader already has an address for, because a novel IR is an +address nobody can resolve. + +Operational consequence, and it is the cheap half: **plain words first; the +symbol, file and section go at the END, as receipts.** A report that opens with +`§5.2 / TERNLOG 0x86 / D-MAR-2` has told the reader nothing they can act on. + +### The three rulings that came with it + +**Alpha channel first, and the reason is not sequencing convenience.** Operator: +the SPOG alpha channel *"affects the underlying storage and table 'multitenant' +access… writing to alpha split tunnel without changing ontologies itself as +saccade focus of attention sparse write and meta awareness of simultaneous +rung"*, where *"before it was 10 rung not talking to each other despite +kanban_actor.rs or deprecated 'one at a time'"*. Three things are being bought: +a write path that does not rewrite the shared ontology (which is what makes +concurrent attention safe); a channel property rather than a consumer +convention; and **simultaneous rungs** — levels of thinking interact, and +interaction requires the priors to sit on the same level. So any second consumer +of `ogar_loco::TERNLOG = 0x86` inherits whatever simultaneity contract the alpha +channel establishes first. `cypher-mask-lowering-v1` §5.2's OQ-9 said "defer +rather than race"; this says *why* deferring is correct rather than merely +polite. + +**`RevisionKind` lives beside `belief.rs`.** Operator: *"belief is historically +correct but needs to be adjusted for proper wiring"* — so the planner, not the +contract (option A of `mask-algebra-revision-read-v1.md` §5 Q1). The history is +right; the wiring is the work. The adjustment is that plan's **D-MAR-2**. + +**The 46 % question is withdrawn, not answered.** Operator: *"46% negligable how +do i know what you are talking about"* — a fair hit twice over. I asked for a +ruling on a word from a plan the operator did not write, without supplying what +anyone would need to judge it; and the number had already moved to 37.3 % (see +the table above). Re-reading the census, **0 of 303 queries fail to lower** — +Split is a two-stage plan, not a failure — so there was never a ruling to make. + +### Receipts + +- Plan: `.claude/plans/lance-graph-as-the-modelgraph-v1.md` §§14-18 (the mindset + check, the census, `LabelDTO` as the answer to OQ-1, the rulings, the redirect). +- Instrument: `crates/lance-graph/examples/w0b_corpus_census.rs` — the corpus is + now `rust_sources()`, a walk, so the denominator is the tree's property. +- Gate discipline, second measured instance: `SUPERSESSION-INDEX.md` was + regenerated BEFORE these board writes and went red at four successive SHAs on + #1240 — exactly the failure `CLAUDE.md` § *Regenerate LAST, after the board + writes* already records from #1085. The rule is right; it needs to be executed + in the order it states. + ## 2026-09-16 (14) — E-THE-NET-ARM-RANKED-ON-A-PARTIAL-SUM-AND-ITS-ONLY-APPARENT-SIGNAL-WAS-THAT-BUG-1 — entry (13)'s NET row is re-measured; the arm is a census on BOTH arms, not one **Status:** MEASURED — re-run of `D-HXP-8` arm 1 after a one-line ranking fix in diff --git a/.claude/board/SUPERSESSION-INDEX.md b/.claude/board/SUPERSESSION-INDEX.md index 6977b4ccb..f1aac5507 100644 --- a/.claude/board/SUPERSESSION-INDEX.md +++ b/.claude/board/SUPERSESSION-INDEX.md @@ -87,7 +87,7 @@ a licence to act on it. | **READ** | `graphrag-doc-retrieval-soa-integration-v1` | `GateDecision` | DESIGN + FIRST CODE. **v1.2 (2026-07-17):** | 7/10 | | **READ** | `hexagon-plasticity-v1` | `MergeMode` | ACTIVE — landed 2026-09-14 on operator go. * | 5/10 | | **READ** | `integration-actionhandler-rbac-orchestration-v1` | `GateDecision` | HARDENING (5+3 in progress). | 0/0 | -| **READ** | `mask-algebra-revision-read-v1` | `StepMask` | DRAFT, awaiting operator ruling on §5 | 2/3 | +| **READ** | `mask-algebra-revision-read-v1` | `StepMask` | DRAFT, awaiting operator ruling on §5 | 3/3 | | **READ** | `mul-calibration-not-verdict-v1` | `GateDecision` | PROPOSAL (unbuilt) — 2026-08-26. PLAN/BOARD | 6/12 | | **READ** | `mul-consumer-build-gate-v1` | `GateDecision` | GATE RUN — 2026-08-27. Discharges D-MCAL-6 a | 3/7 | | **READ** | `mul-consumer-census-v1` | `GateDecision` | MEASUREMENT COMPLETE — 2026-08-27. Measureme | 1/2 | @@ -141,7 +141,7 @@ a licence to act on it. | **RESCOPE** | `entropy-closure-causal-ground-v1` | `ThinkingStyle` | PROPOSAL (measured, unbuilt) — 2026-08-26. P | 3/8 | | **RESCOPE** | `foundry-consumer-parity-v1` | `BindSpace` | Active | 0/0 | | **RESCOPE** | `foundry-roadmap-unified-smb-medcare-v1` | `BindSpace` | Active | 0/0 | -| **RESCOPE** | `lance-graph-as-the-modelgraph-v1` | `BindSpace` | PROPOSAL (operator-set endgame, 2026-09-16). | 5/5 | +| **RESCOPE** | `lance-graph-as-the-modelgraph-v1` | `BindSpace` | PROPOSAL (operator-set endgame, 2026-09-16). | 6/6 | | **RESCOPE** | `lf-integration-mapping-v1` | `BindSpace` | Active (2026-04-25) | 0/0 | | **RESCOPE** | `lite-unified-surrealql-lance-v1` | `BindSpace` | CONJECTURE / design. **Test via feature gate | 0/0 | | **RESCOPE** | `ogit-cascade-supabase-callcenter-v1` | `BindSpace` | plan, not implementation. | 0/16 | From 4dabd92c44787d75b3265cb40e01f035c9328a7e Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 13:31:15 +0000 Subject: [PATCH 21/22] =?UTF-8?q?census:=20five=20review=20findings=20?= =?UTF-8?q?=E2=80=94=20and=20the=20file=20count=20was=20wrong=20in=20my=20?= =?UTF-8?q?own=20board=20entry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All five correct. The three code ones all bear on whether the census can be trusted at all, which is the right place for a review to bite. MAJOR — traversal failures were discarded. `rust_sources` returned on an unreadable directory, `flatten()` dropped a failed entry, and `read_to_string` was skipped on error. A run that cannot see part of the tree then reports a clean census over whatever it did read — and §7.0's STOP gate is cleared on that number. Identical in shape to the `|| true` removed from `run.sh` earlier in this PR: a failure that reports success over a partial corpus. Both `rust_sources` and `main` now return `io::Result<()>` and propagate. Zero-hash raw strings. The raw branch required at least one `#`, so `r"..."` fell through to the ordinary-string branch and had its escapes processed — `r"\d+"` arrived as `d+`, a query the tree does not contain. In valid Rust an `r` directly followed by `"` is always a raw string, so the hash count may be zero. Every source per literal. `seen` kept only the FIRST file for each query, and `per_source` — which IS the "files carrying a query" figure — was built from those values, so a file whose every query also appeared elsewhere vanished from the provenance entirely. **Measured after: 27 -> 33 files. The classification does not move** — 342 candidates, 303 classified, 113 Full (37.3 %), 190 Split, 0 Grace, all unchanged. Dedup by literal was always right; only the attribution was not. The uncomfortable part is that the repo already held the right number. The census's own module doc said *33 files* while the program it documents printed *27*, in the same commit, and I quoted whichever was nearer to hand — the doc's 33 into the source, the program's 27 into the plan and into the EPIPHANIES entry written an hour ago. Both are corrected, and the entry now records the failure rather than just the fixed number. Same shape twice more in the docs, both fixed: G-F's summary row said the kanban seam was "unwired both ways" while this document's own body four sections up says socket, authority and the loco landing are all in place and only the planner's `HotPlug` + `activate` are missing; and §15's caveat still quoted the superseded 46 %. A summary row is a second place to be wrong, and it is the place a reader looks first. Three extractor regression tests, and the example is now declared with `test = true` — an example's test flag defaults to false, so `#[cfg(test)]` inside one is compiled and never run. A test that cannot fail where anyone looks is the defect it was written to prevent, and this extractor is what BUILDS the corpus. Paired silent half included: a hashed raw string still spans its embedded quotes and an ordinary string still resolves its escapes, so "treat every string as raw" cannot pass. Index regenerated LAST, after the board write. fmt + clippy -D warnings clean; append-only +15 lines; citation-decay 0 new. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .claude/board/EPIPHANIES.md | 17 ++- .../plans/lance-graph-as-the-modelgraph-v1.md | 16 ++- crates/lance-graph/Cargo.toml | 12 ++ .../lance-graph/examples/w0b_corpus_census.rs | 130 ++++++++++++++---- 4 files changed, 148 insertions(+), 27 deletions(-) diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index 30e7c9792..5990fde3d 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -53,13 +53,28 @@ cannot see a query built as a raw string literal. codex flagged it on #1240. |---|---|---|---| | as first reported | 3 files, hand-listed | 20 | 15 — **75.0 %** | | after a quote-parity fix | same 3 files | 50 | 23 — **46.0 %** | -| after codex: directory walk | **27 files** of 1451 walked | **303** | 113 — **37.3 %** | +| after review: directory walk | **33 files** of 1451 walked | **303** | 113 — **37.3 %** | The corpus grew **17×** and the headline halved. The root cause is named in this repo's own P0 rule — *grep FINDS, reading DECIDES* — which was written into `CLAUDE.md` **the same day**. Writing a rule is not the same as being immune to it. +**And the file count in that last row was itself wrong when first published — +`27`, corrected here to `33`.** A second review pass found that the census +kept only the FIRST source per query literal, so a file whose every query also +appeared elsewhere vanished from the provenance entirely. The classification is +untouched by it (342 candidates, 303 classified, 113 Full, 37.3 % — all +unchanged; dedup by literal was always right, only the attribution was not). + +The uncomfortable half is that **the repo already held the right number**: the +census's own module doc said *33 files* while the program it documents printed +*27*, in the same commit, and I quoted whichever was nearer to hand — the doc's +33 into the source, the program's 27 into the plan and into this entry. Nothing +flagged it, because neither number is wrong-looking on its own. Third instance +in one session of two values for one quantity (see also G-F, whose summary row +contradicted its own document's body four sections above it). + Three classifier defects rode in with the fix (inline pattern properties never read, 4 maps → 53 hits; `DISTINCT`-over-a-value never firing, 37 hits; and `run.sh`'s `|| true`, which let a failed harvest leave stale TSVs to be counted diff --git a/.claude/plans/lance-graph-as-the-modelgraph-v1.md b/.claude/plans/lance-graph-as-the-modelgraph-v1.md index 1034d2268..756140f64 100644 --- a/.claude/plans/lance-graph-as-the-modelgraph-v1.md +++ b/.claude/plans/lance-graph-as-the-modelgraph-v1.md @@ -553,9 +553,19 @@ open end with its status, not folded in. | **G-C2** | `deinterlace` / durability read | not identified | **the real one — and it is what closes Heckhausen's last phase** | | G-D | `sql()` | gated on G-C | gated on G-C2 (a surface over an unreadable write is not a surface) | | G-E | quack has no DuckDB in its loop | real | unchanged | -| **G-F** | planner ↔ loco ↔ r2il kanban seam | not in plan | **unwired both ways; a build, not a wiring** | +| **G-F** | planner ↔ loco ↔ r2il kanban seam | not in plan | **smaller than it reads: the planner declares a `HotPlug` and calls `activate`** | | **G-G** | alpha-channel split tunnel ↔ SPOG | not in plan | **SPEC Phase 0 exists; needs its own pass** | +> ⊘ **G-F's row said "unwired both ways; a build, not a wiring" — and this +> document's own body, four sections up, said the opposite:** *"socket, +> authority and the loco landing are all in place; the one consumer that needs +> the kanban has never plugged in."* The body is right; the row was written +> from the first impression and never re-read against the finding that +> replaced it. Corrected in place rather than deleted, because the failure is +> the point: **a summary row is a second place to be wrong, and it is the +> place a reader looks first.** Same shape as the corpus row above it, where +> `27` and `33` were both in the repo for one quantity. + --- ## `ogar-loco`'s emancipation — the boring floor is the MOAT, not the burden @@ -1239,7 +1249,7 @@ queries**, from three hand-listed files. Codex filed four P1s on lance-graph | finding | what it was | effect | |---|---|---| -| **the corpus was a subset** | the census read `parser.rs`, `logical_plan.rs`, `semantic.rs`. A walk of the same tree with the same extractor finds queries in **27 files** — the whole of `crates/lance-graph/tests/`, `src/query.rs`, the planner's strategy modules, the Python bindings | 50 classified → **303** | +| **the corpus was a subset** | the census read `parser.rs`, `logical_plan.rs`, `semantic.rs`. A walk of the same tree with the same extractor finds queries in **33 files** — the whole of `crates/lance-graph/tests/`, `src/query.rs`, the planner's strategy modules, the Python bindings | 50 classified → **303** | | **inline pattern properties were ignored** | `MATCH (p:Person {name: "Alice"})` files its predicate in `ScanByLabel.properties` / `Expand.properties` / `.target_properties`, and all four maps went unread. A string equality there is P-9 grace | new row, **53** hits | | **T-12 never fired** | `DISTINCT n.p` is grace, `DISTINCT n` is free. The `Distinct` arm recursed and left it to `classify_value`, which accepts a bare `Property` unconditionally (T-4 is legitimately `[G]`) — so the distinction was never made and the histogram had no T-12 row at all | new rows, **37** hits | @@ -1404,7 +1414,7 @@ The codebook carries real domain concepts — `project` `0x0101`, Cypher test corpus's labels are synthetic and were never minted, which is unsurprising: they exist to exercise a parser. -So §15's caveat 1 is not a formality. The 46 % measures the **shape** of the +So §15's caveat 1 is not a formality. The 37.3 % measures the **shape** of the corpus, and a production number would have to be measured over queries whose labels are minted concepts. That is a different census, and it needs a real bake — which is the rest of W0-a (OQ-2 mint order, OQ-3 column widths, OQ-6 diff --git a/crates/lance-graph/Cargo.toml b/crates/lance-graph/Cargo.toml index b3201d398..3b6e1571d 100644 --- a/crates/lance-graph/Cargo.toml +++ b/crates/lance-graph/Cargo.toml @@ -173,3 +173,15 @@ lance-graph-planner = { path = "../lance-graph-planner" } # capability this crate USES a thing this crate ASKS FOR. Same declaration q2's # `cockpit-server` already carries for the same reason. object_store = { workspace = true } + +# Declared so `cargo test` RUNS this example's `#[cfg(test)]` module. An +# example's `test` flag defaults to false, so unit tests inside one are +# compiled-but-never-run — a test that cannot fail where anyone looks is the +# defect it was written to prevent. The extractor those tests cover is what +# BUILDS the W0-b corpus, so a silent regression in it moves a STOP-gate +# number. Auto-discovery still finds every other example; declaring one target +# does not disable it for the rest. +[[example]] +name = "w0b_corpus_census" +path = "examples/w0b_corpus_census.rs" +test = true diff --git a/crates/lance-graph/examples/w0b_corpus_census.rs b/crates/lance-graph/examples/w0b_corpus_census.rs index 0d54d6873..5d634cbc5 100644 --- a/crates/lance-graph/examples/w0b_corpus_census.rs +++ b/crates/lance-graph/examples/w0b_corpus_census.rs @@ -13,10 +13,11 @@ //! //! # The corpus is the committed corpus, by construction //! -//! The query strings are not transcribed here — they are `include_str!`-ed out -//! of the three committed sources that hold them and extracted at runtime. A -//! transcribed corpus drifts silently from the tests it claims to mirror; an -//! extracted one cannot. Strings that are not queries (the planner's own error +//! The query strings are not transcribed here — every `.rs` file under +//! `crates/` is WALKED and its string literals extracted at runtime. A +//! transcribed corpus drifts silently from the tests it claims to mirror, and +//! a hand-listed one is a corpus nobody chose deliberately; a walked one is +//! neither. Strings that are not queries (the planner's own error //! messages, which also contain the word `MATCH`) self-eliminate: they fail to //! parse and are reported in their own bucket rather than counted. //! @@ -32,8 +33,9 @@ //! //! Run: `cargo run -p lance-graph --example w0b_corpus_census` -use std::collections::BTreeMap; +use std::collections::{BTreeMap, BTreeSet}; use std::fs; +use std::io; use std::path::{Path, PathBuf}; use lance_graph::ast::{BooleanExpression, PropertyValue, ValueExpression}; @@ -50,7 +52,7 @@ type GraceReason = &'static str; /// /// ⊘ The first version of this census listed three files by hand /// (`parser.rs`, `logical_plan.rs`, `semantic.rs`) and reported **46.0 %** over -/// 50 classified queries. Codex flagged it on the PR and was right: a walk of +/// 50 classified queries. Review flagged it on the PR and was right: a walk of /// the same tree with the same extractor finds Cypher query literals in **33 /// files** carrying **342 distinct queries** — the whole of /// `crates/lance-graph/tests/`, `src/query.rs`, the planner's strategy modules, @@ -64,22 +66,27 @@ type GraceReason = &'static str; /// spot that made the extractor itself wrong (see [`string_literals`]). Hence a /// WALK: a file added to the tree enters the corpus with no edit here, so this /// list cannot silently go stale the way the last one did. -fn rust_sources(dir: &Path, out: &mut Vec) { - let Ok(entries) = fs::read_dir(dir) else { - return; - }; - for entry in entries.flatten() { - let path = entry.path(); +fn rust_sources(dir: &Path, out: &mut Vec) -> io::Result<()> { + // Every I/O failure PROPAGATES. It used to `return` on an unreadable + // directory and `flatten()` away a failed entry, which is the same defect + // as the `|| true` this arc already removed from `run.sh`: a run that + // cannot read part of the tree then reports a clean census over whatever + // it did read, and a STOP gate cleared on a partial corpus is cleared on a + // corpus nobody chose. A census that cannot see the tree is not a census + // that found nothing. + for entry in fs::read_dir(dir)? { + let path = entry?.path(); if path.is_dir() { // `target/` is build output, not committed source. if path.file_name().is_some_and(|n| n == "target") { continue; } - rust_sources(&path, out); + rust_sources(&path, out)?; } else if path.extension().is_some_and(|e| e == "rs") { out.push(path); } } + Ok(()) } /// The workspace's `crates/` directory, derived from this crate's manifest dir @@ -150,7 +157,12 @@ fn string_literals(src: &str) -> Vec { while h < b.len() && b[h] == b'#' { h += 1; } - if h > i + 1 && h < b.len() && b[h] == b'"' { + // `h > i + 1` here would demand at least one `#`, so a + // ZERO-hash `r"..."` fell through to the ordinary-string branch + // and had its backslashes unescaped. In valid Rust an `r` + // immediately followed by `"` is always a raw string, so the hash + // count may be zero. + if h < b.len() && b[h] == b'"' { let hashes = h - (i + 1); let close = format!("\"{}", "#".repeat(hashes)); if let Some(end) = src[h + 1..].find(&close) { @@ -412,19 +424,25 @@ fn classify_plan(op: &LogicalOperator, grace: &mut Vec, lowered: &m } } -fn main() { +fn main() -> io::Result<()> { let config = GraphConfig::default(); let root = crates_root(); let mut files = Vec::new(); - rust_sources(&root, &mut files); + rust_sources(&root, &mut files)?; files.sort(); - let mut seen: BTreeMap = BTreeMap::new(); + // Literal -> EVERY file carrying it. Storing only the first source made + // `per_source` (and therefore "files carrying a query") count a file only + // when it was the first to introduce a literal, so a file whose every + // query also appears elsewhere vanished from the provenance entirely. + let mut seen: BTreeMap> = BTreeMap::new(); for path in &files { - let Ok(src) = fs::read_to_string(path) else { - continue; - }; + // Propagated, not skipped: a file the census could not read is a + // hole in the corpus, and a hole that reports success is the failure + // this whole arc keeps finding. (A non-UTF-8 `.rs` file would fail + // here — that is correct; it is also not something this tree has.) + let src = fs::read_to_string(path)?; let label = path .strip_prefix(&root) .unwrap_or(path) @@ -432,7 +450,7 @@ fn main() { .into_owned(); for lit in string_literals(&src) { if looks_like_a_query(&lit) { - seen.entry(lit).or_insert_with(|| label.clone()); + seen.entry(lit).or_default().insert(label.clone()); } } } @@ -447,8 +465,10 @@ fn main() { // Provenance per source, so a reader can see WHICH committed file supplied // the corpus rather than taking "62 literals" on trust. let mut per_source: BTreeMap<&str, usize> = BTreeMap::new(); - for file in seen.values() { - *per_source.entry(file.as_str()).or_insert(0) += 1; + for files_with_this_query in seen.values() { + for file in files_with_this_query { + *per_source.entry(file.as_str()).or_insert(0) += 1; + } } for q in seen.keys() { @@ -603,4 +623,68 @@ fn main() { println!(" Whether that is 'negligible' is §7.0's word and the"); println!(" operator's call; the number is the number."); } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::string_literals; + + /// FAILS IF: the raw-string branch demands at least one `#`. + /// + /// A zero-hash `r"..."` then falls through to the ordinary-string branch, + /// which is wrong twice: it processes escapes a raw literal does not have, + /// and it is one more blind spot in the thing that BUILDS the corpus. The + /// census is only ever as honest as its extractor — that is how three + /// files stood in for thirty-three. + #[test] + fn a_zero_hash_raw_string_is_extracted() { + // Source text: let q = r"MATCH (n:P) RETURN n"; + let src = r##"let q = r"MATCH (n:P) RETURN n";"##; + assert_eq!( + string_literals(src), + vec!["MATCH (n:P) RETURN n".to_string()], + "a zero-hash raw string must be extracted verbatim" + ); + } + + /// FAILS IF: a raw literal's backslashes are unescaped on the way out. + /// + /// This is the half that changes the extracted QUERY rather than merely + /// the path taken: through the ordinary-string branch `\d+` arrives as + /// `d+`, so the census would classify a query the tree does not contain. + #[test] + fn a_raw_string_keeps_its_backslashes() { + // Source text: let p = r"\d+"; (RAW, so the content is \d+) + let src = r##"let p = r"\d+";"##; + assert_eq!( + string_literals(src), + vec![r"\d+".to_string()], + "a raw literal's backslashes survive extraction" + ); + } + + /// The paired silent half, so the fix cannot be "treat every string as + /// raw": a HASHED raw string still spans its embedded quotes, and an + /// ORDINARY string still resolves its escapes. A blanket change breaks + /// both, and neither breakage is visible in the headline percentage. + #[test] + fn hashed_raw_and_ordinary_strings_are_unchanged() { + // Source text: let q = r#"MATCH (n) WHERE n.s = "x" RETURN n"#; + let src = r###"let q = r#"MATCH (n) WHERE n.s = "x" RETURN n"#;"###; + assert_eq!( + string_literals(src), + vec![r#"MATCH (n) WHERE n.s = "x" RETURN n"#.to_string()], + "a hashed raw string still spans its embedded quotes" + ); + + // Source text: let q = "a\"b"; + let src = r##"let q = "a\"b";"##; + assert_eq!( + string_literals(src), + vec!["a\"b".to_string()], + "an ordinary string still resolves its escaped quote" + ); + } } From 84c7ebec42c419246a072e6f9d20fb5bd9336a5e Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 16 Sep 2026 13:33:58 +0000 Subject: [PATCH 22/22] census: the disable run found a vacuous test, and I lost work to the trap that names it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two things, both earned by actually running the disables rather than trusting 4dabd92's green. **The zero-hash test could not fail under the fix it named.** With the `h > i + 1` bound restored, `a_zero_hash_raw_string_is_extracted` still PASSED — and that is structural, not a bad fixture: for a literal with nothing to escape, the raw branch and the ordinary-string branch emit byte-identical output, so NO such fixture can separate them. Its doc claimed to be the falsifier. Corrected in place, with the disable result in the comment, rather than reworded into something that sounds right. The real falsifier is `a_raw_string_keeps_its_backslashes` (`["d+"]` vs `["\d+"]`), which is now labelled as such; the zero-hash case stays as the weaker guard it actually is — it still catches a raw branch that matches and forgets to push. **The MAJOR finding had no falsifier at all** until now. `an_unreadable_tree_is_ an_error_not_an_empty_corpus` is it: disable-verified by restoring the `let Ok(...) else { return }` swallow, which fails exactly that test and only it. It walks a NONEXISTENT path rather than a chmod-000 one, because this container runs as root and an unreadable-directory fixture would have passed for the wrong reason — measured, not assumed. Paired silent half: the real tree still walks and finds this file. ⊘ And the process failure, recorded because it is the one the workspace already warns about in as many words: *"Commit BEFORE you disable, not after… the restore is `git checkout `, and that reverts to the last COMMIT, not to the state you started from."* I committed before the FIRST disable and then wrote both of the above as UNCOMMITTED edits before running the second — so the `git checkout` that restored the disable deleted them, and they had to be redone from the transcript. Nothing shipped wrong; the cost was real. The order is commit → disable → checkout, every time, and "I already committed once" is not the same as "the work under test is committed". Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX --- .../lance-graph/examples/w0b_corpus_census.rs | 64 ++++++++++++++++--- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/crates/lance-graph/examples/w0b_corpus_census.rs b/crates/lance-graph/examples/w0b_corpus_census.rs index 5d634cbc5..f28d8ac4c 100644 --- a/crates/lance-graph/examples/w0b_corpus_census.rs +++ b/crates/lance-graph/examples/w0b_corpus_census.rs @@ -629,15 +629,57 @@ fn main() -> io::Result<()> { #[cfg(test)] mod tests { - use super::string_literals; + use super::{crates_root, rust_sources, string_literals}; + use std::path::{Path, PathBuf}; - /// FAILS IF: the raw-string branch demands at least one `#`. + /// FAILS IF: a traversal error is swallowed instead of propagated. /// - /// A zero-hash `r"..."` then falls through to the ordinary-string branch, - /// which is wrong twice: it processes escapes a raw literal does not have, - /// and it is one more blind spot in the thing that BUILDS the corpus. The - /// census is only ever as honest as its extractor — that is how three - /// files stood in for thirty-three. + /// The falsifier for the MAJOR finding. The old body was + /// `let Ok(entries) = fs::read_dir(dir) else { return; }`, which yields + /// `Ok(())` over an empty corpus — so a census that could not read the + /// tree reported a clean result and §7.0's STOP gate was cleared on + /// nothing. Disable-verified: restoring that swallow fails exactly this + /// test, and only this one. + /// + /// A NONEXISTENT path, not an unreadable one, on purpose: this container + /// runs as root, where `chmod 000` does not deny a read, so a permissions + /// fixture would pass for the wrong reason. Absence errors for every uid. + #[test] + fn an_unreadable_tree_is_an_error_not_an_empty_corpus() { + let mut out = Vec::new(); + let missing = Path::new("/nonexistent-path-for-the-w0b-census-falsifier"); + assert!( + !missing.exists(), + "the fixture path must really be absent, or this proves nothing" + ); + assert!( + rust_sources(missing, &mut out).is_err(), + "a tree that cannot be walked must be reported, not counted as empty" + ); + + // The paired silent half: a real tree still walks, and finds this very + // file. Without it, an `Err(_)` for everything would also pass above. + let mut real: Vec = Vec::new(); + rust_sources(&crates_root(), &mut real).expect("the real tree walks"); + assert!( + real.iter().any(|p| p.ends_with("w0b_corpus_census.rs")), + "the walk finds the census's own source" + ); + } + + /// FAILS IF: a zero-hash `r"..."` is not extracted at all — a raw branch + /// that matches and then forgets to push, say. + /// + /// ⊘ It does NOT falsify the zero-hash fix, and the disable run is what + /// said so: with the `h > i + 1` bound restored this test still PASSED. + /// For a literal with nothing to escape, the raw branch and the + /// ordinary-string branch produce byte-identical output, so no such + /// fixture can tell them apart — by construction, not by oversight. Its + /// first doc comment claimed to be the falsifier; the claim was wrong and + /// is corrected here rather than quietly reworded. + /// + /// The falsifier is [`a_raw_string_keeps_its_backslashes`] — the only + /// case where the two branches disagree. #[test] fn a_zero_hash_raw_string_is_extracted() { // Source text: let q = r"MATCH (n:P) RETURN n"; @@ -651,9 +693,11 @@ mod tests { /// FAILS IF: a raw literal's backslashes are unescaped on the way out. /// - /// This is the half that changes the extracted QUERY rather than merely - /// the path taken: through the ordinary-string branch `\d+` arrives as - /// `d+`, so the census would classify a query the tree does not contain. + /// **The falsifier for the zero-hash fix** — disable-verified: restoring + /// the `h > i + 1` bound fails exactly this test, `["d+"]` against + /// `["\\d+"]`. It is the half that changes the extracted QUERY rather than + /// merely the path taken, so the census would otherwise classify a query + /// the tree does not contain. #[test] fn a_raw_string_keeps_its_backslashes() { // Source text: let p = r"\d+"; (RAW, so the content is \d+)