Methods & coverage ledger
What this record is, how it is built, what it covers — and, with every figure carrying its denominator, what it does not show.
What this record is
A register of market disclosures. It covers 1,725 UK-listed issuers — every issuer resolved from the FCA's listing sources (1,342 present in both, 195 FIRDS-only, 188 LSE-only) — and indexes 1,096,573 filings from the FCA National Storage Mechanism over 2017-01-01..open. 1,638 of the 1,725 have at least one filing on record; 87 have zero. A zero-filings issuer is a first-class page: its count is a statement about the window and the sweep, never an error, and any gap in the sweep is named below. Procurement enrichment appears only where a strict attribution gate passes — 38 of 1,725 issuers this release (enrichment basis).
Coverage & the gap ledger
Every issuer carries a coverage status from the harvest ledger: done 1,725 · attempted_incomplete 0 · not_yet_attempted 0 — of 1,725. A done status may still carry a named gap: 74 of the 1,725 done entries do. A gap quantifies what the sweep did not reach; it renders on the issuer's own coverage ledger as a record statement — never an app error, and never rounded down to a zero. The closed set of gap reasons, with this release's counts and the ledger's own basis prose, verbatim:
| Gap reason | Issuers | Ledger basis (verbatim) |
|---|---|---|
| hits_not_attributable | 45 | measured per issuer; null rows mean NOT HARVESTED (a stated gap), never zero disclosures; an attempt_failed/throttle_suspected entry may instead carry its LAST completed harvest's rows flagged stale_watermark |
| page_cap_exceeded | 17 | split by evidence: IDENTIFIER-capped slices are genuine volume — the full sweep pages both ends (newest-first plus the ascending complement; probed live 2026-07-06: NSM honours sortorder=asc) and the gap states the quantified unreached MIDDLE window per slice, computed by IDENTITY arithmetic (distinct served docs vs the source total — never raw pass counts: ES serves equal-sort-key ties in shard-internal order in BOTH directions, so the two passes can double-serve a meeting-point record while a tie sibling on that day goes unserved; a residual whose frontier band collapses to one day is named tie_boundary, '<= ties on <day>'); NAME-capped slices are token swamps — the OR-semantics keyword's noise, not issuer volume, measured in the gap's 'measured' block (no ascending complement is paged for them: thousands more noise rows for near-zero recall); pre-measurement checkpoints state the absence of the quantification |
| ambiguous_only | 11 | measured per issuer; null rows mean NOT HARVESTED (a stated gap), never zero disclosures; an attempt_failed/throttle_suspected entry may instead carry its LAST completed harvest's rows flagged stale_watermark |
| no_in_window_records | 1 | the sweep's slices SERVED records but every one was excluded before attribution (outside the harvest window / id-less / gate-held / unmappable / clock-less — the split is quantified per entry): rows=0 here is a statement about the WINDOW, never a verified zero. Emitted done on a SINGLE observation, deliberately: the served hits are in-band proof the source answered (the soft-throttle's signature is an EMPTY envelope), so the re-observation cycle that defends no_nsm_hits claims is not needed — the two reasons must never be conflated |
| attempt_failed | 0 | measured per issuer; null rows mean NOT HARVESTED (a stated gap), never zero disclosures; an attempt_failed/throttle_suspected entry may instead carry its LAST completed harvest's rows flagged stale_watermark |
| no_nsm_hits | 0 | reserved for sweeps whose every slice SERVED ZERO records, and only ever recorded for a RE-OBSERVED, VERIFIED zero (the 2026-07-06 hardening — the single-observation flush rule was empirically refuted by the Jul-05 mass-mint of 119 false zeros under a flapping throttle): a zero-hit sweep's done claim is deferred in memory, a later same-run productive search (an organic slice hit, or the fixed sentinel keyword 213800TB53ELEUKM7Q61 — a known-productive LEI) must prove the source answering, the issuer is then RE-SWEPT, and only a second zero observation followed by a further productive search is emitted; zeros observed around a zero-total sentinel are recorded throttle_suspected instead; a zero-hit deferral buffer of zero_streak_k issuers (name zeros INCLUDED — they are streak-exempt no longer) forces a sentinel probe rather than waiting for an organic flush; a sweep that served hits which all fell outside the window is no_in_window_records instead — a different statement with a different (single-observation) basis |
| not_yet_attempted | 0 | measured per issuer; null rows mean NOT HARVESTED (a stated gap), never zero disclosures; an attempt_failed/throttle_suspected entry may instead carry its LAST completed harvest's rows flagged stale_watermark |
| throttle_suspected | 0 | the FCA endpoint soft-throttles with HTTP 200 + a valid-looking EMPTY envelope (hits.total.value=0); a streak of zero-hit identifier-bearing issuers whose sentinel probe also returned zero is checkpointed attempted-not-done under this reason and re-swept on resume — NEVER counted as no_nsm_hits coverage |
Counts are issuers carrying the reason, of 1,725 in the register. The basis prose is the ledger's, unedited — where it names re-observation, sentinel probes or identity arithmetic, those are the harvest's own defences against a false zero.
Attribution — identifier-first
Filings are attributed identifier-first: a filing joins an issuer's record through its resolved identifiers (LEI and ISIN slices swept per issuer). Rows matched on name alone are flagged name_only row by row, and rows served under another issuer's sweep and merged through are marked by origin — the split is stated on each dossier's coverage ledger, never pooled invisibly. The Companies House join is stated X-of-N, never implied complete: 1,120 of 1,725 issuers resolve a GB Companies House number; 605 do not (417 registered outside GB Companies House, 188 with no join key). A null number always carries its named reason.
Enrichment basis — the frozen procurement cohort
Procurement enrichment is a joined record of UK public-procurement awards. It attaches to an issuer only where the strict attribution gate passes — a procurement record joins through resolved identifiers, never name similarity alone. In this release 38 of 1,725 issuers carry the panel; absence of enrichment is a normal state of the record, and every unenriched dossier states its machine-readable reason. The attachment basis:
| Basis | Issuers | Meaning |
|---|---|---|
| legacy_45 | 38 | attached — the frozen legacy cohort, carried forward verbatim and re-keyed to universe_id |
| excluded_delisted | 7 | not attached — legacy-cohort issuers now delisted; their frozen panels are excluded from this release pending backfill |
| ch_join | 0 | attached by forward GB Companies House number join — the open path for new attachments |
The two legacy rows reconcile the frozen cohort: 38 attached + 7 excluded = 45.
The omission denominator is frozen. Each attached panel is carried forward verbatim — including the RNS baseline its omission analysis was computed against (the legacy wf15b sweep). This release's disclosure spine re-swept the same source more completely, so an enriched issuer's dossier can now hold materially more filings than the frozen baseline its omission rates divide by. The rates are not recomputed against the fuller spine: recomputation would silently alter frozen, review-verified figures, and the two sweeps are different observations of the source, not interchangeable denominators.
What the drift notice means. Every enriched dossier states both denominators at the point of use, as a stamp under its enrichment notice: “Omission analysis uses the legacy RNS baseline (N filings), not this dossier's fuller M-filing record — rates are not comparable across the two.” Read a rate accordingly: an omission rate asserts a share of the frozen baseline's disclosure-assessable material awards — never a share of the fuller spine. Neither count is asserted to be the “right” denominator; the record states both and asserts nothing further. Where a spine is materially fuller than its frozen baseline, the build's validation names the affected issuers release by release; the per-issuer pair of counts lives on each dossier, and the release's coverage ledger carries the tally.
Of the 38 enriched issuers, an omission rate is asserted for 18. The coverage-state split: assessable 18 · coverage_limited 16 (no rate asserted — never rendered as 0%) · none 4.
Disclosure text (DEC-002) & determinism
Disclosure text is served under DEC-002: headline, category, dates and a source link — never the announcement body, and no body is ever sent to a model. In this release the gated snippet and content-hash fields are additionally empty by construction (bodies were not fetched); they render as “—” rather than being removed, and a build-time guard refuses to publish any bundle carrying a body field. The read model is byte-deterministic: exporting twice yields byte-identical JSON. The one wall-clock — when the release was built — lives in a separate stamp outside the hashed set.
The alpha thesis returned NULL
Separately from the record itself: procurement intensity was tested as a forward-returns signal and returned a well-powered NULL. The finding's scope is the enriched subset — 38 issuers, on the legacy RNS basis (legacy_wf15b). No whole-universe result is asserted: the findings file marks universe scope unavailable by construction (enrichment_subset_only). This is a transparency and intelligence record, not a trading signal.
Reproducibility manifest
The read model is a deterministic function of pinned inputs: exporting twice yields byte-identical JSON. The manifest content-addresses every input, records the row counts it produced, and hashes every bundle into a single tree root. The one wall-clock — when this release was built — is isolated in a separate stamp, outside the hashed set.
- Schema version
- crystal-intel/v2
- Exporter
- crystal-wf20-exporter/v1
- Code commit
- 7d8ce2a6463a3ee2d920462ad6a46338b21467e2
- Row counts
- 1,725 companies · 38 enriched · 1,096,573 rns marks · 239 shard files · 1,725 universe rows
- Input hashes
- frozen cohort commit e85c8e1…ledger universe artefact sha256 sha256:2b0900b76921887e9b3…merged tree digest sha256:16d9a75f12af88d1c82…universe sha256 sha256:2b0900b76921887e9b3…
- Bundle hashes
- 1,725 per-bundle sha256 (content-addressed, one per issuer)
- Tree root
- sha256:bc741d2ebdac073874a43705f38d011bd6c0d88f6b5a5e569b4519d48425d96a
- Released
- 2026-07-17T15:23:50.854911+00:00 (stamp only — not in the hashed set)