A NinjaTrader-native trading OS: bar clocks that decide when a bar exists, sensors that publish opinions into typed seams, a fusion arbiter that turns them into one verdict, two order sources under a shared safety gate, a recorded corpus, and a 53-file offline Python lab whose whole job is to grade the other half honestly. Companion page: Runtime Topology →
Docs/SENTINEL_DESIGN_SYSTEM.md §0.
Every surface is Sentinel-owned — a Sentinel control never lives in an NT dialog, so there is exactly one source of truth per setting.
…State seam: “is my brain alive, and why isn’t it trading?” 5 tabs incl. Helm.:3000 live:8501 livent8bridge livedeploy hot-reloads running instances.BarsTypes\Sentinel’s first-class idea: the clock is a hypothesis. Each bar type answers “what unit of market activity deserves one bar?” — and each publishes its own seam under its own scope, so the chart is the bar type. Three axes are represented: distance, signed flow, unsigned cost of movement.
BrickState → BRK. One “Speed Settings” knob.FluxState → FLUX + absorption damp.ConvictionState → CVB.A voter never calls the Council. It publishes a typed seam (SetXState) and the
Council reads it. That inversion is why a voter can be auditioned at w=0, replaced, or graded
standalone without touching fusion. Seams are keyed by scope = <instrument>.<barTag>
— one chart’s worth of context.
w=0 is a first-class state: recorded in the corpus, zero fusion impact.
It is how a voice earns promotion instead of being assumed.Alongside the voters: ~30 ported smoother / filter
primitives (SMA…ZLEMA, Laguerre, Butterworth, Gaussian, SuperSmoother, Tillson T3, DSMA, LLMA…) that voters
build on, plus SentinelWallpaper, SentinelBrickCounter, SentinelBarDump and
SentinelTapeRecorder as instrumentation.
Not voters — modulators and vetoes. They do not add direction; they change how much the
direction is worth, or shut the door. Toggled via the Council’s Consult* settings, not
Roster.conf lines.
The arbiter reads seams and emits one CouncilState per scope. It is an
unfitted linear model — hand weights, a conviction floor — and saying so out loud is the point: the
Lab exists to fit it, and the 07-26 re-test says the fused direction is currently a coin flip gross.
Roster.conf + RosterComplete. A roster is declared, not emergent — which is what makes a crashed sensor distinguishable from a quiet one.GC.212201v6x24. Same instrument + bar type on two charts is detected and logged as SCOPE CONTENTION, never silently permitted. Lanes.conf wins over F6.SentinelCore v1.45.0One partial class split across three files for distribution tiering, not for
tidiness: the public bundles can ship Foundation without Safety. 22 Sentinel AddOn files in total.
SentinelCore.Foundation liveLog (6 rotation generations) · Ledger · State · the seam stores · Swallow() — the recorded empty catch.SentinelCore.Safety — L2 liveCanEnter · governor · trailing drawdown · profiles · session · sizing · order guards · GateEntry. “The one place sizing math lives.”SentinelCore.SystemBuilder liveRosterIO · LaneIO — one reader/writer so writer and reader can never drift on format.cards.off render kill switch that ended the legacy-node UCEERR floods.Beacon/BeaconForeign let a consumer say DECOUPLED — restart NT instead of “absent”.The suite has exactly two order sources. Any statement about “all three order paths” is stale — GTrader21 was pulled 2026-07-29.
slip.CouncilState, records to Ledger, stamps the crossing quote. ⚠ known gap: it sizes itself instead of routing through SizedQuantity().One writer, one schema, per artifact. Two loadable recorders once meant a workspace could quietly start a second writer emitting contaminated rows — which is why v1_4 was archived rather than left “harmlessly” in the tree.
firePx) → Excursions\council\. ⚠ opens only on COUNCIL — so any strategy is currently invisible to the corpus.cand.* + ctick.3 self-describing tick-path headers, so context needs no join.MaxFav/AdvTick (5-min window) and MaxMFE/MAE (60-min, uncapped).UpdatedUtc stamps wall-clock even mid-replay. Anything that records must gate on State.Realtime / IsHistorical.Never imported by NinjaTrader, never compiled into NinjaTrader.Custom.dll.
This is the half that grades the other half. Its governing rule: a measurement you cannot falsify is not a
measurement — so the harness ships a test that proves its own gate can fail.
Lab\harness\ 13 filesnrdcsv tick reader · tide (Tide re-implemented in Python) ·
equivalence the gate the whole harness stands on · selftest_equivalence
proves the gate can fail before it is trusted · selfdiff is NT deterministic? ·
cvddrift localise harness-vs-NT disagreement to the print · l2book ·
noise_floor measure precision before interpreting a difference ·
flowscale · pairing_study · regime_study ·
retest_direction · exp0005 (pre-registered).pathlab tick-true path & exit-policy analysis with a cost model ·
sensor_truth grade every voter standalone per bar type · voter_edge
confirming or contrarian, and on how much data · council_paths does conviction buy
better-shaped trades? · compare_bartypes how much does the clock matter? ·
limitlab resting limit vs market at the fire · news_overlap ·
verify_votes + verify_firepx acceptance tests.Lab\sentinel_lab\ + train.py 6 filesdataset schema-tolerant JSONL loader · labels barrier labels,
censoring, uniqueness weights · cv purged walk-forward with an embargo — never random
k-fold · bartag the Python mirror of FriendlyBartag (display only) ·
train.py the offline trainer.ingest\ingest.py JSONL → SQLite (the canon path; the analyzer reads the
DB, never the files) · snapshot\snapshot.py tiered WORM snapshot ladder ·
quartermaster\ .nrd catalog/verify/coverage-holes (filenames only — a 100 GB
scan is a stat sweep) · sync\replay_sync.py rule-based bake-node sync that auto-includes new
Sentinel files.Lab\viz\ 4 filesobservatory.py the analyzer — tree data-group picker + the 3-panel honesty
ladder (firePx ceiling → bracket → tick-true real entry, which goes negative) ·
explorer.py filterable Plotly over the tick corpus · tickpaths.py ·
pages\1_Council_Paths.py (imports the CLI so the numbers cannot drift).health\probe.py NT + suite health · corpus_probe.py is the
corpus trustworthy · legacy-node_probe.py read-only over SSH ·
docs\audit.py drift/link/version audit · docs\facts.py single-sources volatile
numbers as {{tokens}} · ident_check.py does every identifier a doc names still
exist · grafana\build_*_dashboard.py boards are generated, not hand-edited JSON ·
lab_faults.py the Lab’s Swallow().Lab\ 4 filestools\md2atlas.py renders every doc into the Field-Manual house style ·
News\ff_scrape.py + sentinel_newsconf.py economic calendar →
News.conf event veto · suite-oss\tools\lint_suite.py.Canon pipeline: tools → JSONL → ingester → DB → analyzer. Reading the JSONL directly is an expedient, never the architecture.
sentinel.log livesentinel.db live:3000 4 boardsextraThemes.:8501 live:8502 :8504 :8505 livecli-nt-bridge v1.1.1ConnectOnStartup + autorun + autologin..nrd supply: procure → verify → catalog → provision. 90-day rolling feed floor; deep history from the extracted archive.The suite is not a signal generator with reporting bolted on — it is a grading loop, and the first thing it graded honestly was its own thesis.
w=0, or retire the tool.↺ The feedback edge is the whole product. A negative result that survives the holdout retires a tool — that is the loop working, not the loop failing.
nt8bridge compile → errors: []).
Lattice and Effort compile clean but have never been loaded. Keel/Hull/Pilot are specs with no code.
The fused Council carries no measured directional edge today; the assets that are proven are the
risk container and the grading tooling. Before any bake or live run: F5 + full NT restart,
remove the old Council before adding v1.11.0, and re-add Deck v0.2.6 — both are real version forks.
Council_v1_11_0.KnownVoters declares 25 voters including CVD, but
SentinelCore.SystemBuilder.VoterCatalog holds 24 rows — the CVD row is
missing, even though Core’s v1.43.0 header says it was added. The Cockpit and System Builder both read the
catalog, so CVD is invisible to them. Cheap fix, and worth doing before the next roster edit.