Apr 10, 1-2 PM (24)
Apr 10, 2-3 PM (36)
Apr 10, 3-4 PM (33)
Apr 10, 4-5 PM (38)
Apr 10, 5-6 PM (30)
Apr 10, 6-7 PM (11)
Apr 10, 7-8 PM (13)
Apr 10, 8-9 PM (7)
Apr 10, 9-10 PM (25)
Apr 10, 10-11 PM (47)
Apr 10, 11-12 AM (18)
Apr 11, 12-1 AM (6)
Apr 11, 1-2 AM (4)
Apr 11, 2-3 AM (2)
Apr 11, 3-4 AM (0)
Apr 11, 4-5 AM (8)
Apr 11, 5-6 AM (4)
Apr 11, 6-7 AM (5)
Apr 11, 7-8 AM (7)
Apr 11, 8-9 AM (3)
Apr 11, 9-10 AM (0)
Apr 11, 10-11 AM (10)
Apr 11, 11-12 PM (4)
Apr 11, 12-1 PM (7)
Apr 11, 1-2 PM (3)
Apr 11, 2-3 PM (7)
Apr 11, 3-4 PM (12)
Apr 11, 4-5 PM (18)
Apr 11, 5-6 PM (39)
Apr 11, 6-7 PM (0)
Apr 11, 7-8 PM (0)
Apr 11, 8-9 PM (2)
Apr 11, 9-10 PM (1)
Apr 11, 10-11 PM (19)
Apr 11, 11-12 AM (23)
Apr 12, 12-1 AM (4)
Apr 12, 1-2 AM (1)
Apr 12, 2-3 AM (9)
Apr 12, 3-4 AM (2)
Apr 12, 4-5 AM (0)
Apr 12, 5-6 AM (2)
Apr 12, 6-7 AM (2)
Apr 12, 7-8 AM (1)
Apr 12, 8-9 AM (3)
Apr 12, 9-10 AM (2)
Apr 12, 10-11 AM (11)
Apr 12, 11-12 PM (4)
Apr 12, 12-1 PM (1)
Apr 12, 1-2 PM (10)
Apr 12, 2-3 PM (24)
Apr 12, 3-4 PM (7)
Apr 12, 4-5 PM (7)
Apr 12, 5-6 PM (17)
Apr 12, 6-7 PM (2)
Apr 12, 7-8 PM (1)
Apr 12, 8-9 PM (8)
Apr 12, 9-10 PM (9)
Apr 12, 10-11 PM (38)
Apr 12, 11-12 AM (23)
Apr 13, 12-1 AM (5)
Apr 13, 1-2 AM (6)
Apr 13, 2-3 AM (5)
Apr 13, 3-4 AM (6)
Apr 13, 4-5 AM (2)
Apr 13, 5-6 AM (18)
Apr 13, 6-7 AM (23)
Apr 13, 7-8 AM (39)
Apr 13, 8-9 AM (43)
Apr 13, 9-10 AM (51)
Apr 13, 10-11 AM (75)
Apr 13, 11-12 PM (35)
Apr 13, 12-1 PM (55)
Apr 13, 1-2 PM (80)
Apr 13, 2-3 PM (42)
Apr 13, 3-4 PM (20)
Apr 13, 4-5 PM (31)
Apr 13, 5-6 PM (25)
Apr 13, 6-7 PM (18)
Apr 13, 7-8 PM (13)
Apr 13, 8-9 PM (15)
Apr 13, 9-10 PM (22)
Apr 13, 10-11 PM (29)
Apr 13, 11-12 AM (13)
Apr 14, 12-1 AM (6)
Apr 14, 1-2 AM (8)
Apr 14, 2-3 AM (15)
Apr 14, 3-4 AM (4)
Apr 14, 4-5 AM (4)
Apr 14, 5-6 AM (63)
Apr 14, 6-7 AM (50)
Apr 14, 7-8 AM (100)
Apr 14, 8-9 AM (33)
Apr 14, 9-10 AM (21)
Apr 14, 10-11 AM (34)
Apr 14, 11-12 PM (42)
Apr 14, 12-1 PM (72)
Apr 14, 1-2 PM (96)
Apr 14, 2-3 PM (44)
Apr 14, 3-4 PM (35)
Apr 14, 4-5 PM (9)
Apr 14, 5-6 PM (20)
Apr 14, 6-7 PM (22)
Apr 14, 7-8 PM (14)
Apr 14, 8-9 PM (10)
Apr 14, 9-10 PM (11)
Apr 14, 10-11 PM (24)
Apr 14, 11-12 AM (24)
Apr 15, 12-1 AM (3)
Apr 15, 1-2 AM (9)
Apr 15, 2-3 AM (8)
Apr 15, 3-4 AM (1)
Apr 15, 4-5 AM (1)
Apr 15, 5-6 AM (32)
Apr 15, 6-7 AM (6)
Apr 15, 7-8 AM (18)
Apr 15, 8-9 AM (46)
Apr 15, 9-10 AM (40)
Apr 15, 10-11 AM (126)
Apr 15, 11-12 PM (53)
Apr 15, 12-1 PM (59)
Apr 15, 1-2 PM (43)
Apr 15, 2-3 PM (45)
Apr 15, 3-4 PM (28)
Apr 15, 4-5 PM (43)
Apr 15, 5-6 PM (21)
Apr 15, 6-7 PM (33)
Apr 15, 7-8 PM (15)
Apr 15, 8-9 PM (17)
Apr 15, 9-10 PM (5)
Apr 15, 10-11 PM (20)
Apr 15, 11-12 AM (16)
Apr 16, 12-1 AM (12)
Apr 16, 1-2 AM (6)
Apr 16, 2-3 AM (7)
Apr 16, 3-4 AM (3)
Apr 16, 4-5 AM (4)
Apr 16, 5-6 AM (8)
Apr 16, 6-7 AM (33)
Apr 16, 7-8 AM (31)
Apr 16, 8-9 AM (29)
Apr 16, 9-10 AM (27)
Apr 16, 10-11 AM (50)
Apr 16, 11-12 PM (56)
Apr 16, 12-1 PM (57)
Apr 16, 1-2 PM (28)
Apr 16, 2-3 PM (35)
Apr 16, 3-4 PM (45)
Apr 16, 4-5 PM (46)
Apr 16, 5-6 PM (56)
Apr 16, 6-7 PM (15)
Apr 16, 7-8 PM (68)
Apr 16, 8-9 PM (38)
Apr 16, 9-10 PM (8)
Apr 16, 10-11 PM (23)
Apr 16, 11-12 AM (23)
Apr 17, 12-1 AM (12)
Apr 17, 1-2 AM (8)
Apr 17, 2-3 AM (3)
Apr 17, 3-4 AM (4)
Apr 17, 4-5 AM (3)
Apr 17, 5-6 AM (7)
Apr 17, 6-7 AM (25)
Apr 17, 7-8 AM (94)
Apr 17, 8-9 AM (70)
Apr 17, 9-10 AM (53)
Apr 17, 10-11 AM (37)
Apr 17, 11-12 PM (41)
Apr 17, 12-1 PM (31)
Apr 17, 1-2 PM (0)
3,870 commits this week Apr 10, 2026 - Apr 17, 2026
Probe CHaP doc sites instead of hardcoding per-package URLs
Replace the name-based PREFIX_RULES (6 entries) and most of the
EXACT_OVERRIDES table (26 -> 14 entries) with a heuristic: for each
CHaP package, generate candidate subdomains under
*.cardano.intersectmbo.org by progressively dropping trailing
'-<token>' segments of the package name, then HEAD-probe
doc-index.html at each candidate and take the first that resolves.

doc-index.html is a Haddock-standard asset that every real package
serves and that wrong-site probes reliably 404 on. That makes the
heuristic safe: mis-guesses become NONE (stripped link) rather than
wrong-but-not-broken URLs.

EXACT_OVERRIDES retains only packages whose subdomain is not a
name-suffix (the cardano-base family at base.cardano.intersectmbo.org,
the ledger-repo members that don't start with 'cardano-ledger-', the
two ouroboros-network oddballs, and io-classes on GitHub Pages).
Defensive entries for packages not currently referenced by this
project's Haddocks have been dropped; they can be added when new
re-exports surface them (Phase 7's dead-link annotation means missing
entries don't break the build).
fix(chainselection): use SelectionTip instead of Tip for switch guard (#1928)
The switch-suppression guard in evaluateBestPeerLocked compared
Tip.BlockNumber (the peer's claimed remote chain tip as advertised
in RollForward messages) rather than SelectionTip().BlockNumber
(the highest block header actually delivered to the chain selector).

These values can diverge: a peer announces Tip=N+1 in a RollForward
message at the same time it delivers the N+1 header. When two peers
are at the same chain position, peer A may announce Tip.BlockNumber=N+1
milliseconds before peer B, while both SelectionTips are still N. The
`>` precondition evaluates as `N+1 > N` (true), IsSignificantlyBetter
returns false for a 1-block lead, and the guard fires — keeping the old
incumbent. On the next cycle peer B catches up and the same logic fires
again in reverse, causing continuous oscillation near the chain tip.

Fix: use SelectionTip().BlockNumber for both the `>` precondition and
the IsSignificantlyBetter call. SelectionTip returns ObservedTip when
available (actual delivered headers), falling back to Tip otherwise.
This ensures the guard only suppresses switches based on headers that
have been concretely observed, not just claimed.

The density comparison case (same BlockNumber, different slots — fork
resolution) is unaffected: N > N is false, so the guard does not fire
and the density tiebreaker path proceeds normally.

Signed-off-by: wcatz <[email protected]>
Review and update all documentation
- index.md: fix typos, incomplete sentence, rewrite components
  and testnets sections, add image publishing guide
- cardano-node-master.md: full rewrite with topology diagram,
  configuration files, running instructions, version strategy
- All component docs (configurator, sidecar, tracer, tracer-sidecar,
  config): replace empty stubs with actual documentation
- adversary.md: fix typos, broken shell command, unclear language
- testnets/index.md: fix typo, update command list, simplify
- CONTRIBUTING.md: fix broken link reference, update repo structure,
  add component contribution guide
Fix broken cross-package Haddock links on hosted docs site
Fixes #601. Links to dependency packages (cardano-ledger-*, plutus-*,
etc.) were relative paths pointing to directories that don't exist on
the hosted site, resulting in 404s.

Adds scripts/fix-haddock-links.sh, invoked from the github-page
workflow, which:
- Fetches the CHaP package index to classify packages as CHaP vs Hackage
- Auto-discovers all broken cross-package links in generated HTML
- Creates symlinks for versioned directory names (GHC-bundled and local)
- Rewrites links to known doc sites (prefix rules + exact overrides) or
  Hackage
- Validates all rewritten URLs with HTTP HEAD requests
- Replaces dead links with annotated plain text (tooltip shows package
  name)

This eliminates any ad-hoc hardcoded list, automatically handles new
dependencies, and guarantees zero broken clickable links.