Commit graph

39 commits

Author SHA1 Message Date
igneum-labs
825b86df2f Merge build-server aa64017a into master: the deploy script after the devnet-4 re-point (index hero, explorer-stats keyed on the live network, checkpoint shape check, LIVE_NETWORK default igneum-devnet-4) and the checkpoint no-certificate reason with live_daa
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 18:10:57 +00:00
igneum-labs
5f2cd8bf0c /acceptance: the registry's times read UK on the served page and in the runtime reply (the zone name is a forbidden string on a served page)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 17:52:23 +00:00
igneum-labs
f79f8fe427 Merge the acceptance page (aa508757) into the 2.0 lane branch: /acceptance from the Test and Acceptance Standard's registry with its runtime endpoint, the case ids on the facts rows, the nav, sitemap, capture and share hooks united with the audit page's
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 17:42:28 +00:00
igneum-labs
aa50875704 /acceptance: the Test and Acceptance Standard 1.0, case by case, rendered from docs/plans/igneum-2.0-test-registry.json
The page shows each of the 128 cases in 16 suites as it is run, in the standard's words (NOT RUN, RUNNING, PASS, FAIL,
BLOCKED, DEFERRED): a header with the approval line and a thin segmented count bar (never a percentage), G0 and the five
gates G1 to G5 plus the three named gates as cards whose state follows the standard's rule, one section per suite with an
expandable row per case (setup, steps, accept, required evidence, the run's evidence record when present), the profiles
(approved as proposed, P13 deferred, the P04 line read as a FAIL to work against), the fixtures, and the closing notes.

site/lib/acceptance-render.mjs is the one renderer: build.mjs imports it for the build-time page and prints the same functions
into the page's inline script, which polls /api/acceptance (site/api/acceptance.mjs: the registry from git.igneum.network
master, cached 60 s, ok:false with status 200 on failure) and re-renders in place when a case state or source_sha256 moves.
Hooks: the Learn panel, the nav check, the sitemap, capture.sh, the og card row, a lead link on /scorecard, the facts rows 1
to 7 name the case that will prove each. The never-served check strips the plan's own marked never-served list. Node tests
(known-failed first) run in the gate; the registry and the standard text land with the page.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 17:40:41 +00:00
igneum-labs
4068bd2236 checkpoint: the no-certificate reason names the DAA 7,200 window, not a wall-clock (main, 8 Oct 2026); live_daa from the dn4_ blocks in the JSON, no estimate
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 17:25:19 +00:00
igneum-labs
05c08e1d84 Merge explorer-dn3 18a64dad into master (gate: green on 18a64dad, recorded by tools/ci/pre-push.sh; landed on the build mirror) 2026-10-08 17:22:00 +00:00
igneum-labs
18a64dad41 Merge remote-tracking branch 'build/master' into explorer-dn3 2026-10-08 17:14:57 +00:00
igneum-labs
fbcfc9328e Explorer API: network_label from the node's network name with the plan's map (igneum-devnet-4 reads "the Igneum 2.0 devnet", any other suffix "the Igneum devnet N"; the site moved to the dn4_ tables while the label stayed Devnet 3)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 17:09:03 +00:00
igneum-labs
71f801e7f0 Merge master 06cfb387 into build-server; /api/checkpoint serves the live chain only (main, 8 Oct 2026 18:4x: the public site answered the finality test fixture, source test, network igneum-devnet-7): the default and source=dn4 read the dn4_ tables and answer certificate:null with a reason before the first lock, source=test only with the ops key in x-igneum-ops-key (404 without), the reference apps' readCheckpoint never falls back to the fixture; the deploy's checkpoint check keys on that shape and on the live network (rule 25: a served value from the wrong network is a fault); LIVE_NETWORK defaults to igneum-devnet-4
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 17:07:00 +00:00
igneum-labs
89fd0d21dc Merge the box master ecb70db5 into the 2.0 sweep (the ledger page regenerated from the 2.0 source after the enforced-proving lane's D5 row)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 16:52:18 +00:00
igneum-labs
7da771ea93 Rule 25: every coinbase, subsidy and earned figure on /block and /address formats at 18 decimals (the four remaining ign() sites; the 8-decimal formatter is the earlier devnets'); the live tables' default prefix dn4_ in _neon.mjs and live.mjs
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 16:41:53 +00:00
igneum-labs
3974a355be Compatibility rows on the Igneum 2.0 devnet: 20 of 20 pass with real transactions on igneum-devnet-4 (chain id 4465; ERC-20 deploy, transfer, approve and transferFrom; a probe contract; fee quotes and estimates against gasUsed; the 21,000-limit transfer; a revert with Error(string) data decoded from eth_call's raw answer; out-of-gas; receipt fields, bloom and the rebuilt receipts trie root; logs and index agreement; block context, CREATE2; the measured differences: coinbase per including block, prevrandao from the epoch seed, the two-dimensional fee split); site/lc restored to the payment-receipt code another lane's landing (ffd6751e) had reverted; the read service and /api/checkpoint read devnet-4's dn4_ certificates (?source=dn4)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 16:34:50 +00:00
igneum-labs
fb6f84e3e2 Site reset to Igneum 2.0, second pass: the reference apps and the deploy smoke pins follow the Igneum 2.0 devnet
- /light, /receipt and the offline receipt verifier say "devnet, no value" (bundle and source), the reference-app test page
  names no devnet number, the faucet API's closed message names no testnet
- /oracle drops the earlier-oracle history sentence
- tools/site-deploy-from-mirror.sh: the served-page pins no longer expect "Devnet 3 faucet" or the class v5 floor history;
  they expect the Igneum 2.0 devnet faucet title and igneum-devnet-4 on /build

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 15:42:20 +00:00
igneum-labs
af56609574 Merge explorer-dn3 881b854d into master (gate: green on 881b854d, recorded by tools/ci/pre-push.sh; landed on the build mirror) 2026-10-08 11:32:59 +00:00
igneum-labs
881b854d78 Merge remote-tracking branch 'build/master' into explorer-dn3 2026-10-08 11:24:02 +00:00
igneum-labs
ef65b0e7d5 api/checkpoint: bind the row the hand merge dropped (every caller read "cp is not defined" from 12:23 BST)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 11:24:02 +00:00
igneum-labs
fda0c0b518 Explorer: the 10-minute proving counter counts payments landing in the window for blocks of any age (the observer's per-block count read 0 while the lag runs to 500 DAA); the badge reads "certificate re-checked in this browser; the node's verdict on the STARK"
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 11:18:09 +00:00
igneum-labs
0bdc873423 Merge build/master into reference-apps (checkpoint.mjs: master's dn3 default and ?index, the read service's exports kept; built pages rebuilt)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 11:15:05 +00:00
igneum-labs
23f64215bf Reference apps: a receipt proves against the earliest certified checkpoint above its block (the smallest proof, 10 headers and 143 KB instead of 289 headers and 2 MB), the certificate used travels in the receipt
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 10:31:00 +00:00
igneum-labs
e69c4b62f1 Reference apps (8 Oct 2026): the light wallet (/light), the payment receipt (/receipt) and the Sepolia state oracle page (/oracle), each on Devnet 3; site/light/core.js verifies certificate, header path, coinbase merkle inclusion, segment record (aggregator BLS) and the MPT account proof in the browser; the read service tools/reference-apps/light-service (behind rpc.devnet.igneum.network/light); the one-file offline receipt verifier (site/receipt/verify-receipt.js); /api/checkpoint?source=dn3; the negative cases in verify.test.mjs and /light/test; nav routes
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 10:26:55 +00:00
igneum-labs
f05228a6a1 Devnet 3 explorer: transactions (/tx/<hash>), accounts (balance, nonce, code, 7 days of transactions), the proving view (/proving), the DAG picture and the verified badge (the covering certificate re-checked in the browser with site/verify) on /explorer and /block; class and lock state per block; /api/explorer gains ?tx, ?txs, ?proving, ?stats, ?dag; the dn3_ default for /api/explorer, /api/stats, /api/supply and /api/checkpoint (?index=N); replaced chain blocks read as such against the indexer
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 10:24:03 +00:00
igneum-labs
1c1f90e86d Live proving feed: the page says when its shard states are stale, and a chain block with an empty plan reads "no shards in this block" (8 October 2026, main's order: the project lead wants to watch proving and shards in real time; a stale snapshot must read as stale). Reading of the day: /api/live's proven and paid states come from the Devnet 3 observer's own node on igneum-build-1 (igneum-observer-node-dn3, EVM 26850), not from hub-1; that node stopped crediting payouts at 23:57Z on 7 October (paidShards frozen at 7,304 while blocks carried 8,457 proof records by 03:00Z and hub-1 counted 11,861 by 08:56Z), and the page kept showing the paid total as fresh. site/lib/proving-health.mjs (tests known-failed first: "Cannot find module", then 10 green on build-2): stale when the observer's last status read is over 60 s old (status_at, new in the observer's live_state.proving), when the node's tip trails the newest block by over 300 DAA, or when blocks carried proof records in the last 10 minutes and no shard moved to verified or paid for 10 minutes (the blind-to-records class); a quiet chain is not stale for lack of credits. /api/live carries stale, stale_reason, status_age_s, tip_lag_daa, records_10m and last_change_at on proving (two more indexed readings; scene/feed-contract.json lists the keys; the recorded fixture carries them). /live: the Proven tile's line reads "proving feed stale: ..." in ember, else "... last credit N s ago"; the inspector's count adds "feed stale". Scene 2.0.7: a chain block whose plan is known (block.number set, carried as plan on the normalised block) and empty reads "no shards in this block"; loading and late stay for an unread plan (shard-words test, known-failed on 2.0.6). Gate: the health test joins the site unit-test line.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-08 09:12:56 +00:00
igneum-labs
ec38078097 Site on master: /api/live reads the dn3_ tables by default and the pill names igneum-devnet-3 (the live-dn3 edit, taken onto master as files this time; the 22:0x BST cherry-pick landed without it because the branch's commit had been rebased past the master it was picked onto and the merge resolved to master's side); main 7 Oct 2026: every site deploy is master only
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 21:12:36 +00:00
igneum-labs
94ad12c74c live: the Proven tile reads a 600 s window of its own every 10 s (?summary=1 counts), the observer marks claimed shards proving behind OBSERVER_CLAIMS
Main's two follow-ons of 7 October 2026 after the per-block read. (1) /api/live?window=N&summary=1 returns the window's counts alone (blocks, chain, planned, proven, shards by state, the proving counters), and the /live Proven tile reads window 600 that way every 10 s with the line "of the last 10 minutes, every shard verified or paid", while the scene keeps its 60 s window; the stat was the scene window's count, zero by the proof lag. (2) The observer's shardStates reads an open claim as 'proving' from the claim until the proof lands: the records reply's own claims field whenever the node sends one, and the claims RPC behind OBSERVER_CLAIMS ('1' = igneum_getProofClaims, or a method name; unset = off); a node without the method turns the flag off for the run after one log line. Nothing lights until the node lane ships the RPC on the 0.3.20 line.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:14:43 +00:00
igneum-labs
e7398522a8 observer and live API: a block in view carries its shard states whatever its age; windows up to 1800 s (1,800 blocks); the record window 30 minutes
Main's order of 7 October 2026 on the per-block proof read. The live API joined proof rows by when the plan landed and capped the window at 300 s while the fleet's proofs land a median 262 s after the block, so a 60 or 90 s scene window read zero proven blocks by construction. Now: /api/live?window=N accepts 30 to 1800 s and returns at most 1,800 blocks; the shard rows are joined by block hash alone, so the proof's own landing is what moves a block to verified or paid in any window. The observer keeps reading a planned block's records for 30 minutes (was 10) so the lag tail still lands. provers_10m, shards_proven_10m and median_proof_lag_s are unchanged.
Read against the live chain through the local API at 11:05 UK: window 90 proven 0 before and after (every block younger than the lag), 300 proven 2, 600 proven 49 of 139 chain blocks, 1800 proven 143 of 329 chain blocks (1,334 s of blocks under the cap). Observation for the fleet lane: in 1,800 blocks no shard reads proving or verified; states go planned straight to paid.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 10:06:17 +00:00
igneum-labs
ad4c025218 Home scene: the step view returns, with real blocks, animated transitions and a one-line caption
The owner, 6 October 2026: "I liked it when we could see each step of the algo working." The home page's scene is again the
lane chart where a square moves through mined, shards being proven, proven and locked checkpoint, now as site/live-steps.js on
the shared feed (site/scenes/feed.js, which gains onData):
- every square is a real block from /api/live (a 300 s window so late proofs still reach the caption), released one every
  2.5 s so a square crosses the scene in about 34 s; the chain merges a pending block in about 10 s, so its step changes
  while it is still on screen (at the original 10 s crossing most transitions landed after the square had left). The feed is
  sampled for the stream; item 0's counters read the chain. The first reply seeds the scene across its width, so nothing
  starts empty;
- each step is drawn as before: an outline (grey while pending, ember once included), molten quarter cells filling as shards
  are verified or paid, an ember fill when proven, a ring on a locked checkpoint with the dashed "final" line to its left,
  excluded blocks dimmed; every transition glows for a second and a lock ripples;
- one caption line under the scene for the newest block that changed step, e.g. "block 144,564: mined 21:16:03, on the
  selected chain; 1 shard planned", or with its shards "8 shards on 3 cards; proven in 48 s" and "locked at checkpoint 7,084".
  /api/live now carries each block's chain number for it. When no block changes step for a minute the caption says why in
  the ledger's words: finality paused (under two thirds of the weight signing), no proof landed in the last 10 minutes
  (with the median lag), or no block changed step;
- the wheel is never touched: the module has no wheel handler, so the page scrolls through the scene;
- light and dark from the tokens, 390 px, a still frame under reduced motion. The DAG module stays as /live's scene and the
  three scenes stay unlinked on /scenes.

Proved headless over 40 s against the live feed: thirteen captioned transitions, no console errors at 1440 or 390, no
overflow. Captures: docs/plans/site-ui-3-shots/after/index-steps-1440-dark-clip.jpg, index-steps-390-dark-clip.jpg and
index-steps-1440-dark.webm (ten seconds of blocks moving through the steps). Checks: identity grep 0 hits, link check 931
links 0 broken, ledger text 43 of 43, contrast 32 pairs 0 under 4.5:1, api tests pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 20:17:47 +00:00
igneum-labs
5632afa4b7 Home live scene reads the chain, not the window: chain block, shards proven, last lock, live colours, a plain unavailable state
The "LIVE DEVNET" scene on the home page showed blocks 21, proven 0, locked 3 and grey nodes while the devnet stood past
chain block 140,000 with 2,090 shards paid and a checkpoint locking every 30 s. Four causes, all in site/index.html:
- "blocks" was the scene's own spawn counter, never the chain;
- "proven" counted blocks of the 90 s window whose shards were all paid, and proofs land a median 380 s behind the tip
  (median_proof_lag_s), so the window can never hold one;
- "locked" counted locked checkpoint blocks inside the same 90 s window (always about 3);
- the live path skipped the colour state machine, so every real block stayed grey, and a failed first fetch left the
  simulation running under a label that looked live, with no further polls.

Now: /api/live carries state.height (the chain block number, the same field /api/stats reports, one indexed subquery);
the scene's counters read chain block (state.height), shards proven (proving.paid_shards_total, the node's count of paid
shard records, with the 10-minute count and the median lag in the note) and last lock (finality.latest_locked_index);
live blocks take the observer's own words (pending, included, excluded, proven, locked checkpoint, final to its left),
refreshed on every poll, with a legend in those words; the hero tile shows the chain block instead of the node's
held-block count; polling never stops (2 s while fresh, 10 s while off) and the off state is labelled "simulated preview ·
live feed unavailable" or "observer offline, last update N ago" with a note that the counters count simulated blocks.
Also found while verifying: the scene advanced a fixed 16 ms per frame, so it ran at double speed on 120 Hz displays;
it now uses the real frame time, capped at 50 ms.

/live had the same window bug in its "proven 0/16" counter; it now reads the observer's 10-minute truth (chain blocks
with every shard paid, of the chain blocks planned in 10 min) with the lag and the chain total in its title.

Verified against the live API through tools/site-serve.mjs in the built-in browser and headless Chromium:
chain block 140,489, shards proven 2,130, last lock #6,784; the failed-fetch state shown by blocking /api/live.
Screenshots: docs/plans/site-ui-3-shots/item0/ (1440 and 390, live and failed). Checks: identity grep 0 hits,
link check 708 links 0 broken, site/api tests 14 pass, site build clean.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 18:14:05 +00:00
igneum-labs
a93d2a5e9a Explorer pages: /explorer, /block/<hash|number>, /address/<addr>, the search router, a local preview server, CI
Fed by /api/explorer from the observer's tables. Latest blocks (hash, number, DAA, blue score, miner, txs, proof
records, time); a block's header, parents, children, mergeset, coinbase outputs, EVM transactions, shards, checkpoint
and certificate; an address's blocks, what they earned, vote keys and balance (eth_getBalance when EXPLORER_EVM_RPC is
set). Same tokens as live.html. vercel.json rewrites /block/:id and /address/:addr; the footer links the explorer; the
link checker skips template literals and resolves /api/<name> to its function. node tools/site-serve.mjs previews the
site with the functions in-process.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 19:35:40 +00:00
igneum-labs
4b052d63c8 Public stats API: /api/stats and /api/supply, documented with live examples, contract test and a live check
The numbers profitability sites and pool software read (WhatToMine's form: explorer or pool with an API, the halving
schedule, a source for total coins). Reward and supply from the emission rule at the node's DAA score; the halving table
(33 rows), the 30-day ramp and the observer's coinbase check. Cached 10 s, CORS open. FIELDS in each handler is the
contract; public-stats.test.mjs checks it from a fixture, tools/ci/public-api-check.mjs checks a deployment.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 19:35:40 +00:00
igneum-labs
03c3ed9b36 Public testnet launch, the public side: dl/public downloads path, site download buttons, HiveOS package, faucet
Downloads: packaging/ota/publish-public.sh publishes the current installers, the HiveOS package and the two signed
manifests into dl/public/ with no token in any URL, writes the four /public/ aliases as vercel.json rewrites and an
unsigned index for the site; publish-manifest.sh --public and ship-app.mjs --public run it on every release (dry run
and self-test cover it). Nothing removed from the token folders.

Site: the miner and wallet buttons link the public aliases and show the version and size from the index, read at
build time (site/downloads.json is the offline snapshot); TESTNET_OPEN in build.mjs drops the "Public testnet: not yet
open" line on the go; the HiveOS Flight Sheet install line on the miner page; /faucet page.

HiveOS: igneum-hive-0.3.8.tar.gz from the 0.3.8 node (2b6d23ef, PC build job) and the zig-built Linux workers.

Faucet: site/api/faucet.mjs (10 IGN per address and per IP per day, Neon table faucet_grants, EIP-1559 transfer signed
by site/lib/eth.mjs with no dependencies: keccak, RLP, secp256k1 with RFC 6979), FAUCET_KEY and FAUCET_RPC from the
Vercel env only; 15 unit tests with a fake database and node, run in CI.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 15:59:31 +00:00
igneum-labs
dd72897628 Log intake: accepts LOG_INTAKE_KEY_NEXT during a key rotation (round 4, X23)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 18:25:33 +00:00
igneum-labs
35bcc93d53 Live page: shards per block (proving v0), three strips on one time axis (blocks, finality bar, proving), observer proof feed, hero glint
Observer (tools/observer/observer.mjs): reads the execution layer's JSON-RPC of a node on the proving build
(IGNEUM_EVM_RPC, default the Mac app's node 26800): every chain block's shard plan as it joins the chain
(igneum_getShardPlan by blockHash, one live_proofs row per shard, planned), the proof records of the chain
blocks of the last 10 minutes polled in rotation (igneum_getProofRecords, four in flight, 40 blocks per tick
while active, 10 before activation): proving (in the pool), verified (SP1 proof verified, or carried and checked
by consensus), paid (a carrying segment paid it), with the prover's id8, the carrier, lag in DAA and the payout.
live_state.proving = {supported, active, activation_daa, tip_daa, verifier, pool, blocks_10m,
blocks_fully_proven_10m, shards_proven_10m, shards_paid_10m, median_proof_lag_s, provers_10m}. A node without
the RPCs gives supported false (rechecked every 5 min); an unreachable endpoint is retried every 20 s. Events:
proving (activation, first paid shard), prover_seen. Additive schema (live_proofs, live_state.proving).

API (site/api/live.mjs): proving, and per block shards: [{i, n, state, prover, lag, payout (IGN), pgas}] and
proven; ?window=N (30 to 300 s) for the page's diagnostic long view; LIVE_TABLE_PREFIX reads a test observer's
tables.

Live page (site/live.html), the design change of 4 Oct 2026: three thin strips sharing one time axis, newest at
the right. BLOCKS keeps the per-miner lanes, chain path, blue/red/pending colouring, arrival glow and tooltips;
the lock ring, dashed lock line and final band leave it. FINALITY is an 18 px bar: ember wash = final (up to the
newest locked checkpoint on screen), molten tick = locked checkpoint, faint = proposed, one label at the newest
lock ("locked #522, 12 s ago"); while finality is not active it reads "finality paused: N% of weight silent" and
nothing else (R4.6.3). PROVING shows one cell per shard under each chain block, outline (planned), molten
(proving), prover colour (verified), tick (paid), a dashed "proofs land N s behind the tip" line, or the one
honest line before activation ("Proving layer: not yet activated on this devnet; activation at DAA N" / "node
without proving"). Header stats: on screen, chain, identities, last lock, proven. Legend: one line per strip.
Hover and tap tooltips on blocks and cells (block, shard, prover, lag, payout). Lanes snap on resize (they used
to ease from a zero-height layout). Phone width, no horizontal scroll; draw 0.6 ms avg, 1 ms max with 110 blocks
on screen (playwright, 1280 px).

Hero (site/index.html): a faint second glint behind a real block once every shard of it is verified, only while
the proving layer is active; pace and sampling untouched.

Verified on the private 3-node proving network (tools/proving-v0/run.mjs --network-only, activation 60) with a
CPU prover loop signing as v0/v1/v2: records relayed, verified on node 0, carried and paid (block 155 by 405,
lag 259 DAA, 0.634 IGN); screenshots in docs/design/live-proving (devnet before activation at 1280 and 375 px,
test network active, the ?window=300 view with paid cells). The live devnet shows the "not yet activated;
activation not set" line once the observer runs this build.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 17:39:28 +00:00
igneum-labs
87b9d34697 Public API: no peer addresses, no full key hashes, no payout addresses (R4.6.2, R4.6.8)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 13:47:39 +00:00
igneum-labs
266ddf4db3 Observer: decoupled ingest, lag metric, per-minute by header time, feed self-check, restart loop
After the 4 Oct 2026 stall (no block stored from 11:57 to 13:15 UTC, then 7,022
blocks in two minutes). Notifications only enqueue; a drain loop handles them
in bounded batches. Block flush, colour marking and certificate work each run
on their own timer and never wait on one another. Mergesets come from the
notification's verbose data (bounded cache); getBlock only on a miss, four at
a time. live_state gains observer_lag_s and queue_depth; the API serves them;
the page shows "observer N s behind" past 30 s instead of waiting for the
first block. blocks_per_minute and blocks_60s are bucketed by the block's own
timestamp and reseeded from the table on start, so a catch-up fills past
minutes instead of painting a spike. If no blockAdded arrives for 60 s while
the node's block_count advances, the observer resubscribes; after two failed
attempts it exits 2 and tools/observer/run.sh restarts it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 13:26:46 +00:00
igneum-labs
a2d7d575b7 Live DAG: side blocks carry their GHOSTDAG colour (blue paid, red excluded, pending)
Observer: additive live_blocks.color (pending by default). Every chain block's
mergeset marks its blues blue and its reds red, from the notification's verbose
data or getBlock for chain blocks learned via virtualChainChanged; a reorg puts
the removed chain blocks' mergesets back to pending. API serves color. Page:
blue side blocks filled in the miner's hue at 70% with the ring, pending the
faint outline, red a dark outline with a strike; tooltip and legend name the
state.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 10:03:28 +00:00
igneum-labs
26121a138c Light client v0: the browser verifies the latest certified checkpoint
site/verify/core.js recomputes every header hash (keyed BLAKE2b, the
node's field order), checks the parent links from the previous locked
checkpoint, hashes each voter's G1 key to its vote_key_hash, verifies the
BLS aggregate over "igneum-vote-v1/" || chain_id || 0 || index_le64 ||
checkpoint under the vote tag with the bitmap's keys, and applies Q3
(2/3 of active, 17/30 of total). verify.js drives it from /api/checkpoint
with @noble/hashes 2.4.0 and @noble/curves 2.4.0 pinned from jsdelivr and
fills the homepage card; the badge says LIVE only after a pass in the tab.

site/api/checkpoint.mjs ships the data: certificate bytes, voter table
with public keys, header chain. tools/observer stores every certificate a
block carries (new table live_certificates, voter table read at the lock,
selected-chain headers back to the previous lock, one-off backfill of the
newest lock on start) and keeps header nonces exact; the FinalityLock
write no longer fails on a missing votes_seen.

Tested on the igneum-devnet-7 test network: checkpoint 95 verifies in
Chrome in 103 ms; a flipped signature bit, a dropped voter, an altered key,
an altered header and a removed header all fail with the reason named.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 22:21:12 +00:00
igneum-labs
d37c0fed7b Finality v2: fork reading guide, spec implementation notes, bench entry, observer checkpoints, live page locks
- docs/fork-divergence.md: "Finality v2" table (every file, risk, merge note), decisions
- docs/spec/03-finality.md: section 3.10 implementation notes, clause by clause
- docs/bench-log.md: test-network results (72 of 72 steady locks, median 0.80 s; equivocation
  strip; partition: 0 locks at 39.6% of total with the floor binding, heal in 30 s), follower
- tools/observer: live_checkpoints table, FinalityLock subscription, "checkpoint N locked" events
- site: /api/live adds checkpoints and locked/final flags; /live draws the lock ring and final line

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 21:54:24 +00:00
igneum-labs
3138d3f308 Live devnet: observer, /api/live and the /live page
tools/observer: Node 22 observer on the node's wRPC JSON port (blockAdded and
virtualChainChanged subscriptions, 2 s state ticks) writing live_blocks,
live_state and live_events to Neon, miner address decoded from the coinbase
payload, events for new or quiet miners, peers and difficulty steps.
site/api/live.mjs: three indexed queries, max-age=1.
site/live.html: status strip, DAG stream with real parent edges and a lane per
miner, miners table, events feed, blocks-per-minute sparkline, OFFLINE freeze.
The homepage live path and the /api/live cache header went in with 43624bf.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 19:22:06 +00:00
igneum-labs
9665e3137d Add the miner log intake, Windows uploader and Mac reader
POST /api/log stores a log snapshot in Neon table miner_logs over the HTTP SQL
endpoint with no dependencies. upload-log.bat posts the last 256 KB of a log from
Windows with the curl.exe that ships with it. tools/logs.mjs lists runs and prints
the latest lines on the Mac.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 18:42:32 +00:00