Skip to content

registry: add ZR (rough rice) and WBS (ICE Europe WTI) - #99

Merged
mspinola merged 1 commit into
mainfrom
claude/registry-zr-wbs
Aug 4, 2026
Merged

mspinola merged 1 commit into
mainfrom
claude/registry-zr-wbs

Conversation

@mspinola

@mspinola mspinola commented Aug 4, 2026

Copy link
Copy Markdown
Owner

Adds two symbols: ZR rough rice (CBOT, 039601) and WBS WTI Crude Oil (ICE Futures Europe, 067411).

These are the two codes of crowdmon's contract-spec backlog that Norgate actually carries. That handoff (crowdmon/docs/handoffs/2026-08-03-spec-backlog-producer.md) asked for six, and its §4 made confirming vendor coverage the step that had to happen first. The vendor catalogue now says two: Norgate's entire energy universe is eight contracts, four of which are already in this registry, and the only Henry Hub row is NG, which is 023651. The four Henry Hub codes (023A55, 03565B, 023A56, 03565C) are vendor-absent and stay in the backlog with no proxy substituted, per §4's own rule.

Why the entries come before the producer run, not after

norgate.get_symbol_metadata resolves REGISTRY[internal_symbol].norgate + "_CCB", so an unlisted symbol is a KeyError before any fetch:

cotdata-update --metadata --symbols ZR WBS
...
covered = [s for s in requested if REGISTRY[s].norgate]
KeyError: 'ZR'

Verified against this branch: _norgate_covered(["ZR", "WBS"]) returns both.

ZR needs no norgate: mapping (the default is &<internal>, and Norgate's code is ZR). WBS carries databento: null following the MME/MFS precedent: it is an ICE product and not on GLBX.MDP3.

Why these two and not the others

  • WBS is not a duplicate of CL. Open interest tracks it at 0.771, which is exactly what makes it look like one, but Managed Money net is negative and flow correlation is near zero, so it is a different holder base. Measured in crowdmon/docs/design/amendments-2026-08-03.md §C15, which records an objection raised and withdrawn on that evidence.
  • ZR is the smallest ag candidate of ten and the strongest on the criterion that decides: Managed Money share 0.433 against a covered median of 0.137, the highest of any backlog candidate measured (§C17, human decision recorded in §9 of the handoff, which cut the ag tranche to rough rice alone).

Three guards fired, all updated deliberately

guard change
test_registry_loads_all_symbols 49 -> 51
test_symbols_are_hashable 49 -> 51
test_golden_identity_checksum new digest, with the previous value and the reason recorded beside it

The checksum lock exists so that adding a symbol cannot be accidental, and it did its job. Its docstring asks for the hash to be updated on purpose; this is that.

289 passed, ruff clean, run with PYTHONPATH shadowing so the suite tested this branch rather than the main checkout the editable install resolves to.

One consequence to sequence around

crowdmon/tests/test_contract_master_live.py asserts not_joinable <= {"MFS", "MME"}. From the moment this merges until the producer run lands both symbols, that fails, measured on this branch rather than predicted:

AssertionError: new uncovered symbols: {'WBS', 'ZR'}
assert {'MFS', 'MME', 'WBS', 'ZR'} <= {'MFS', 'MME'}

That is the test doing its job: a symbol the registry claims and the store cannot price is exactly what it watches for. Its joinable >= 47 floor still holds, and crowdmon's CI is unaffected because that file skips without a real store. But the scheduled 09:15 live run would go red overnight, so merge this and run the producer back to back:

cotdata-update --metadata --symbols ZR WBS
cotdata-update --prices --symbols ZR WBS

One --prices run writes both backadj and unadj, which is what propadj is derived from on read. With --symbols the metadata write is an upsert, so the other 47 spec rows are preserved.

Afterwards, ContractMaster.coverage() should read joinable: 49 of 51 with MFS and MME still the only two unjoinable.

🤖 Generated with Claude Code

The two codes of crowdmon's contract-spec backlog that Norgate actually
carries. crowdmon's handoff docs/handoffs/2026-08-03-spec-backlog-producer.md
asked for six; its §4 required confirming vendor coverage first, and the
vendor catalogue says two. Norgate's entire energy universe is eight
contracts, four already covered here, and the only Henry Hub row is NG,
which is 023651. The four Henry Hub codes are vendor-absent and stay in
the backlog with no proxy substituted, per that handoff's §4.

The entries are the precondition for the producer run rather than a
consequence of it: norgate.get_symbol_metadata resolves
REGISTRY[internal].norgate + "_CCB", so an unlisted symbol is a KeyError
before any fetch.

WBS is not a duplicate of CL. Open interest tracks it at 0.771, which is
what makes it look like one, but Managed Money net is negative and flow
correlation is near zero, so it is a different holder base (crowdmon
docs/design/amendments-2026-08-03.md §C15). ZR is the smallest of ten ag
candidates and the strongest on the criterion that decides, Managed Money
share 0.433 against a covered median of 0.137 (§C17, decision in §9 of
the handoff).

Three guards fired and all three are updated deliberately: the two
len(all_symbols()) == 49 pins, and the golden identity checksum, which
exists precisely so that adding a symbol cannot be accidental.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@mspinola
mspinola merged commit 49ebc45 into main Aug 4, 2026
5 checks passed
@mspinola
mspinola deleted the claude/registry-zr-wbs branch August 4, 2026 15:47
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