EGM drift report: the EGM.md contracts against the code¶
Run on 2026-10-28 over the 23 EGM.md contracts the EGM bootstrap wrote that
day, before they were first committed. Six reviewers in fresh contexts each
compared a group of contracts with the source and reported only the
differences: WRONG (the contract states something false), MISSING (an
important omission) or IMPRECISE (true but misleading). The findings are
as the reviewers wrote them, with file and line evidence; the contracts were
corrected from them before the first commit, so the line numbers and quotes
refer to that first draft and to the code on main at f9cd36cb.
Findings that point at the code rather than the contract were filed as issues and are not fixed here.
src/sdmxlib/model/EGM.md¶
- [WRONG] "It depends on the standard library and attrs": model modules also import
typing_extensions(codelist.py:11),sdmxlib._time.as_utc(16 modules, e.g.codelist.py:13,header.py:27),sdmxlib.sql(_label_match.py,rollup.py:20),sdmxlib.session(rollup.py:19), andduckdbandpolars(rollup.py:16-17). - [WRONG] "
SdmxConformanceError... (errors.py)":SdmxConformanceErroris defined invalidation.py, as isLossyReadError, which the contract never mentions (validation.py:151,:252). - [WRONG] "
enforce()... emitsImRuleWarningfor each advisory": it emits oneImRuleWarningper artefact carrying every broken advisory, and only after all rules pass; when a rule fails it raises and no advisories run (_invariants.py:105-111). - [WRONG] "
Anystays out of its public signatures":from_dict(cls, data: dict[str, Any])(convert.py:303),Ref.__getattr__ -> Any(ref.py:281),ItemList.to_dict/ArtefactList.to_dict -> dict[Any, T](collections.py:231,:473) andItemExpr.is_in(values: Collection[Any])(expr.py:130) useAny. - [IMPRECISE] "A Ref keeps the resolver that was current when it was built": only the factories (
Ref.unresolved,Ref.of,Ref.to, theto_refconverters) readcurrent(); a bareRef(urn)defaults_resolver=Noneand is never bound;InMemoryRegistry.refbinds its own resolver (ref.py:212,:331,:336,:382;in_memory_registry.py:220). - [IMPRECISE] "
InMemoryRegistryreplaces an entry by URN in both_storeand_by_type, sogetandget_allagree":_internwrites only the new object's type bucket and never removes the URN from another type's, so aGeographicCodelistre-added over aCodelistof the same URN leaves the stale copy inget_all(Codelist)(in_memory_registry.py:164-171,codelist.py:757). - [MISSING]
InMemoryRegistry._resolver, aMapResolverwith a runtime item-lookup cache cleared by every_internthroughforget_items()(_resolvers.py:28-45,in_memory_registry.py:61,:171). - [MISSING]
InMemoryRegistry.get/__contains__answer item URNs throughresolve_item;gettakesexpect=; the registry also hasapplicable_hierarchies,unique_hierarchy,check_binding_driftandvalidate_binding(in_memory_registry.py:173-210,:240-300). - [MISSING]
SdmxRefand theRef.resolved/Ref.boundproperties;UnresolvedRefis also raised by calling the Ref and when its registry is closed (ref.py:257-279,:410). - [IMPRECISE]
ArtefactListis indexed by int, slice, bare id,"AG:ID","AG:ID(ver)",SdmxUrnorSdmxRef, not by an artefact, and is boundedT: Maintainable(collections.py:285-330). - [IMPRECISE] "A
MaintainableArtefactsubclass declaressdmx_package,sdmx_classandmsg_field" is a convention nothing enforces (base.py:34-44). - [IMPRECISE]
_-prefixed model modules are internal to sdmxlib, not tosdmxlib.model:formats/,storage/,local/andbundle/import them;_label_match.pyholds SQL fragments used only byquery/(_label_match.py:1-20). - [MISSING] Exported modules absent from Interface:
expr.py,organisation.py,provision.py,metadata_provision.py, the othermapping.pyartefacts,HierarchyAssociation,AttachmentConstraint,istring.py,annotations.py,link.py,version_rewrite.py,rest_api.py,_tree.py, andversion.is_final/unreferenceable(model/__init__.py:3-129).
src/sdmxlib/query/EGM.md¶
- [IMPRECISE] "A path that crosses a to-many hop compiles to a correlated
EXISTSsubquery, never a join": a membership hop whose only leaf is an equality on the joined key compiles to? = ANY(s0.ancestor_ids)(forward, no facet, insideany) (_compile.py:428-497,:1285). - [IMPRECISE]
FanOutalso provides.every()(NOT EXISTSover a violating child) and thelist,uniqueandcount(where=)aggregates;Quantifiedcarries "any" or "every" (_expr.py:3009-3070,_compile.py:1245-1309). - [IMPRECISE] "Cardinality is derived from key constraints": at runtime it is read off the hop's direction (forward to-one, backward to-many,
member_ofto-many);tests/unit/test_query_edges.pychecks the declarations against the schema (_joins.py:63-70,_edges.py:9-15). - [IMPRECISE]
Query.explainreturns the compiled SQL, a-- binds:line and an optional fetch line; it does not run DuckDBEXPLAIN(query.py:1345-1358). - [IMPRECISE]
unionis a module-level functionunion(first, *rest), not aQuerymethod (query.py:2505,__init__.py:14). - [MISSING] The result types
Select(with its ownorder_by,limit,offset,unique,having,to_sql,explain,columns,collect,stream;Select.filterraises),Grouped(agg/len) andPage(query.py:1966,2031,2086,2274). - [IMPRECISE]
fetch_intoissues the requests and callsstore.add, skipping an artefact that is notSupportsUrnor whoseaddraisesValueError, and returns theRequests; nothing in_execute.pyruns the query, which runs whenQuery._cursor()calls the_preparehookapi/registry.py:760installs (_execute.py:110-166,query.py:639-656). - [IMPRECISE]
fetchissues one request and returns theStructureMessage; onlyfetch_intocallsStore.add(_execute.py:60-81,150-166). - [MISSING] Terminals trigger the REST fetch: every statement goes through
Query._cursor(), which calls_prepare, so any terminal on a REST-backed query,columnsincluded, performs HTTP first (query.py:639-656). - [MISSING] REST-backed queries are scoped to their own fetch through
_fetch_scopeand a compiled scope clause (query.py:658-679,_compile.py:1317). - [IMPRECISE] "Identifiers come only from the edge graph": the observation plane takes names from the
DataflowBindingand sidecar;_partition_valuesand_scope_clauseinterpolate binding and schema names (observations.py:115-135,query.py:1744-1756,_compile.py:1317). - [IMPRECISE]
CrossSourceErroris raised in three places:filterwith anis_in(relation)of another source,intersect/difference, andunion; a relation that cannot report its source is trusted (query.py:845-879,1040-1069,2528). - [MISSING]
ObsQueryrefusesids,urns,pageand the artefact terminals withTypeError(observations.py:532-555). - [MISSING] All compilation routes through
plan_program(self.plan, DUCKDB); a program of more than one step raisesNotImplementedError;DUCKDB,Program,PushandPushdownErrorare unnamed (_pushdown.py:589,637-711,query.py:1324-1343). - [IMPRECISE]
RawSql.columnsalso runsDESCRIBE, andQuery.columnstriggers_preparefirst (raw.py:275-283). - [MISSING]
_rest.pyalso turns an observation query into a/datarequest (DataRequest,data_request_for,requests_for_derived) (_rest.py:178,278,342).
src/sdmxlib/storage/EGM.md¶
- [WRONG] "The only interpolated SQL is the
ATTACHof file paths and the storage version":code_mapandcode_map_for_dsdinterpolate the caller'slanginto SQL (_projections.py:59,readers.py:2850), anduse_sdmx,holds_rows,_trim._rebuild,_delete_artefact_cascade,_columns.table_columnsand_synthetic.distinct_periodsinterpolate identifiers (schema.py:1662,:1690,_trim.py:94-96,writers.py:820,_columns.py:12,_synthetic.py:45). - [IMPRECISE]
get_artefactreturns aLazyCodelist/LazyHierarchyunchecked by default; the facade is checked when it materialises orpartial()runs (readers.py:2668-2679,lazy.py:679,705,1245). - [IMPRECISE]
get_artefactneedseager=Trueto rebuild a codelist or hierarchy, answers item URNs through the owning scheme, and takesrefused=(readers.py:2623,2663-2729). - [IMPRECISE]
put_availability(conn, dataflow_urn, availability)takes nosource_registryand writes an availability, not an artefact (writers.py:2906). - [MISSING]
put_artefact(the dispatching writerLocalRegistrycalls;TypeErrorfor an unpersisted class),drop_artefact,clear_availabilityandput_availability(writers.py:2850-2906). - [MISSING]
_put_spinewarns (RuntimeWarning) when a row is overwritten with a differentsource_registry, and stampsfetched_at(writers.py:196-245). - [MISSING]
_kinds.py, the single class-to-artefact_typeregistry used by writers, readers,local/registry.pyandquery/accessors.py(_kinds.py:1-12). - [MISSING]
_parsed.py's process-wide bounded single-flight cache of parsed statements (MAX_TEXTS = 256);_columns.pyand_synthetic.pyare unlisted (_parsed.py:1-38). - [MISSING]
_manifest.pyalso definesManifestError,StoreFormatError,MANIFEST_NAME,FORMAT_VERSION,DATA_PATH,DUCKLAKE_SPEC_VERSION,publication_storage_version,engine_storage_versionandgenerate_schema;refuse_engine_mismatchcreates a throwaway DuckDB file on every call (_manifest.py:27-171,408).
src/sdmxlib/local/EGM.md¶
- [IMPRECISE]
duckdb.connect(uri, read_only=...)applies to a registry opened on a file path; abundle()registry runs inside aBundleEngine, onengine.cursor(prefix)(registry.py:762-768,1511-1520,engine.py:139). - [IMPRECISE]
DuckLakeVersionErroris raised only when the catalog's format is newer than the installed extension supports, matched on DuckDB's error text;bundle()usually refuses earlier withStoreFormatError(data_store.py:48-68,310-339,registry.py:1510). - [IMPRECISE] The engine prefix replaces unsafe characters in
bundle_idwith_and removes them fromtoken, so a UUID token loses its hyphens (engine.py:137). - [IMPRECISE]
DuckDBDataStore._needs_azureis true for anyducklake:spec, so every bundle andbuild()registry runsINSTALL azure/LOAD azureand sets the curl transport (data_store.py:278-301,349-369). - [MISSING] Opening a registry can rewrite the store:
_initialise_schemacallsmigrate(DROP SCHEMA sdmx CASCADE) on an empty orrebuild=Truestore, raisesStoreSchemaError/ReadOnlySchemaErrorotherwise, and runscheck_scan_integrity;rebuild=andtarget=are unmentioned (registry.py:591-627,848-891). - [MISSING]
bundle()reads the manifest first and refuses a schema-version or engine-format mismatch; it returns aBundleRegistryeven fromLocalRegistry.bundle(registry.py:1500-1515). - [MISSING]
build()withprevious=runsrefuse_engine_mismatchandrestore, always rewritespublication_token/previous_token, andresume=raisesManifestErrorfor a published or foreign publication;publicationis unlisted (registry.py:2516-2572). - [MISSING] Unlisted
BundleRegistrymembers:refused,manifest,data_path,locate,lake_alias,dsd_code_map,reported_attributes,metadata_for_target,check_binding_drift,validate_binding,applicable_hierarchies,unique_hierarchy,clear_resolve_cache,resolve_cache_info;BundleEngine.connectionandattached. - [MISSING] The bounded FIFO resolve cache (
_FIFOCache,resolve_cache_items=), cleared on every write and attransaction()exit (registry.py:248,334-445,2624-2673). - [MISSING] Scan relations are never dropped and live until the connection closes; bytes are written to a temporary file first;
scan_frame_intoreports a cast failure throughtype_mismatch(_scan.py:63-69,126-128,169-174).
src/sdmxlib/api/EGM.md¶
- [WRONG] "An
obs()/data()response":RestRegistryhas nodata()method; onlyobs()ingests throughreading_csv(api/registry.py:1146). - [IMPRECISE] Only the structural
query()path usesSingleFlight;get()does not, and the observation path uses_data_lock(api/registry.py:288-291,1127-1134). - [IMPRECISE] The constructor also takes
timeoutandheaders;apiis ignored for aProviderInfo;store=withoutidraisesValueError(api/registry.py:237-267). - [MISSING]
RestRegistry.refused,registryand__contains__;getraisesSdmxConformanceErrorfor a served artefact the reader refused (api/registry.py:310,368,396,458-472). - [MISSING] With
store=, a pinned, unresolved read is served from the store before any HTTP; alatestURN never is (api/registry.py:474-496). - [IMPRECISE]
download'stois optional (bytes without it), and the responseContent-Typeis checked too (api/registry.py:937-1008,client.py:634-693). - [IMPRECISE]
FmrRegistryalso acceptsauth=(user, pass), forcesapi="2.1"and takes onlyHttpxTransportOptions(api/registry.py:1293-1327). - [IMPRECISE] Freshness metadata is cached only for
latest-version conditional calls, keyed by URL and sorted params; a fresh window returnsNOT_MODIFIEDwithout a request (client.py:500-512). - [IMPRECISE] Only
get_artefact/get_artefact_if_changedmap a 404 toKeyError;get_alland the data methods raiseHTTPStatusError; 413/414 becomeResponseTooLargeError(client.py:246-260,514-546). - [IMPRECISE]
download_datawrites a file only whentois given (client.py:681-693). - [MISSING]
FederatedRegistry.gettranslatesresolve/partialper source from its signature;__contains__takes anSdmxUrnonly. - [MISSING]
HttpxTransportOptions,HttpxAuthOptionandSdmxClient.api(client.py:77,85,414).
src/sdmxlib/bundle/EGM.md¶
- [WRONG]
check_on_openrunsreceiveon the first call (stamping if clean) andopenonce stamped, never both in one call; an unreadable manifest or unsafebundle_idgets an unstampedreceive(_check.py:291-306). - [IMPRECISE]
write_manifest's*.waland non-code refusals come aftersettle_lake,clear_availabilityand the binding survey have run, so a refused publication is left settled with availability cleared; the non-code check runs only whenlake.ducklakeexists (_write.py:440-465,506-511). - [MISSING]
check_bundleraisesValueErrorfor an argument the profile does not use (_check.py:213-230). - [MISSING] Exports:
read_manifest,Manifest,Producer,Provenance,BundleFile,ArtefactEntry,BindingCount,Tier,ManifestError,StoreFormatError,DATA_PATH,MANIFEST_NAME,SIGNATURE_NAME,FORMAT_VERSION,DUCKLAKE_SPEC_VERSION,Lifecycle,Merge,applied,overlay_digest,OVERLAY_FORMAT(bundle/__init__.py:44-101). - [MISSING]
_availability.py(survey,NonCode) andstructure_fingerprint(_fingerprint.py:72). - [IMPRECISE]
build_bundlecuts codelists only withpartials=True;fetch_bundlepassespartials=False(_fetch.py:118-127,_build.py:57).
src/sdmxlib/builders/EGM.md¶
- [IMPRECISE]
build_component_availabilitywithcomponent_id="all"covers every bound dimension; an attribute comes back as aComponentValueSet, a dimension as aKeyValue(contentconstraint.py:240,263-266). - [MISSING] It reads a published
BundleRegistry's stored availability, drops a constraint covering every held value, and takes an unconstrained dimension's stored values without a scan; aLocalRegistryalways scans (contentconstraint.py:242-251,316-332). - [IMPRECISE] Only the column is quoted; the table name is interpolated from the binding as is (
contentconstraint.py:113,368-370). - [IMPRECISE]
annotate_structure_messagealso returns its input when no DSD gains an annotation (metadata_annotation.py:400-401). - [MISSING]
build_dsd_metadata_maporders*_DATAFLOW_INFOMSDs first, runs a fixedNUM_QUERIES = 3round trips (pinned by a test) and expands wildcard targets in Python (metadata_annotation.py:97,160-163,297-301). - [IMPRECISE] Every builder also accepts a
LocalRegistry(contentconstraint.py:316).
src/sdmxlib/EGM.md¶
- [WRONG] "
SingleFlight... Every runtime cache goes through it":_FIFOCache(local/registry.py:334),SdmxClient._freshness(api/client.py:326),RestRegistry._settled(api/registry.py:259) andfunctools.caches inapi/federated.pyandmodel/urn.pydo not;SingleFlightis used inapi/registry.py:288andstorage/_parsed.py:60. - [IMPRECISE] The outermost
session()block releases its cursor, so the next session gets a fresh one;own_handlemakes a new handle per Arrow stream (session.py:253-262,476-480). - [IMPRECISE]
_hook_lockguards only the bookkeeping; the hooks run outside it (session.py:281-304). - [MISSING]
SessionHook, module-levelon_connectandhandle_count, andVALUES_RELATION_PREFIX(session.py:62,69,291,307). - [IMPRECISE]
DataStore.write_observationsis keyword-only and also takespartition_byandlake_alias. - [IMPRECISE]
synthetic_bundleis deterministic in artefacts and rows only; the token and DuckDB bytes differ per build (testing.py:12-15). - [IMPRECISE]
__init__.pyalso defines the publicsl.lenaggregate (__init__.py:213).
src/sdmxlib/formats/EGM.md¶
- [IMPRECISE]
parsealso converts aValidationErrorraised outside any per-artefact refusal toSdmxParseError(formats/__init__.py:184-191). - [MISSING]
serializerunswithout_dropped(msg, version)before validating, and raisesValueErrorfor an unknown version first (formats/__init__.py:287-298). - [MISSING] With an
InMemoryRegistry,parsebinds the read to its resolver;add_allruns only after thestrict/losslesschecks (formats/__init__.py:173,192-200). - [IMPRECISE]
check_positionsalso raises for a stated position that is not an integer (_positions.py:43-47). - [IMPRECISE]
DataFormatalso has.baseand.version(data_format.py:65-83).
src/sdmxlib/formats/sdmx_ml/EGM.md¶
- [WRONG] "No code branches on a version string":
_common.pybranches onversion == "2.1",self.grammar == "2.1"andBY_STRUCTURE_NS.get(...) == "2.1"in many places (_common.py:253,262,1657,1820,1851-1865,1905,1977,2026,2189). - [WRONG] "
accountattachesReadGapandReadAssumptionentries toStructureMessage.lost":ReadAssumptions go tomsg.assumed, andaccountalso appends refusals tomsg.refused(_losses.py:321-323). - [IMPRECISE]
V3Writer.write_keptalso takesmetadata_linksandbase_url, and raisesValueErrorwhenmetadata_linkslacksbase_url(_v3_writer.py:1510-1527). - [IMPRECISE]
accountskips theAvailabilityConstraintscontainer, synthetic StructureSets and 2.1 elements built as another class (_losses.py:273,299-304,328-363). - [IMPRECISE] The declared tables
LOSSESandASSUMPTIONSare unnamed (_losses.py:87,198). - [MISSING]
write_header(header=None)writes the fixedPLACEHOLDER, which the header readers read back asNone(_header.py:30,64-71,139-193). - [IMPRECISE] The closed-world check also admits any attribute on an element in
OPEN_ATTRIBUTES(_closed_world.py:77-84).
src/sdmxlib/formats/sdmx_ml21/EGM.md¶
- [IMPRECISE] A metadata
ContentConstraintis refused (METADATA_CONSTRAINT), not read as aDataConstraint(sdmx_ml/_common.py:84-87,1561-1565). - [IMPRECISE]
_plainconverts a geographic codelist only when it has extensions (writer.py:1284-1294). - [MISSING] A metadata provision agreement is written as a
ProvisionAgreementover its metadataflow and read back;<str:HierarchicalCodelist>is unwrapped intoHierarchyartefacts and dropped when it wraps only one (_providers.py:1-21,reader.py:1155-1265). - [IMPRECISE] The marker list omits
SYNTHETIC_REPORT_ID,METADATA_PROVIDER_SCHEME_TYPE,METADATA_PROVIDERS_MERGED_TYPEandMETADATA_PROVIDER_TYPE(_synthetic.py:41-58).
src/sdmxlib/formats/sdmx_ml30/EGM.md¶
- [IMPRECISE] The MSD URN goes in the header only when the set's structure ref resolves to an MSD; otherwise the writer uses the ref's own URN in an element chosen by class, and a
MetadataProvisionAgreementURN falls tocom:Structure(metadata.py:173-232). - [IMPRECISE] The writer emits only
md:Valueorcom:Text, so acom:StructuredTextvalue is written back ascom:Text(metadata.py:92-100,264-292). - [MISSING]
metadata.readdiscards the header'sReadGap, so an unbuildable header becomesNonewith no loss recorded (metadata.py:366). - [IMPRECISE]
metadata.readraisesSdmxParseErroritself only for a set with no structure ref and a bad timestamp; lxml errors andValidationErrors propagate toparse(metadata.py:314-364).
src/sdmxlib/formats/sdmx_ml31/EGM.md¶
No drift detected.
src/sdmxlib/formats/sdmx_json/EGM.md¶
- [WRONG] "
id,agencyID,versionare declared required":versionisstr | None = NoneonMaintainableJson; a missing version is held as 1.0 and recorded as an assumption (_structure_dto.py:109-114,_losses.py:256-257). - [IMPRECISE] Unknown wire fields are recorded as
ReadGaps onlost, and unknown top-level sections are refused (reader.py:693-742). - [MISSING]
lostis lazy and holds the document's bytes until first read; an entry its struct cannot decode is refused alone through a per-entry fallback (reader.py:637-690,718). - [IMPRECISE]
write_keptcallswith_derived_targetsand expands%wildcard codelists before_refuse_unwritable(writer.py:282-290). - [MISSING] The data readers read only
data_sets[0](andstructures[0]in 2.0); further data sets are ignored (data_v1.py:202,data_v2.py:227-228). - [IMPRECISE] The metadata writer stamps
$schemawith the 2.1 metadata schema URL (metadata.py:50,264).
src/sdmxlib/formats/sdmx_json_1_0/EGM.md¶
- [MISSING]
write_contentconstraintraisesValueErrorfor a naiveprepared, and zoneless date-time periods fold into theValidationError(writer.py:265,271;_dto.py:252-264).
src/sdmxlib/formats/sdmx_csv/EGM.md¶
- [IMPRECISE]
structure_idmay be aDataflow,DataStructureorProvisionAgreement, from whichstructureis derived;ValueErrorwhenstructureis not inSTRUCTURE_KINDS(writer.py:65-120). - [MISSING] The public
STRUCTURE_KINDSconstant (reader.py:59). - [IMPRECISE]
_peek_dataflow_idfalls back toSTRUCTURE_IDwhen there is noDATAFLOWcolumn (reader.py:76-79). - [IMPRECISE]
_resolve_structurefollows provision agreement → dataflow → structure, returns(DataStructure, Ref[Dataflow] | None)and raisesValueErrororTypeError(reader.py:138-203). - [IMPRECISE] The helpers read the first 4096 characters, so a longer first row is truncated, and decode bytes with
errors="replace"(reader.py:64-103).
cli/EGM.md¶
No drift detected.
cli/src/EGM.md¶
No drift detected.
cli/src/sdmxlib_cli/EGM.md¶
- [WRONG] "A bad
SOURCE,FLOWor tier raisestyper.BadParameter... it never falls through to the library":_flowraisesBadParameteronly for an empty agency or id; a malformed URN or short form raises the library'sSdmxParseError, and_flow("ECB:X(bad v)")returns a URN (cli/src/sdmxlib_cli/__init__.py:93-100). - [IMPRECISE]
fetchrequiresPATHabsent or empty (FileExistsErrorotherwise), with the publication at<path>/<token>/and data at<path>/data/(bundle/_fetch.py:51-87). - [IMPRECISE]
--apiapplies only to a URL source (bundle/_fetch.py:88).
tools/EGM.md¶
- [IMPRECISE]
just generate-allowed-childrentakes no parameters and always rewrites;--checkworks only by running the script directly, andtest_closed_world.pyis the guard (justfile:107-108,generate_allowed_children.py:502-511). - [MISSING]
mutate_compare.pyalso rewritespyproject.tomland deletesmutants/on every arm (mutate_compare.py:64-87). - [MISSING]
check_return_widening.pyexempts the pairs inALLOWEDand the functions inALLOWED_FUNCTIONS(check_return_widening.py:63-80,225-228). - [IMPRECISE]
check_docstrings.pyexits 2 when pydoclint crashes, even without--check(check_docstrings.py:164-166). - [IMPRECISE]
check_prose.py's phrase scan also reads the.pyand.tomlfiles and the justfile underCODE(check_prose.py:41-43,136-140).
fuzz/EGM.md¶
- [IMPRECISE] Seeds over
MAX_LEN(65536) bytes are never copied into the corpus (tests/fuzz/targets.py:141-152).
EGM.md¶
- [IMPRECISE] "
sdmxlib.model... does no I/O":model/rollup.py'sAncestorMapholds a DuckDB connection and runs SQL (rollup.py:16-20,55,107-118). - [IMPRECISE] "
formats/owns all XML and JSON": true of SDMX wire formats; bundle and manifest JSON is parsed and written instorage/andbundle/(storage/_manifest.py:24,bundle/_check.py:15-321,bundle/_overlay.py:31,storage/resolve.py:19). - [IMPRECISE]
.egmignoredoes not listtests/, which EGM's own rules exclude (.egmignore:1-13). - [IMPRECISE]
test_public_surfacechecks that every type in a public signature or a documented raise is importable fromsdmxlib, not public names in general (tests/unit/test_public_surface.py:157,336). - [IMPRECISE] Hosted workflows also run the fuzzer, the docs build, zizmor, Scorecard and the release, besides
just check(.github/workflows/).
src/EGM.md¶
No drift detected.