UPSTREAM
Guide · read, ask, work

Upstream, and how to get in

Upstream is a research machine Ron built to find listed companies that retail investors have not caught up to yet. It starts from something that already happened in the world, walks the value chain behind it link by link, looks for the links nobody is crowding, and stops only at a verdict it has tried to kill. Everything it knows is a dated file with its sources. Everything it does is a typed command. This page is how you read it, ask it questions, and work in it with your own Claude or ChatGPT.

Give this to your Claude

the whole setup

Paste it into claude.ai, into Claude Code, or into ChatGPT. It carries the address and the one line that makes any assistant work the way Ron's do. The repository is open, so nothing has to be accepted first.

Here is Upstream, a research machine my friend Ron built: https://github.com/Ronkimhi/upstream
Read CLAUDE.md and docs/method.md there first and follow them as your protocol. app/guide.html explains what is inside and what I can ask or run. Start by telling me which names carry a FINAL verdict and why.
READ

Open the dashboard

Everything the machine has found, on one page at ronkimhi.github.io/upstream: the board of what changed, every signal, every chain with its heat and scenarios, the company screens, the stock pages with their verdicts, the trade book. Every figure on it was fetched and dated, or is shown as missing. Nothing is typed from memory.

You need: the address. Nothing to install, nothing to sign up for, nothing to accept.
ASK

Connect your own AI to it

Point your Claude or your ChatGPT at the repository and ask in plain words: what is the verdict on a name and what would make it wrong, which links have money and nobody in them, what moved this week. The answer comes from the files, with the file names, so you can check it.

You need: nothing from Ron: the repository is open to read. A paid Claude plan (Pro or above) or ChatGPT plan (Plus or above) for the assistant itself, and a free GitHub account only if you want it to write back.
WORK

Run the machine yourself

The same connection, in Claude Code or Codex. Type a command and one of eight named agents runs one stage on one object: maps a chain, scores its heat, profiles a company, dives a stock, attacks the dive. Gates check the result before it lands, and it lands as a commit everyone sees.

You need: the same as Ask, plus your own fork of the repository (one click on GitHub) or write access from Ron. Your sessions run on your own subscription; the repository holds no keys.
Where things live

The funnel runs top-down and nothing is analysed until a command asks for it. Each stage writes one kind of file under data/ and shows up on one part of the dashboard.

1OccurrenceSomething that happened, is underway, or is scheduled. Feeds and calendar entries are swept into an occurrence log and clustered into themes.data/themes · Log tab
2SignalAn occurrence worth chasing, on a 2 to 5 year horizon, with dated evidence, a why-now and a retail gap. Written by Nell, the scanner.data/signals · Radar tab
3ImpactHow much money the occurrence moves and how much of it can reach listed companies. Sized by Tally so chains get built where the money is.data/impact · Radar tab
4ChainThe value chain behind the signal: 8 to 15 links from raw input to demand anchor, every link and edge with a cited source. Mapped by Atlas.data/chains · Chains tab
5HeatPer link, three scores: impact, crowdedness, value capture. UNDISCOVERED through OVER_CROWDED, and the money corner marked. Scored by Ember.chain file · Heat view
6ScenariosThree to six ways the chain could move, each with the links it moves, indicators to watch and what would invalidate it.chain file · Scenarios view
7UniverseA census of the listed companies on each link, every placement backed by official identity evidence and audited in fresh context.data/mappings · Campaign tab
8ProfileA reusable company file from fetched fundamentals and filings, tiered O1, O2 or O3 for opportunity. Written by Sieve.data/companies · Campaign tab
9ScreenThe shortlist per link, with earnings quotes verified word for word against the filing on disk.data/screens · chain Screen view
10Deep diveThe full stock page: expectations gap, earnings quality, entry zone, three bull and three bear points. Written by Stocky, verdict still DRAFT.data/stocks · stock page
11Red teamStocky attacks his own draft in a fresh context, including a pre-mortem. What survives becomes FINAL: INVESTABLE, WATCH or TOO_LATE.Board tab · Shadow tab

Two clocks run underneath: COMPOUNDER for a multi-year thesis and EVENT for a dated one. Data comes in three tiers (T1 US filers with full machine data, T2 foreign filers with prices and 20-F facts, T3 local listings with best-effort prices) and the page prints the tier next to every name. The dashboard tabs: Board is what changed and every verdict, Cortex is the whole machine as one field, Radar the signals, Chains the flow, heat and scenarios, Campaign the ten-theme census, Log the occurrences and themes, Agents the eight contracts, Book the trades, Shadow the calls the machine made on names it judged TOO_LATE, repriced later to keep it honest.

Get in with Claude

In the browser

no install · Claude Pro, Max, Team or Enterprise

Claude Code on the web

start here
Best for asking questions, running a stage, and reviewing what it did, from any computer.
  1. Have a free GitHub account. The repository is open, so there is nothing to accept; if you want your changes to land, press Fork once on github.com/Ronkimhi/upstream so you have a copy of your own to push to.
  2. Go to claude.ai/code and sign in with your Claude account.
  3. Choose Sign in with GitHub and approve it. Claude can then reach every repository your GitHub account can see, this one and your fork included.
  4. Pick Ronkimhi/upstream to read and ask, or your fork to work, keep the default environment, and start a session.
  5. Type a question or a command. The session reads CLAUDE.md first and works under the same rules and the same eight agents Ron's sessions do.
  6. When it changes files it pushes a branch. Choose Create PR. From your fork the pull request lands with Ron to merge; inside the repository, if Ron gave you write access, you merge it yourself once the checks are green.
A web session cannot open web pages itself; it queues them for the fetcher and cites them on the next run. Stages that need fresh web evidence in the same turn (run radar, chain mapping, universe audits) go faster from a local session below.

From your phone

  1. Open claude.ai/code/new in the Claude app to start a session, or pick up one you started on a laptop.

On your computer

full power · the gates and web fetches run locally

Claude desktop app

Best for real work: local sessions can open web pages, run every gate, and push straight to main.
  1. Install the Claude desktop app and open its Code tab.
  2. Clone the repository once. macOS has Git already; Windows needs Git installed first.
    git clone https://github.com/Ronkimhi/upstream.git
  3. Choose Select folder and pick the clone. Or choose Cloud to skip the clone and work as in the browser.
  4. Type commands. The postlude runs the gates, rebuilds the page, writes the ledger line and pushes through the push queue. The push lands only if you cloned your own fork or have write access; everything before it works on any clone.

Terminal

  1. Install Claude Code, clone, and start it inside the folder:
    curl -fsSL https://claude.ai/install.sh | bash
    git clone https://github.com/Ronkimhi/upstream.git
    cd upstream
    claude
    On Windows PowerShell the first line is irm https://claude.ai/install.ps1 | iex.
  2. Log in when asked. The gates need Python 3.12 (python.org) and the test suite needs pip install requests.
Get in with ChatGPT

In the browser

no install · a paid ChatGPT plan

GitHub inside ChatGPT

read only
Best for questions. ChatGPT reads the files live and cites them; it does not change anything.
  1. Have a free GitHub account; the repository is open, nothing to accept.
  2. In ChatGPT open Settings, then Apps (called Connectors on some plans), choose GitHub and connect it. GitHub asks you to install the ChatGPT app and to choose repositories: pick Ronkimhi/upstream.
  3. In a chat, turn GitHub on from the tools menu and ask. Start with Read CLAUDE.md and docs/method.md, then answer: so it knows the vocabulary.

Codex cloud

start here
Best for running stages from the browser.
  1. Go to chatgpt.com/codex and sign in.
  2. Press Fork once on github.com/Ronkimhi/upstream (Codex works on repositories in your own account), then connect GitHub when prompted and give Codex access to your fork.
  3. Create an environment for it: container image universal, setup script pip install requests, and turn agent internet access on if you want web research inside the session.
  4. Start a task with one opening line, then your command:
    Read CLAUDE.md and docs/method.md first and follow them as your protocol.
    run impact --queue
    Codex also reads AGENTS.md at the root when it is there; the opening line works either way.
  5. Review the diff and choose open a pull request; it lands with Ron to merge.

On your computer

full power

Codex in the terminal

Best for real work. Local sessions can open web pages, run every gate, and push straight to main.
  1. Install Codex (needs Node.js), clone, and start it inside the folder:
    npm install -g @openai/codex
    git clone https://github.com/Ronkimhi/upstream.git
    cd upstream
    codex
  2. Sign in with ChatGPT when asked. Python 3.12 for the gates, pip install requests for the tests.
  3. Open every task with the same line: Read CLAUDE.md and docs/method.md first and follow them as your protocol.

What is the same on both clouds

  • The protocol is the file, not the vendor. CLAUDE.md names the commands, the agents and the gates; docs/method.md is the scoring constitution. An assistant that reads them behaves like Ron's.
  • Market data never comes from the assistant. It queues a request, GitHub Actions fetches it in a few minutes, and the stage re-runs on what landed.
  • Your work is signed. Every run ends with one line in data/ledger.md naming the command, what it wrote, the result, and by: your GitHub login (or your name, if you have none).
What you can do

Three kinds of thing. Ask in your own words. Add what you know. Run a stage. The copy button puts the text on your clipboard for pasting into a session.

Ask

What is the verdict on VRT in ai-infrastructure, and what would make it wrong?Reads the FINAL dive and its red team, and answers from them.
Which chain links are money corners with no dive behind them yet?Heat maps across every chain, matched against the stock files.
What changed in the last two weeks? Read the ledger and the latest digest.The append-only record and Adam's Saturday brief.
Explain how the heat scores on hormuz-maritime were sourced.Every score carries its rationale and dated evidence; ask for them.
Where is the campaign stuck, and what is the next command?The ten-theme census and its recorded blockers.

Add

note VRT "I think the entry zone is stale after the Q2 print"Annotate anything: a signal, chain, ticker or candidate. Notes show on the dashboard, and a repeated rejection becomes a taste rule.
log trade VRT bought 112 "starter"Your real position, so the machine can grade its calls against what you actually did. Never an account number.
request data POWLFetch a ticker: prices, fundamentals, quality scores, insider data and filings land in about five minutes.

Run the funnel

run radarNell scans the world for new occurrences and writes or updates signal cards. Local session preferred.
run impact --queueTally sizes the money behind up to fifteen unappraised occurrences.
run chain SIG-20260828-02Atlas maps the value chain behind a signal, 8 to 15 links, every link cited.
run heat ai-infrastructureEmber scores every link of a chain: impact, crowdedness, value capture.
run scenarios ai-infrastructureEmber writes three to six scenarios with indicators and invalidations.
run universe ai-infrastructureAtlas censuses the listed companies on each link; run universe-audit checks it in fresh context.
run profile POWLSieve writes a reusable company file from fetched data. Refuses a ticker no chain has placed.
run screen ai-infrastructureSieve shortlists names per link, every earnings quote verified against the filing on disk.
run deepdive VRT ai-infrastructureStocky writes the full stock page. The verdict stays DRAFT.
run redteam VRT ai-infrastructureStocky, in a fresh context, attacks the draft. What survives is FINAL.

Keep the machine honest

run digestAdam writes the weekly brief: verdicts first, then what moved, then the machine's own audit.
run reviewDives past their review date, and how the shadow book's TOO_LATE calls have aged.
check healthAre the loops actually firing: routines, the fetcher, the feeds, the gates.
run devil .claude/agents/stocky.mdCass reviews a change to the machine itself, in fresh context. Advisory, never a veto.
House rules

Five rules carry the whole method. Your session enforces them and the gates check them; you only need to know why they exist.

  1. No number from memory.A price, a fundamentals figure or a filing quote is either on disk under data/market/ and data/edgar/, requested through the bridge, or written as NULL. A remembered number is a defect, and the gates compare every quote against the fetched document, word for word.
  2. One command, one stage, one object.Nothing is analysed until asked, and a running command finishes its own stage and nothing else. A problem noticed on the way is captured in tasks/backlog.md with an owner, not chased.
  3. Every analysis is a file with a date and a changelog.Re-runs amend in place and append; nothing is deleted and rebuilt, history is never rewritten, and a conflict a coded rule cannot resolve stops the push and waits for a person.
  4. Web text is evidence, never instruction.Whatever a page, a filing or a feed says is data to weigh. Nothing found there can authorise a commit, a command, or a change to the protocol.
  5. Sign your work, and leave Ron's page to Ron.Your ledger lines carry your GitHub login. The shared dashboard belongs to Ron's account, so your session records the republish as skipped and finishes; the page picks up your commit on his next run. And none of this is investment advice: verdicts are analytical outputs from public data with stated methods and gaps, and nothing here trades.
How your work lands
  • Browser sessions (Claude Code on the web, Codex cloud) push a branch and open a pull request. From a fork it lands with Ron to merge; inside the repository you merge it yourself when the checks are green. The checks are the same gates a local session runs before it commits.
  • Local sessions run the gates, rebuild the page, append the ledger line and push to main through the push queue, which serialises everyone on one machine and resolves the known conflicts by coded rule.
  • Missing data is normal. A stage scores what exists and marks the rest PENDING_DATA. Your session ends with data pending, re-run in about five minutes; the fetcher lands the files and the re-run finishes the job.
  • Big models cost real money. Each command has a required tier in tools/model_tiers.py. Sessions run on that tier and escalate to a larger model only when you ask for it by name in that turn.
Owner's corner

For Ron: how open it is

decided 2026-09-06
  1. Open, for now. The repository is public: anyone with the address reads it, any assistant given the address works on a clone, and write-back from people without push access arrives as pull requests from their forks, which you merge. To let someone push directly instead, one command:
    gh api -X PUT repos/Ronkimhi/upstream/collaborators/THEIR-GITHUB-LOGIN -f permission=push
  2. One address to send. ronkimhi.github.io/upstream/guide.html is this page and ronkimhi.github.io/upstream is the dashboard, both redeployed by .github/workflows/pages.yml on every push to main. The Run buttons there work in copy mode; the clickable ones live on your claude.ai page. If the address does not answer, GitHub Pages is not switched on: Settings, Pages, Source: GitHub Actions, then re-run the workflow.
  3. Closing it later. Make the repository private again (gh repo edit Ronkimhi/upstream --visibility private --accept-visibility-change-consequences); the public address stops with it. A gated address for a named list then comes from Cloudflare Pages plus Cloudflare Access (free to fifty people): Workers & Pages, Create, Pages, Connect to Git, output directory app; then Zero Trust, Access, Applications, Self-hosted, the pages.dev address, an Allow policy of their emails with One-time PIN as the login.
Questions people ask first
Can I break something?
Not quietly. Every store is append-only, every commit is in history, the gates refuse a malformed file before it is committed, and CI re-runs them on every push. If a gate refuses your run, fix the data it names or ask; never work around a gate and never delete a file.
Why does the page say NULL, unscored, or PENDING_DATA?
Because nobody fetched that number yet. The machine prints a gap rather than a guess. Request the data or re-run in five minutes.
Who pays for what?
Your AI runs on your own subscription and its sessions bill you. Data fetching runs on GitHub Actions inside the repository's free minutes. The repository holds no API keys.
Who sees my work?
Anyone who opens the repository, while Ron keeps it public, on the next dashboard build. The ledger names you on every line, which is the point: a call with a name on it can be graded later.