Conversation
The buyer panel told the buyer three things they could not act on, and one of them was wrong. Share link. The workspace stripped the break out of the address bar on arrival, so the only shareable URL lived behind an unlabelled copy icon and a recipient who forwarded what they saw sent an empty break. The address bar now carries the current break and stays in sync with it, the history entry is marked as this browser's own so a reload is not re-announced as someone else's shared calculation, and the control is a labelled Share button that uses the platform share sheet on touch before falling back to the clipboard and then to a readable link. Color balancing. MTGJSON marks draft common sheets color balanced. The simulator ignored the flag and reported it as a technical issue, which both understated every mono color's floor (a modeled opening could miss a color that a real pack cannot) and put a defect notice in front of someone with no way to fix it. Sampling now applies the one guarantee the flag carries: the sheet spends its first five picks on one card of each mono color, then draws the rest by its own printed weights. Slot bounds follow the same rule. No stronger per-color distribution is claimed, and colorless and land commons still come through the free picks. The omission now fires only when the resolved sheet has lost a whole color and the guarantee cannot be honored. Stale prices. "Prices over 6 hours old" is now the button that refreshes them: it re-reads the published snapshot past the browser and service-worker caches and recalculates, and says plainly when no newer publication exists. Also fixes the ranked-card list, where a legacy three-column rule outranked the four-cell contributor grid at 720px and up, so Adds wrapped onto its own line and Chance read as an empty column; and the column tooltip, which ran two definitions together in one paragraph. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XPJ6p3JK61STwJazS24aoF
…hare-price-refresh-jy8ap2 # Conflicts: # build-number.txt # src/future.css
…hare-price-refresh-jy8ap2 # Conflicts: # build-number.txt
…hare-price-refresh-jy8ap2 # Conflicts: # build-number.txt # public/methodology.html # src/domain/simulation.test.ts # src/domain/simulation.ts # src/features/buyer/BuyerDetails.tsx # src/features/buyer/BuyerWorkspace.tsx # src/features/shared/Primitives.tsx
…hare-price-refresh-jy8ap2 # Conflicts: # build-number.txt # public/methodology.html # src/data/outcome-model.ts # src/domain/simulation.ts # src/features/buyer/BuyerWorkspace.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The buyer decision panel showed three things the buyer could not act on. This makes each one a control.
Scope has narrowed as
mainadvanced: the color-balancing work this PR originally carried is now superseded bymain's ownminColorscollation policy and has been dropped (see Validation).Share link now propagates the break
The workspace stripped the query out of the address bar on arrival, so the only shareable URL lived behind an unlabelled copy icon, and a recipient who forwarded what they saw in the address bar sent an empty break.
history.state.colorbreakOwn), so a reload of your own break is not re-announced as someone else's shared calculation or a recovery prompt.Note: the address bar now carries the public break composition (products, quantities, slots). Bids, shipping, seller costs and actuals were already excluded from the share URL and still are.
Stale prices are a refresh button
"Prices over 6 hours old" is now the control that acts on it, driven by
main's ownrefreshPublishedPrices— the same engine the product picker uses, so usable prices survive a failed refresh and the buyer never loses an estimate by asking.The badge speaks the picker's vocabulary exactly (
Searching…/Updating…/Updated/Up to date/No newer data/Partial update/Retry), carriesaria-busywhile running, and stays visible after the check so the answer outlives the condition that prompted it. A plain-language line states the outcome, including the honest "No newer prices are published yet."Ranked cards: empty Chance column
A legacy
.contributors .card-rowthree-column rule outranked the four-cell contributor grid at 720px and up, so the Adds cell wrapped onto its own line and Chance read as an empty column. Header and row columns now align to the pixel.Column tooltip
Chance and Adds ran together in one paragraph.
Tipnow renders blank-line-separated paragraphs and sets a leading term apart, alongsidemain'sEstimateTipand its visual-viewport sizing.Also fixes an unhandled rejection when the catalog or sealed-price fetch fails during line repair.
Validation
mainhas been merged in four times as it advanced (thirteen commits). The last merge changed what this PR should contain:mainimplemented the same idea more generally —minColorson the sheet, a collation-policy layer mappingbalanceColors → minColors: 5with per-product evidence, exact DP bounds over color groups,duplicateKeyidentity, reserved color spaces in sampling, and its own omission when the card list cannot prove the guarantee.main's version is a strict superset, sosimulation.tsandoutcome-model.tswere taken wholesale and this PR's two color-balancing tests removed;main'scollation-integration.test.tscovers the behavior.mainlandedrefreshPublishedPriceswith phases, per-shard revisions and partial retry. This PR's weakerrefreshPriceSnapshotwas deleted and the buyer badge now callsmain's function, soscryfall.tsdiffers frommainonly in one status message.BuyerWorkspace.tsx/BuyerDetails.tsx/methodology.html: this PR's controls and copy placed insidemain'sAnswerProvider,AnswerGraphicand MIN/MAX paragraph.Post-merge the full
npm run checkis green: 464 tests across 100 files, root.mjssuites, shared-module boundary, unused-symbol check, coverage gate, both price-snapshot gates, ready examples, production build, deploy-path and OCR-bundle smoke tests.build-number.txtis 13.tools/check-refresh-flow.mjs(not wired into any script or workflow) fails on a sheet-header height assertion — but it fails identically onorigin/mainwith the same browser, so it is not this PR's. It appears to expect Playwright's headless-shell build, which this environment does not carry.Re-verified in Chromium against the merged production build, with no page errors: the URL carries the break, the Share button is present, the stale badge renders as the refresh button and a full round trip reports "No newer data" with the matching answer line, the ranked row renders four cells with header and value columns aligned to the pixel, and the column tooltip renders two paragraphs.
🤖 Generated with Claude Code
https://claude.ai/code/session_01XPJ6p3JK61STwJazS24aoF