Skip to content

release: apis dev to main - #131

Merged
jm-rivera merged 8 commits into
mainfrom
dev
Oct 24, 2026
Merged

jm-rivera merged 8 commits into
mainfrom
dev

Conversation

@jm-rivera

@jm-rivera jm-rivera commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Promotes #114, #120, #123, #124, #125 and #128 to prod.

Prod serves #121's reader for the new warning fields on every instance (dfo-prod-apis and dfo-prod-datasets-worker at e6f32a6e), so #120's writer can follow. #120 makes a group mint's coverage_below_scope warning tell off-cadence members from empty ones, with member_count, off_cadence_members and out_of_window_members. #114 settles Count_Person stub twins under a confirmed root, so population mints no longer end in member_not_resolvable. #123 checks a sole slot value claimed from a recall sample against the walked family, so a one-member sample no longer narrows a total to one gender, and resets every done operation a submission finds, so no 202 answers done. #128 adds the reader half of the next warning change: three optional WarningModel fields (unserved_entities, omitted_entities, omitted_entity_years) that its writer, #129, will emit. #129 is not on dev, so this release must reach prod before the release that carries it. #124 gives every graph node one display name on the node door and in presentation frames. #125 makes search refuse an answer that drops a measure the question names, such as "mobilised" for amountMobilised, whatever the stated-word rating.

The deploy runs no migration.

Testing: CI and the eval gate passed on each PR into dev, and dev serves 2a7a490c. The production deploy waits for approval. Not applied.

A possible root twin whose read the reader holds complete and that carries
none of the five-tuple definition arcs answers the same body to every read,
so the twin pass could never settle it and the walk refused the family with
member_not_resolvable. Under a confirmed root, _read_root_twins now settles
such stubs before spending the twin budget and returns them as
MemberGroup.stub_candidates. The walk log shows them as stubs= and the mint
trace states them as trace.stub_candidates. Without a confirmed root, with
an incomplete read, or with any definition arc present, the refusal stays.
…nes in coverage_below_scope (#120)

A group mint named every member the facet election did not count as
"No observations were served for dcid:...", whether the member reported the
requested years at another frequency, which the figures leave out, or held
nothing in the window. `_plan_group_members` now splits the two, and the
warning carries them as `off_cadence_members` and `out_of_window_members`
(`{count, refs}`) beside `member_count`. The out-of-window case is dropped
when the served provenance declares absent members as zero. The stored
message states counts only; the presentation store labels the refs in its
existing label read and the card names them within its length limit.
A node holding several `name` values was labelled by position, and two
surfaces picked different positions: the node door took the first name that
differs from the dcid ("United States"), the frame store the last one
("United States of America"). The graph returns names in the order they were
stored, so either pick depended on how the graph was imported.
`dc_graph.display_name` takes the greatest name by code point, which matches
the label the dev mixer records on every recorded multi-name node, and
`label_or_self_name` also accepts a dcid when that is a node's only name.
Every site that turns names into a label calls one of them, Search's
open-axis value labels included, and `alternateName` never becomes a label.
…e-word-requirement

fix(search): refuse an answer that drops a measure the question names
… a 202 done (#123)

* fix(search): judge a sole value claimed from a sample against the walked family

_validate_sole_option_bindings knew whether a sole-value claim rested
on the whole family or on a recall sample, and dropped that knowledge,
so the member walk read the family filtered by a claim it never tested.
A one-member sample asserting gender=Female answered the female series
where the question asked for the total.

A claim from an incomplete population now carries sampled=True
(excluded from every dump and schema). The walk reads sampled slots
open, and _judge_sampled_claims confirms each claim on the walked
members or refutes it and unbinds the slot. An unsettled walk leaves
the claim standing under membership_unverified. No extra member read.

Refs #101

(cherry picked from commit 8214f72fdad8df9065b5c624c9a2fcb95800d401)

* test(eval): expect the DFO GNI series for a plain GNI question

dq-dac-016 "GNI of Denmark" expected the World Bank family base.gni,
but the DFO series dev answers with carries the World Bank indicator
NY.GNP.MKTP.CD, and DAC1 is its only provenance for Denmark. Pin the
dac1.gni family to that series, point the case at it, and drop the
known failure, whose issue number did not exist.

(cherry picked from commit f98b2b8994c8d38de2f3dc5cd2251c36f5441e8b)

* fix(datasets): reset every done operation a submission finds

A submission reaches the operation store only when the subject's head
could not answer it, yet create_or_get returned a done row at another
version unchanged. Two renderings of one over-budget subject make that
deterministic: a csv mint after an xlsx rebuild answered 202 done, and
its poll served the old version. A client following the contract also
raises on a 202 done, which carries no manifest.

create_or_get now resets every done row to pending and enqueues it
again, and the run serves what the head rule gives at run time. This
removes the rejected-version plumbing through submit_over_budget,
current and spec_id, and the refresh door's done branch, two-pass loop
and RefreshRebuildUnservable. C187, the datasets README and
datasets-sync-ceiling state the rule.

(cherry picked from commit 37b2e6ff660ebcf0c6485acd4634988daa1ff35c)

* fix(datasets): serve the head when a full backlog refuses its submission

A submission that found its operation just completed reset it and went
through backlog admission again, so with a full backlog it answered 503
although the head already served the result. serve_mint and the
definition door's _materialise_and_record now catch
OperationBacklogFull, read and judge the head once more under their own
head rule, and answer from it when it serves; otherwise the refusal
stands. Admission itself is unchanged, and the recheck costs one head
read on the 503 path only.

(cherry picked from commit 877a2ea20558a79c12b004eb08c4e96bd1082d52)

* fix(search): keep a place's own name when another shares its words

0b5ea77 renamed an entity to the span the user wrote whenever the
span's ambiguity settled it. For "aid from Congo to Congo" both ends
became "Congo", and since the parsed door reads one text as one place
per part, every option pinned both ends to the same country.
_recover_entity_surfaces now renames a name to its span only when no
other name in the part would carry the same text, so the two ends keep
the extractor's names and independent choices, while "ODA
disbursements from Germany to Congo" still reads "Congo".

(cherry picked from commit 5d42bbd6ba3bf4f0b159abebf331554d141bce4b)

* fix(datasets): pace only a failed operation at the floor, and state the backlog recheck

* test(live-refresh): give the composed worker the head store the deployed worker has

* fix(search): bind the value an unexported family is told apart by over a sampled claim

bind_shared_values binds the value an unexported family shares on a
property the exported rows also carry, since that value is what tells
the family apart (IDS debt service: financialFlowType=ServicingPayment
on a five-tuple the index shares with CRS). _unexported_shared_values
counted a sampled claim as already bound and skipped the slot, so only
the sample backed the claim; the walk then read the slot open, listed
interest payments too, and refuted it, and "total debt service of
Kenya" served both flows unbound (eval dq-ids-001, 002, 014, 020, 035).
A sampled claim now leaves the slot open to the rule, and a claim of
the shared value is kept with its flag cleared.

* build: pin spec-kit 0d19172, which reads proxy refusals as problem documents
…int writes them (#128)

WarningModel gains optional `unserved_entities` and `omitted_entities`
(`{count, refs}`) and `omitted_entity_years` (`{count, entities: [{ref,
years}]}`), and #120's member model is renamed CountedRefsModel with the
same stored keys. Stored bodies are extra="forbid", so this reader deploys
before the writer that emits the fields. Nothing writes them yet.
…they named (#129)

coverage_below_scope's unserved-entity list, currency_unmapped_omitted and
deflator_missing_omitted named raw refs in their stored messages, which no
later code change could relabel. Their messages now give counts only, and the
warning carries the refs as `unserved_entities`, `omitted_entities` and
`omitted_entity_years`: five unserved entities, and the ten entities the
conversion messages used to name, each deflator entity with its omitted
years. Cards label the refs in the frame store's existing label batch, and
Search's two omission warnings carry the entities, their labels and the
deflator years in `params`. Structural tests tie every counted field to a
writer and a card row, and pin that no stored message names its refs.
@jm-rivera
jm-rivera merged commit 1851e7e into main Oct 24, 2026
28 checks passed

This branch was successfully deployed

1 active deployment
dev — e5745836 Deployed Oct 24, 2026 by jm-rivera via deploy / deploy #67
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.

1 participant