← All projectsFeature-complete, in a live observation period
Market Intelligence Terminal
A personal research system built to explain what moved and why, with hard rules against the two failures that make analysis systems useless: inventing causes, and hiding what it never checked.
Organization
Personal project
Role
Product Owner and AI-Assisted Developer
Period
July 2026 – Present
Status
Feature-complete, in a live observation period
Roughly 11,000 lines of Python across seven build phases. Feature-complete for data collection and currently in a deliberate observation period: the system runs daily and records what it concluded, but the thresholds are frozen and no conclusions are being drawn until enough sessions accumulate. No performance or profitability claims are made anywhere, by design.
The problem
Systems that try to explain market activity tend to fail in two specific ways: they infer a cause from a price move (the stock went up, so this headline must be why), and they quietly present an absence of evidence as evidence of absence. Both produce output that reads as confident analysis and is actually noise. I wanted to build something that could not do either.
The goal
Build a research system that organizes evidence rather than manufacturing conclusions, where every claim is traceable, missing data is reported as missing, and no explanation is ever inferred from the thing it claims to explain.
My role
Sole developer and product owner. I set the architecture and the integrity rules, directed the build with Claude Code across seven phases, and did the live testing that caught the failures below. The design decisions that matter most in this project are all refusals: what the system is structurally prevented from doing.
Process
- 1Started from a narrower technical scanner, then deliberately pivoted the project when it became clear that the interesting problem was interpreting market context, not scoring individual charts.
- 2Built a relationship map of 199 companies across 71 groups, with a validation command that must report zero errors before any change is accepted.
- 3Separated the layers strictly: code computes facts, and the interpretation layer is only ever allowed to describe facts the code already established. It cannot introduce a number, a headline, or a claim of its own.
- 4Ran the system live each day and treated every surprising output as a possible defect rather than a quirk, which is how the integrity bugs below were found.
- 5Froze all thresholds and entered a formal observation period, recording what the system concludes daily without tuning it, so that later evaluation is honest rather than fitted after the fact.
Technologies
Only what’s actually in the codebase. Nothing added because it was discussed but not used.
Claude CodePythonSQLiteFlaskpandasyfinance
Challenges
- Wrong-company attribution: the system was crediting one company's news to another because it trusted a data feed's grouping instead of checking whether the story actually named the company. Fixed by requiring an explicit name or symbol match before any attribution is made.
- Explanations inferred from price: headlines like 'why is this stock jumping today' were being accepted as causes, which is circular, the price move explaining itself through a middleman. Those are now detected and rejected outright.
- Absence of evidence presented as evidence of absence: the system reported 'no catalyst found' for companies it had never actually checked. 'Not checked' is now a separate, visible state.
- Look-ahead contamination: each morning's reasoning is now written once and never revised, because updating it with information that arrived later would quietly corrupt any future evaluation of whether the morning read was any good.
- Ranking that could be overwhelmed by volume: weak signals in bulk were outvoting a single strong one. Evidence is now weighted by tier and can never be won on count alone.
Deliverables
- A daily research pipeline: market regime, sector rotation, peer relationships, catalysts, and a narrowed watch list
- A validated 199-company, 71-group relationship taxonomy
- A lifecycle system that records each morning's reasoning immutably and evaluates it after the fact
- An operator health check reporting data quality and flagging any session unfit for later analysis
Outcome
The system runs daily and produces a short, evidence-backed read on market conditions rather than a wall of signals. The more meaningful outcome is what live testing forced me to fix: four separate bugs where the system was manufacturing explanations that did not exist. Each one looked like a working feature until it was checked against reality.
What I learned
- The hardest bugs were not crashes. They were features that produced confident, plausible, wrong output, and every one of them was found by checking the system against reality rather than by reading the code.
- There is a real difference between 'we looked and found nothing' and 'we never looked,' and a system that collapses those two into one answer is actively misleading. Making that distinction structural, not cosmetic, changed the design.
- Freezing the rules before evaluating results is uncomfortable and correct. A system tuned until its past output looks good has told you nothing about its future output.
Skills demonstrated
Systems architectureAI boundary designData integrity and provenanceEvidence-based reasoning under uncertaintyLive defect diagnosisPythonClaude CodeTechnical documentation
Visual evidence
This is a private, local-only system and no screenshots are published. The strategy layer it grew out of came from paid third-party course material, so none of that material's specifics appear here or anywhere else on this site.
Want to talk through how this applies to your team?