Holding investment decisions to a plan written before the decision, and measuring the gap from the broker’s record

TradeLog and Indy: a decision-discipline system for active investors, with a companion charting toolkit. I designed and built both. The investor writes down their Rules before a session. Afterwards, TradeLog reads every execution from the broker’s record and grades each Rule as kept or broken: that is Verified Adherence. The investor’s own grade for the same day is Claimed Adherence, and the two sit side by side, because the gap between them is what a review should look at. Indy is a set of chart indicators that records what a chart displayed at a point in time.

Sponsor
Self-directed · product design and architecture
Status
Design and architecture published
Governing constraint
Methodology Silence
Reading time
11 minutes

Design, not dollars The figures behind this system are personal. No dollar figure, account balance, return or behavioral finding from the account’s record appears here. The method stays private too: the real Rules, their thresholds and their definitions are withheld, which is what Methodology Silence means on this page. Every Exhibit uses the Illustrative Investor, an invented investor with a synthetic account over a synthetic period, whose Rules A to D stand in for the real ones. What is published is the product and its architecture.

What this Engagement produced

  • 4 Rules machine-checked

    Committed in advance, then evaluated against the broker’s export rather than graded from memory.
  • 0 order paths to the broker

    Placing an order from the system was rejected outright, and the broker integration reads and never writes.
  • 3 indicators rebuilt

    In Indy, one inherited script was diagnosed, then rebuilt from shared modules that are never published.

The Situation

TradeLog was built around a single futures account, my own. Each day it does three jobs. It holds the investor’s Rules, written in advance. It reads every execution the broker recorded. And it grades each Rule on each day as kept or broken, next to the investor’s own grade for the same day.

Investors with a written plan usually grade themselves afterwards. They grade from memory, after the pressure has passed. The decisions most worth reviewing are the ones taken outside the plan and disowned on review. Those are the least likely to be recorded at all.

So a self-reported adherence figure shows what the investor meant to do. Care makes this worse. The more carefully someone writes up their decisions, the more believable their number looks, even for the sessions their notes never covered.

The record that would settle it already exists. The broker writes down the entry, exit, size, fees and timestamps of every execution as it happens. Nothing needs remembering, only reading. Then something has to be willing to disagree with the investor about it.

What I Did

Exhibit 1 Four steps turn a plan into a record that can be reviewed.

Step through the cycle to see what the Illustrative Investor has in front of them at each step, and which part of the system carries it.

View the data
One day of the Illustrative Investor, taken once around the cycle
StepWhat the Illustrative Investor seesCarried by
CommitAll four Rules are written down in advance and saved as version 1: Rule A for position size, Rule B for entries, Rule C for exits and Rule D for when to stop.The ruleset
RecordEvery execution of the day, read from the broker’s export with nothing typed in: entry, exit, size, fees and timestamps.The broker integration
CompareVerified Adherence, computed from those executions, beside Claimed Adherence, the Illustrative Investor’s own account of the day. The record shows Rule C broken once, while the account says it was kept.The evaluator
ReviseRule B is revised on review and saved as version 2. The next day is graded under version 2, and this one stays graded under version 1.Versioned configuration
Source: illustrative, one day of the Illustrative Investor, taken once around the cycle. The cycle repeats whenever the Rules are revised, and one pass is drawn.

TradeLog computes Verified Adherence by checking every execution the broker recorded against the investor’s Rules. Each Rule is written in advance, in the ruleset, as a condition a computer can check. The figure comes from the ruleset and the broker’s record alone, and nothing the investor types reaches it.

A simpler product would delete the self-report at this point. TradeLog keeps it. Claimed Adherence, the investor’s own account of the same session, sits beside the computed figure, and the difference is shown for review instead of reconciled away. The record knows what happened and can never know why. The investor knows why, and has every reason to be generous. The gap shows where belief has drifted from behavior, which is what a record of decisions is for. Averaging the two into one score is the one step that destroys it.

Exhibit 2 Averaging what was done with what was reported erases the signal worth reviewing.

Read each Rule across the week, the record beside the report, then press Report one combined score.

View the data
A synthetic week of the Illustrative Investor, each Rule graded for each day from the broker’s record and as reported in review
DayRuleVerified AdherenceClaimed Adherence
MondayRule A, position sizeKeptBroken
MondayRule B, entriesKeptKept
MondayRule C, exitsKeptKept
MondayRule D, when to stopKeptKept
TuesdayRule A, position sizeKeptKept
TuesdayRule B, entriesKeptKept
TuesdayRule C, exitsBrokenKept
TuesdayRule D, when to stopKeptKept
WednesdayRule A, position sizeKeptKept
WednesdayRule B, entriesBrokenBroken
WednesdayRule C, exitsKeptKept
WednesdayRule D, when to stopKeptKept
ThursdayRule A, position sizeKeptKept
ThursdayRule B, entriesKeptKept
ThursdayRule C, exitsBrokenKept
ThursdayRule D, when to stopKeptKept
FridayRule A, position sizeKeptKept
FridayRule B, entriesKeptKept
FridayRule C, exitsKeptKept
FridayRule D, when to stopBrokenKept
Source: illustrative, a synthetic week of the Illustrative Investor. Each Rule on each day is graded from the broker’s record (Verified Adherence) and by the investor in review (Claimed Adherence). Kept or broken is a simplification for this Exhibit, and the combined score is the plain average of both counts.

Three decisions hold Verified Adherence up.

Decision 1: one calculation produces every number. The evaluator is a single function. It takes the executions, the ruleset, the account, the investor’s notes and the date as inputs, and returns every number on every screen. It does not look up the time or read saved data for itself. Because the date is an input, re-running a session from March today gives the answer it gave in March. Nothing else recomputes adherence, so every screen shows the same answer.

Decision 2: Rules are stored as versioned configuration. The investor has to be able to edit them, or they are the system’s rules and not the investor’s. But a threshold edited in place rewrites its own history: last month’s adherence silently becomes a claim about this month’s rule. So every edit saves a new version, and every day records the version it was graded under. A rule changed today changes how tomorrow is graded and leaves graded days alone.

Exhibit 3 A revised rule governs the decisions after it, and earlier decisions keep the rule they were made under.

Read the week as revised, then press Edit in place and watch what happens to the days already graded.

View the data
The synthetic week of Exhibit 2 for Rule B: the version each day was recorded under, and the day graded under each version of the Rule
DayRuleRecorded underGraded under version 1Graded under version 2
MondayRule B, entriesVersion 1KeptKept
TuesdayRule B, entriesVersion 1KeptBroken
WednesdayRule B, entriesVersion 1BrokenKept
ThursdayRule B, entriesVersion 1KeptKept
FridayRule B, entriesVersion 2BrokenKept
Source: illustrative, the synthetic week of Exhibit 2, for Rule B only, of the Illustrative Investor. Rule B is revised on review after Thursday and saved as version 2, as in Exhibit 1, and the system grades each day only under its own version, matching Exhibit 2. Both versions are shown here so an edit in place can be drawn. What either version of Rule B says is withheld.

The rubric that scores the investor’s notes is versioned the same way, one level finer. A Rule version is recorded per day, because a clean day is a claim about the whole day. A rubric version is recorded per note, the single entry it scored.

Decision 3: order placement is rejected outright. The appeal was real. The system knows when the budget is spent, so it could block the next order instead of only objecting to it. I rejected it because a block works only if it cannot be bypassed, and the broker’s own platform is one keystroke away. It would buy no enforcement while adding two failure modes that did not exist before: a bug that moves money and a failed request that leaves a position open. What is left is a read-only broker integration. It runs on the server, keeps the key out of the browser, and reads without ever writing. When the connection fails, the system says so loudly. A stale count shown as a current one is worse than no count, because it gets believed.

Exhibit 4 The system observes every execution and places none.

Read the paths as built, then press Connection failed to see what the Illustrative Investor is shown when the record stops arriving.

View the data
The paths between the broker and TradeLog for the Illustrative Investor’s account, whether each was built, and how each fails
PathFromToBuiltFailure mode
Read the execution recordThe brokerTradeLogYesThe connection fails and the record goes stale
Place an orderTradeLogThe brokerNoA bug that moves money
Place an orderTradeLogThe brokerNoA failed request that leaves a position open
Source: illustrative, the paths between the broker and TradeLog for the Illustrative Investor. The order path was not built, so its failure modes, named above, are drawn struck through. The notice is worded for this Exhibit, not copied from the system. The broker’s name, how the system signs in to it, and every detail of the account are withheld.

Indy is the charting half: a set of chart indicators whose job is to remove drafting labor, not to supply judgment. Where it could either present evidence or resolve it, it presents, and it carries no direction readout at all. Its link to TradeLog is an export of what a chart showed at a point in time. The export is structured data, imported through TradeLog’s existing import as a chart record that makes no claim a trade was placed.

Indy began as an inherited script that did a fraction of what I wanted, and did that fraction wrong. The first work was not the rewrite. It was saying exactly how the script failed. One readout had never displayed once in months of use. A four-digit time was being handed to an argument expecting an hour, so every comparison fell through to the same branch. I deleted it instead of repairing it. It existed to make the script look elaborate, nothing depended on it, and a requirement nobody has is not a requirement.

A second defect had two possible behaviors and nothing to tell them apart. A daily reset was keyed to a timezone where it needed a session. So either the overnight levels were cleared before the investor’s active session, or they were never cleared at all. Neither reading the code nor using it had settled which. Naming both defects turned a vague intention to rebuild into a specification of fifty numbered requirements.

The charting platform’s shared-library feature publishes its source code to anyone, without exception. So the shared logic could not be published there as a library, and that one decision shapes the architecture for good. The code lives as modules in a private repository, and a build step joins them into the three scripts that run on the charts. All three are built from the same private code, and none of that code is published.

What Changed

TradeLog stopped being a place to type once executions arrived by import and became the record. Journaling became adding notes to rows that already exist, limited to what the broker cannot know. The headline figure changed with it. It used to be a score of how completely the journaling form was filled in. Now it is how much room the account has left before it ends.

Indy changed the weekly review the same way. A week’s review became reading records instead of opening dated folders of screenshots.

Pending Result Whether holding decisions to a written plan this way improves them is not answered here. TradeLog is designed to improve three things: commitment to a plan before a decision, honest review after it, and the ability to see drift between intention and action. Whether it does so, for anyone, would take a long run of decisions read against the same account before and after the change, and that record is not published. Returns are out of scope.

Withheld What the committed Rules would have done across the account’s history has been computed exactly, from executions that already happened. It is not on this page. That figure is a personal profit-and-loss number. A number about my own account is not evidence about my engineering, and it is what a reader would remember instead. A check in the site’s build now fails if a dollar figure of that kind appears in any page. So this is enforced by the build, not left to my restraint.

What I Learned

I wrote TradeLog’s interventions from a story about the user, not from the user’s record. Each one was plausible, and that was the whole of the evidence behind it. When I finally pointed the same import that produces Verified Adherence at the trigger list, one trigger turned out to be watching for a pattern the record did not contain. I retired it.

The uncomfortable part is that the check cost nothing, and the data for it had been there from the first day. I had built the instrument that could check my own product before it occurred to me to point it there. Indy taught the same thing from the other end: a readout dead from the day it was written sat on the chart for months, unnoticed because nothing depended on it. “I use it and it works” is not evidence that it works.

What this page claims, and what it does not

Nothing here should be read as a claim that the product worked. The Pending Result above says what evidence that would take, and why it is not published.

What the page claims is narrower and checkable. The figure comes from a record the user does not write. The calculation gives the same answer on old data. And the decisions behind both were written down with their alternatives at the time, not reconstructed afterwards for a write-up.

Where Else This Applies

The framework is not specific to one account. Any investor, adviser or investment committee held to a written plan faces the same gap. It appears wherever the plan is committed in advance, someone else records the executions, and the people who made the decisions report their own adherence. An adviser’s recorded rationale could be read against the client’s executed trades, or a committee’s investment policy statement against the portfolio’s transactions. Adherence would be computed from the execution record and kept beside the adherence reported, and the gap would be reviewed instead of reconciled.

Self-report measures intention, and it fails hardest where it matters most. Control attestations, training completion, time recording and safety checklists all ask the person who did the work to confirm they did it properly. Each is least reliable in exactly the cases worth catching. Where a system already holds a record of the behavior, compliance can be computed from it. The distance between claim and record is then a second measurement, and most organizations throw it away by reconciling it.

A rule that changes needs versions. Change a credit policy, a risk limit, an eligibility criterion or a service-level definition in place, and last quarter’s compliance rate silently becomes a statement about this quarter’s rule, with nobody told. Versioning the rule, and recording which version graded each case, costs almost nothing at design time and cannot be added afterwards.

Refusing a capability is an architecture decision. The broker integration is not read-only because writing was hard. It is read-only because the write path added risk to a system whose whole purpose was to reduce it. A decision recorded with the alternative it was chosen over survives the next person to notice the gap, even when that person is me, six months later, with a plausible reason.

All six Engagements Ask me about this one