The Jawz Loop
By Mako · Version 0.4.2 · Free · Open
A four-chapter reference for thinking about portfolio management across the full investor workflow. See the World → Understand the Book → Decide → Observe & Refine.
Every output surfaces questions, not instructions. The loop makes visible what's true about the world and the book. The user decides what to do with it.
Chapters
- Chapter 1See the WorldWhat changed outside the portfolio?
- Chapter 2Understand the BookWhat is this portfolio actually exposed to?
- Chapter 3DecideHow should I think about a specific decision?
- Chapter 4Observe & RefineWhat happened, and what should the process learn?
↻ Chapter 4 returns to Chapter 1 — the Loop is a cycle, not a checklist. The world has moved by the time you observe.
The Loop is open. Anyone can read it, fork it, or suggest improvements. Mako reviews and integrates.
For the methodology in full and how Jawz works as a system, read the whitepaper.
What has changed, and why
A published framework that never changes is either finished or unexamined, and this one is neither. Every entry below is a change to the method itself — not a website tweak — with the reasoning that prompted it. Several came from the Loop being wrong in a way worth recording. Chapters carry version numbers, and a change here means a chapter version moved.
This is the companion to the Sources & freshness block that closes every mode output: that shows where a single answer came from, this shows how the method behind it has moved.
Any badge or row of the card over the last year: /api/indicator-history
The dated read answers what the card said on one day. The indicator history answers what one badge or one row said on every day it printed, over the last year: GET jawz.ai/api/indicator-history with no parameters lists every card and indicator (its kind, cadence, unit, source and how far back it reaches), and ?card=regime&indicator=badge (or any row key, with from and to) returns the word at each of its own print dates, the transitions between words, the runs and the current run. Every word is the one the dated read gives on that date, today's rules applied to what was published by then, and on the three dates checked by hand every word and number agreed with the dated read; the last point, when the window ends today, is today's card itself. Each indicator keeps its own clock: claims on Thursdays, prices on the CPI and core PCE release days, investment on each GDP estimate, the builders' capex on each filing, the season on every print of any of its inputs, the weekly reads on the weekly grid. One policy decides what comes with the word (Pedro's): what Jawz computes carries its number at every point (the four-bank money total, the dollar effect, US net liquidity, the growth vote), and what Jawz only words, a series a publisher already puts out (sentiment, claims, prices, rates, credit, the dollar, gold, bitcoin, the Census tables, the filings, utilities output), carries the word and a source block instead: the provider, the series, a link and, for FRED series, the ALFRED vintage link where each number can be read as first published. The numbers stay with the people who publish and maintain them; what Jawz adds is the word and the rule that set it. The history applies today's rules throughout and says so: a badge's current run names the same held-since date as the card, the regime and business-cycle histories list every day where what Jawz published then differs from today's rules, with the rule changes that explain it, and the four-bank money total marks the day the China leg entered coverage (and carries the three-bank total beside it), so a jump from coverage is never read as a move. Each point is kept 90 days once its inputs read cleanly, because a past point does not change, and a cold year computes in about 4 to 11 seconds; the route answers with what is ready and partial: true if a year ever takes longer than 40. It is the data source for the dashboard's History tab.
The Jawz Read for any day in the last year: ?as_of=
The card answered one question, where the world is today. It now answers the same question for any day in the last 365 days: add ?as_of=YYYY-MM-DD to jawz.ai/api/read (JSON or ?format=md), /api/read.png, /api/read.svg or /dashboard and you get the card as Jawz would have read it that day, built only from what had been published by then. Every FRED series is read as it stood that day, through ALFRED's vintages, so a number revised since shows its first value; the China leg is the PBoC statement Jawz had on file; the builders' capex counts each quarter from the day it was first filed; gold and bitcoin are the daily marks up to that day. Two rows cannot be rebuilt that way, and the card says so instead of hiding it: the Census tables behind data centres and chips keep only their current revised figures, so on a dated read those two rows carry a warning mark, the note 'revised history, not as first published', and a field point_in_time set to false, while every other row is point_in_time true. The read applies today's rules to that day's data, and says that in a rules_note; where Jawz's own daily snapshot of the day is on file, the note also says what Jawz published then under the rules in force, so a reader can see when a rule change, not the data, makes the two differ. September 3 is one: Jawz published RED that morning, and the dated read for that day is YELLOW, because under the money rule in force since September 25 one scarcer weekly read is a lean (1 of 2), not yet the colour. The window is a year because the store-of-value prices come from CoinGecko's public API, which serves only the last 365 days; an older date, a future date or a malformed one gets a plain 400 that says so. A past day's card does not change once every input has read cleanly, so it is built once and kept for 90 days, and the HTTP answer may be cached for a day; a build where any input failed is served but not kept. Today's card is untouched: without as_of the answer is byte for byte what it was, checked against the live card.
Growth is now a vote of output, jobs and investment, and the season waits for two prints
The business-cycle label moved today because the rule moved, not the economy. Until now the growth side of the season was one thing: the trend in factory output. Claims and sentiment went into the growth score but never into the direction, so an investment boom concentrated in a few firms could not move the season and a small wobble in factory output could — which is how the card read FALL through September while investment in computers and software was running nineteen, eighteen and sixteen percent above a year earlier. From today growth is a vote of three inputs, each read as growing, flat or stalling: factory output (the same industrial-production trend as before, same thresholds), jobs (initial claims, four-week average, against the average twelve weeks earlier: down more than five percent is growing, up more than five percent is stalling) and investment (real business spending on information-processing equipment and software, year on year: above ten percent growing, below zero stalling — the same thresholds the card's Investment row has used since it appeared). Two of three decide. A mixed vote keeps the direction of the last decisive vote for up to eight prints, about a month, so a single input wobbling cannot flip the season; with nothing to keep, it is flat, which sits on the stalling side as it always has. The waiting rule changed too. The season used to need three daily reads in a row, counted from what Jawz had stored; now, like every other block on the card, it needs two prints in a row — a print being any release of a cycle input: claims on Thursdays, industrial production, consumer sentiment, CPI, core PCE and the GDP estimates — and it is computed from what was known on each print date, so any past date gives the same answer as the day it was read. Under the new rule the season reads SUMMER: output flat (industrial production down a tenth over three months), jobs growing (claims at 202k, nine percent below twelve weeks earlier), investment growing (+15.9% in the second quarter) — two of three — with prices still rising, and it has read SUMMER on every print since August 13. The card's business-cycle block shows the vote: a Growth row with the count ('2 of 3 growing'), a Jobs row with the claims number, the Investment row now marked as a voter, and the output vote in the Growth row's data note. The regime history keeps the FALL that was published through September 29 on its observed rows and flags the change as a method event, the same way the money rule change was flagged on September 25. A caution, written down where the rule is: with this rule the season stays SUMMER while capex booms even if jobs and factories weaken together; a cut in investment is what turns it. Every other block on the card was checked byte for byte against the live card and did not move.
The Jawz Read as a web page: jawz.ai/dashboard
The card had three renderings — the JSON at /api/read, the markdown inside get_macro_regime, and the picture — and one page, /read, that only showed the picture. It now has a page of its own at jawz.ai/dashboard, drawn from the same object the picture and Rumo use, in the site's own style: the six-badge strip with each block's four-word set-by line, the biggest-risk line, then one section per block with its rule, its confirmation and held-since, the investment block's builders' outlook line, and the same 3rd last, 2nd last, latest, data table — the bold word with the print date and the display value beneath it, verbatim from the object, never reformatted. Two things the picture cannot carry, the page adds quietly: every block names the MCP tool that produces it, and every data cell names the source of its latest print and links it where the source is public — a FRED series to its own page, the Census C30 survey, EDGAR, CoinGecko. The page is served from the read's own ten-minute cache and, like the routes, shows the last good read with a note if a build fails. Its share card is the picture itself and its description is the six current badges, so a posted link unfurls as the card. /read now redirects there permanently; the PNG, SVG and JSON routes are untouched, byte for byte.
The Jawz Read's sixth block: investment, and an investment row for the cycle
The thesis Pedro wanted made measurable: the US economy is running hot because of AI capital spending, and the card's growth row — factory output, claims, sentiment — cannot see an investment boom concentrated in a few firms. Two additions. First, the business-cycle block gains an Investment row: BEA's real private investment in information-processing equipment and software, year on year, one print per quarter dated by the GDP release that carried it (the third estimate when it is out), booming above ten percent, steady to ten, fading below zero. It is shown, not yet part of the season rule; the badge and the rule line did not move. On the day it shipped: +19.6%, +18.4%, +15.9% for the last three quarters, all booming. Second, a sixth block, INVESTMENT, last on the card, reads the AI build-out from four sources nothing else in Jawz reads. Data centres: the Census construction survey's data-centre line, the value of private data-centre construction put in place at an annual rate, from the detail spreadsheet because the API does not carry it. Chips: imports of electronic integrated circuits, HS 8542, from the Census trade API, worded on a three-month sum so one lumpy month does not swing it. Builders' capex: purchases of property and equipment by Microsoft, Alphabet, Meta and Amazon, read from their own 10-Q and 10-K filings on EDGAR, de-cumulated where a quarter is filed only year-to-date, summed by calendar quarter and dated by the last of the four to file; if one has not filed yet the row says so. Power: utilities output from the Fed's G.17. Every row is worded on year-on-year growth with the same three words, every print is dated by the release that carried it, and the badge is a majority over the four — BOOMING if more rows are booming than fading and at least two are, FADING the other way, STEADY otherwise — held by two weekly prints in a row like the other card-own blocks, drawn as arrows up, right and down. Under the rule sits one more line, the builders' outlook, curated by hand from earnings calls because forward guidance is not structured data; it reads 'not yet curated' until the first entry lands rather than guessing. On the day it shipped the read was BOOMING: data centres $75bn in July, up 57 percent on the year; chips $4.4bn in July, the summer sum up 45 percent; the four builders $165bn in the second quarter, up 87 percent; power up 6.2 percent in August after two months near one — steady, one hot month does not clear the bar. Values are the current vintage throughout, and the card says so. Alongside, every measurement print now carries `display`, the number exactly as the markdown writes it, from one formatter shared by the builder, the markdown and the picture, so Rumo shows the same string without re-deriving it. The five existing blocks were checked byte for byte against the live card and did not move; the strip has six pills and the picture's size cap moved from 350 to 450 KB to keep the sharper rendering.
The Jawz Read's fifth block: money, second on the card
The regime light is half mood and half money, and until today the money half had one row on the card. It now has a block of its own, placed second, right after the regime. The badge is the same money condition the regime uses — PLENTIFUL, STEADY or SCARCER, the class held after two weekly prints agree — drawn as a filled, a half-filled or a hollow circle, a vocabulary of its own beside the regime's colours and the seasons. Under it, three rows. Central banks: the four balance sheets in dollars, with the raw class of each weekly print — the read before the two-prints rule — so a lean shows here a week before the badge moves; the regime block keeps showing the held class over the same number. Dollar effect: how much of the 12-week move was the currency rather than the banks, in billions with its sign — helping above +25bn, hurting below −25bn, flat between — from the decomposition every liquidity read has carried since Sep 25. US money: the Fed's balance sheet minus the Treasury's account minus reverse repo, with its own plentiful, steady or scarcer label. Every class and number was already published by get_financial_conditions and get_macro_regime; the card only dates them. On the day it shipped the read was PLENTIFUL, held since Sep 13: central banks plentiful at $25.06T, the dollar helping at +212bn over twelve weeks (the banks themselves −71bn), US money scarcer at $5.77T. The four existing blocks were checked by key against the live card and did not move. The strip now has five pills; the picture is drawn a step smaller across the top so they fit.
The Jawz Read's fourth block: store of value
The card shipped with a space held for store of value and the words 'not in this version'. That space is now a block. It reads gold and bitcoin — the two things people reach for when they stop trusting money — each against where it was a month ago and a quarter ago: above both is rising, below both is falling, anything else is mixed. Both rising makes the badge RISING, both falling FALLING, otherwise MIXED. Like financial conditions, the badge only changes when two weekly prints in a row agree, and the table shows the last three weekly prints with the price under each word: gold in dollars per troy ounce, bitcoin in dollars. The prices are CoinGecko's daily marks; gold is read through PAXG, a token redeemable for one ounce, and checked every time against Tether Gold — if the two ever drift more than one percent apart the card averages them and says so. The marks are the price at midnight UTC, so a print does not move during the day. The block has its own symbols, a triangle up, a diamond and a triangle down, because the regime's colours and the seasons mean other things. On the day it shipped the read was MIXED, held since Sep 12: gold at $4,282 was below its month-ago mark, bitcoin at $84,076 above both. Nothing in the other three blocks moved; they were checked byte for byte against the live card.
The Jawz Read is now a picture too
The card shipped this morning as JSON and markdown, and within hours every AI client was showing it differently: one kept the tables, another flattened them into sentences, a third rewrote the words. A card that looks different in every chat is not one card. So the same object is now also drawn as a picture — a PNG at jawz.ai/api/read.png (and an SVG at /api/read.svg, with a shareable page at jawz.ai/read) rendered on the server from the same read, with the same four badges, the biggest-risk line and the three-print tables, in the same dark layout everywhere. get_macro_regime attaches that picture to its answer as an image after the text, and asks the client to show it as is and comment underneath rather than rebuild the table. Nothing in the numbers moved: the picture is drawn from the read that was already there, and if it cannot be drawn the answer is exactly what it was yesterday.
The Jawz Read: one card, shown the same way everywhere
The regime read now opens with a card. Four badges across the top — regime, business cycle, financial conditions, and a space held for store of value — each with four words saying what set it, and one line naming the biggest risk. Under that, one block per badge: the rule in a sentence, then a table of the last three prints. The first row is the badge itself on each of those dates. The rows below it are the measurements behind the badge — mood and money for the regime, growth and prices for the cycle, rates, credit and the dollar for conditions — one word per print, with the date and the number under it and a freshness mark on the right. The dates are the days the data actually printed: consumer sentiment on the last Friday of its month, claims on the Thursday after the week they cover, CPI and PCE on their published release days, industrial production on an estimated mid-month day marked as such, and the weekly reads on the day they were taken. The same card is served at jawz.ai/api/read as JSON and as markdown, so a desktop app can show it live without an AI, and get_macro_regime carries it at the top of its markdown and as a 'read' object under data. Nothing else in the regime read moved: every colour, quadrant and class on the card is the one already published. The one new label is the financial-conditions badge — loose, tightening, tight or easing over rates and credit, held only when two weekly prints agree — which sits beside the existing composite rather than replacing it. Store of value is not measured yet; the card says so rather than filling the space.
The money side of the light now waits for a second read
The regime light is made of two things: how consumers feel, and whether global liquidity is expanding, flat or draining. The economy label already refuses to change on one day's read — it needs three daily reads in a row. The money side had no such rule, and it is the noisier of the two: the liquidity number adds up foreign balance sheets in dollars, so a currency wobble alone can push the weekly change across zero and turn the light red one Thursday and yellow the next. From today the money condition the light uses changes only after two consecutive weekly reads agree on the new class. Until then the light keeps the class it had, and the read says so with a count — for example, "Money read leans draining this week (1 of 2 needed to change); the light keeps supportive until a second read agrees." When the deciding number sits within one percentage point of zero, the read says that too, with the number. Every regime read now carries the weekly reads it used, the class it holds, how many weeks it has held, any pending lean, and the 4-week and 12-week percent changes behind the class. The rule is built from dated reads, not from stored state, so any past date reproduces the same answer and history and today agree. What it means for readers: fewer colour changes on currency noise, and a lean that is visible before it becomes the colour. On the day this shipped the light for 2026-09-24 changed from RED to YELLOW: the raw read that morning was draining, but the two reads before it (2026-09-10 and 2026-09-17) were supportive, so the light holds supportive with draining pending at 1 of 2. The raw liquidity class in get_financial_conditions is unchanged; only what the light does with it moved.
Liquidity now says whether the dollar or the central banks moved it
The global liquidity number adds up four central-bank balance sheets in US dollars. That means it can fall when no central bank did anything — a stronger dollar simply makes the same euros, yen and yuan worth fewer dollars. Until now the read could not tell you which had happened. Every liquidity read now splits the 4-week and 12-week move into two parts: what the balance sheets themselves did, and what the currency did — with the share the dollar accounts for stated as a percentage, and the arithmetic written out beside it. The regime read says it in one sentence when the dollar is most of the story. Alongside it, US net liquidity — the Fed's balance sheet minus the Treasury's account minus overnight reverse repo, the dollars actually available to US banks — gets its own 4-week and 12-week trend and its own supportive, neutral or draining label, using the same rule as the headline, with the date of each input it was built from. It is a supporting read: it does not enter the regime light. No published number changed — the headline value, its changes and its label are identical before and after; these are added fields and added sentences.
Decide learned to size, stage, and sit still
The chapter with the highest stakes had the least machinery — and a user's real complaint ("should I sell this position?" answered in jargon) was a Chapter 3 failure. It now runs on one doctrine: regime sets size, structure sets timing, falsifiers set survival. Waiting for a friendly regime to buy is named as a misuse, because recoveries in fast assets concentrate into a handful of sessions and a slow macro signal always arrives after them — the honest regime-aware answer is smaller size, not later entry. Two modes were added: Entry Staging turns "I'll buy it" into an armed plan with per-level invalidations, a false-start budget and an expiry date, because an entry without a written invalidation is a hope with a ticker attached. Do Nothing Well makes the reviewed hold a first-class outcome — the most expensive retail behavior is trading out of restlessness, and a plan working as designed looks uneventful.
The book gets asked what it is for
Every mode measured the portfolio against the regime; nothing measured it against the owner. A fit score without a mandate is a compass without a destination. A new capture step now asks what the money is for, when it is needed, one named benchmark, and drawdown tolerance asked in currency rather than percent — because percentages lie in the abstract and money is where the truthful answer lives. It also records account constraints before analysis instead of after: a retirement account restricted to European funds cannot buy US single names no matter how good the thesis, and discovering that at recommendation time is a framework failure. The record lives with the user, never with Jawz, and downstream chapters size, score and benchmark against it.
Worked examples, composed journeys, and an open door for complaints
Contracts told an AI what shape an answer should take; examples show it, and models imitate examples far better than they obey schemas — so each chapter's highest-traffic mode now carries one, marked illustrative. The onboarding guide gained five composed journeys (first session, the weekly loop, a new idea, the itch to act, after a drawdown) so mode composition stops being something users discover by accident. And every chapter now invites feedback at the moment a run disappoints, because the improvement model this page documents only works if the misses get reported — several entries above exist because they were.
Crypto positions are scored instead of skipped
Every token used to collapse into one bucket the framework refused to assess — it reported the weight and excused itself from the verdict. Tokens now resolve into three factors scored on what actually drives them: Bitcoin as the liquidity-beta asset, Ether carrying an additional platform component that behaves like long duration, and everything else as the high-beta tail. What this deliberately does not claim is independence: the chapter states that the three correlate, and correlate further in drawdowns, and the stress test still treats them as a single cluster. Three factors is not diversification.
Every mode output now ends with its sources
A Sources & freshness block is mandatory on every mode in every chapter: the tools actually called with their as-of dates, whether each read was observed live or reconstructed, any staleness flag verbatim, and anything that could not be reached along with what was used instead. It covers degraded runs explicitly — that is when it matters most. An answer that cannot show its sources is indistinguishable from a confident guess.
The Loop asks for your book instead of making you paste it
Loading the portfolio became an ordered preference: ask Rumo if the reader has it connected, otherwise a portfolio file they maintain, otherwise ask. Jawz still stores nothing — the point is that a reader stops re-typing holdings every session without Jawz holding anything. The output has to name which source it used.
The regime read says when it is sitting on a line
The business cycle turns on two threshold questions, so a pillar reading neutral is one small move from flipping the whole quadrant. A cycle change now requires three consecutive daily reads before it becomes the headline, with any pending flip reported as provisional rather than dropped. Separately, the headline colour declares when it sits within a hair of its own threshold. That second part is the one that mattered: a routine data revision moved sentiment across a line by 0.2 and a published brief was wrong the next day, because nothing had said how close the reading was.
History, not just today
Chapters now read trajectory rather than a single point. The regime, global liquidity and financial conditions each carry a timeseries, so 'what changed' is grounded in dated transitions instead of memory. Liquidity trend is computed on a constant basis, because when China enters or leaves the coverage the headline moves by several trillion without any liquidity actually changing — a coverage change is reported as a coverage change.
Low fit now distinguishes 'by design' from 'decayed'
A weak regime-fit score used to read the same whether a position was opened low-fit deliberately or had deteriorated since entry. Those are opposite findings — one is a plan, the other is drift — so they are now separate flags. Only the second is a reason to look again.
One factor vocabulary, end to end
Classification and scoring had drifted into two different vocabularies, so a position tagged in the chapter had to be translated before the drift engine could score it — and translation is where meaning gets lost. The chapter's factor axis is now exactly the set the scoring tools accept. No translation step, and no way for the two to disagree.
Crypto companies are companies
Miners, exchanges and treasury-holders were being tagged as crypto exposure. They are equities: they carry business risk, dilution and financing risk, and they can fail while the token does fine. They are now classified by their dominant equity factor with crypto correlation recorded as a secondary overlay — and that overlay is allowed to migrate, which is itself a signal that a thesis has evolved.
The last sketch modes graduated
Several modes shipped as v0.1 outlines while the framework was being built. With Position Conviction Audit and Process Mirror completed, every mode in all four chapters is a full mode with a real procedure and output contract. Nothing in the published Loop is a placeholder.
Global liquidity got its own mode
Liquidity had been one input inside the regime read. It is often the dominant driver for risk assets, so it became a mode in its own right — central-bank balance sheets converted to a common currency, with the move decomposed into policy versus currency translation, because a stronger dollar shrinks foreign balance sheets without any policy changing.