Today's deploy log, in sequence.
15:04Instance failed
Ran out of memory — used over 512MB
15:04Service recovered
Instances reporting healthy
16:35Deploy live 9dda690
Write all sensor readings to Supabase graph
17:11Deploy live dea09e4
Quarantine false graph facts and harden graph writes
One scraper became 27 sensors. The process exceeded the memory limit. We fixed the handling, redeployed, then hardened the write layer so bad data can't enter the graph going forward.
What one sensor actually produced this week
Before talking about 27 sensors, it's worth showing what the single scraper that ran for two weeks actually captured — because it produced a real, usable signal.
Real signal captured · May 20–22, 2026 · fii_dii_scraper.py
−₹7,928 Cr
FII net sell · 3 sessions
+₹10,463 Cr
DII net buy · same 3 sessions
Foreign capital exited. Domestic institutions absorbed more than the full exit. The Indian market held. The graph captured not just both numbers but the causal relationship between them — and connected it to the domestic liquidity environment created by RBI rate action.
The graph built this chain from those three sessions:
Foreign Institutional InvestorsTRIGGERSForeign Capitulationw=0.85
Foreign CapitulationTRIGGERS_BUYINGDIIsw=0.85
DIIsSUPPORTSIndian Marketw=0.85
Domestic LiquidityCUSHIONS_POSITIVELYForeign Capitulationw=0.85
Four hops. One causal story. Built from three days of FII/DII flow data combined with India's domestic liquidity environment.
That is what one sensor produced. The question this week is what 27 sensors produce together.
What the graph can't do yet — cross-domain chains
The FII/DII chain above is a single-domain signal — institutional flows talking to institutional flows. What the graph doesn't yet have is signals from different domains connecting to each other. These chains don't exist today but should appear as 27 sensors run together:
Yield curve signal→FII positioning shift→Sector rotationnot yet in graphyield_curve sensor + fii_dii sensor — two domains, no edge between them yet
Tariff sentiment ↑→Commodity pressure→Manufacturer margin impactnot yet in graphtariff_sentiment + commodity_agent + corporate_agent — three domains unconnected
Promoter pledge spike→Options flow asymmetry→Early stress signalnot yet in graphpromoter_pledge + options_flow — the combination is more informative than either alone
If these chains appear in next week's dump, the graph becomes a different kind of tool. If they don't, we'll know which sensors aren't producing connective signal.
The sensor layer
Market microstructure
Block deals
0 records today
Corporate signals
Earnings calendar
0 events today
Macro
India pulse
UPI · railways · power
Physical & alternative
Neural vision
charts · satellite
Gov contracts
0 signals today
What could break
likelyEntity duplication explosion
One scraper gave us three nodes for FIIs. With 27 scrapers all independently encountering FIIs, Infosys, NIFTY — duplicate counts multiply. Canonical node resolution needs to be in place before we analyse next week's graph or the numbers are meaningless.
likelyRelationship vocabulary fragmentation
Already 28 distinct relationship types from 2 scrapers. Each new scraper brings its own language. Without a controlled type list at the write layer, no two scrapers describe the same dynamic the same way — and the graph can't traverse what it can't match.
watchSilent sensors
gov_contracts returned 0 records today. block_deal returned 0. earnings_calendar returned 0. The market didn't produce those events today. Over a week the pattern becomes clear: sensors that consistently return empty get cut.
What we'll publish next week: the actual graph dump after seven days of 27-sensor operation.
Which cross-domain chains appeared. Which sensors produced connective signal. What a real traversal query returns on a live question.
The graph state as it is. Not as we'd like it to look.