Repository navigation
Conversation
…t its map ADR-0067 records the owner's direction of 2026-11-08: Latence becomes a traceable semantic-resolution and ontology engine that runs standalone and as a sidecar to Metis. Warehouse metadata (Unity Catalog, metric views) is a new input modality; the text path and Graph Completion stay, and the extraction stack is re-selected against a recorded baseline. ADR-0068 removes query-time retrieval tooling, hyperedges and Context Enrichment. Embedders stay only as a resolution signal. ADRs 0039, 0048-0053 and 0056-0059 carry a superseded notice; the index, nav and the four front-door ADR counts move from 65 to 67. The route is charted as a wayfinder map in .scratch/semantic-sidecar/: 19 tickets (6 research, 4 tasks, 9 grillings) with blocking wired. The carve-out inventory (07) is resolved from a read-only sweep of the tree; the six research tickets are running. Verified: test_front_door_truthfulness, test_publish_readiness, test_adr_page_map_carriage_currency, test_continuity_statement and test_perf_results_doc pass; mkdocs build --strict reports only the offline Mermaid CDN check.
|
The job fails in its first step, before any test runs:
No fix exists on
Either way the lane keeps exercising a real Generated by Claude Code |
Every product traces answers, not semantic elements, and the auto-drafting tools lose curation on rebuild. The map gains the positioning and the three demo claims the engine must prove.
…ecar map The bottlenecks are the linker and per-chunk LLM induction, not extraction. The bake-off shortlist starts from GLiNER-Relex plus the bi-encoder, with offset grounding and entailment checks against fabricated relations.
… tickets Schema matching: keep the statistical core keyed on UC ids and add five signals that send no values out. Entity resolution: embeddings retrieve, cross-encoders decide, calibrated bands with an LLM only in the review band, and human must-links and cannot-links replayed first as hard vetoes.
No method is good enough to auto-accept; warehouse constraints outrank models. Emit OWL 2 QL, SHACL 1.1, SKOS, PROV-O and SSSOM, with named graphs now and RDF 1.2 later. P4 is sketched as an OntologyProposal contract over ten stages.
The research wave (01-06) is complete. Reading needs no system tables; metric views are GA; write-back has no staging, so proposals live in the engine's store; the overlay key is table_id plus the field name. The first grillings (10, then 11) are unblocked.
test_intra_op_threads_config_override asked for 4 intra-op threads and asserted [4], but resolve_intra_op_threads clamps an explicit cap to os.cpu_count(). GitHub's macos-latest runner has 3 cores, so the provider correctly set 3 and the test failed ([3] == [4]) on that lane. The test now pins os.cpu_count() to 128, the same idiom test_perf_hardware_derived_defaults.py uses, so it checks what it claims (an explicit override is honoured) on any runner. The clamp itself stays covered by test_perf_seam.py::test_resolve_intra_op_threads_default_and_clamp. Verified: with os.cpu_count forced to 3 the test was red before ([3] == [4]) and is green after; the file's 56 tests pass; ruff check and strict mypy on latence-extract-gliner2 are clean.
|
This PR didn't cause it: the test depends on how many cores the runner has. The fix is in this PR as its own test-only commit,
Generated by Claude Code |
…ead-cap tests Four thread-cap tests failed on the 4-vCPU ubuntu runner (py3.11) and on any Linux or 3.13+ host with fewer than 8 cores: test_perf_load_choreography::test_gliner_load_runs_the_whole_sequence_in_order test_perf_load_choreography::test_gliner2_caps_intra_op_threads_before_importing_the_backbone test_perf_torch_runtime::test_st_load_runs_the_whole_sequence_in_order test_gliner2_pii_thread_cap::test_redaction_gliner2_caps_intra_op_threads_at_load Their pin helpers set only os.cpu_count, but the derived default goes through effective_cpu_count(), which prefers os.process_cpu_count (3.13+) and os.sched_getaffinity (Linux) over cpu_count. The pin was inert there, so the default derived from the real host (4) instead of the pinned 64 (cap 8). The three helpers now pin all three probes, the idiom test_perf_hardware_derived_defaults.py already uses. Test-only; no provider code changes. Verified: the four tests failed locally on a 4-core Linux py3.13 host exactly as in CI and pass after; 333 thread/perf tests across latence-core, latence-extract-gliner2 and latence-pii-gliner2 pass; ruff check and strict mypy on both packages are clean.
|
Cause. Each of these tests pins the core count by overriding Fix. The three pin helpers now override all three functions. That is the same approach Checked locally on a 4-core Linux host with Python 3.13:
Generated by Claude Code |
…cides Adds the candidate resolution design (design/resolution-at-scale.md): anchor-first linking with NIL clustering, multi-pass blocking, calibrated three-band scoring under Learn-then-Test, constrained clustering, collective evidence, schema-first relation resolution, a decisions store replayed every run, and two execution scales (single-node metadata, Spark instance level). New tickets: - 20 prototype: resolution feasibility spike, go/no-go, measuring machine precision and expert effort; - 21 research: relation resolution and canonicalization at scale (running); - 22 prototype: the expert resolution workbench (UI/UX). 13 now waits on 20 and 21, 14 on 21, 16 on 22. The map's Notes record two owner principles: resolution is the critical path, and the machine prepares while the expert decides.
…o the design note One edge per fact via aggregation, EDC-style definition matching per distinct (label, head class, tail class) triple, domain and range as vetoes, unmapped relations as proposals, contradictions to review, joint ER bounded to two rounds, and UC foreign keys and joins as schema-level properties.
Owner decision 2026-11-08. v1 is built, measured and gated in English only. The German items found in research (a German gold set, compound splitting, DE labels) move to Not yet specified as the German extension. Designs stay language-neutral. Open tickets 08, 18 and 20 and the design note are updated; resolved tickets keep their findings as the record.
Auto-accept precision must be at least 0.95 under Learn-then-Test. There is no expert-capacity bar during development: the owner judged it too vague and an obstacle the dev phase doesn't need. Review-band rate and expert minutes are still reported, but gate nothing yet.
Metrics (pairwise and B-cubed from the contingency table), isotonic calibration, fixed-sequence Learn-then-Test accept and reject bands, constrained clustering that never crosses a cannot-link, stable ids by overlap. Seven checks pass, including the LTT guarantee on a known distribution and abstention when scores carry no signal.
Seeded English master-data estate (positives: legal-form variants, abbreviations, acronyms, typos, missing fields, formatted ids; hard negatives: same name in another city with another legal form, numbered siblings, divisions). Pipeline: multi-pass DuckDB blocking, Splink Fellegi-Sunter over exactly that candidate set, vetoes, isotonic calibration, LTT bands with a separate stricter reject target, constrained clustering machine-only and with a simulated expert, plain-closure and Latence-cascade baselines.
Part B: English documents with span-level gold and NIL entities, two-retriever candidates (char-ngram TF-IDF, bge-small embeddings), ONNX Runtime CPU cross-encoders, logistic decision over top score, margin and lexical cosine, LTT link/NIL/review bands, NIL clustering. Part A fixes: person normaliser handles NaN, per-stage progress lines, and a DuckDB memory limit on both connections (a 1e5-record run reached 11.7 GB RSS without one).
Parquet returns missing postcodes as float NaN and str(NaN) is 'nan', so every record without a postcode shared one blocking key (18,012 records at 1e5) and, worse, two missing postcodes scored as an exact match. The EM rule on that key generated 164M pairs and exhausted memory and disk. A single _present() check now guards every derived key; the largest postcode block is 126. Earlier estate numbers carried the bug and are being rerun.
The secret scan (detect-secrets, Base64 High Entropy String) flagged the two 26-letter strings that built the neighbour-key map in generate.py. They are not secrets. Rather than add a baseline exception for scratch code, the map is now built from string.ascii_lowercase plus its three swaps (q/w, e/r, a/s). It is the identical mapping, and regenerated data is byte-identical. A comment records its known weakness: most letters map to themselves. Verified: detect-secrets reports 0 findings under the spike directory.
…asses The public 50k benchmark showed that a per-pair guarantee is not a cluster guarantee: accepted pairs were 97% precise, yet machine-only clusters were 63% precise, because with no negative evidence the accepted edges chained transitively. The design's cluster-level check is now implemented: two clusters merge only if their scored crossing pairs average >= 0.5 and none is below 0.05 (unscored pairs are no evidence). Machine-only precision on that set goes 0.633 -> 0.960. Two generic person passes (surname+birth place, postcode) lift pair completeness 0.50 -> 0.69. Two new checks pass.
Final-code results for the synthetic estate (12k with the Latence-cascade baseline, ~1e5) and the public 50k benchmark. Auto-accept precision 0.963, 0.971 and 0.979, each above the 0.95 bar with its lower bound. The 1e6 run is in progress; run_scale.sh drops the /usr/bin/time wrapper, which this host does not have.
… with what is still open
…r list under a certified line The estate build can seed a second source (service accounts of a partner portal, marked as generated in the catalog, the export and the summary), hand its records and the dealers to the resolution engine, and bring the answer into the export: same_as edges with what each rests on, review items, and a summary with the labels it cost and how right it was against the seed. What the dealers showed, each fixed with a test that failed first: - the first stage stopped on an estate without postcodes; - different dealers carry the same name in different towns: a source named as holding no duplicates now has its own pairs ruled out, no cluster holds two of its records, and the scorer sees whether an account fits one master record clearly or two equally; - linking to a master list compares no two records of one source; - names that reuse a few words need a shared-word-and-town candidate pass; - the seed dropped the legal form or the town where that was all that told two dealers apart. On the mirror with the seed: 1,274 accounts, 1,300 labels from the seed's truth, 938 linked to a dealer by the machine, 916 of them right (97.7%), 304 pairs left for review, accept and reject line certified.
…ides it is fitted per domain Label curve on three estates and three seeds: about 600 labels give the automatic merges on the real registers, about 2,500 on noisier names; a certified reject line needs 300 more on its side. A scorer carried from one estate to another finds 26% to 52% of the links where the estate's own labels find 87% to 97%. The person records' cluster precision is 0.916 over three seeds, not the 0.949 of the single seed first reported; the report says so. Report, tickets 13 and 25, the handoff and the notes are updated, with what the dealer link showed about the engine.
…art-of, and which value sits under which The induced model was flat. A pass over it now proposes, from counts alone: roll-ups between value sets (checked in every object that carries both, with the values that break them), value sets that cut the rows the same way, part-of from keys, derived objects that describe an entity, and broader edges between values. Names that may be the same are read against the hierarchy: two manufacturer names under one make is a reason more. On the mirror: 10 roll-up steps, one equivalence, 3 part-of, 3 describes, 390 broader edges. Ticket 25 records the owner's objection, the route to an ontology and the decision on top classes.
…ided by a person What kind of thing each concept is cannot be proved from counts. Two voices propose it: attribute patterns from the catalog, and a language model that is shown names, types, comments and relations and never a row or a value. The top classes are six of our own (owner's decision); the model may put classes between them and the concepts and writes a sentence of definition. Disagreements are kept and marked. Everything is a proposal. The build writes what would leave the estate to classes_prompt.json. The model voice comes either from a recorded answer to that file or from a direct call; the direct call is tested against a stand-in client only and has not reached the service. On the mirror, with a recorded answer: 28 of 39 concepts under 12 classes, 6 contested, 11 left unplaced on purpose.
…nobody approved marked as such Classes and concepts as owl:Class with subclass axioms, relations and attributes as properties with domain and range, part-of as an existential restriction, value sets as SKOS schemes with broader along every roll-up. Identifiers are opaque under the estate's base address. A proposed element carries reviewStatus proposed; a proposed axiom between two settled classes is annotated, not asserted. Master rows, record links and measures are not in the file yet. The tests parse the file back with an RDF library.
95 of 211 dealers carry a dealer group; the step dealer -> dealer group was proposed without a word about the other 116. The step now carries the rows that have the level and says so in its signal. Test written first.
…he host page shows of the ontology
… 26 to 39; ticket 25 resolved with pointers
…im (graph-export/3) What the engine says about an element is a code with parameters from one table (codes.py, schemas/codes.json); a host renders it in its own languages. Text from the catalog or a model is carried with its language and origin. Every element a person can decide carries a digest of what it states. The matcher's evidence is codes too (resolution/2), and the build refuses a code the table does not hold.
…, each with a test that failed first A title that has a value per row of its entity is a name and not a level; a reference to one column of a composite key is a relation, and the concept links two things; a value the data puts under two values gets no edge and the step names it; no two concepts share a label; a key column named after a table is that table's key in every layer; the plural rule; label columns an estate can state. A linking concept is no longer written as a part in the Turtle file.
…the layer and survives a rebuild Every element of all nine kinds is an assertion. A decision is applied only to an element that still states what was decided: a changed proposal is reported as stale. A rejected step leaves before the steps are reduced, so the step it hid comes back; a rejected placement falls to the other voice's class; an approval settles a contested placement. The Turtle file states a step, its broader edges and a part-of plainly only once a person approved them.
…st for the vehicle estate Precision and recall for classes, hierarchy steps, part-of and links, with every wrong proposal and every miss by name. The list is a draft written from the catalog; until a person corrects it and signs it, the numbers are printed and marked as not measured.
…rounds, and takes them from a reviewer The pairs to learn from are asked for first; the two test samples are drawn from the scores once those are answered, and a line is certified only on samples that are answered in full. A reviewer's answers come from the decisions file; where the estate allows it the seed's truth stands in for the rest, and the summary says how many labels a person gave. An answer on a pair decides it; names a reviewer calls the same become one value.
…l, asked once and held under a cost limit The voice goes over the provider's official SDK with a strict answer form and definitions in two languages. A call is made only when what would be sent has changed, never when its worst case is above the limit, and each call is logged with its cost. The voice that had never run is removed. One live run on the synthetic estate is recorded in ticket 31, and its answer is kept as a file.
…nges no status A log of answered questions (usage/1) is matched by name to measures, value sets, entities and relations the model already holds; each match is counted and shown as a signal. What matches nothing is counted and listed. A record that carries a value is refused.
…er for Unity Catalog proven against a stand-in Names and text casts come from the reader, so the same model comes out of a warehouse that quotes with backticks; the mirror's build is byte-identical. The catalog reader lists tables page by page, reads tags, keys and metric views, and runs statements through the statement API with polling and results in parts. A stand-in server that refuses, pages, stalls and fails as the services do holds it to the protocol. Not yet run against a workspace.
… of nine met, two wait for the owner
|
What blocks a fix: a log from a stalled leg. If the leg stalls again and the log is again missing, the next step is to upload pytest's output as an artifact from an Generated by Claude Code |
…nvironment pinned HANDOFF.md described the state before tickets 26 to 33. It now starts with the run in order (inputs, environments, build, page, hand-checked list, real catalog) and says what was verified where. Blocks 2 and 4 were run from nothing and gave the kept export and Turtle file byte for byte. spike/requirements-link.txt pins what the record linker needs; a clean install of it gave the same resolution file. Ticket 34 records the owner's first look and the entity graph added after it.
…n steps What is known (the branch starts at the hosted main, none behind), what is not (commits that exist only on the main machine), what the branch touches in the host, and the three steps before anything is merged.
…ith the one defect they found
The code scan on the pull request flagged the pattern on a value taken from the request (polynomial regular expression on uncontrolled data). The stand-in is a test server; the check is now a plain string test.
…, and tickets for the proposal file for the host, the catalog reader's lineage and what ontology v1 leaves out
|
CI on Every job that ran passed: lint and types, the secret scan, the three Linux test legs (py3.11, 3.12, 3.13) and the stack validation. Not caused by this push. What blocks a green run is macOS runner availability for this repository (the job never starts), which needs a look at the account's Actions settings; no change to the workflow is proposed here, since dropping or skipping the leg would weaken the gate. Generated by Claude Code |
… approved decisions The decision record gives the engine one seam to a host: a reviewable proposal file. Nothing wrote it. `python -m estate propose` now writes it for a build folder, from the export (what every element states now) and the decisions file (what a person decided). Two kinds of entry are written, each from an approved decision in force and each with the decision it rests on (the element, its claim, who, which day): two values of a value set a reviewer called the same, and the names of the records of a master list the estate file names. Never written: a rejected or undecided element; anything seeded, including a pair of values of a value set a seeded object carries; a link between records; a decision made on another statement than the build now makes (listed as stale); a decision without a claim or without a day. The day is read from the decision's line or given on the command line, never made up. The same inputs give the same bytes; every text is quoted, so no reader takes a name or a claim for a number or a date. `build --receipt` reads what the host wrote when it placed a file, and an approved element the receipt lists as placed says in the export since which release of the host's library it is in the semantic layer. Without a receipt the field is absent. It is an optional field of graph-export/3: the host's page already reads it there, and reads one version at a time. Ten tests, each seen failing first. The estate README and the handoff document say how to write the file and what the host does with it.
…e host's tool Ticket 40 records what was built, the done check with what holds and what is still the host's to write, the trial against the host's tool at its final state of 12 Nov (the library it wrote from our file is the host's own release, byte for byte), every choice made where the ticket was open, and what is not done. The map's line for the ticket says the same, and the owner's actions gain the one that puts a person's decisions through it.
…er package, a build with the record linker, and a decided link between records
Summary
This PR records the owner's direction of 2026-11-08, charts the route as a wayfinder map (linked decision tickets), removes the query-time retrieval tooling, and reports the resolution feasibility spike, which the owner decided as go on 2026-11-11. After that decision it adds a scorer fitted on reviewer labels that links two real company registers, and a prototype that induces an ontology over a warehouse estate for a host's read-only screen: concepts and relations, entities, a second source linked to a master list under a certified line, hierarchies the data proves, and a class tree proposed for a person to decide. It also fixes two pre-existing CI test failures, a secret-scan gate whose verdict depended on the network, an erasure gap in
latence purge, a silent empty run on an unfilled stack template, an over-broad manifest redaction and config keys that were ignored in silence, rewrites the front-door pages, and adds a clickable prototype of the expert review workbench as scratch code.The branch history was rewritten once on 2026-11-10 to correct the author field of its commits; content is unchanged.
Decisions (eight ADRs; the Decision Log goes from 65 to 73 records, numbered 0001–0074)
The retrieval removal (ADR-0068 executed)
latence-retrieval,latence-sink-qdrant,latence-spladeandlatence-muveraleave the workspace (34 → 30).latence-coreloses hyperedges, Context Enrichment, graph features, the BM25 / sparse / multi-vector / FDE export signals, redaction survival, the SPLADE index driver, and the protocols, descriptors, conformance cases, CLI group and setup-recipe parts that existed only for them.SCHEMA_VERSIONis 22 andQUALITY_SCHEMA_VERSIONis 21.benchmark/s5,benchmark/serving, the campaign'ss5-retrievalstage and the retrieval docs are removed. About 78,000 lines go.docs/anatomy/04-knowledge-graph-export.md, documents the graph export's files, columns and redaction posture.musiqueandhotpotqaonly fed retrieval benchmarks and leave the campaign's dataset registry, together with the code only they reached. The MuSiQue licence row stays because MuSiQue data is still tracked; the HotpotQA row goes because none is.benchmark/official/,benchmark/official-data/,benchmark/musique-subset/,benchmark/rfc/andbenchmark/enterprise-gold/are deleted: they imported a removed package or read a hyperedge export nothing writes. Their recorded results, question sets and data stay as dated records, each folder with a note. A test fails if a script that could run imports a removed package; one report script underresults/is kept as a record and exempted by name.ConfigErrornaming the key, the Stage and ADR-0068, before anything is written;latence stack checklists them. Unknown keys in general are still allowed: a Provider may read keys the core does not know.ROADMAP.mdand anatomy chapters 2 and 3 are rewritten against the current tree, and everyfile:linereference in the two chapters was re-read (38 corrected). A test fails a listed page whose paragraph names a removed capability without saying it is gone.Front-door pages (owner: the name stays Latence; lead with what exists, then the direction)
README.mdanddocs/index.mdnow open with what the code does today, each claim checked against the tree, and end with a marked section on the decided direction, none of it described as built.CONTEXT.mdgains a section "Decided, not yet in code" for the vocabulary ADR-0069 fixed (ledger, assertion, locator, decision, actor, concept, entity, binding, accept band). The review and reject bands are in no accepted ADR, and the glossary says so.AGENTS.md, and two retrieval pages outside the site navigation.Release gates
RELEASE-GATES.mdrequired SPLADE proven against a live vector store and a graph path proven to retrieve. Those two gates are removed, and a new Gate 6 holds the resolution bars: auto-accept precision of at least 0.95, recall of at least 0.60 at that precision on the synthetic estate, and a text path that beats the recorded baseline.RELEASE-GATES.mdandROADMAP.mdare now under the doc-truth link check.Fixes outside the re-scope
6d2b52c).detect-secretsverified Stripe-shaped strings against the vendor's API and dropped a fixture the vendor reported invalid, so the gate's verdict depended on the network. The gate now scans with verification off, and the one fixture is audited into the baseline.392e51e). A purge left the document's file name, id and content hash in every Corpus Version manifest while the CLI said nothing is retained. A purge now drops every live listing of the document from every Version. The content-addressed id stays as a suppression tombstone; the help text and tutorials say so.latence runon a stack whose placeholders were never filled exited 0 after creating a directory literally named{STORAGE_URI}. It is now refused with aConfigErrorbefore anything is written. Known limits: a missing source folder still gives an empty run with exit 0, and a legitimate config string of the form{UPPER_SNAKE}would be refused.manifest.jsonredacted every key containing "token", which also hid the chunk budget. A closed list of five numeric token-count keys is now shown; every other key containing "token" stays redacted. The owner confirmed the list.--samplehelp and the report labels now say what the figure is. Found and not fixed: the endpoint knob family sweeps a key none of its three Providers reads.run --freshnow redoes a stage whose artifacts are intact. The budget prompt says what the cap does: it is an estimate turned into a call budget, and calls past it fall back to configured labels. Whether it should be a hard stop is left to the owner.abe4a8b). Two legs of the test matrix stalled on 2026-11-10 on unrelated commits; the cause is not found. The test job getstimeout-minutes: 90and pytest getsfaulthandler_timeout = 900, which writes every thread's traceback to the log when one test runs longer than 15 minutes. A readiness test requires both.test_chunking_pathological_input_stays_near_linearcompared one wall-clock sample per size and read 3.3× against a limit of 3.0×. It now takes the fastest of seven interleaved runs per size. It still fails a walk that rescans from the start (3.7×). Test-only.The map:
.scratch/semantic-sidecar/The resolution spike (ticket 20, scratch code, not shipped): report in
.scratch/semantic-sidecar/spike/REPORT.mdDecision. Go (owner, 2026-11-11). Budget for a million records: 4 hours on one 24 GB GPU.
Method. Splink on DuckDB scores candidate pairs; Learn-then-Test certifies an accept and a reject line; the pairs left undecided are scored again by neural models and tested in a second stage; a constrained clusterer builds the entities. Reviewer labels are simulated from the truth.
A million records on a 15 GB machine. Pairs and clusters are held as integer arrays; the matcher's prediction table stays in DuckDB. 989,658 records run end to end in 72 s at 5.4 GB peak memory on 4 CPUs. The method is unchanged: on the 12k estate, the 100k estate and the public 50k set the rewrite gives the same pairs, bands and clusterings as the code before it, and the 12k comparison is a test against a recorded run.
Model arms, measured on 2026-11-11 on one 24 GB GPU (extractor, reranker, two decision models and an embedder, all zero-shot; revisions in the report).
A pass below the reject line (negative result). The best-scored rejected pairs are scored by the model as a stage of their own. It reaches 93 to 95% of the true matches lost below the line and accepts none of them at the bar, at 10⁵ and at 10⁶ records (68 minutes for the whole run, inside the budget).
Two real company registers. 120,192 UK legal-entity records against the UK company register, 102,732 true links, the shared company number withheld; one estate has 302,924 records, one 1,222,924. The data is downloaded where the run happens and is never committed.
run_a.py --learned): boosted trees fitted on the reviewer's labels over the evidence of every pair, calibrated across folds; training labels spread over patterns of evidence; the accept and the reject line each certified on fresh labels from their own side of even odds. Same 5,000 labels, no GPU.How it carries to new data.
Labels from a reviewer (ticket 30). The matcher asks for labels in two rounds: first the pairs it learns from, then two test samples drawn from the fitted scorer's own scores and frozen. A reviewer's label wins over the seed's truth; a pair that was picked by its score can train and decide and is never a test label; with open labels and no truth nothing is linked. The answer file (
resolution/3) says per sample how many labels came from a person.Acronyms (owner's priority, 2026-11-11).
aliases.pygathers the evidence for a short form (the full name in the same thread, a definition in some document, an alias column, the letters alone) and a small ranker fitted on the calibration labels weighs it with popularity and context. On a synthetic set written for it, acronym mentions linked correctly go from 0.1% to 81.8% (97.4% with the full name in the thread, 42.3% with context only). On 685 real annual reports the definition miner finds 6,852 definitions; on hand-checked samples of 80 it was right in 92% before two fixes and 97% after. Linking those definitions to the right filer has not been measured.Research notes with sources and unverified points marked: real data sources and their terms (22), licences of English entity-linking benchmarks (23, one clean candidate, not run), methods for linking company registers (24).
Defects the runs found, each fixed with a test that failed first: the embedder searched with the whole document and retrieved the other organisation a document names; the public person dataset was scored with the organisation question.
Not done: no customer estate and no real text linked end to end; no entity-linking benchmark run; no Spark run; no larger GLiDE variant and no fine-tuned arm; no review-item explanations from the hosted model; the no-duplicates rule has not been measured on the registers or the synthetic estates.
run_a.py --export-reviewwrites the review band as items a reviewer can decide, with a suggestion per pair, and--export-graphwrites the machine clusters as a graph. Both feed the workbench and cover the synthetic estate only.The estate prototype (tickets 25 to 33, scratch code, not shipped):
.scratch/semantic-sidecar/estate/It reads a warehouse estate through one small reader and writes one
graph-export/3file with a JSON Schema, and the same ontology as one Turtle file (OWL 2 QL and SKOS). Measured on a local mirror of a synthetic vehicle and warranty estate (29 objects with the seeded one, 13 metric views). Nothing has run against a Databricks workspace: the Unity Catalog reader has met a stand-in server only.estate seedwrites service accounts of a partner portal into a schema of its own in a copy of the mirror: generated data, marked as such in the catalog comments, the export and the summary. The build hands dealers and accounts to the resolution engine and brings its answer into the export assame_asedges with the probability and what each rests on, review items, and a summary. 938 of 1,274 accounts are linked to a dealer under a certified line, 916 of them right (97.7%), which is 85% of the accounts that belong to a dealer; 304 pairs are left for a person. It cost 1,300 labels, taken from the seed's truth in place of a reviewer, and the export says so. Run once with 64 answers written as a reviewer would give them: 60 training and 2 test labels and 31 links were then a person's, and one machine link was taken away.broaderedges between values. 9 roll-up steps (market ← dealer group ← dealer; make ← model; make ← manufacturer; system ← component), 4 part-of and links, 301broaderedges, and one value set named as no level because it names single things. Names that may be the same are read against the hierarchy.schemas/codes.json), and a host renders them in its own languages. Free text says who wrote it and in what language.broaderedges drawn under a step with breaking values; two concepts with one label; a key column credited to the wrong one of two tables with the same name. Two of the causes were other than first assumed; the ticket says which.usage/1: measures and dimensions by name, no value) adds "used in N answered questions" to elements the model already holds and lists what was asked for and is not in the model. It creates nothing and changes no status. On this estate the log is the host's 408 golden questions, which are synthetic and written from the same metric views, so the counts say what the host's tests cover.estate scoregives precision and recall per kind against a hand-checked list. The list in the tree is a draft written before the score was run; nobody has checked it, and the command marks its numbers as not measured.HANDOFF.mdin that folder is the owner's run as seven blocks to paste, and says what was verified where.The workbench prototype (ticket 22, scratch code, not shipped):
.scratch/semantic-sidecar/workbench/--rw-*variables.INTEGRATION.mdlists the edits a mount needs.CI test fixes (test-only):
b2db2a5and3a78ee4pin the core-count probes in five thread-cap tests.Licence
Definition of Done
The test that was red
benchmark/s5andbenchmark/serving.--no-verify: red before the change.stack checklists every such key: red before the change.calibrateis not a command, the capability help example names real capabilities, the stage diagram names only stages that exist, the campaign stage needs no earlier export, and every dataset the campaign offers has a plan and a pipeline: each red before its change.--samplehelp says what the flag does;--freshredoes a done stage; the budget prompt says what the cap does: each red before its change.ROADMAP.mdand anatomy chapters 2 and 3 name no removed capability as current: red on each page before its rewrite. The front door states the direction as not built: 7 tests red on the old pages.ROADMAP.md,README.md,docs/index.md,CONTEXT.md,llms.txtand the agent briefing under existing checks (the pages already passed them); the workbench's tests, the acronym resolver's tests and most of the estate prototype's tests (seed, merge of the engine's answer, structure, classes, codes, usage, the score, the catalog reader against its stand-in, the label loop), which were written with the code; the property test that fitted scores are probabilities; the change to the chunking timing test, which failed once on one CI leg and passes locally before and after.Gates
Run on the removal tree before its merge:
ruff check packages benchmark/sota-campaign scripts: exit 0.scripts/typecheck.sh(strict mypy, 30 packages, src and tests): exit 0.PYTHONHASHSEED=0 uv run pytest packages: 4,332 passed, 17 skipped, exit 0.scripts/verify-local.sh, every lane after the secret scan: all passed.uv lock --check: exit 0.Run on the later changes:
ee3686c: the test matrix (three Python versions on Linux, one on macOS), lint, types, secret scan, stack validation, bake-offs, the Airflow lane and the build passed, in both runs. Only the MinIO lane is red (see below). Earlier heads that passed in full:d346eb4,798a6f7,63c41e3,5e3ab6f,5401ddb,5e8a8f4,34e5f8e.c64b5c1one of the two runs lost its Python 3.11 leg to the 90-minute limit; the other run passed on every leg, and the push changed only files under.scratch/. The cause of the stall is still not found (see CI above and the PR comment).40f96b3, has not reported yet. Its five commits change only files under.scratch/semantic-sidecar/.34e5f8e: ruff exit 0; strict mypy on 30 packages exit 0;PYTHONHASHSEED=0 uv run pytest packages: 4,503 passed, 17 skipped, exit 0; secret scan exit 0.scripts/verify-local.shhas not been re-run on the final tree. The Helm templates were not rendered and the compose and Helm commands were not executed (nohelmor docker daemon on the machine).Workbench, spike and estate prototype (scratch code, outside the repository's gates):
spike/requirements-link.txt; a clean install of it gave the kept result byte for byte.HANDOFF.mdwas repeated from nothing and gave the same files.Contracts, packaging, licences
SCHEMA_VERSION21 → 22 andQUALITY_SCHEMA_VERSION→ 21. Nothing after the removal changes a contract's shape.delta.entriesof earlier Corpus Version manifests. The contract's shape is unchanged.{UPPER_SNAKE}placeholder, or one of nine removed config keys, raisesConfigErrorwhere it used to run.latence-campaign run --freshredoes a stage.publishablefield, nowFalsefor every remaining lane.baseline r/stobaseline figure; the keys of the tuned YAML are unchanged.latence-core.fastino/GLiDE-0.4B, is under a vendor community licence, not a permissive one. No model weights are in the repository; using it in a product needs the agreement the owner is arranging. The label-fitted scorer needs no model.Security, secrets, PII
.secrets.baseline.test_kg_export_name_posture.py.classes_prompt.json): names, types, comments, keys and relations, no row and no value. Sending it to a hosted model needs the estate file to allow it and a flag on the command. One such call was made, on the synthetic and public vehicle estate; the key came from the environment's secret store and is in no file.Docs and decisions
README.md,docs/index.md,ROADMAP.mdand theCONTEXT.mdglossary describe the tree after the removal first and state the re-scope as decided direction, none of it built.AGENTS.mdstill opens with the earlier framing.Not run locally
Pipeline e2e on MinIO (s3://)is red on this PR and onmain: the image pull forminio/minio:latestis refused before any test runs. The cause is in a PR comment; the fix is kept out of this PR.mkdocs build --strictstops on one warning: the Mermaid script URL check, which the sandbox cannot reach. The docs workflow's build job passes in CI.HANDOFF.md.