Skip to content

Two measured corrections: the DisMech oracle population, and the academic carve fill - #975

Merged
AdaWorldAPI merged 4 commits into
mainfrom
claude/lance-graph-stage-3-recovery-2wrdbd
Aug 21, 2026
Merged

Two measured corrections: the DisMech oracle population, and the academic carve fill#975
AdaWorldAPI merged 4 commits into
mainfrom
claude/lance-graph-stage-3-recovery-2wrdbd

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

Two corrections, both found by measuring a claim rather than inheriting it, and both landing as append-only board entries plus the narrow fix each implies. No bits move; no API changes.

1. The DisMech "ORACLE population" is 2,489 edges, not 3,978

E-DISMECH-CORPUS-CENSUS-1 (2026-08-20) established the causal_link_type census and stands — 9,073 / 4,539 / 3,978 / 408, total 17,998. One sentence of it does not:

IndirectKnownIntermediates (3,978) is the ORACLE population — the source names the mediators, so they can be hidden and recovery measured.

Measured on the same 2,100-file corpus:

measured
INDIRECT_KNOWN_INTERMEDIATES 3,978
…carrying ≥1 named intermediate 2,489
…with no intermediate_mechanisms key at all 1,489 (37.4%)
distinct mediator strings 3,048
…that are an exact node reference 45 (1.5%)
string length median 4 words, mean 5.2

The mediators are prose — "Classical-pathway inhibition yields serum resistance, permitting spirochete survival during hematogenous dissemination." — not addresses into the 48,467 distinct mechanism names the corpus carries.

Three consequences: the oracle population is 2,489; the 1,489 label-only edges are neither oracle nor restraint control and need a third bucket or they poison a gold set in both directions; and Recall@k over a mediator-identity candidate list has nothing to score against until a gold set is built by a path that cannot leak — label matching alone grounds 59.4%, and the 40.6% residue has to be reported, not dropped.

DismechTopology::source_knows_intermediates() is correctly implemented — it answers a question about the label. Corrected here are the two places that overstate what the label buys: that function's second doc sentence, and the LATEST_STATE summary.

2. The academic carve under-fills — rows are not words

plans/causal-rung-standing-wave-v1.md:465 claims the 20k academic vocabulary "fits the palette256² pair carve NATIVELY — 20480 = 80×256". It does not.

academic_20k.csv has 20,845 rows but only 18,559 distinct surface forms (2,286 duplicates — COCA lists a word once per part of speech), and from_frequency_ranked admits by surface form. The carve fills 18,559 / 20,480 = 90.6%; the last id lands at basin 72 slot 126, so basins 73..79 are empty.

The inference was arithmetic on the wrong noun: 20,845 rows > 20,480 slots looks like a fit. The same plan file notes the Pos multiplicity two paragraphs later without drawing the consequence.

No test could catch it. academic_20k_carve_spans_80_basins asserts exactly the property that fails on real data — pair("w20479") == (79, 255) — and passes, because its fixture is 20,480 synthetic words that are all-distinct by construction. A dedupe-sensitive property tested on a duplicate-free fixture can only confirm the arithmetic it was written from.

Added the companion falsifier: a fixture that actually has something to deduplicate, with an anti-vacuity assertion that it is not duplicate-free. Disable-verified — removing the contains_key guard turns it red (and the pre-existing duplicates_keep_first_id with it); restoring turns both green.

Nothing moves: RESERVE, DON'T RECLAIM means a 90.6%-full carve is correct and addressable. What changes is the claim, and any design that read basin occupancy as a frequency signal.

Artifact

The derived deepnsm-v2 academic COCA codebook was uploaded round-trip-verified (PUT → GET → compare, same discipline as the bake uploader) to lance-graph/codebooks/deepnsm-v2-academic-coca-v1/ — TSV + source CSV + manifest. The TSV states the shortfall in its own header so a consumer cannot pin it without reading it. It reports 18,559 entries, unpadded.

Board hygiene

  • EPIPHANIES.md — two prepended entries (E-DISMECH-KNOWN-INTERMEDIATES-ARE-PROSE-NOT-IDENTITIES-1, E-ACADEMIC-CARVE-UNDERFILLS-ROWS-ARE-NOT-WORDS-1)
  • LATEST_STATE.md — oracle-population correction
  • plans/causal-rung-standing-wave-v1.md — dated correction, original claim retained

Gates

lance-graph-contract 1180/1180 lib + 21 doctests · deepnsm-v2 109/109 · cargo fmt clean · cargo clippy -D warnings clean.


Generated by Claude Code

claude added 2 commits August 21, 2026 03:41
…dentities

E-DISMECH-CORPUS-CENSUS-1 (2026-08-20) established the causal_link_type
census and stands. One sentence of it does not: "the source names the
mediators, so they can be hidden and recovery measured".

Measured on the same 2,100-file corpus: 1,489 of the 3,978 label-KNOWN
edges (37.4%) carry no intermediate_mechanisms key at all, and of the
3,048 distinct mediator strings that do exist only 45 (1.5%) are an exact
node reference. The rest are prose with a median length of 4 words.

Consequences recorded in the new entry: the oracle population is 2,489,
not 3,978; the 1,489 label-only edges need a third bucket or they poison a
gold set in both directions; and Recall@k over a mediator-identity
candidate list has nothing to score against until a gold set is built by
an independent path (label matching alone grounds 59.4%, and the 40.6%
residue has to be reported rather than dropped).

DismechTopology::source_knows_intermediates() is correctly implemented --
it answers a question about the label -- so no bits move and no API
changes. Corrected here are the two places that overstate what the label
buys: that function's second doc sentence and the LATEST_STATE summary.

Gates: lance-graph-contract 1180/1180 lib + 21 doctests, fmt clean.
Measured while building the deepnsm-v2 academic codebook for S3.
causal-rung-standing-wave-v1.md:465 claims the 20k academic vocabulary
"fits the palette256 pair carve NATIVELY -- 20480 = 80x256". It does not.

academic_20k.csv has 20,845 rows but only 18,559 distinct surface forms
(2,286 duplicates -- COCA lists a word once per part of speech), and
PaletteVocab::from_frequency_ranked admits by surface form. The carve
fills 18,559/20,480 = 90.6%; the last id lands at basin 72 slot 126, so
basins 73..79 are empty.

The inference that produced the claim was arithmetic on the wrong noun:
20,845 rows > 20,480 slots looks like a fit. The same plan file notes the
Pos multiplicity two paragraphs later without drawing the consequence.

No test could catch it. academic_20k_carve_spans_80_basins asserts exactly
the property that fails on real data -- pair("w20479") == (79, 255) -- and
passes, because its fixture is 20,480 synthetic words that are all-distinct
by construction. A dedupe-sensitive property tested on a duplicate-free
fixture can only confirm the arithmetic it was written from.

Added the companion falsifier: a fixture that actually has something to
deduplicate, pinning that duplicates consume ranks but not slots, with an
anti-vacuity assertion that the fixture is not duplicate-free. Disable-
verified -- removing the contains_key guard turns it red (and the
pre-existing duplicates_keep_first_id with it); restoring it turns both
green.

Nothing moves: RESERVE-DON'T-RECLAIM means a 90.6%-full carve is correct
and addressable. What changes is the claim, and any design that read basin
occupancy as a frequency signal or assumed basin 79 was populated.

Artifact uploaded round-trip-verified to
lance-graph/codebooks/deepnsm-v2-academic-coca-v1/ (TSV + source CSV +
manifest); the TSV states the shortfall in its own header so a consumer
cannot pin it without reading it. It reports 18,559 entries, unpadded.

Gates: deepnsm-v2 109/109, fmt clean, clippy -D warnings clean.
@coderabbitai

coderabbitai Bot commented Aug 21, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b641ee19-e8a7-49ba-919e-b73b25d84477


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cursor

cursor Bot commented Aug 21, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_c73812ff-78fa-46dc-a050-0bec0a600a29)

@AdaWorldAPI
AdaWorldAPI marked this pull request as ready for review August 21, 2026 03:49

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3fa7acb451

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .claude/board/LATEST_STATE.md Outdated
Comment on lines +10 to +12
label-KNOWN set is NOT the oracle population: 1,489 of the 3,978 (37.4%)
name no mediator at all, so the usable oracle is **2,489** —
`E-DISMECH-KNOWN-INTERMEDIATES-ARE-PROSE-NOT-IDENTITIES-1` (2026-08-21).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Ground mediator identities before calling the oracle usable

For mediator-identity Recall@k experiments, the 2,489 non-empty edges are not yet a usable oracle: this commit's own census says only 45 of 3,048 distinct mediator strings are exact node references and that 40.6% remain ungrounded even after label matching. Treating all 2,489 as usable gold will either compare candidate identities against prose or silently discard the unresolved residue, corrupting the reported recall; describe this as the population requiring grounding rather than the usable oracle.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, and this is the sharper of the two — "usable oracle" was the wrong noun and the numbers in the same commit contradict it.

Reworded to the population REQUIRING GROUNDING, with the reason inline rather than left implicit: 45 of 3,095 distinct mediator strings are exact node references (1.5%); label matching grounds 1,834 (59.3%) and leaves 1,261 (40.7%) as ungrounded prose. Both failure modes you name are now stated where the number is — comparing candidate identities against prose, or silently discarding the residue — so a consumer can't read 2,512 as a gold set.

The count also moved: 2,512, not 2,489 (see the other thread — the line-scanner was wrong, the structural parser corrects it). The grounding ratio is essentially unchanged, which is the part that matters here: the population is ~⅔ of the label-KNOWN set and roughly ⅗ groundable, so the residue has to be reported rather than dropped in any Recall@k that uses it.

Fixed in 5577728.


Generated by Claude Code

Comment on lines +131 to +132
/// over the 2,100-file corpus, **1,489 of the 3,978 label-KNOWN edges
/// (37.4%) carry no `intermediate_mechanisms` key at all** — the source

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Reconcile the impossible corpus and subset counts

The new corpus-wide count implies 2,489 label-KNOWN edges have intermediates, but the same module documents pathophysiology[].downstream[] as a subset of that corpus with 2,497 such edges (lines 167–182). A subset cannot contain eight more qualifying edges than the full census, so at least one parser scope or count is wrong; consumers cannot reliably construct the gold population until these measurements are reconciled.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed, and you were right without needing the corpus — a subset cannot exceed the whole, so at least one count had to be wrong. It was mine.

The 2,489 came from a throwaway Python line-scanner. Re-measured with the structural parser that already existed in dismech-rs (dismech_oracle_census over graph::build_causal_graph, whose edge already carries intermediate_mechanisms: Vec<String>), cross-checked against an independent pyyaml parse — identical on every figure:

line-scan structural
label-KNOWN with ≥1 mediator 2,489 2,512 (63.1%)
label-KNOWN naming nothing 1,489 1,466 (36.9%)
distinct mediator strings 3,048 3,095

The subset figure (2,497) was correct all along. There is no contradiction once mine is right: 2,512 corpus-wide against 2,497 in pathophysiology[].downstream[], the 15-edge difference sitting in influences_mechanisms (115 label-KNOWN edges) and sequelae (19). The doc now states that scope relationship explicitly so the next reader doesn't have to re-derive it.

The census line also reproduces the board's own E-DISMECH-CORPUS-CENSUS-1 exactly (9,073 / 3,978 / 4,539 / 408), which is the anti-vacuity check that the binary reads the corpus it claims to.

One finding fell out that neither pass had: 92 INDIRECT_UNKNOWN_INTERMEDIATES edges DO name mediators — the source contradicting its own label. Neither oracle nor restraint control; left in the control they read as hallucinated closure by the benchmark's own definition. Recorded.

Fixed in 5577728.


Generated by Claude Code

claude added 2 commits August 21, 2026 03:53
…arrative

I reported to the operator that "no ppr, personalized_page*, bm25, rrf, or
community function exists in the workspace" and that "AriGraph appears only
as narrative in doc comments". Both are false.

crates/lance-graph/src/graph/arigraph/ is 15 modules, ~327 KB:
PersonalizedPageRank + personalized_pagerank(), Bm25Index::{build,score,
rank}, reciprocal_rank_fusion(), Communities, markov_soa, EpisodicBasins,
WitnessCorpus, retrieval, triplet_graph, orchestrator, and five more, all
re-exported from mod.rs.

Two compounding causes. The pattern `fn .*ppr` matches `approx` ("ppr" is a
substring of a-p-p-r-o-x), so every approx() test helper in jc, holograph
and sigker matched while the real functions -- spelled personalized_pagerank
and reciprocal_rank_fusion -- matched nothing; bm25 lives in the type name,
not the function name. Then head -20 pushed community.rs's 5 genuine hits
off the end. A noisy pattern with full output would have shown them; a clean
pattern with a limit would have found them first. Jointly they produce a
confident false negative.

The rule: searching for a function's NAME is not searching for a CAPABILITY.
find . -path "*arigraph*" would have ended it in one call with no guess about
spelling. And never conclude absence from a limited-output search -- absence
is a claim about the whole set, a head reads a prefix of it.

The correct state was already on this board under E-ARIGRAPH-IS-AN-ISLAND:
every module exists and tests green, the chain is open at the joints,
HotWitness is todo!(). I cited that entry as prior art for a different claim
without reading it, and it contained the correction to the claim I was
making in the same breath.

This matters beyond the error: absent and unwired have opposite remedies.
Absent means build the organs. Unwired means build nothing and close the
seam. I recommended the expensive one.

Second instance of a class the board already names -- "a false negative
manufactured by the intake" (the sorted-histogram gate, codex P1 on #876) --
with a disjoint mechanism, which makes it a pattern rather than an anecdote.
…at exists

Codex P1 on #975 caught this structurally, without the corpus: the module
documents pathophysiology[].downstream[] as a SUBSET with 2,497 mediator-
bearing edges, and I had written 2,489 corpus-wide. A subset cannot exceed
the whole, so at least one count was wrong. Mine was.

The counts came from a throwaway Python line-scanner. Re-measured with
dismech-rs's dismech_oracle_census over graph::build_causal_graph, cross-
checked against an independent pyyaml structural parse -- identical on every
figure:

  label-KNOWN with >=1 mediator   2489 -> 2512 (63.1%), 549 diseases
  label-KNOWN naming nothing      1489 -> 1466 (36.9%)
  distinct mediator strings       3048 -> 3095
  exact node references             45 ->   45 (1.5%) unchanged
  groundable by label alone      59.4% -> 59.3% (1834)
  ungrounded prose               40.6% -> 40.7% (1261)
  UNKNOWN_INT that DO name         --  ->   92  (missed entirely)

No contradiction once the number is right: 2,512 corpus-wide against 2,497
in the downstream subset, the 15 sitting in influences_mechanisms (115) and
sequelae (19). Every qualitative claim survives; magnitudes moved under 1%.

Also addresses the second P1: 2,512 is now described as the population
REQUIRING GROUNDING, never a usable oracle. Ranking candidate identities
against it ungrounded either compares identities to prose or silently drops
the 40.7% residue -- both corrupt any reported recall.

And a third finding neither pass had: 92 INDIRECT_UNKNOWN_INTERMEDIATES
edges DO name mediators, contradicting their own label. Neither oracle nor
restraint control; left in the control they read as hallucinated closure.

Gates: lance-graph-contract 1180/1180, fmt clean.
@AdaWorldAPI
AdaWorldAPI merged commit 4a43698 into main Aug 21, 2026
7 checks passed
AdaWorldAPI pushed a commit that referenced this pull request Aug 21, 2026
Both merged PRs shipped types, so neither is discharged by the Termination
clause. #974's obligation was missed at merge on 2026-08-20 and is recorded
late rather than silently skipped; its entry says so.

PR_ARC_INVENTORY: two prepended entries with Added / Locked / Deferred /
Docs / Review / Confidence. #974's carries the source-side-only ruling, the
fail-closed parse, and the citation-identity falsifier, plus an explicit
Superseded-by-#975 line for the one doc claim that did not survive. #975's
carries the three findings, the two codex P1s, and the two rules the session
paid for: absent is not unwired and their remedies are opposite; a
measurement a committed parser can make must not be made by an ad-hoc script.

LATEST_STATE: the #974 heading becomes a merged-PR entry and #975 is added
above it, including the AriGraph correction as a standing warning -- the
15 shipped modules must not be rebuilt under a new name by a session that
greps for a function spelling and concludes absence.
AdaWorldAPI added a commit that referenced this pull request Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants