Home · Why – How – What

Target Architecture

Author: Uri Andersen
Version 2.3
2026-10-03

Shared under NDA. This document may be passed on only with the author's consent. And only under an NDA of equal scope.

Context

RAPID is the shared execution layer for self-directed investors: an open runtime the member controls, that turns the member's own rules into the member's own orders. Engines say which of the member's rules was met. RAPID composes the order from the member's own policy, asks, and sends under the member's own key. The broker executes.

The law came first. Eight research rounds since July, a counsel opinion in June, and the integrations built and run along the way produced this design. Each constraint is a legal finding turned into a boundary, a default or a missing feature. P8 (7 September 2026) added the brokers' own contracts to the record, and they moved several things: the attribution question closed, a permission question opened, the price-and-time envelope changed shape, and standing execution turned out to be refused in the form we had drawn.

Version 2.1 (12 September) folded in what four adversarial reviews of the patent specification found. Five statements here promised more than the machine can deliver and are now stated at the level it can, and one real gap was closed: the order the broker receives is verified against the order the member approved.

Version 2.2 (13 September) corrects one of those changes after a second opinion. Version 2.1 required the engine to hold no connection to the Company at all while it ran. That was adopted on a technical argument, and when it was tested against the securities material it did not hold up: nothing in the authorities turns on whether a vendor's software checks in during operation. What the authorities look at is whether the vendor participates in the transaction. So the axis is no longer online against offline. It is product control against transaction control: the Company may decide whether the software runs at all, and may have no influence whatever on an individual order. R1.6 is rewritten on that axis, and the diagnostics the earlier version gave up are back.

Version 2.3 (3 October) brings L1 and R1.5 in line with Why #2: the engine never reads account or policy state. The sort-key example “longest under cost” in L1 is moved to the plan, and R1.5 no longer lists the policy hash among the engine’s inputs; it journals the engine’s own inputs (market-data source, rule version, universe list version), and the policy hash belongs to the plan journal. Per the EE ruling of 3 October.

This page is the design. What remains after it is in the Legal Position. Read them together.

The invariants: the engine only reports that a member's rule was met on an instrument; it never says buy or sell, and every decision-relevant input to it is the member's or a named external source's. RAPID composes from the member's local policy, including the direction. In per-order mode the member decides every order, and the architecture requires that he decides on a surface the engine cannot fake. In plan mode the member's own software executes the member's own plan on a machine only he controls. Nobody holds discretionary authority. No Company-controlled component can authorize or transmit an order, and no Company-originated data is an input to whether, when or how an order qualifies, is composed, is authorized or is sent. Guards can stop anything. What leaves for the broker is what the member approved. The ledger is append-only and tamper-evident. Everything else may change.

Why – the argument for this architecture

Every other auto-trading service tells the member: "we promise not to misuse our access." This one is built so that the access simply doesn't exist. Here's that argument, in five claims:

  1. The access doesn't exist. Structurally. The trade credential lives only in the runtime, on a machine the member controls. The engine never holds a trade key and has no path to the broker at all. Compromise an engine and there is still no credential to expose and no way to manufacture execution authority. This is the shape the SEC staff cleared in 2005 (CommandTRADE / GlobalTec), though that relief rested on a bundle of conditions, not on key custody alone. Who holds the key is not the statutory test, which asks who is in the business of effecting transactions for others. It is, however, the test the member's own broker applies to whose order it is: six brokers, in six separately drafted contracts, attribute an order to whoever's credentials carried it, and condition that on nothing else (Schwab ESA §12; IBKR Client Agreement ¶4; tastytrade §4; Alpaca §16(e)(7); Fidelity Terms of Use; E*TRADE §4.9). That is the fact doing the work in Layer 2. Open source makes the runtime auditable and buildable by anyone, and that is why we chose it. It is not the legal reason the boundary holds.
  2. The design targets what the research actually weighs, and the weight has moved. On adviser status the argument now leads with absence of personalization, not authorship. The Commission has described an investor-signed-up-for, investor-customizable alert keyed to the securities on the investor's own watch list as "generally … outside the scope of 'recommendations'" (88 FR 53975, citing NASD 01-23), proposed a rule to reach it, and withdrew that rule in June 2025. The configuration holds nothing about the member and uses nothing about him. That is the axis with Commission-level support. Authorship and request remain facts we preserve: the member wrote the trigger criteria himself and asked to be told. No authority yet distinguishes a rule the member wrote from one he adopted, the customer-configuration defence has never succeeded on adviser status anywhere (Rome v. Mandel), and in the one case where a customer confirmed every single trade, that fact counted for nothing (Donelson). So those facts are distinguishing, not decisive, and they should not be asked to carry the argument. They hold only if true all the way down: no Company-controlled choice may determine which instrument qualifies, when a rule fires, or how the list is ordered. The engine never names a direction at all; that mapping is the member's, held in the runtime. The builder supplies mechanics: evaluation, scheduling machinery, delivery. The economic timing, the universe and the meaning of each rule are the member's. Where the software runs changes nothing by itself (Taucher v. Born). Five of the most-cited adverse cases (R&W, Taucher, Vartuli, Donelson, Hall) are commodity cases under a statute that, unlike the Advisers Act, gives publishers no exclusion (Commodity Trend Service v. CFTC); their facts transplant, their inference does not. Labels, participant caps and disclaimers stand in for none of this: five disclaimers failed together in David Lerner Associates (2026).
  3. The brain can never create the order, or the authority to send it. (Brain is the engine. Hands are the RAPID runtime.) The engine sends only which rule was met, on which instrument, and when. No side, no quantity, no order type, no price, no time-in-force, no account. RAPID composes all of those from the member's own local policy, including whether that rule means buy or sell. In per-order mode, the member's swipe on the RAPID-owned surface is the member's own instruction for that order. In plan mode, the member's own plan, adopted field by field, is the instruction, and the member's own software executes it. In neither mode does anybody hold discretionary authority: not the Company, not the engine, not the builder. The engine can never create or enlarge an instruction. And nothing the Company operates sits on the path of an order: no service of ours is consulted while an order is being qualified, composed, authorized or sent, and no order waits on a reply from us.
  4. Execution stays inside the member's own terms, and the broker keeps them. Once the member has instructed a definite order, the order carries his own price limits: a limit buy can never fill above his maximum, a limit sell never below his minimum. Where the member wants the order worked, the broker's own order types do the working (limit, GTC, trailing stop, bracket, OCO), placed on the same single act. The runtime does not re-peg, and it does not sweep: E*TRADE's API terms treat a cancel-and-replace and a cancel as new acts each needing "a discrete, contemporaneous, and specific instruction … for that particular order" (§4.9, §1.19), that API has no amend-in-place, and the brokers' own end-of-day handling makes a sweep redundant. And the terms the broker actually receives are checked back against the terms the member saw: every adapter normalizes, rounds to lot size, translates the order type and applies broker defaults, so the outgoing request is verified to be the approved order and never a broader one. Pre-trade risk control stays with the member's regulated broker. And in all marketing, onboarding and Product Terms: the member is a customer of his own broker, not of the Company. The Company has no customer relationship to any trade. That is condition 1 of the 1996 Schwab letter, a supporting fact for the solicitation problem, not a cure.
  5. The record proves what was instructed. It doesn't change what the runtime is. The local journal links source, policy version, composed order, the exact terms shown, the member's instruction, adapter and broker response in one append-only chain. That answers what was instructed and by whom. It is evidence, not a legal transformation, and it is only as good as its tamper evidence and as the operator's lock-out: the attribution cases ask whether the party relying on the record could have produced it itself (Banister, Garcia, Aerotek), and a runtime that renders the surface, holds the key and mints the record must be able to show it could not. That showing rests on what the Company does not hold rather than on a test that came back negative: the deciding key is generated on the member's machine and cannot be exported, and no Company credential appears in the policy that governs the journal. A failed attempt is evidence of that attempt, not proof that no other path exists, and the document no longer claims otherwise. The broker's statement is the final truth about execution. The journal stores derived values and the member's own terms only, never vendor prices or price sequences.

Every layer below exists to keep one of these five enforced by the machine, not by policy. The architecture is the current legal position, in running form.

How – the target architecture

RAPID (Rule-Authorized Proposal & Instruction Dispatcher) is the shared execution stack. Independently built engines connect as signal sources through one execution boundary that the member controls. The broker stays the member's. So does the authority to trade.

Definition. RAPID is an open-source execution runtime (GPL-3.0-only, never AGPL) that runs on a machine the member controls: his own computer, or a server instance he owns and operates. Free, auditable, buildable by the member. It receives signals from authenticated engines, composes each order from the member's own local policy, takes the member's instruction, applies the member's limits, and is the only software allowed to use the member's broker credentials.

Terminology, used consistently below: engine = signal source · RAPID runtime = execution boundary · broker adapter = execution integration · broker = execution venue and account authority · member-operated instance = a machine, local or rented, that the member alone controls. (Brain and hands appear only in Why, as metaphor.)

Release shape
1 Per-order 2 Plan Member-instructed, one act per order Member-executed plan, member-operated instance
Two modes, two legal architectures. Per-order: signal, composed order, one member act, transmission. Engines may be hosted or local. Plan: the member adopts a plan field by field; his own software, engine and runtime together, executes it on an instance only he controls. What was drawn before, a bounded standing authority granted to RAPID, is refused three times over: NASD declined standing written instructions under Rule 3260(d)(1) and held to a trade-specific standard (Rel. 34-49883 at 7); SEC staff answered "We disagree" to a bounded standing authorization (2017); and E*TRADE's API terms prohibit it outright, offering a power of attorney as the only alternative, the exact characterization this architecture exists to avoid (§4.9). Across four independent authorities the two modes separate on one feature only: the presence of a per-order human act. The plan route rests on the law's own construction of a pre-adopted "algorithm, or computer program" producing the adopter's own trades (Rule 10b5-1(c)(1)(i)(B)(2)), untested for retail members with third-party software, and on the publisher line (Lowe). It is available only at brokers whose terms permit it, and it is a counsel question before it ships. Registration is the proven alternative and is listed as one, not hidden.
Figure 1 · The topology – who talks to whom
Sources – heads

YILD engine · rule-met signals only, one among equals; hosted in per-order mode, local in plan mode

Brian’s engine · independently built – own repo, logic, data

Other compatible engine · same signal contract, independently owned

→
RAPID – the member’s instance

The member-controlled execution boundary

Authenticates sources · validates signals · maps the member’s rule to its meaning · composes the order from the member’s policy · takes the member’s instruction (per-order) or executes the member’s plan · dispatches via broker adapters · journals everything.

🔒  Trade-capable credentials live only here – local keychain / isolated vault, inaccessible to every source and to the Company.

→
Member’s own broker

The member’s account

Authenticates · validates (pre-trade risk) · executes and works the order within the member’s limits · answers back: ack, fill, status.

Sources send rule-met signals only – rule, instrument, time and source identity. They never send side, quantity, order type, price or time-in-force; they never access the broker credential and never bypass the member. External reference lists are fetched by the member’s runtime directly from the publisher and passed to the engine as member configuration, never through Company servers.
Figure 2 · Inside RAPID – one order, top to bottom
1 · Source authentication

Registered identity · version · provenance – an unknown source stops here.

↓
2 · Signal validation & order composition

The signal is validated; RAPID looks up what the member said this rule means (buy or sell), and composes quantity, order type, price limits, time-in-force and account from the member’s own local policy.

↓
3 · The member’s instruction

Per-order: the complete order is shown on a surface the runtime renders in its own process; the member’s act is the instruction. Plan: the member’s adopted plan is the instruction; the runtime records which plan version authorized the order.

↓
4 · Broker adapter, and the last-mile check

Capability and permission validation · broker-specific translation, including the broker’s own order types that carry the member’s limits – invoked only after the member’s instruction, using the member’s own credentials. The request that will leave is read back and compared to the approved order before it is sent; a difference outside the declared translation, or any difference that would broaden the order, stops it.

↓
5 · Broker response & reconciliation

Ack, fill, status – reconciled against the journal; the broker’s statement is final truth.

↓
Linked journal – every step above lands here

Source → configuration → instruction → canonical order → outgoing request → adapter → broker response, as one append-only, provenance-linked, replay-safe chain.

Nothing the Company operates appears anywhere in this column. No step consults a Company service, and no step waits for one.
A layer is done when something ran and proved it. Never by reading the code.
LAYER 1

Engine – the signal source

signals
Contract – the API every new brain integrates against

An engine, hosted by its builder or running on the member’s own instance, evaluates the member’s rule logic and emits an authenticated rule-met signal only: { rule_id, rule_version, instrument, fired_at, source_id, source_signature }. It says which of the member’s rules was met, on what, and when. Never buy or sell, never how much, never how to place the order. Side, quantity, order type, price, price limits, time-in-force and account cannot cross this boundary, and a message carrying a field the contract does not know is rejected rather than ignored, so that no auxiliary channel can be opened by adding one. Engine-side settings cover universe filtering, trigger points, thresholds and trading windows, all of them the member’s. What a rule means (buy or sell), sizing, cash management and how an order is built belong to the member’s local RAPID policy. Engines never hold the member’s trade credentials and have no broker code path.

Who writes the rule. The engine is filter-based. It evaluates the member’s criteria and sorts by the member’s chosen key, a key that reads only market facts and the member’s own engine settings: closest to ex-date, yield high to low, whichever the member picked in Settings. Any ordering or lot selection that depends on the member’s account or policy (longest under cost, highest priority) belongs to the plan, not the engine; the engine’s signal is per instrument. Sort labels are neutral (“Yield: high to low”), never evaluative (“best”). The builder supplies mechanics only: evaluation, the scheduling machinery, delivery. The economic timing is the member’s: trading window, evaluation frequency, distance to ex-date, the instant a trigger counts as met. So is the universe. There is no model, no weighting, no score, no threshold, no inclusion rule and no default in the engine that the member did not set, and nothing the Company controls can decide which instrument qualifies, when it fires, or where it ranks. The list is shown in the member’s own sort order with nothing highlighted. This is what makes “the member wrote every rule” a fact rather than a slogan. It also matters the other way: a Commission release calls the adjusting and customizing of parameters discretion. On that reading every parameter we shipped pre-filled would be discretion we exercised, which is why the empty-field rule is load-bearing and not housekeeping.

Where the engine runs, and what the Company’s server may do. In per-order mode the engine may be hosted; the member’s act stands between every signal and every order. In plan mode the engine runs on the member’s own instance as licensed software. The question that then arises is what our servers are allowed to be while it runs, and the answer is drawn on one line: product control, never transaction control. We may decide whether the software continues to run at all, which is what every software vendor decides. We may not influence, permit, refuse, delay or observe an individual order.

That line is not the same as “no connection”. Version 2.1 of this page required the engine to hold no connection to us at all during a session. It was adopted on the argument that a live channel carries information through its timing and its selective failure even when its fields are narrow, which is true as a matter of channels. Tested against the securities material, it did not earn its cost: nothing in the authorities turns on whether a vendor’s software checks in during operation, and staff relief has been given to systems that sat far closer to the order than a licence call. Meanwhile the cost was real, and it fell on the member: no way for us to see that his instance had stopped, no diagnostics while something was going wrong, and support reduced to asking him to package a bundle. So the requirement is drawn on what the channel may reach, not on whether it exists.

Three things are therefore kept apart, and each is separately testable. Entitlement says whether the software may run; it is validated locally, refreshed on its own schedule outside the execution path, and has a grace period so that a failure to reach us never decides an order. Liveness goes outward only: the instance tells us it is alive and may send a diagnostic bundle with no credentials and no prices; nothing that comes back is read by the engine. Support is a state the member turns on deliberately, unavailable while an execution interval is running, and closed again before ordinary operation resumes. The claim this architecture makes is not that no packet flows. It is that no Company-originated data is an input to qualification, composition, authorization or execution. That can be shown; “there is no connection” cannot, and would not be true at the transport layer in any case.

The stronger variant remains available and is described in the patent: an entitlement signed before a session, validated locally, with no operator-directed traffic at all for its duration. It is the better answer against a compromised backend, and a member or a broker may require it. It is not a condition of the legal position, and the product does not pay for it by default.

Requirements
  • R1.1Source messages conform to the published integration contract, carrying registered source identity, version and provenance on every message. An unrecognized field is rejected, not ignored.
  • R1.2The signal contract permits rule identity/version, instrument, timestamp, source identity and source signature – and rejects side and every order-construction field: quantity, order type, price, price limits, time-in-force, account.
  • R1.3No trade credential, no broker imports, no order-transmission path anywhere in the engine – provable by static check.
  • R1.4Pairing by code: the engine learns only which runtime to address. Connecting an engine never grants execution authority of any kind.
  • R1.5Decision provenance, per fired signal. A declared manifest names every class of input allowed to affect which instrument qualifies, when it fires, and how the list is ordered: the build identity of the evaluating component, the rule-interpreter version, the clock source, each data publisher with its retrieval time and parser version, adjustment tables, the universe list and its version and retrieval time, the rule version, the sort key, the missing-value policy. The policy hash is not an engine input; it belongs to the plan journal (L4). For each fired signal the runtime resolves the inputs actually used in producing that result to an origin and version permitted by the manifest. The check is per signal and fails closed: an input that is unknown, unclassified, stale or not permitted makes that signal non-executable and the rejection is journaled. The engine may compute objective metrics mechanically from transparent definitions. Sort labels are neutral. The display carries no highlight, pick or emphasis.
  • R1.6Product control, not transaction control. The Company operates an entitlement service that decides whether the software may run. It is constrained so that: (a) it receives no operation, instrument, event, rule, account, source or broker identity; (b) it is never called as a prerequisite to, or synchronously within, the handling of a particular order, and no order ever waits on its reply; (c) it cannot issue, modify, revoke or validate an execution capability; (d) it can neither read nor write the journal, the member’s policy, an adopted plan, the trade credential or any composed order; (e) it is called on a cadence independent of orders, with local validity determination and a local grace period, so that its unavailability cannot itself decide an order; and (f) its response changes entitlement state only, and can never change the outcome of an order that has already qualified or been authorized. Liveness is outbound only, carries no order data, and nothing returned is read by the engine. Interactive diagnostics exist only in a support state the member enables, unavailable while an execution interval is running. The property claimed, and the one to test, is that no Company-originated data is an input to qualification, composition, authorization or execution. Verified three ways: the published interface contract, static analysis showing no call from the order path, and network capture across a full session. A stronger variant, in which the entitlement is signed before the session and no operator-directed traffic occurs at all, is available where a member or broker requires it.
Definition of Done
  • a sample message validates against the integration contract (conformance test); messages carrying side or an unknown field are rejected
  • static check green: zero broker/credential code paths in the engine
  • provenance: for a sample of fired signals, every input actually used resolves to the manifest; an injected unknown input makes the signal non-executable (negative test)
  • pairing flow proven end-to-end; unpaired or unauthenticated source rejected (negative test)
  • call-graph analysis shows no path from order handling to the entitlement service; with the service unreachable for a full session, orders are qualified, composed, authorized and sent normally (negative test)
  • network capture across a session: every outbound message is classified as entitlement, liveness or member-enabled diagnostics, and no inbound payload reaches the engine’s decision path
LAYER 2

Instruction – the member’s decision

the member decides
Contract

The member works in the engine’s own interface. The engine shows that a rule was met. Beside it, a RAPID-owned approval surface shows the complete order RAPID composed from the member’s local policy: security, side, quantity, order type, price limits, time-in-force and account. The member places the order with one tap or swipe on that surface. That act is the member’s own instruction for that order, and it creates the instruction record: the exact terms shown, member, account, source, scope, timestamp and nonce. Immutable once minted.

No discretionary authority exists, in either mode. Nobody is granted standing power over the member’s account: not the Company, not the engine, not the source, not the builder. In per-order mode each order is the member’s current instruction for a definite quantity of a specific security. In plan mode the member’s adopted plan is the instruction, and the software executing it is his own, on an instance only he controls. Six brokers’ contracts treat an order under the member’s credentials as the member’s own, and none conditions that on who composed it or whether a human reviewed it. A member who never grants an authorization does not create the fact that someone holds one.

One approval, one trusted path. No second confirmation, no extra popup. The surface sits beside the engine experience but is rendered by the runtime, in the runtime’s own process, never inside the engine’s page. The engine frames the workflow. It can never produce the member’s yes, and it must never be able to draw the surface the yes is given on.

Trusted surface, and why it exists. The surface earns nothing by being ours. No instrument or decision was located in which the identity of the party that rendered a screen decided whose act it was; attribution runs on actual authority and on credentials, and NASD NTM 98-66 expressly lets a third party build and operate the surface. What the attribution cases do ask is whether the party now asserting the act could have produced it itself (Banister, Garcia, Aerotek); where it could, attribution fails. A runtime that renders the surface, holds the credential and mints the record sits in the losing posture until it can show lock-out of all three. The showing rests on what is not provisioned rather than on a test that came back empty: the key that turns a swipe into an instruction is generated on the member’s machine after install, marked non-exportable, and never supplied by or escrowed with us; and no Company principal appears in the policy that permits a write to the journal. Those are facts about what exists, and they can be inspected. Threat model: the operating system and the signed RAPID runtime are trusted; the engine process is not; compromise of the operating system is out of scope. The minimum is R2.5. If it cannot be guaranteed on one machine, a secondary trusted channel (the member’s phone as remote to his instance) is the clean answer; still one swipe. Which mechanism is chosen is open. That one is required is not.

The per-source permission ladder – safe by default

Per-order modedisabled → per-order instruction

Plan mode · separate trackdisabled → plan adopted → member-executed on member-operated instance

Every new source starts disabled. The member can switch on per-order live use right away, with one explicit, logged local act. No waiting period, no intermediate mode. Each order then takes a fresh swipe on the RAPID surface. Plan mode is a different legal architecture and stays a separate track: the member adopts a plan field by field, the plan is journaled as a versioned instruction, and the member’s own engine and runtime execute it on an instance he alone controls, at brokers whose terms permit it. It is not a standing authority granted to anyone, and the documents no longer describe one: the Commission has held that a customer’s approval of a general strategy is not time-and-price discretion, and located the definiteness requirement on the customer’s grant rather than on the resulting order (Pino). A built-in delay between a rule being met and submission is kept as a system requirement in plan mode so that no order leaves at machine speed; the delay carries no legal claim. No authority says an interval bears on who decided; the only delay federal securities law mandates exists to sever an informational link, not to locate a decision.

Requirements
  • R2.1No order reaches dispatch without an instruction record. There is no second door.
  • R2.2An instruction record is minted only from a member act observed through the runtime’s trusted path, or from the member’s adopted plan in plan mode, cryptographically bound to the exact terms, the source, account, scope and a nonce – and immutable after mint, enforced in storage, not just in code.
  • R2.3Permissions are per-source and local; every new source starts disabled, and enabling per-order placement or adopting a plan requires a separate logged member act. No permission is inherited from pairing.
  • R2.4Member instruction record. For every transmitted order, the journal records evidence that the member personally instructed it: the exact terms, the act or the plan version, the surface, time and actor. Neither mode relies on any standing discretionary authority granted to the Company, engine, source or builder, and the runtime issues no document that would suggest one exists. Closed 7 September 2026: six brokers (Schwab, Interactive Brokers, E*TRADE, tastytrade, Alpaca, Fidelity) treat an order carried by the member’s own credentials as the member’s own instruction, in deeming language, and none conditions that on who composed the order or on whether a human reviewed it.
  • R2.5Trusted surface, minimum: (1) the surface is a separate, signed RAPID process, never an iframe, WebView or DOM the engine owns; (2) it is a native top-level window whose input is delivered directly to the RAPID process; (3) the engine has no accessibility, input-monitoring or screen-capture access to it; (4) the surface receives order data from RAPID, which recomposes independently; the engine can supply signal identity only; (5) the surface shows an authentication mark derived from a runtime secret and bound to the order and session nonce; (6) the swipe event is minted inside the RAPID process and bound to order hash, surface/session nonce, member, release identity and timestamp; (7) if the trusted path cannot be established, the surface fails closed; (8) operator lock-out is a property of what is provisioned, not a conclusion from a test: the key that produces an instruction is generated on the member’s machine after install, is marked non-exportable in a hardware-backed or OS-protected store, and is at no point supplied by, escrowed with or recoverable by the Company; no Company principal appears in the access policy governing the journal or the issuing of an execution capability; and the set of principals in those policies is inspectable. A verification run that attempts the prohibited operations under Company credentials is recorded as evidence of those attempts, and is not offered as proof that no other path exists. Mechanism (same-machine isolation vs secondary channel): open.
Definition of Done
  • invariant test: dispatch without an instruction record is rejected
  • invariant test: altered terms and replayed envelopes are rejected
  • proven: a newly paired source starts disabled; per-order use or plan adoption begins only after an explicit local member act
  • negative tests, all rejected: fake window · overlay · focus steal · injected click or swipe · accessibility read · replay · order changed after render
  • lock-out shown as provisioning: the signing key is generated on the instance and reported non-exportable; the principal list for journal writes and capability issuance is produced and contains no Company principal; the attempt log is attached as evidence, not as proof
  • for a sample of transmitted orders, the journal shows the member’s instruction before transmission; no document in the system grants standing authority to anyone
  • done 7 Sep 2026: six brokers’ account and API terms read; all six attribute an order to whoever’s credentials carried it
LAYER 3

RAPID runtime – validation, policy, dispatch

executes
Contract – the pipeline

authenticated signal → signal validation → member local policy (incl. rule meaning) → order composition → member instruction (act or plan) → instruction record → broker adapter → last-mile check → broker response & reconciliation

The runtime builds the order from the member’s own local policy: what each rule means (buy or sell), sizing, cash reserve, order type, price limits, time-in-force, account, instrument, and frequency and risk limits. The member enters those fields during onboarding, one at a time. Fields start empty. No presets, no one-click imports. Each policy version is journaled as a new event. Reference material stays beside the screen, not on it: the product neither fills a field nor shows a published figure next to one (Keimer; SEC 2008 layout guidance). The onboarding session is recorded, and the consent is asked and answered inside the recording (RCW 9.73.030(3); State v. Fields). Market data is the member’s own: each member connects his own broker or data token. RAPID and the Company hold no data credential.

External lists come straight from the publisher. After one explicit enable act, the member’s runtime fetches a list such as an RMS Universe from the publisher’s own endpoint. The Company never mirrors, caches, relays or re-serves it. The engine gets the list from the member’s runtime as part of the member’s configuration. Never from Company servers.

Dispatch, and the last mile. After the member’s instruction, the Dispatcher sends it through the chosen broker adapter to the member’s own broker. Credentials stay per member and local. There is no Company-level trading credential, no netting or routing across members, no “fire all now”. No Company-controlled component can authorize or transmit an order, and nothing the Company operates is consulted on the way.

Between the approved order and the broker there is one more step, and it is the one the earlier version of this page skipped. Every adapter transforms: it normalizes the symbol, rounds the quantity to a lot size, rounds the price to a tick, translates our order type into the broker’s, maps the account, and lets the broker apply defaults to anything left unspecified. So the request that leaves is not literally the object the member approved. R3.11 closes that gap: the adapter builds the outgoing request in full, reads it back, and compares it to the approved order under a declared translation for each field. A difference the translation does not allow stops the order. So does any difference that would make the order bigger: more quantity, a looser price limit, a longer life, another account, or a field filled in that the member left empty. The order may be expressed differently. It may never be broadened.

What the runtime does not do afterwards. The order carries the member’s own price limits, and where the member wants it worked, the broker’s own order types do the working on the same act. The runtime does not re-peg (a cancel-and-replace is a new order without an instruction under E*TRADE §4.9) and does not run an end-of-day sweep (a cancel is an act too, and the brokers’ own day-order handling covers it). It acts on nothing by itself after dispatch. It is not, however, a system that cannot cancel: the member can stop an order at any time from the app or at his broker, and any such action is his own fresh instruction through the same path. Software that can never intervene is not safer; it is only less useful in the moment something goes wrong.

Two questions per broker, and only one is ours to answer. Attribution (whose order) is settled by the brokers’ own contracts. Permission (may this software connect at all) is each broker’s own gate, and no consent design reaches it: E*TRADE requires a vendor key and a review with unpublished criteria; Schwab requires written approval through its Developer Program; Interactive Brokers expects a third party offering automated trading to hold registration or to supply a legal opinion explaining why not; tastytrade requires prior written approval for software the member did not write; Fidelity prohibits it and has no retail API. A broker is supported only when that gate is read and met. And broker approval says nothing about legal status: Schwab’s Developer Program Agreement §3 and Fidelity’s Account Authority form both disclaim it, so no approval is ever recorded as comfort.

Requirements
  • R3.1Every gate fail-closed; null means reject, not unlimited; missing state means FREEZE.
  • R3.2The member’s stop, set in the member’s local policy: the emergency stop – member-triggered, sets TRADE to OFF for every source at once and cancels the runtime’s own resting orders on the member’s act; stop needs no confirmation; TRADE can be switched back on only from desktop Settings, where the member goes through the terms again and accepts them afresh, and that acceptance is journaled as an instruction event with terms version, time and actor; no written reason is asked for. There is no scheduled sweep; resting orders are day orders unless the member chose otherwise, the broker’s own end-of-day handling applies, and the member may cancel any order himself in the app at any time.
  • R3.3Operator halt – the Company's own stop, distinct from the member's. For a hosted engine, the operator can stop it emitting signals to every paired runtime at once, and the Company can revoke a source's registration so no runtime accepts it. For a local engine, the Company can withdraw a release and decline the next entitlement, which stops the software after its current validity and grace; it cannot reach a running order, and does not try. The halt is deliberately coarse: it is product control, which is why it is available to us, and it is why it cannot be used on an individual order, which is what would make it transaction control. All halts are logged with time, actor and reason, and drilled. This is the mechanism behind every stated role limit: a limit that cannot be enforced and shown to have been enforced protects nobody (Ranieri Partners / Phillips). The member's stop protects the member; the operator halt protects the founders.
  • R3.4Trade-capable credentials live only in the local keychain / isolated vault – inaccessible to signal sources and to the Company; the execution key may advance an order, never enlarge one; orders are followed by broker order-id only, never by guessing.
  • R3.5Broker adapters are per-broker translations behind one contract – adding a broker adds an adapter, never a change to the core. Each adapter declares which of the broker’s own order types carry the member’s limits, and the runtime composes with those.
  • R3.6Member policy fields are entered individually, start empty, are versioned and journaled, and cannot be populated from Company presets or another member’s configuration.
  • R3.7External lists are fetched by the member’s runtime directly from the publisher endpoint after an explicit enable act; Company servers never proxy, mirror or re-serve them.
  • R3.8Broker access uses the member’s own supported retail API credentials. No Company-level trade credential, cross-member netting, venue selection or batch placement path exists. After dispatch the runtime takes no action on an order by itself. Any modification, replacement or cancellation requires a fresh member instruction through the same trusted path, or is performed by the member directly at his broker. This is deliberately stated as the absence of autonomous action and not as the absence of any path: a system that could never cancel would be unsafe, and the member’s ability to stop an order is part of the design.
  • R3.9Broker permission gate, per broker, before the adapter ships. Attribution and permission are separate conditions and the brokers answer them separately. A broker is supported only when its current terms for third-party software have been read in full, met and journaled with date and version, including what the broker requires of the vendor (key tier, review, registration, legal opinion, indemnity), and any term that constrains the runtime’s own behaviour is mapped to the capabilities that broker may run. Plan mode is enabled per broker only where those terms permit order submission without a per-order instruction. No capability is treated as a property of the runtime until it is permitted at every broker where it is offered. Broker approval is recorded as permission, never as a statement about legal status.
  • R3.10Member-operated instance, measured rather than asserted. In plan mode the runtime and engine run on a machine the member alone controls: his own computer, or a server instance in the member’s own provider account, provisioned from a Company-published image. Before a session begins, the runtime enumerates the administrative capabilities over that instance (start and stop, console or shell, key-store access, disk attach and snapshot, network policy, image replacement, role assumption) and evaluates whether any Company principal can reach any of them, directly or through an assumed role. The result is one of three: reachable, no path found on a complete model, or indeterminate where a policy construct is unsupported, a principal cannot be resolved, or the data is stale. Only the second permits a session to start; indeterminate is treated exactly like reachable, so an unmodelled policy edge is never mistaken for absence of access. The result is signed with the release identity and journaled. The Company receives from the instance only what the member enables: liveness, a diagnostic bundle without credentials or prices, and an opt-in journal summary. Updates are pulled as signed releases and are not executed until the member adopts them; the adopted release is fixed for the session. Note the limit of the claim: this excludes the Company, not the infrastructure provider, who retains snapshot and hypervisor access in any cloud embodiment.
  • R3.11Last-mile binding. Before an order is transmitted, the adapter constructs the complete outgoing request, including every field the broker will receive after symbol normalization, lot and tick rounding, order-type translation, account mapping and broker defaults. That request is parsed back into an order and compared to the approved order under a declared, versioned translation profile that names the permitted transformation and tolerance for each field. Transmission proceeds only on equivalence. A transformation outside the profile, or any transformation that would broaden the order – greater quantity, looser price limit, longer time-in-force, different account or endpoint, or a field populated that the approved order left empty – causes refusal, never adjustment. The profile version and both forms of the order are journaled, so the record shows what was approved and what was sent.
  • R3.12Nothing of ours on the order path. No Company-operated service is invoked while an order is being qualified, composed, authorized or transmitted, and no step of that handling waits on a reply from one. This holds whatever the service is called: entitlement check, policy lookup, rate limit, feature flag, health probe. Enforced by call-graph analysis as a release condition, and demonstrated by running a full session with every Company endpoint unreachable.
Definition of Done
  • all gates proven by running tests, incl. failure paths (negative tests)
  • kill-switch drill from the member’s grip on a live order, and an operator-halt drill from the engine side, both measured with timestamps
  • credential isolation proven: neither a source nor the Company can reach the vault
  • no autonomous post-dispatch action exists in the runtime (static check); a member-initiated cancel works end to end and is journaled as a fresh instruction
  • last-mile: for every adapter, a suite of orders is composed, translated, parsed back and compared; each broadening mutation (quantity, price, time-in-force, account, filled-in field) is rejected (negative test)
  • order path clean: call-graph analysis finds no Company endpoint reachable from order handling, and a full session runs normally with every Company endpoint blocked (negative test)
  • adapter conformance suite green before any new broker goes live, including the broker’s terms read, its requirements satisfied and recorded, and its constraints mapped to the capabilities enabled there (R3.9)
  • boundary measurement runs before a session and is journaled; a deliberately unsupported policy construct yields indeterminate and the session does not start (negative test)
LAYER 4

Linked journal & reconciliation – append-only, tamper-evident

proves
Contract

The member’s local journal links source → signal → local policy version → composed order → instruction → outgoing request → adapter → broker response as one append-only, provenance-linked, replay-safe chain. Broker API events land as provisional; the broker’s statement is final and promotes them. History is never rewritten, “not even by the hand that wrote it”. Corrections are new events. Append-only, provenance-linked and replay-safe are the required properties. A local file can still be deleted, truncated, replaced or written by a modified runtime, so the journal proves nothing on its own until four more things are true: events are signed, the release that wrote them is identifiable, time is trusted, and each instruction is bound to the surface or plan version it came from. Those are requirements, listed below. How they are stored and signed is an implementation decision, left open on purpose.

Requirements
  • R4.1Every executed row carries member, account, source, policy version, instruction and evidence source; cross-account or cross-source matching is forbidden and invariant-tested.
  • R4.2Broker API events are provisional; the broker statement is final authority and promotes the record without rewriting history.
  • R4.3Performance numbers follow the protocol: the denominator is always named – WC-at-cost CAGR ≠ realized-on-cash ≠ projections, never blended.
  • R4.4Tamper evidence: every event is signed by the runtime; the signing release is identifiable against the Company’s published release signatures; timestamps come from a trusted source; deletion or truncation is detectable from the chain. Because a local store can be replaced or rolled back wholesale, the chain head is periodically published to a place outside the instance that the member chooses, so a rollback is caught by comparison rather than assumed impossible. Mechanism: open.
Definition of Done
  • one query answers “who decided this trade” with the full linked chain, including what was approved and what was sent
  • terminality guard proven – rewrite attempt rejected
  • provisional → final promotion proven on a real fill
  • cross-account/source invariant test proves rejection
  • a truncated or edited journal is detected on verification; a wholesale rollback is detected against the externally published chain head (negative tests)
What – briefly

A quick read of your codebase (the July version) is encouraging. The distance from your engine to this target looks shorter than the pages above suggest. We see:

The prompt below – what it's for

Our read is stale, so the honest starting point is a fresh map made by you. This prompt produces a factual inventory of the current engine: modules, flows, decision points, seams. Run it, rewrite it, or skip it. Whatever map comes out is the shared picture we plan the integration from.

Produce a factual component map of this trading engine. Facts only – no judgments, no design advice. Deliver the result as one self-contained HTML document. Cover:
1. MODULE OVERVIEW – each file/module, one line on what it does (cite function names).
2. DATA FLOW – inputs (broker API? files?), outputs (orders? emails? logs?), and the order of a typical run.
3. DECISION POINTS – exactly where a BUY/SELL decision is made; which thresholds are hard-coded vs configurable.
4. BROKER COUPLING – which API and which calls (order placement, status, cash); retry and error handling around them.
5. BOOKKEEPING – how lots, markers and gains are recorded; definitions implicit in the code.
6. DEPENDENCIES & RUNTIME – language, libraries, startup, assumptions (account, subscriptions, machine).
7. SEAM CANDIDATES (observation only) – existing boundaries between "signal" and "execute".
8. OUTBOUND CALLS – every call the engine makes to a server the builder operates, and whether any of them sits on the path of an order.
Cite file + function for every claim. Mark assumptions [ASSUMED]. Keep code excerpts minimal.