Jun 16, 9-10 AM (28)
Jun 16, 10-11 AM (22)
Jun 16, 11-12 PM (31)
Jun 16, 12-1 PM (37)
Jun 16, 1-2 PM (49)
Jun 16, 2-3 PM (34)
Jun 16, 3-4 PM (28)
Jun 16, 4-5 PM (37)
Jun 16, 5-6 PM (17)
Jun 16, 6-7 PM (26)
Jun 16, 7-8 PM (9)
Jun 16, 8-9 PM (11)
Jun 16, 9-10 PM (4)
Jun 16, 10-11 PM (31)
Jun 16, 11-12 AM (9)
Jun 17, 12-1 AM (8)
Jun 17, 1-2 AM (8)
Jun 17, 2-3 AM (11)
Jun 17, 3-4 AM (4)
Jun 17, 4-5 AM (1)
Jun 17, 5-6 AM (6)
Jun 17, 6-7 AM (99)
Jun 17, 7-8 AM (33)
Jun 17, 8-9 AM (23)
Jun 17, 9-10 AM (56)
Jun 17, 10-11 AM (18)
Jun 17, 11-12 PM (19)
Jun 17, 12-1 PM (57)
Jun 17, 1-2 PM (28)
Jun 17, 2-3 PM (37)
Jun 17, 3-4 PM (26)
Jun 17, 4-5 PM (19)
Jun 17, 5-6 PM (16)
Jun 17, 6-7 PM (10)
Jun 17, 7-8 PM (14)
Jun 17, 8-9 PM (12)
Jun 17, 9-10 PM (37)
Jun 17, 10-11 PM (29)
Jun 17, 11-12 AM (14)
Jun 18, 12-1 AM (12)
Jun 18, 1-2 AM (8)
Jun 18, 2-3 AM (5)
Jun 18, 3-4 AM (11)
Jun 18, 4-5 AM (11)
Jun 18, 5-6 AM (11)
Jun 18, 6-7 AM (10)
Jun 18, 7-8 AM (20)
Jun 18, 8-9 AM (83)
Jun 18, 9-10 AM (45)
Jun 18, 10-11 AM (51)
Jun 18, 11-12 PM (23)
Jun 18, 12-1 PM (67)
Jun 18, 1-2 PM (14)
Jun 18, 2-3 PM (53)
Jun 18, 3-4 PM (44)
Jun 18, 4-5 PM (64)
Jun 18, 5-6 PM (24)
Jun 18, 6-7 PM (21)
Jun 18, 7-8 PM (13)
Jun 18, 8-9 PM (17)
Jun 18, 9-10 PM (23)
Jun 18, 10-11 PM (30)
Jun 18, 11-12 AM (26)
Jun 19, 12-1 AM (13)
Jun 19, 1-2 AM (9)
Jun 19, 2-3 AM (5)
Jun 19, 3-4 AM (2)
Jun 19, 4-5 AM (11)
Jun 19, 5-6 AM (4)
Jun 19, 6-7 AM (92)
Jun 19, 7-8 AM (18)
Jun 19, 8-9 AM (38)
Jun 19, 9-10 AM (39)
Jun 19, 10-11 AM (27)
Jun 19, 11-12 PM (30)
Jun 19, 12-1 PM (53)
Jun 19, 1-2 PM (66)
Jun 19, 2-3 PM (32)
Jun 19, 3-4 PM (61)
Jun 19, 4-5 PM (9)
Jun 19, 5-6 PM (4)
Jun 19, 6-7 PM (17)
Jun 19, 7-8 PM (16)
Jun 19, 8-9 PM (11)
Jun 19, 9-10 PM (45)
Jun 19, 10-11 PM (30)
Jun 19, 11-12 AM (8)
Jun 20, 12-1 AM (4)
Jun 20, 1-2 AM (0)
Jun 20, 2-3 AM (4)
Jun 20, 3-4 AM (1)
Jun 20, 4-5 AM (8)
Jun 20, 5-6 AM (6)
Jun 20, 6-7 AM (6)
Jun 20, 7-8 AM (6)
Jun 20, 8-9 AM (2)
Jun 20, 9-10 AM (2)
Jun 20, 10-11 AM (0)
Jun 20, 11-12 PM (2)
Jun 20, 12-1 PM (7)
Jun 20, 1-2 PM (1)
Jun 20, 2-3 PM (9)
Jun 20, 3-4 PM (11)
Jun 20, 4-5 PM (1)
Jun 20, 5-6 PM (0)
Jun 20, 6-7 PM (2)
Jun 20, 7-8 PM (8)
Jun 20, 8-9 PM (7)
Jun 20, 9-10 PM (0)
Jun 20, 10-11 PM (17)
Jun 20, 11-12 AM (5)
Jun 21, 12-1 AM (14)
Jun 21, 1-2 AM (0)
Jun 21, 2-3 AM (1)
Jun 21, 3-4 AM (0)
Jun 21, 4-5 AM (1)
Jun 21, 5-6 AM (0)
Jun 21, 6-7 AM (9)
Jun 21, 7-8 AM (1)
Jun 21, 8-9 AM (2)
Jun 21, 9-10 AM (2)
Jun 21, 10-11 AM (1)
Jun 21, 11-12 PM (2)
Jun 21, 12-1 PM (0)
Jun 21, 1-2 PM (17)
Jun 21, 2-3 PM (4)
Jun 21, 3-4 PM (10)
Jun 21, 4-5 PM (4)
Jun 21, 5-6 PM (8)
Jun 21, 6-7 PM (7)
Jun 21, 7-8 PM (19)
Jun 21, 8-9 PM (0)
Jun 21, 9-10 PM (1)
Jun 21, 10-11 PM (15)
Jun 21, 11-12 AM (15)
Jun 22, 12-1 AM (12)
Jun 22, 1-2 AM (6)
Jun 22, 2-3 AM (9)
Jun 22, 3-4 AM (4)
Jun 22, 4-5 AM (2)
Jun 22, 5-6 AM (29)
Jun 22, 6-7 AM (17)
Jun 22, 7-8 AM (49)
Jun 22, 8-9 AM (90)
Jun 22, 9-10 AM (53)
Jun 22, 10-11 AM (64)
Jun 22, 11-12 PM (74)
Jun 22, 12-1 PM (47)
Jun 22, 1-2 PM (56)
Jun 22, 2-3 PM (119)
Jun 22, 3-4 PM (46)
Jun 22, 4-5 PM (49)
Jun 22, 5-6 PM (29)
Jun 22, 6-7 PM (33)
Jun 22, 7-8 PM (13)
Jun 22, 8-9 PM (13)
Jun 22, 9-10 PM (11)
Jun 22, 10-11 PM (32)
Jun 22, 11-12 AM (36)
Jun 23, 12-1 AM (18)
Jun 23, 1-2 AM (18)
Jun 23, 2-3 AM (23)
Jun 23, 3-4 AM (11)
Jun 23, 4-5 AM (13)
Jun 23, 5-6 AM (30)
Jun 23, 6-7 AM (27)
Jun 23, 7-8 AM (32)
Jun 23, 8-9 AM (25)
Jun 23, 9-10 AM (1)
3,594 commits this week Jun 16, 2026 - Jun 23, 2026
feat(website): restyle to Cardano developer-portal look and feel
Move the GitHub Pages theme from the old violet/navy palette to the
Cardano Foundation developer-portal visual language
(developers.cardano.org): Cardano Blue (#0033AD) on generous white
space, clean Inter typography, soft rounded cards, minimal shadows.

- custom.css: Cardano-blue accent ramp; light mode is now the primary
  aesthetic (white + blue), dark mode a blue-tinted deep navy; branded
  splash hero with a soft blue gradient + gradient headline; pill-shaped
  CTA buttons; rounded card grid with blue icons and hover lift.
- Add a Cardano-blue brand mark (src/assets/logo.svg) and wire it into
  the Starlight header; refresh the favicon to match.

Built clean: 13 pages, brand color + logo present in output, no
easy1staking self-references in the rendered site.

Co-Authored-By: Claude Fable 5 <[email protected]>
fix(fmt): always warn when the git pre-commit hook isn't installed
A failed `git config` write (e.g. read-only `.git`) was swallowed by
`|| true`, leaving only Git's confusing raw error with no hint the `treefmt`
hook was skipped.

Messaging with a read-only `.git`:

- before:

  ```
  error: could not lock config file .git/config: Read-only file system
  ```

- after:

  ```
  error: could not lock config file .git/config: Read-only file system
  note: couldn't set git core.hooksPath (is .git read-only?)
  hint: the blockfrost-platform pre-commit (treefmt) hook was not installed
  ```
leios: synthesize LeiosFetch offers from CertRB headers; shared peer-vars
When a CertRB header arrives via ChainSync, recognise it
(headerContainsLeiosCert) and offer the EB it certifies
(chainDepStateLeiosAnnouncement) to that peer's LeiosFetch state, as if its
LeiosNotify client had offered it (leiosCertRbCallback / leiosCertRbOffer). The
per-peer LeiosPeerVars are now a shared, get-or-create resource: every peer-vars
mini-protocol (ChainSync, LeiosNotify, LeiosFetch) wraps itself in
bracketLeiosPeer, which allocates the entry if absent and cleans it up on exit.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
leios: park CertRBs in ChainSel until their EB closure is acquired
Treat a missing EB closure like a missing predecessor. ChainSel's
candidate construction skips a CertRB whose announced EB closure is not yet in
the ChainDB-owned acquired set (cdbAcquiredLeiosEbs, seeded at open and grown by
leiosAcquiredEbsRunner from LeiosDb closure-completion notifications). When a
closure arrives, a FIFO ChainSelReprocessLeiosEb message reprocesses the
announcer RBs' cert-carrying successors (found via getLeiosAnnouncers). Also
drives LeiosDb GC/promotion and prunes the acquired set at GC-schedule time.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
leios: add the ChainDB-orchestrated LeiosDb peer-store hooks
Add three methods to LeiosDbHandle (implemented for the in-memory and SQLite
backends): leiosDbScanCompleteEbClosuresNotOlderThanSlot (used at ChainDB open
to seed the acquired-EB-closures set, incl. restart recovery), and the still
no-op leiosDbGarbageCollect and leiosDbPromoteToImmutable lifecycle hooks. Inert
until ChainDB calls them.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
leios: enrich the VolatileDB index with each block's Leios dependency
Add biHasLeiosCert and biLeiosAnnouncedEb to BlockInfo, derived in
extractBlockInfo via blockHasLeiosCert / headerLeiosAnnouncement (hence a
ResolveLeiosBlock constraint on the VolatileDB and its openDB callers, e.g.
DBImmutaliser). Add an incremental EB-announcer reverse index
(LeiosAnnouncerIndex) maintained alongside currentSuccMap, exposed as
getLeiosAnnouncers. Inert until ChainSel consumes it.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
leios: extend ResolveLeiosBlock with the CertRB-recognition methods
Add two methods to ResolveLeiosBlock (both with no-Leios defaults):
headerContainsLeiosCert, which reads the header's hbLeiosContainsCert bit so a
CertRB is recognisable from its header alone, and chainDepStateLeiosAnnouncement,
which reads the EB a CertRB certifies from the predecessor's chain-dep state.
Implement them for the Shelley Dijkstra and CardanoBlock instances (the latter
projecting its chain-dep state), factoring out praosLeiosAnnouncement.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
leios: add the Praos header contains_cert bit and the envelope check
Add hbLeiosContainsCert to the Praos HeaderBody (Dijkstra-only; 10-vs-12-field
CBOR encoding so pre-Leios blocks stay byte-identical), thread it through
mkHeader and Shelley forging, and expose it via pHeaderLeiosContainsCert on the
protocol-header abstraction (TPraos uses default_pHeaderLeiosContainsCert =
const False). Enforce the header/body envelope in blockMatchesHeader: the cert
bit is set iff the body carries exactly one Leios certificate and no txs.

No ChainSync callback yet; that arrives with the peer-vars lifecycle.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>