Skip to content

Handoff: claim ADR-0007 step 2, with a re-measurement that moved the wrong way - #101

Merged
mspinola merged 1 commit into
mainfrom
claude/adr7-step2-handoff
Aug 5, 2026
Merged

mspinola merged 1 commit into
mainfrom
claude/adr7-step2-handoff

Conversation

@mspinola

@mspinola mspinola commented Aug 5, 2026 •

Copy link
Copy Markdown
Owner

Claimed, not started. A work order and a re-measurement. No code.

Executes crucible-stack ADR-0007, accepted 2026-07-27. Proposes no new decision and asks for none.

crowdmon's CLAUDE.md records step 2 as "on ice… nobody owns it. Do not start it without confirming that has changed." It changed: asked for directly on 2026-08-04, while deciding which machine publishes the crowdmon damage panel.

Step 2 grew ~11% while sitting on ice

Measured against wc -l on main at 49ebc45:

file ADR-0007 recorded (2026-07-27) today drift
providers/databento.py 1,015 1,099 +84
providers/norgate.py 469 546 +77
prices.py 167 186 +19
providers/yfinance.py 70 70 —
total 1,721 1,901 +180

Both price providers grew, prices.py grew, neither CFTC provider moved. ADR-0007 predicted exactly this — "databento.py arriving after this ADR was written makes cotdata more price-heavy… and enlarges step 2 at the same time" — so the drift is now measured rather than anticipated.

That is an argument for doing it sooner, not an argument for doing it. The ADR already made the second one.

It is not a file move

marketdata/src/marketdata/providers/ contains __init__.py and yfinance.py. That is all. The futures domain is declared in adjust.DOMAIN_TIERS — ADR-0007 notes that was done so error messages are correct from day one — but nothing implements it.

So step 2 writes a Norgate futures provider, using cotdata's as reference. 1,901 lines to read; the deliverable is a provider that did not exist. Worth pricing in before estimating.

§4 is the finding, and nothing had composed it before

Three facts, each already written down separately in three different repos:

  1. crowdmon needs two stored tiers. notional refuses anything but unadj, riskunits anything but propadj, and propadj is derived on read from unadj + backadj. ContractMaster.coverage() already encodes it.
  2. Norgate is the only vendor supplying all tiers, and it is Windows-only by mechanism rather than licence: norgatedata talks to a locally installed Norgate Data Updater application, not an API (providers/norgate.py:207,325, both commented "Windows producer only").
  3. databento owes exactly one series per symbol, backadj, because ADR-0007 scopes it to the Linux dashboard and says its coverage "should not be broadened toward parity with Norgate".

Composed: a databento-backed futures store cannot feed crowdmon at all. One stored tier cannot produce propadj, and the refusal is a raise rather than a warning precisely because the error survives a spot check — backadj percent vol is 201x too high for soybeans and 0.47x for gold, which never goes negative and passes every implausibility screen.

The trap for whoever executes: if the new provider ships databento-first, or ships Norgate storing only backadj to match the server's needs, crowdmon stops working — as a raise inside a weekly scheduled job. unadj and backadj both stored is a hard requirement of the new provider, not a coverage nicety. §4 says so where its author will be reading.

It also answers one of ADR-0007's own open questions

"Whether the Linux server runs the marketdata futures producer itself after step 2, or keeps receiving a synced store."

2026-08-04 answered it de facto: the crowding page ships as a synced artifact because that box runs Python 3.9 against crowdmon's >=3.10 floor. Combined with §4, it could not produce a crowdmon-consumable store even with a raised interpreter, because it has no Norgate either.

So "synced store" is not a temporary state pending step 2. It is the answer, unless the server's interpreter is raised and a full-tier non-Norgate vendor appears. §5.3 suggests marking it resolved in ADR-0007 rather than leaving it reading as undecided — that edit is not made here, since ADR-0007 lives in another repo.

What it deliberately does not decide

  • Whether price production becomes its own repo rather than moving into marketdata. ADR-0007 says marketdata and is accepted; a session wanting otherwise writes a superseding ADR rather than quietly building something else.
  • Whether databento's coverage should broaden. ADR-0007 says no, twice. §4 is a reason to revisit someday, not a licence to.
  • Anything about livebook — step 3, deferred on purpose, live book behind it.

Companion

crowdmon/docs/design/amendments-2026-08-04.md §D14 records §4 consumer-side, so the constraint is discoverable from the repo it binds. Opened as mspinola/crowdmon#67.

🤖 Generated with Claude Code

…wrong way

Claimed, not started. A work order and a measurement, no code.

ADR-0007 accepted the direction on 2026-07-27 and step 2 has not started since.
crowdmon CLAUDE.md records it as on ice with nobody owning it, and says not to
start without confirming that changed. It changed: asked for directly on
2026-08-04 while deciding which machine publishes the crowdmon damage panel.

Re-measured, and step 2 grew 11% while sitting on ice: 1,721 lines to 1,901, with
both price providers and prices.py growing and neither CFTC provider moving. The
ADR predicted exactly that and the drift is now measured rather than anticipated.

It is also not a file move. marketdata/providers/ holds only yfinance.py; the
futures domain is declared in adjust.DOMAIN_TIERS so error messages are right, but
nothing implements it. Step 2 WRITES a Norgate futures provider using cotdata as
the reference.

Consumers enumerated: crowdmon is 6 modules and 10 call sites, and
contract_master.py:34 already documents itself as the site ADR-0007 will repoint.

Section 4 is the finding the handoff exists for, and nothing had composed it
before. crowdmon needs unadj AND propadj; propadj is derived on read from unadj +
backadj; databento owes exactly one series per symbol by ADR-0007 scoping. So a
databento-backed store cannot feed crowdmon at all, and only the Windows box can
write a store it reads. Not for a Python reason: the Mac runs 3.11 under uv and
builds the full panel today.

That makes ADR-0007 open question 3 answerable. A synced store is not a temporary
state pending step 2, it is the answer, unless the servers interpreter is raised
AND a full-tier non-Norgate vendor appears.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@mspinola
mspinola merged commit 2f4f849 into main Aug 5, 2026
5 checks passed
@mspinola
mspinola deleted the claude/adr7-step2-handoff branch August 5, 2026 02:03
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