From fd1034c7b04a483f5b0670d98f50b997df4e0bbb Mon Sep 17 00:00:00 2001 From: Jer Miller Date: Wed, 5 Aug 2026 13:43:36 -0600 Subject: [PATCH] declare the facet store as a journal-io wrapper, and record the resolution-door change The facet store crate reaches the durable-write API legitimately (atomic writes, containment, malformed-data policy, directory listing) but was not added to the allowed-wrappers list, so the dependency gate failed for every build on the shared branch. Additive: one name, no existing entry changed, the ban itself untouched. entity_resolution_door.json records the owner-visible difference between the two entity-resolution doors over the recorded matching corpus, both columns produced by the native implementation. The routes are served today by the door that does not pre-normalize and silently auto-picks low-confidence matches; moving them onto the mutation-safe path changes 27 of 65 vectors, 19 of which stop guessing and ask instead. None resolves to a different entity. Eight more keep an identical outcome while losing their closest-candidate list, which is the class an outcome-keyed review cannot see -- hence the separate list in the file. --- core/deny.toml | 2 +- core/fixtures/entity_resolution_door.json | 436 ++++++++++++++++++++++ 2 files changed, 437 insertions(+), 1 deletion(-) create mode 100644 core/fixtures/entity_resolution_door.json diff --git a/core/deny.toml b/core/deny.toml index 69a7df766..646d322bf 100644 --- a/core/deny.toml +++ b/core/deny.toml @@ -25,7 +25,7 @@ deny = [ { name = "cpython" }, { name = "aws-lc-rs" }, { name = "aws-lc-sys" }, - { name = "solstone-core-journal-io", wrappers = ["solstone-core-segment", "solstone-core-sol-client", "solstone-core-sol-link", "solstone-core-entity", "solstone-core-observer-delete", "solstone-core-ingest-resolve", "solstone-core-depict", "solstone-core-callosum"], reason = "durable journal I/O primitives are owned by the native segment write door, sol-client and local-link security authorities, the read-only entity-store authority, the observer-delete authority, the ingest-manifest and quarantine writer authority, the still-image depiction writer, and the durable event-append authority in this wave" }, + { name = "solstone-core-journal-io", wrappers = ["solstone-core-segment", "solstone-core-sol-client", "solstone-core-sol-link", "solstone-core-entity", "solstone-core-observer-delete", "solstone-core-ingest-resolve", "solstone-core-depict", "solstone-core-callosum", "solstone-core-facets"], reason = "durable journal I/O primitives are owned by the native segment write door, sol-client and local-link security authorities, the entity-store and facet-store authorities, the observer-delete authority, the ingest-manifest and quarantine writer authority, the still-image depiction writer, and the durable event-append authority in this wave" }, ] [graph] diff --git a/core/fixtures/entity_resolution_door.json b/core/fixtures/entity_resolution_door.json new file mode 100644 index 000000000..87181bc33 --- /dev/null +++ b/core/fixtures/entity_resolution_door.json @@ -0,0 +1,436 @@ +{ + "note": "The owner-visible difference between the two entity-resolution doors, measured over every vector in entity_matching.json. Both columns are produced by the native implementation: the old door is the matcher called with the raw query, accepting a match at ANY tier; the new door is the mutation-safe resolution path, which pre-normalizes the query and refuses low-confidence matches instead of guessing.", + "why_this_file_exists": "The reference serves its entity routes through the old door, so moving them onto the mutation-safe path changes what an owner is told. This file enumerates that change so it can be reviewed as a whole rather than discovered one route at a time.", + "vector_source": "entity_matching.json", + "vector_count": 65, + "counts": { + "total": 27, + "silently_guessed_now_asks": 8, + "found_nothing_now_asks": 11, + "same_entity_stronger_tier": 8, + "now_asks_the_owner": 19, + "resolve_to_a_different_entity": 0 + }, + "outcome_identical_candidate_list_emptied": { + "fixture_indices": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 40 + ], + "count": 8, + "why_this_list_is_separate": "On these the outcome is no-match on BOTH doors, so any enumeration keyed on the outcome cannot see them. The old door still returned a closest-candidate list and the new door returns none, so the response body changes while the outcome does not. A route surfacing those candidates to an owner loses them silently." + }, + "when_this_file_reddens": "A later failure means one of the two doors changed behavior. Re-measure both columns and decide deliberately; do not regenerate this file to absorb the change. Every entry is reachable by a name a person could type today.", + "entries": [ + { + "fixture_index": 6, + "query": "Roberta", + "change_class": "silently_guessed_now_asks", + "old_door": { + "outcome": "resolved", + "tier": 5, + "entity_id": "roberta_kim" + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 7, + "query": "Robert", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 8, + "query": "Jose Garcia", + "change_class": "silently_guessed_now_asks", + "old_door": { + "outcome": "resolved", + "tier": 6, + "entity_id": "jose_garcia_marquez" + }, + "new_door": { + "outcome": "ambiguous", + "tier": 6, + "entity_id": null + } + }, + { + "fixture_index": 9, + "query": "Maria Sanchez", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 6, + "entity_id": null + } + }, + { + "fixture_index": 20, + "query": "Müller Werke", + "change_class": "same_entity_stronger_tier", + "old_door": { + "outcome": "resolved", + "tier": 2, + "entity_id": "muller_werke" + }, + "new_door": { + "outcome": "resolved", + "tier": 1, + "entity_id": "muller_werke" + } + }, + { + "fixture_index": 25, + "query": "firefly labs", + "change_class": "same_entity_stronger_tier", + "old_door": { + "outcome": "resolved", + "tier": 2, + "entity_id": "firefly_labs" + }, + "new_door": { + "outcome": "resolved", + "tier": 1, + "entity_id": "firefly_labs" + } + }, + { + "fixture_index": 26, + "query": "firefly labs", + "change_class": "same_entity_stronger_tier", + "old_door": { + "outcome": "resolved", + "tier": 2, + "entity_id": "firefly_labs" + }, + "new_door": { + "outcome": "resolved", + "tier": 1, + "entity_id": "firefly_labs" + } + }, + { + "fixture_index": 27, + "query": "ffluent works", + "change_class": "same_entity_stronger_tier", + "old_door": { + "outcome": "resolved", + "tier": 2, + "entity_id": "ffluent_works" + }, + "new_door": { + "outcome": "resolved", + "tier": 1, + "entity_id": "ffluent_works" + } + }, + { + "fixture_index": 28, + "query": "ffluent works", + "change_class": "same_entity_stronger_tier", + "old_door": { + "outcome": "resolved", + "tier": 2, + "entity_id": "ffluent_works" + }, + "new_door": { + "outcome": "resolved", + "tier": 1, + "entity_id": "ffluent_works" + } + }, + { + "fixture_index": 29, + "query": "µ-lab research", + "change_class": "same_entity_stronger_tier", + "old_door": { + "outcome": "resolved", + "tier": 2, + "entity_id": "m_lab_research" + }, + "new_door": { + "outcome": "resolved", + "tier": 1, + "entity_id": "m_lab_research" + } + }, + { + "fixture_index": 30, + "query": "µ-lab research", + "change_class": "same_entity_stronger_tier", + "old_door": { + "outcome": "resolved", + "tier": 2, + "entity_id": "m_lab_research" + }, + "new_door": { + "outcome": "resolved", + "tier": 1, + "entity_id": "m_lab_research" + } + }, + { + "fixture_index": 33, + "query": "firefly labs", + "change_class": "same_entity_stronger_tier", + "old_door": { + "outcome": "resolved", + "tier": 2, + "entity_id": "xx_opaque_identity" + }, + "new_door": { + "outcome": "resolved", + "tier": 1, + "entity_id": "xx_opaque_identity" + } + }, + { + "fixture_index": 37, + "query": "Barth Kensington", + "change_class": "silently_guessed_now_asks", + "old_door": { + "outcome": "resolved", + "tier": 7, + "entity_id": "bartholomew_kensington" + }, + "new_door": { + "outcome": "ambiguous", + "tier": 7, + "entity_id": null + } + }, + { + "fixture_index": 38, + "query": "Barth Kensington", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 7, + "entity_id": null + } + }, + { + "fixture_index": 39, + "query": "Jonathon Smythe", + "change_class": "silently_guessed_now_asks", + "old_door": { + "outcome": "resolved", + "tier": 8, + "entity_id": "jonathan_smythe" + }, + "new_door": { + "outcome": "ambiguous", + "tier": 8, + "entity_id": null + } + }, + { + "fixture_index": 42, + "query": "Robert", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 44, + "query": "Robert", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 46, + "query": "Roberta", + "change_class": "silently_guessed_now_asks", + "old_door": { + "outcome": "resolved", + "tier": 5, + "entity_id": "roberta_kim" + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 48, + "query": "Alice", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 50, + "query": "Alice", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 52, + "query": "Jose", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 54, + "query": "Jose", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 56, + "query": "Maria", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 58, + "query": "Maria", + "change_class": "found_nothing_now_asks", + "old_door": { + "outcome": "no_match", + "tier": null, + "entity_id": null + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 60, + "query": "İstanbul", + "change_class": "silently_guessed_now_asks", + "old_door": { + "outcome": "resolved", + "tier": 5, + "entity_id": "istanbul_metal_works" + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 62, + "query": "Istanbul", + "change_class": "silently_guessed_now_asks", + "old_door": { + "outcome": "resolved", + "tier": 5, + "entity_id": "istanbul_metal_works" + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + }, + { + "fixture_index": 64, + "query": "Straße", + "change_class": "silently_guessed_now_asks", + "old_door": { + "outcome": "resolved", + "tier": 5, + "entity_id": "strasse_handels_gmbh" + }, + "new_door": { + "outcome": "ambiguous", + "tier": 5, + "entity_id": null + } + } + ] +} \ No newline at end of file -- 2.51.2