<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>cat/mosaic</title>
<subtitle>a takuzu puzzle field for agents to explore tile by tile, with a referee and a replayable spectator view</subtitle>
<id>https://src.rest/cat/mosaic/</id>
<link href="https://src.rest/cat/mosaic/"/>
<updated>2026-08-27T15:00:47-06:00</updated><entry>
<id>d7c0ae67df737f37dc78c972c31576c02860adc5</id>
<title>plan: guards landed</title>
<link href="https://src.rest/cat/mosaic/commit/d7c0ae67df737f37dc78c972c31576c02860adc5/"/>
<author><name>dami</name></author>
<updated>2026-08-27T15:00:47-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>2136753614725f205bf13db820a197383a74eff7</id>
<title>viewer: placeholders frame nothing (boxOf skips shapeless tiles)</title>
<link href="https://src.rest/cat/mosaic/commit/2136753614725f205bf13db820a197383a74eff7/"/>
<author><name>dami</name></author>
<updated>2026-08-27T14:58:34-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>462e8a339bd0469207a4f0f0752f88a0970f7c94</id>
<title>site: anti-cheat guards — per-machine health with once-per-cell credit and burst death, in-batch death cutoff, batch cap, session cap bound into the join proof, keyless joins refused, rejected values stripped, fogged live view (redact.ts), random day seed, keys released in the archive, name/model labels</title>
<link href="https://src.rest/cat/mosaic/commit/462e8a339bd0469207a4f0f0752f88a0970f7c94/"/>
<author><name>dami</name></author>
<updated>2026-08-27T14:56:08-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>dcc27bea174a8a0ea0803b1ec803029d7114486a</id>
<title>engine: X=15 fixture regenerated under gen-v7</title>
<link href="https://src.rest/cat/mosaic/commit/dcc27bea174a8a0ea0803b1ec803029d7114486a/"/>
<author><name>dami</name></author>
<updated>2026-08-27T14:15:30-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>8121c976bc79725e8e784d9a4fff46eee0937e80</id>
<title>engine: tile commitments (mosaic-tile-v1) under a private day key; day seed committed, released at archive</title>
<link href="https://src.rest/cat/mosaic/commit/8121c976bc79725e8e784d9a4fff46eee0937e80/"/>
<author><name>dami</name></author>
<updated>2026-08-27T14:10:10-06:00</updated>
<content type="text">manifest.tiles[].hash was sha256 over the tile&#39;s solution, so an agent
enumerating a revealed tile&#39;s m candidates could find the truth by
hashing them. Now: seed_commit = sha256(&quot;mosaic-day-seed-v1|&quot; + day_seed)
is the manifest id; day_key = HMAC(&quot;mosaic-day-key-v1&quot;, day_seed) keys
every tile hash and sha256(day_key) is published as hash_key_commit; the
hash is HMAC-SHA256 over a versioned length-prefixed encoding of the game
id, tile id, geometry, packed solution bits and packed givens mask
(mosaic-tile-v1). day_seed and day_key live in the private output and
are released with the archive. Fields rehash tiles after the merge with
their final ids and coordinates. TestHashIsACommitment: no candidate
matches without the key, exactly one with it; the checker verifies seed
and key commitments from the released values. gen-v7; 2x2 fixture
regenerated (X=15 follows).</content>
</entry>
<entry>
<id>98712fd72ca842e32bb7696b3735676521ba5688</id>
<title>plan: redacted live geometry under fog; random day seed and versioned commitments</title>
<link href="https://src.rest/cat/mosaic/commit/98712fd72ca842e32bb7696b3735676521ba5688/"/>
<author><name>dami</name></author>
<updated>2026-08-27T14:06:21-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>b01277642a6b413203de07b007d16028fa7eea3b</id>
<title>plan: session cap and session-bound proof</title>
<link href="https://src.rest/cat/mosaic/commit/b01277642a6b413203de07b007d16028fa7eea3b/"/>
<author><name>dami</name></author>
<updated>2026-08-27T14:05:13-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>1889a178aa5b0212a004d57ef86594b43b1cd21a</id>
<title>plan: mid-batch death and once-per-cell health</title>
<link href="https://src.rest/cat/mosaic/commit/1889a178aa5b0212a004d57ef86594b43b1cd21a/"/>
<author><name>dami</name></author>
<updated>2026-08-27T14:04:47-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>3225887e758282b46cded3be096915de662de9ac</id>
<title>plan: guards against the oracle, the log leak and the hash oracle</title>
<link href="https://src.rest/cat/mosaic/commit/3225887e758282b46cded3be096915de662de9ac/"/>
<author><name>dami</name></author>
<updated>2026-08-27T14:01:14-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>2a1aa81bb0dcefaf20db426e87cab2b198cb0c6f</id>
<title>plan: item 15 proven live (shoo login and machine claim)</title>
<link href="https://src.rest/cat/mosaic/commit/2a1aa81bb0dcefaf20db426e87cab2b198cb0c6f/"/>
<author><name>dami</name></author>
<updated>2026-08-27T13:50:06-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>63c41e05a2ff1f9ae7894752b258b807dccb1624</id>
<title>plan: item 15 landed</title>
<link href="https://src.rest/cat/mosaic/commit/63c41e05a2ff1f9ae7894752b258b807dccb1624/"/>
<author><name>dami</name></author>
<updated>2026-08-27T13:43:32-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>8b1d3164d041e936737123a38b8ad4abb115c312</id>
<title>identity: session label with a bearer join; lint</title>
<link href="https://src.rest/cat/mosaic/commit/8b1d3164d041e936737123a38b8ad4abb115c312/"/>
<author><name>dami</name></author>
<updated>2026-08-27T13:41:24-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>a3dd7603504b1e3ef0180c7da1b40adda3490ac8</id>
<title>identity: public origin for claim links, the id_token audience and the cookie behind the proxy</title>
<link href="https://src.rest/cat/mosaic/commit/a3dd7603504b1e3ef0180c7da1b40adda3490ac8/"/>
<author><name>dami</name></author>
<updated>2026-08-27T13:40:09-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>f7891dbca13d64fdca15ca90c0fe1c2f510fe897</id>
<title>identity the tribes way: JWK identity file, key-auth bearer tokens, shoo login, claim links</title>
<link href="https://src.rest/cat/mosaic/commit/f7891dbca13d64fdca15ca90c0fe1c2f510fe897/"/>
<author><name>dami</name></author>
<updated>2026-08-27T13:38:25-06:00</updated>
<content type="text">~/.config/mosaic/identity.json {v, publicKey, privateKey (JWK Ed25519),
createdAt, name}; POST /api/keys/auth {publicKey, ts, sig} over
mosaic-key-auth:&lt;host&gt;:&lt;ts&gt; mints one msc_ bearer per key (TOFU registry
in data/identity.sqlite); join takes the bearer from the MCP request
(request scope) or the proof fields; /identity and /identity.md carry the
spec with node, openssl, python and deno ways; shoo.js login with
/api/session (jose against shoo&#39;s JWKS, audience origin:&lt;origin&gt;), HMAC
session cookie, /api/me, /api/logout; /api/keys/link-token and /link
claim a machine for the signed-in account; identity.ts --token/--link;
solve.ts --bearer; tests incl. an openssl-made signature.</content>
</entry>
<entry>
<id>06386b9c680e2c2e926128e773c9ecde5b247195</id>
<title>plan: auth follows the tribes convention; shoo login/logout; claim link</title>
<link href="https://src.rest/cat/mosaic/commit/06386b9c680e2c2e926128e773c9ecde5b247195/"/>
<author><name>dami</name></author>
<updated>2026-08-27T13:28:49-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>8dc64f954a718771d326e6e1190ad9cc374925cd</id>
<title>plan: machine keys landed (item 15, first half)</title>
<link href="https://src.rest/cat/mosaic/commit/8dc64f954a718771d326e6e1190ad9cc374925cd/"/>
<author><name>dami</name></author>
<updated>2026-08-27T13:16:57-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>506edf3e13f7fcef032e20e066d25af6774cb1e5</id>
<title>identity: a machine key per machine, verified joins, sessions, TOFU registry</title>
<link href="https://src.rest/cat/mosaic/commit/506edf3e13f7fcef032e20e066d25af6774cb1e5/"/>
<author><name>dami</name></author>
<updated>2026-08-27T13:14:05-06:00</updated>
<content type="text">scripts/identity.ts (served at /identity.ts) makes an ed25519 key in
~/.config/mosaic/identity.json; join takes machine_id, public_key and a
proof (signature over mosaic-join|game|key|minute, current or previous
minute); the server checks the fingerprint and the signature, records
the first key per machine id in data/machines.sqlite and refuses another;
a verified agent is machine_id/session and the by-user leaderboard keys
on the machine; unverified joins stay allowed as provisional a&lt;N&gt;, marked
and never honoured; the client signs with --identity; prompt and rules
say so.</content>
</entry>
<entry>
<id>e50e8a56bc5afa553dc8ffb52f04674443dd6648</id>
<title>viewer: no coordinates at L3; death cross drawn above the stones</title>
<link href="https://src.rest/cat/mosaic/commit/e50e8a56bc5afa553dc8ffb52f04674443dd6648/"/>
<author><name>dami</name></author>
<updated>2026-08-27T13:05:17-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>16534aacc6952ac1a1a6ad01b179b0a9f07e91d2</id>
<title>calendar: say when no day has finished yet</title>
<link href="https://src.rest/cat/mosaic/commit/16534aacc6952ac1a1a6ad01b179b0a9f07e91d2/"/>
<author><name>dami</name></author>
<updated>2026-08-27T12:49:59-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>7974f99327ffbd3b6083138fdcc124812c9724bd</id>
<title>viewer: table first and default in the dock; user rows show the agent&#39;s name; model rows say how many timed out</title>
<link href="https://src.rest/cat/mosaic/commit/7974f99327ffbd3b6083138fdcc124812c9724bd/"/>
<author><name>dami</name></author>
<updated>2026-08-27T12:46:07-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>fe6fa7c33d91742639cafe2bcf9b843bdee547a2</id>
<title>plan: the Kifu match screen landed (items 16-23), live on mosaic.dev.site</title>
<link href="https://src.rest/cat/mosaic/commit/fe6fa7c33d91742639cafe2bcf9b843bdee547a2/"/>
<author><name>dami</name></author>
<updated>2026-08-27T12:40:32-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>2df8a9e82d668242294c91f1a6ed1af2bfc439fd</id>
<title>viewer: a ?zoom= deep link for the initial view (used for screenshots and links)</title>
<link href="https://src.rest/cat/mosaic/commit/2df8a9e82d668242294c91f1a6ed1af2bfc439fd/"/>
<author><name>dami</name></author>
<updated>2026-08-27T12:37:44-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>d7f3c1c435bd6bc9804c142133cec3a0781f37a1</id>
<title>viewer: the Kifu match screen — board with stones, counting marks and board lines, player cards with clocks, move list, tournament table, result card, phone layout; identity tokens and pages</title>
<link href="https://src.rest/cat/mosaic/commit/d7f3c1c435bd6bc9804c142133cec3a0781f37a1/"/>
<author><name>dami</name></author>
<updated>2026-08-27T12:26:25-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>12bbe12966ad6b80fa126b03ae2b39e0b9657215</id>
<title>plan: hosted at mosaic.dev.site</title>
<link href="https://src.rest/cat/mosaic/commit/12bbe12966ad6b80fa126b03ae2b39e0b9657215/"/>
<author><name>dami</name></author>
<updated>2026-08-27T12:22:53-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>76dd74f931daea3f01b398ec2927b2dd3112119b</id>
<title>fly: public URL mosaic.dev.site</title>
<link href="https://src.rest/cat/mosaic/commit/76dd74f931daea3f01b398ec2927b2dd3112119b/"/>
<author><name>dami</name></author>
<updated>2026-08-27T12:20:20-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>b54148e5cddd4913c7a1b92ce12e2d85c4106700</id>
<title>plan: current goal — implement the Kifu match screen (items 16-23)</title>
<link href="https://src.rest/cat/mosaic/commit/b54148e5cddd4913c7a1b92ce12e2d85c4106700/"/>
<author><name>dami</name></author>
<updated>2026-08-27T12:11:17-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>fa37ff30d75435cbfa7298cccea516632c3655a4</id>
<title>plan: visual identity — Kifu, field + dock, Go match screen</title>
<link href="https://src.rest/cat/mosaic/commit/fa37ff30d75435cbfa7298cccea516632c3655a4/"/>
<author><name>dami</name></author>
<updated>2026-08-27T11:54:50-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>2b675e14467dc178585b83576b128f824f6419ef</id>
<title>viewer: no L3 detail for a tile nobody has revealed</title>
<link href="https://src.rest/cat/mosaic/commit/2b675e14467dc178585b83576b128f824f6419ef/"/>
<author><name>dami</name></author>
<updated>2026-08-27T11:07:40-06:00</updated>
<content type="text"></content>
</entry>
<entry>
<id>149a4465e887aaca9625a3cdbb9bcc9ba4b180f3</id>
<title>webmcp: the page exposes the /mcp tools to an agent driving the tab</title>
<link href="https://src.rest/cat/mosaic/commit/149a4465e887aaca9625a3cdbb9bcc9ba4b180f3/"/>
<author><name>dami</name></author>
<updated>2026-08-27T04:50:28-06:00</updated>
<content type="text">An island mirrors tools/list onto navigator.modelContext and proxies
execute through tools/call, so the browser surface always matches the
server surface (the daily host still hides start_mosaic). Both host
shapes (registerTool, provideContext) are served; a late-injected host
is caught by a short poll; a browser join defaults harness=webmcp.</content>
</entry>
<entry>
<id>0898f96118c29558a30f16d807c48e8ed9a5ccc9</id>
<title>plan: acceptance runs under health; rules were missing on the host, fixed</title>
<link href="https://src.rest/cat/mosaic/commit/0898f96118c29558a30f16d807c48e8ed9a5ccc9/"/>
<author><name>dami</name></author>
<updated>2026-08-27T04:41:42-06:00</updated>
<content type="text"></content>
</entry>
</feed>
