<feed xmlns='http://www.w3.org/2005/Atom'>
<title>guess-market/service/src/test/java/market, branch master</title>
<subtitle>definitely not polymarket
</subtitle>
<id>https://git.sartin.in/guess-market/atom?h=master</id>
<link rel='self' href='https://git.sartin.in/guess-market/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.sartin.in/guess-market/'/>
<updated>2026-09-10T08:55:50Z</updated>
<entry>
<title>tests: cover the ex-2 loader, order book trading and desktop state</title>
<updated>2026-09-10T08:55:50Z</updated>
<author>
<name>Kostya</name>
<email>mail@sartin.in</email>
</author>
<published>2026-09-10T08:55:50Z</published>
<link rel='alternate' type='text/html' href='https://git.sartin.in/guess-market/commit/?id=1a8b75f96f0c6855581be3a38069f09eca37d1f5'/>
<id>urn:sha1:1a8b75f96f0c6855581be3a38069f09eca37d1f5</id>
<content type='text'>
Add tests for the behaviour introduced in the last few commits, so
later changes to matching, settlement or the UI state can't quietly
break it.

On the service side, Ex2LoaderTest loads the ex-2 fixtures and checks
that every invalid file is rejected for its own reason, including
events with no market maker or two of them, and v1 files. The order
book tests cover buys and sells that match or rest in the ladder,
self-trade prevention, cash and shares reserved by resting orders,
price bounds, risk rejections, and resolution cancelling resting
orders and paying the holders. A simulation checks that LMSR
settlement conserves money.

LedgerMapperTest used to pin the unmapped seq and at fields to their
defaults. Now that the mapper fills them from the entry id and time,
assert the real values and add a case for a null time.

On the desktop side, AppStateTest drives the real ServiceEngine through
loading, event creation, LMSR and order book trading, and checks that
the observable state updates. Smaller tests check chart timestamps,
money and probability formatting, and that every animation settles on
its final frame, which is what the UI shows when animations are off.
</content>
</entry>
<entry>
<title>model: relocate market DTOs out of the flat api package</title>
<updated>2026-08-23T14:05:29Z</updated>
<author>
<name>Kostya</name>
<email>mail@sartin.in</email>
</author>
<published>2026-08-23T14:05:29Z</published>
<link rel='alternate' type='text/html' href='https://git.sartin.in/guess-market/commit/?id=843820ea9f357220d69f3795f3289ee41eed355c'/>
<id>urn:sha1:843820ea9f357220d69f3795f3289ee41eed355c</id>
<content type='text'>
Move AccountDTO/MarketDTO/MarketStateDTO/PurchaseReceiptDTO/TradeRowDTO
out of the catch-all api package into model.market (and LedgerDTO into
model.ledger), matching the existing model.event convention so DTOs
live next to the domain they describe rather than in the interface
package. Relocate LedgerMapper from mapper.v2 to infrastructure.adapter
to match the module's established package layout, and update all call
sites and imports accordingly.

Also register the ui-desktop module in the build tooling: add it to
MODULES, add openjfx to the shipped runtime libs, and generalize
package.sh so each executable module (ui-console, ui-desktop) gets its
own Main-Class/Class-Path manifest and run script instead of
special-casing ui-console. Fold long Class-Path manifest lines at 72
bytes per the JAR spec, since adding ui-desktop's dependencies pushed
the line past the limit.
</content>
</entry>
<entry>
<title>Add MapStruct LedgerMapper and wire annotation processing into build.sh</title>
<updated>2026-08-20T14:39:50Z</updated>
<author>
<name>Kostya</name>
<email>mail@sartin.in</email>
</author>
<published>2026-08-20T14:39:50Z</published>
<link rel='alternate' type='text/html' href='https://git.sartin.in/guess-market/commit/?id=fbfd2e275e9d645e4ec8a1874bc57d98b1c38300'/>
<id>urn:sha1:fbfd2e275e9d645e4ec8a1874bc57d98b1c38300</id>
<content type='text'>
build.sh now passes -processorpath/-s so MapStruct's generated impl
compiles alongside hand-written sources.
</content>
</entry>
<entry>
<title>Move CommissionTiming and MechanismType into model.event package</title>
<updated>2026-08-20T09:09:20Z</updated>
<author>
<name>Kostya</name>
<email>mail@sartin.in</email>
</author>
<published>2026-08-20T09:09:20Z</published>
<link rel='alternate' type='text/html' href='https://git.sartin.in/guess-market/commit/?id=0fc488c3f9e29f5e9f1092f8081714c9e820f178'/>
<id>urn:sha1:0fc488c3f9e29f5e9f1092f8081714c9e820f178</id>
<content type='text'>
Groups them with the other event-domain enums instead of the general
api package, and updates all call sites accordingly.
</content>
</entry>
<entry>
<title>Break down purchase receipts by cost/commission, harden XML validation and state I/O</title>
<updated>2026-08-18T15:19:50Z</updated>
<author>
<name>Kostya</name>
<email>mail@sartin.in</email>
</author>
<published>2026-08-18T15:19:50Z</published>
<link rel='alternate' type='text/html' href='https://git.sartin.in/guess-market/commit/?id=755d2265054e5140e82d322681566c3034583c95'/>
<id>urn:sha1:755d2265054e5140e82d322681566c3034583c95</id>
<content type='text'>
Adds a full pre-load validation pass for GM XML seeds (ids, names,
options, commission, LMSR liquidity), replaces IO.print with
System.out, and surfaces detailed error messages across load/save
commands instead of generic failures.
</content>
</entry>
<entry>
<title>Split DTOs into api/model, extract order matching into service/matching</title>
<updated>2026-08-16T18:50:15Z</updated>
<author>
<name>Kostya</name>
<email>mail@sartin.in</email>
</author>
<published>2026-08-16T18:50:15Z</published>
<link rel='alternate' type='text/html' href='https://git.sartin.in/guess-market/commit/?id=eed9265be711432f40247f149c07f9e33511192a'/>
<id>urn:sha1:eed9265be711432f40247f149c07f9e33511192a</id>
<content type='text'>
Moves Event/Ledger DTOs out of the flat api package into
api/model/{event,ledger}, and moves LocalCatalogContext and order
matching logic into dedicated service/catalog and service/matching
packages, replacing TradingOperation/TradingOperationImpl.
</content>
</entry>
<entry>
<title>Implement LMSR and order-book trading logic, wire MarketContext facade and new menu commands</title>
<updated>2026-08-15T16:25:40Z</updated>
<author>
<name>Kostya</name>
<email>mail@sartin.in</email>
</author>
<published>2026-08-15T16:25:40Z</published>
<link rel='alternate' type='text/html' href='https://git.sartin.in/guess-market/commit/?id=0247f3f5068b96df52a4f9424578d4c66ca6975c'/>
<id>urn:sha1:0247f3f5068b96df52a4f9424578d4c66ca6975c</id>
<content type='text'>
Fill in the previously stubbed cost/pricing math for both trading
mechanisms, and give OrderBookTradingMechanism an actual matching engine
with resting bid/ask books. Fold EventRepository/UserRepository access
into a single MarketContext used by LocalGuessMarketContext, and move the
repository package under infrastructure. Add Buy/EventDetails/LoadState/
SaveState/SettleEvent console commands and wire them into App/Menu.
</content>
</entry>
<entry>
<title>Wire EventRepository into LocalGuessMarketContext, add mapper/provider infra and tests</title>
<updated>2026-08-14T07:54:12Z</updated>
<author>
<name>Kostya</name>
<email>mail@sartin.in</email>
</author>
<published>2026-08-14T07:54:12Z</published>
<link rel='alternate' type='text/html' href='https://git.sartin.in/guess-market/commit/?id=65ef330ad8182c95cc26260548e687d1d71c5ca2'/>
<id>urn:sha1:65ef330ad8182c95cc26260548e687d1d71c5ca2</id>
<content type='text'>
Removes the placeholder Mapper interface in favor of concrete mapper/provider
implementations, fixes Menu.stop() to no-op instead of throwing.
</content>
</entry>
</feed>
