Mithraeum · Agora

The workbench

The Hub

The fourth program never ships to anyone. It launches the other three, watches them, tests them, backs them up and packages the release. It is the room the rest of the project was built in.

Its views are grouped by what you are doing rather than by what things are — building, operating, or shipping. That sounds like a cosmetic decision and is not: it is the rule that decides where a new tool goes, and having a rule is what stops a workbench turning into a drawer.

Build

Workbench and design documents, an ideas board, a prompt repository, a diagnostics reader, an API tester, the dependency report, and the test-suite runner.

Operate

Live status of every service, the operator console for both backends, backups, background monitoring with history and alerts, and a finder for processes that should not be running.

Ship

The packager that produces the desktop build, and the changelog. Every build writes a record — version, channel, the addresses baked into it, checksums — so a release identity is never retyped from memory. A build runs on this machine or on a second build host, a Windows virtual machine, and the platform follows the host it ran on rather than a flag anyone could set wrongly.

The Hub — Workbench · the plan catalogue
The Workbench's plan catalogue: thirty-seven engineering plans with status chips — nineteen complete, six partly built, two not implemented, ten reference — each carrying its size, age and a one-line shipping note.
The design record, with its statuses told apart from its prose. Every plan carries a deliberately-set status chip — complete, partly built, not implemented, reference — because plan headers lie in both directions: one document announced "plan only" eighty rounds after it shipped. The chips are tracked separately from the files, on purpose.
The Hub — Dependencies
The dependency report: a summary counting two declared packages not installed, an interpreter section marking Python 3.9.6 past end of life in red as the ceiling on everything below, and per-package rows with declared, installed and newest-usable columns — including a pinned flask with its written reason.
Reachable is not latest. The loudest row is the interpreter — past end of life, and the ceiling on every package below it. The flask pin carries its written reason and its re-check condition, because a pin with no reason is a suppression waiting to outlive it. The report will not upgrade anything itself.

Three lists of one shape

The workbench keeps three lists that look alike and answer different questions, and they are never merged. The plan catalogue is a record of decisions — what is being built, and how far it got. The ideas board holds observations: what a scheduled review noticed on a given day that nobody has acted on yet. The prompt repository holds instructions not yet given — a request written now, filed with an urgency and a category, and submitted later.

Four rules this thing taught me

A pin is a claim, and a claim needs a reason. Every pinned dependency, every exempted list, every route marked deliberately unreachable has to record why. The checks fail on an entry whose reason no longer applies. It stops the oldest failure mode in any codebase: a suppression added for a good reason in year one, still suppressing in year three, reason long forgotten.

Nothing on this site is investment advice or an offer of any product or service.

How it was built

Working notes

The project is 543 numbered rounds long. Each one is written up before it closes — what changed, what broke, and what the mistake taught. A handful of those lessons ended up shaping everything after them.

One fact, one owner

The recurring failure across the whole project has been the same shape every time: two places that both claim to know something, drifting apart quietly until one of them is wrong and nothing notices.

The palette was computed, not chosen

The application draws profit in green and loss in red. The original pair measured a colour difference of 5.4 under simulated deuteranopia — the most common form of colour blindness, affecting roughly one in twelve men. In an application where those two colours mean gained money and lost money, that is not a styling preference. It is a defect.

Accentlamp flame
#d78c00
Gainprofit
#6ed274
Lossloss
#e3636c
Amberwarning
#eac35c
Goldtop tier only
#f2d98a
Verdigrischrome only
#1e8f66
Violetsynthetic data
#7a59c3
The sweepidentity gradient

Every value was solved for rather than picked, using perceptual colour distance and colour-blindness simulation. The rebuilt gain and loss pair measures 11.3 under the same simulation. It deliberately does not go further: deuteranopia collapses the red-green axis, so pushing for more separation forces the green toward lime and the red toward salmon until neither reads as its own meaning any more. Around eleven, plus the plus-and-minus signs the interface already prints, is the honest optimum.

Three colours, one constraint. The accent, the gain green and the loss red cannot be chosen independently. A colour-blind-safe loss red has to shift toward orange — which parks it directly on top of an ochre accent. The first candidate had the accent and the loss colour at a distance of 2.1, effectively identical to a colour-blind viewer. Changing any one of the three re-opens the other two, and there is a note saying so at the top of the file.

The theme family eventually closed into a deliberate two-by-two — warm and cold, night and day — plus a frosted twin for each corner and a neutrals-only high-contrast mode. Every borrowed palette was retired on measurement rather than taste: an imported theme inherits semantic colours that were solved against a different ground, and two of the best-known ones turned out to draw their loss colour below the contrast floor on their own panels. The light corners were the harder problem: on a pale ground everything must darken to keep contrast, which collapses the palette into one band of lightness, and lightness is most of what a colour-blind viewer has left. Their money colours were re-solved from scratch rather than inverted.

lamplight — warm night
The Backtest page under the warm dark lamplight theme: the strategy builder beside the book over a synthetic series — candles under risk-off and risk-on regime boxes, the strategy against buy and hold, the transport and a drawdown strip — with gains in green and losses in red.
ash — cold night, the default
The identical Backtest page under the ash theme, a blue-cast dark palette that inherits the same accent and money colours, so the three-way constraint holds by construction.
bone — warm day
The identical Backtest page under the bone theme: a warm cream ground carrying the daylight semantic set, its inks re-solved dark enough to keep their contrast.
marble — cold day
The identical Backtest page under the marble light theme: same layout, pale ground, with the gain green and loss red re-solved from scratch rather than inverted.
One view, four solved palettes — the two-by-two. Warm night, cold night, warm day, cold day; the layout never moves and every semantic colour was re-derived for the ground it sits on, because a gain green that reads on charcoal measures near-invisible on white. The cold-night corner is the default. All four frames show the same demonstration run over an app-generated synthetic series — the figures in them are that demonstration's arithmetic, nothing more. These four stay as they are whichever palette you pick, because they are the comparison; every other capture of the application on this site was taken in all four themes and follows the dots at the top of the page.

Tests that could have passed forever

Found by rendering it and looking

A whole class of defect is invisible to any check that reads code. A control hidden by an attribute kept painting, because a stylesheet's display rule outranks the browser's own rule for hidden things; a legend wrapped onto several rows and was drawn over its own chart; a mark meant to show where a gap had been collapsed sat under a gridline and read as one. Each was found with every check green, by rendering the real page and reading it. The notes keep count of how many times that has happened, because the count is the best argument there is for looking.

Documents lie in both directions

The project has nearly seventy design documents. When I went to record which were finished, the obvious approach — read the status out of each document's own header — turned out to be worthless in both directions. One document still announced itself as "plan only, no code changed" eighty rounds after it had shipped end to end. Another carried no marker at all and had been fully built. Status is now tracked deliberately and separately, and nothing writes back into the documents, because two writers for one fact is the same failure as everything else on this page.

A short list of things that turned out to be load-bearing

Looked cosmeticWas actually
A wrapping preformatted block Every ASCII diagram in the documentation, broken.
Chart colours held in constants All fourteen alternate themes — including the light ones — drawing profit and loss in dark-theme colours.
Reusing a saved zoom between views A currency-scaled zoom applied to a percentage series, rendering a blank chart.
Recomputing a chart during a drag A pan that ran away — a 240-pixel drag moving the view by 64,000 days.
Retiring an unused theme name Users whose saved preference pointed at it stranded on a stylesheet that no longer existed.

SURGEON · the Mithraeum · the Agora · the Control Plane Round 543 A personal project

Standing note for the whole site. This is a personal engineering showcase. Nothing here is investment advice, a recommendation to trade, a performance claim, a term of service, or an offer of any product or service. The only figures anywhere on this site are a demonstration instance's own arithmetic over app-generated synthetic series, inside screenshots, as illustrations of the tools — none are results and none are implied to be. Trading involves risk of loss, and software that tests ideas against history cannot tell you what happens next.

A personal project. Not advice. Nothing for sale.

This site describes a personal engineering project, written and run by one person in their own time and published under the name Mithraeum Agora. There is no company behind it, no team and no other contributor. It is not a product and not a business. Nothing here is for sale — there is no account to open, nothing to buy, no subscription, no waiting list, and no service is being offered or solicited. Sending a message through the note form creates no customer, client or contractual relationship of any kind. The note form on the contact page is the way to reach me, and it is the only one.

Nothing on this site is investment advice, financial advice, tax advice, or a recommendation, solicitation or offer to buy or sell any security or financial instrument. I am not a financial adviser, a broker, an investment manager or a regulated firm, and nothing here should be relied on as though I were. If you are making decisions about money, take advice from someone qualified and regulated to give it.

Figures do appear on this site, inside screenshots, and none of them is a performance claim. Every one is a demonstration instance's own arithmetic over price series the application generated itself — synthetic data, with no real market behind it — shown to illustrate what the tools display. They are hypothetical and simulated: no capital was at risk, no orders were placed, and a result computed over history with the benefit of hindsight carries limitations that live trading does not forgive. Hypothetical results are not indicative of future returns, and past performance — real or simulated — predicts nothing.

No brokerage, market-data vendor or other company is named anywhere on this site, and where a name appeared inside a screenshot it has been redacted out of the image. Nothing here states or implies that any company is associated with this project, endorses it, sponsors it, supplies it or has reviewed it. None is, and none has.

What this site collects. Nothing, unless you write to me. There is no analytics, no tracking, no advertising, and nothing at all is loaded from another domain. If you use the note form it takes the name, address and message you type, stores them privately where only I can read them, and keeps them for up to a year before they are deleted — sooner if you ask, and you do not have to give a reason. Your IP address is not kept. One thing is stored on your own device: the colour theme you pick, remembered by your browser so the site does not change appearance every time you arrive. It is written only when you choose a theme, and it identifies nothing and nobody. The preference itself never leaves your browser, but the screenshots follow it, so the pictures your browser fetches from this site are the ones drawn in that palette. The contact page answers all of this in more detail.

Terms of use. This site is provided as is and as available, with no warranty of any kind, express or implied. It describes software under active development: anything here may be incomplete, out of date or simply wrong, and it may change or disappear without notice. Nothing on it is a contract, a term of service for any product, or a promise that anything described will be built, released or kept running. To the fullest extent the law allows, I accept no liability for any loss or damage arising from use of this site or from reliance on anything it says. Nothing here excludes or limits any liability that cannot lawfully be excluded or limited.

Trading involves risk of loss.