Apr 18, 7-8 PM (2)
Apr 18, 8-9 PM (4)
Apr 18, 9-10 PM (9)
Apr 18, 10-11 PM (21)
Apr 18, 11-12 AM (23)
Apr 19, 12-1 AM (1)
Apr 19, 1-2 AM (4)
Apr 19, 2-3 AM (1)
Apr 19, 3-4 AM (0)
Apr 19, 4-5 AM (0)
Apr 19, 5-6 AM (3)
Apr 19, 6-7 AM (0)
Apr 19, 7-8 AM (2)
Apr 19, 8-9 AM (1)
Apr 19, 9-10 AM (1)
Apr 19, 10-11 AM (4)
Apr 19, 11-12 PM (7)
Apr 19, 12-1 PM (6)
Apr 19, 1-2 PM (8)
Apr 19, 2-3 PM (23)
Apr 19, 3-4 PM (7)
Apr 19, 4-5 PM (4)
Apr 19, 5-6 PM (3)
Apr 19, 6-7 PM (8)
Apr 19, 7-8 PM (3)
Apr 19, 8-9 PM (8)
Apr 19, 9-10 PM (6)
Apr 19, 10-11 PM (25)
Apr 19, 11-12 AM (23)
Apr 20, 12-1 AM (4)
Apr 20, 1-2 AM (5)
Apr 20, 2-3 AM (2)
Apr 20, 3-4 AM (7)
Apr 20, 4-5 AM (1)
Apr 20, 5-6 AM (8)
Apr 20, 6-7 AM (12)
Apr 20, 7-8 AM (29)
Apr 20, 8-9 AM (42)
Apr 20, 9-10 AM (37)
Apr 20, 10-11 AM (95)
Apr 20, 11-12 PM (42)
Apr 20, 12-1 PM (39)
Apr 20, 1-2 PM (53)
Apr 20, 2-3 PM (68)
Apr 20, 3-4 PM (47)
Apr 20, 4-5 PM (41)
Apr 20, 5-6 PM (31)
Apr 20, 6-7 PM (24)
Apr 20, 7-8 PM (10)
Apr 20, 8-9 PM (7)
Apr 20, 9-10 PM (16)
Apr 20, 10-11 PM (28)
Apr 20, 11-12 AM (18)
Apr 21, 12-1 AM (24)
Apr 21, 1-2 AM (5)
Apr 21, 2-3 AM (13)
Apr 21, 3-4 AM (4)
Apr 21, 4-5 AM (3)
Apr 21, 5-6 AM (8)
Apr 21, 6-7 AM (15)
Apr 21, 7-8 AM (44)
Apr 21, 8-9 AM (119)
Apr 21, 9-10 AM (36)
Apr 21, 10-11 AM (35)
Apr 21, 11-12 PM (98)
Apr 21, 12-1 PM (57)
Apr 21, 1-2 PM (71)
Apr 21, 2-3 PM (60)
Apr 21, 3-4 PM (33)
Apr 21, 4-5 PM (31)
Apr 21, 5-6 PM (27)
Apr 21, 6-7 PM (38)
Apr 21, 7-8 PM (35)
Apr 21, 8-9 PM (37)
Apr 21, 9-10 PM (14)
Apr 21, 10-11 PM (34)
Apr 21, 11-12 AM (12)
Apr 22, 12-1 AM (2)
Apr 22, 1-2 AM (3)
Apr 22, 2-3 AM (3)
Apr 22, 3-4 AM (4)
Apr 22, 4-5 AM (3)
Apr 22, 5-6 AM (17)
Apr 22, 6-7 AM (34)
Apr 22, 7-8 AM (21)
Apr 22, 8-9 AM (37)
Apr 22, 9-10 AM (18)
Apr 22, 10-11 AM (47)
Apr 22, 11-12 PM (45)
Apr 22, 12-1 PM (56)
Apr 22, 1-2 PM (64)
Apr 22, 2-3 PM (44)
Apr 22, 3-4 PM (86)
Apr 22, 4-5 PM (46)
Apr 22, 5-6 PM (17)
Apr 22, 6-7 PM (10)
Apr 22, 7-8 PM (18)
Apr 22, 8-9 PM (15)
Apr 22, 9-10 PM (23)
Apr 22, 10-11 PM (31)
Apr 22, 11-12 AM (17)
Apr 23, 12-1 AM (7)
Apr 23, 1-2 AM (4)
Apr 23, 2-3 AM (4)
Apr 23, 3-4 AM (6)
Apr 23, 4-5 AM (3)
Apr 23, 5-6 AM (8)
Apr 23, 6-7 AM (17)
Apr 23, 7-8 AM (26)
Apr 23, 8-9 AM (33)
Apr 23, 9-10 AM (33)
Apr 23, 10-11 AM (29)
Apr 23, 11-12 PM (30)
Apr 23, 12-1 PM (51)
Apr 23, 1-2 PM (69)
Apr 23, 2-3 PM (65)
Apr 23, 3-4 PM (26)
Apr 23, 4-5 PM (21)
Apr 23, 5-6 PM (7)
Apr 23, 6-7 PM (7)
Apr 23, 7-8 PM (11)
Apr 23, 8-9 PM (14)
Apr 23, 9-10 PM (6)
Apr 23, 10-11 PM (28)
Apr 23, 11-12 AM (18)
Apr 24, 12-1 AM (7)
Apr 24, 1-2 AM (4)
Apr 24, 2-3 AM (7)
Apr 24, 3-4 AM (5)
Apr 24, 4-5 AM (8)
Apr 24, 5-6 AM (13)
Apr 24, 6-7 AM (12)
Apr 24, 7-8 AM (33)
Apr 24, 8-9 AM (40)
Apr 24, 9-10 AM (41)
Apr 24, 10-11 AM (71)
Apr 24, 11-12 PM (57)
Apr 24, 12-1 PM (37)
Apr 24, 1-2 PM (53)
Apr 24, 2-3 PM (34)
Apr 24, 3-4 PM (19)
Apr 24, 4-5 PM (16)
Apr 24, 5-6 PM (38)
Apr 24, 6-7 PM (25)
Apr 24, 7-8 PM (12)
Apr 24, 8-9 PM (41)
Apr 24, 9-10 PM (17)
Apr 24, 10-11 PM (30)
Apr 24, 11-12 AM (16)
Apr 25, 12-1 AM (8)
Apr 25, 1-2 AM (1)
Apr 25, 2-3 AM (10)
Apr 25, 3-4 AM (5)
Apr 25, 4-5 AM (3)
Apr 25, 5-6 AM (13)
Apr 25, 6-7 AM (1)
Apr 25, 7-8 AM (4)
Apr 25, 8-9 AM (24)
Apr 25, 9-10 AM (17)
Apr 25, 10-11 AM (4)
Apr 25, 11-12 PM (4)
Apr 25, 12-1 PM (12)
Apr 25, 1-2 PM (3)
Apr 25, 2-3 PM (10)
Apr 25, 3-4 PM (6)
Apr 25, 4-5 PM (10)
Apr 25, 5-6 PM (16)
Apr 25, 6-7 PM (10)
Apr 25, 7-8 PM (0)
3,707 commits this week Apr 18, 2026 - Apr 25, 2026
Pin term namespace to a stable, domain-controlled URL
The previous cips.cardano.org/CIP-XXXX# placeholder embedded an
unassigned CIP number; tooling that hardcoded the URL would have
to migrate once a number is assigned. Pinning the namespace to a
URL we control (314pool.com/cips/governance-feedback#) keeps the
IRI stable regardless of CIP number assignment or upstream URL
changes, and gives consumers a single place to dereference for
both the JSON-LD context and a redirect back to the spec itself.
Remove build infrastructure and outdated Agda model from cost-dashboard
The cost-dashboard is now just 3 static files (index.html, controller.js,
view.css) with no build step. The controller.js uses an IIFE pattern to
expose the Controller global, eliminating the need for webpack bundling.

Removed:
- CostModel.agda, Main.agda (outdated Short Leios model)
- webpack.config.js, package.json, package-lock.json (build infra)
- build.sh, debug.sh (nix-shell scripts)
- shell.nix symlink, .envrc, .gitignore

Updated site/static/cost-estimator/ and site docs to match.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
feat(asteria-player): bootstrap submits self-pay tx end-to-end (#56)
Iteration 5.

- src/Asteria/Wallet.hs: reads /utxo-keys/genesis.3.skey at startup,
  decodes the CBOR-wrapped 32-byte ed25519 key, derives the Shelley
  payment address, and exposes pickWalletUtxo over a Provider.
  Picks genesis.3 deliberately to avoid the race with tx-generator
  (which takes genesis.1).

- app/BootstrapMain.hs: connects via withN2C, reads the wallet,
  picks a seed UTxO (200_000 ADA at fresh cluster boot), builds
  a self-pay 5 ADA tx via the TxBuild DSL, signs with the genesis
  key, submits, and polls queryUTxOs for confirmation. Emits SDK
  events at every milestone (starting / wallet_loaded /
  seed_picked / tx_built / self_pay / completed) so the
  hypervisor sees each step land.

Verified locally:
  asteria_bootstrap_starting        reachable
  asteria_bootstrap_wallet_loaded   reachable {"addr":"..."}
  asteria_bootstrap_seed_picked     reachable {"seed_coin":200000000000000}
  asteria_bootstrap_tx_built        reachable {"outputs":2}
  asteria_bootstrap_self_pay        sometimes true
  asteria_bootstrap_completed       reachable

Iteration 5b will replace the no-op self-pay with the real asteria
shape: mint admin NFT (always-true policy), lock at asteria spend
address with inline AsteriaDatum, deploy the four validators as
inline ref-scripts, mint+lock N pellets at known coordinates.
feat(asteria-player): bootstrap submits self-pay tx end-to-end (#56)
Iteration 5.

- src/Asteria/Wallet.hs: reads /utxo-keys/genesis.3.skey at startup,
  decodes the CBOR-wrapped 32-byte ed25519 key, derives the Shelley
  payment address, and exposes pickWalletUtxo over a Provider.
  Picks genesis.3 deliberately to avoid the race with tx-generator
  (which takes genesis.1).

- app/BootstrapMain.hs: connects via withN2C, reads the wallet,
  picks a seed UTxO (200_000 ADA at fresh cluster boot), builds
  a self-pay 5 ADA tx via the TxBuild DSL, signs with the genesis
  key, submits, and polls queryUTxOs for confirmation. Emits SDK
  events at every milestone (starting / wallet_loaded /
  seed_picked / tx_built / self_pay / completed) so the
  hypervisor sees each step land.

Verified locally:
  asteria_bootstrap_starting        reachable
  asteria_bootstrap_wallet_loaded   reachable {"addr":"..."}
  asteria_bootstrap_seed_picked     reachable {"seed_coin":200000000000000}
  asteria_bootstrap_tx_built        reachable {"outputs":2}
  asteria_bootstrap_self_pay        sometimes true
  asteria_bootstrap_completed       reachable

Iteration 5b will replace the no-op self-pay with the real asteria
shape: mint admin NFT (always-true policy), lock at asteria spend
address with inline AsteriaDatum, deploy the four validators as
inline ref-scripts, mint+lock N pellets at known coordinates.
Update cost-dashboard to CIP-164 (Linear Leios) protocol model
Replace the old Short Leios model (IBs, pipelines, phases) with the
Linear Leios (CIP-164) cost model as documented in docs/cost-estimate/.

Key changes:
- Remove Input Blocks (IBs); EBs now carry 32-byte tx hash references
- Main input is confirmed throughput (TxkB/s) instead of tx/s
- Add P(cert) = (1-f)^voting_window certification probability
- CPU model: Apply + Reapply + EB header + Vote + Cert validation
  (matches doc values exactly: 97.1 ms/s at 5 TxkB/s)
- Egress model: per-component with network topology parameters
  (inbound peers, fetch multiplicity M, vote spanning-tree)
- Storage: tx closure + EB body (P(cert) cancels) + EB headers + RB
- IOPS: UTxO-HD model with tx data + UTxO state updates
- All default values from CIP-164 simulation config and benchmarks
- Add CPU breakdown display (Apply, Reapply, EB, Vote, Cert)

Cross-checked against cost-estimate doc tables at all throughput levels.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
feat(asteria-player): apply parameters to validators (#56)
Iteration 4.

- aiken/apply-params.sh: chains `aiken blueprint apply` calls to
  bake admin_token + game constants + cross-validator hashes into
  the four asteria validators. Documents each parameter's CBOR
  encoding (computed once with Python cbor2). Re-runnable when
  parameters change.

- aiken/plutus-applied.json: the produced blueprint with all four
  validators parameter-applied:
    pellet:    13d2d459de8ad483d2958859fcf192ac90dfcf00ad92a4e78e870e6e
    deploy:    019a7253f89d99d5ee03ffec5ac77a78f862bfb53e0174af3390110f
    asteria:   70ad11758e5c32c6abb385977c7999b041ca4e9c9bc7775b05941b8d
    spacetime: edf8ee06686bf59f412c7c49ba13ff0270d2735ba879f8baf48f4d68

- src/Asteria/Validators.hs: embed plutus-applied.json (was
  plutus.json, now redundant); rename `unappliedBlueprint` →
  `appliedBlueprint`. The four script accessors (asteriaScript,
  spacetimeScript, pelletScript, deployScript) now return
  parameter-applied bytes ready for use.

Parameter values baked in:
  admin_token       = AssetClass { policy: 00..00 (28 zeros)
                                 , name:   "asteriaAdmin" }
  ship_mint_lovelace_fee = 3_000_000
  max_asteria_mining     = 50
  min_asteria_distance   = 50
  initial_fuel           = 100
  max_speed              = Speed 1 30000
  max_ship_fuel          = 100
  fuel_per_step          = 5

Iteration 5 will replace admin_token's static value with a
bootstrap-time one-shot mint tied to a specific TxOutRef.

Verified: docker container's asteria_player_validators_loaded
event now reports the parameter-applied hashes above.
feat(asteria-player): apply parameters to validators (#56)
Iteration 4.

- aiken/apply-params.sh: chains `aiken blueprint apply` calls to
  bake admin_token + game constants + cross-validator hashes into
  the four asteria validators. Documents each parameter's CBOR
  encoding (computed once with Python cbor2). Re-runnable when
  parameters change.

- aiken/plutus-applied.json: the produced blueprint with all four
  validators parameter-applied:
    pellet:    13d2d459de8ad483d2958859fcf192ac90dfcf00ad92a4e78e870e6e
    deploy:    019a7253f89d99d5ee03ffec5ac77a78f862bfb53e0174af3390110f
    asteria:   70ad11758e5c32c6abb385977c7999b041ca4e9c9bc7775b05941b8d
    spacetime: edf8ee06686bf59f412c7c49ba13ff0270d2735ba879f8baf48f4d68

- src/Asteria/Validators.hs: embed plutus-applied.json (was
  plutus.json, now redundant); rename `unappliedBlueprint` →
  `appliedBlueprint`. The four script accessors (asteriaScript,
  spacetimeScript, pelletScript, deployScript) now return
  parameter-applied bytes ready for use.

Parameter values baked in:
  admin_token       = AssetClass { policy: 00..00 (28 zeros)
                                 , name:   "asteriaAdmin" }
  ship_mint_lovelace_fee = 3_000_000
  max_asteria_mining     = 50
  min_asteria_distance   = 50
  initial_fuel           = 100
  max_speed              = Speed 1 30000
  max_ship_fuel          = 100
  fuel_per_step          = 5

Iteration 5 will replace admin_token's static value with a
bootstrap-time one-shot mint tied to a specific TxOutRef.

Verified: docker container's asteria_player_validators_loaded
event now reports the parameter-applied hashes above.
feat(asteria-player): vendor Aiken validators + Haskell loader (#56)
Iteration 3.

- components/asteria-player/aiken/: vendored from txpipe/asteria's
  onchain/src — the four Aiken validators (asteria, spacetime,
  pellet, deploy) plus their lib/ helpers and aiken.toml /
  aiken.lock for deterministic builds.
- components/asteria-player/aiken/plutus.json: the unapplied
  blueprint produced by `aiken build` from the vendored sources,
  committed for review and so the Haskell layer can embed it
  without an aiken-toolchain build dep at docker-image time.
- src/Asteria/Validators.hs: embedFile-based loader that decodes
  plutus.json at compile time and exposes asteriaScript /
  spacetimeScript / pelletScript / deployScript as Plutus V3
  Script ConwayEra values.
- app/PlayerMain.hs: at startup, hashScript each validator and
  emit asteria_player_validators_loaded_<id> sdk_reachable with
  the four hashes in the details body — proves the load
  machinery works end-to-end inside the running container.

The validators are still parameterized — they're not yet usable
on-chain. Iteration 4 will add an aiken blueprint apply step
(admin token, game constants, cross-validator hashes) and
replace the unapplied bytes; the player code already references
each validator by name so iteration 4 only swaps the JSON file.

Verified:
  - nix build .#asteria-player succeeds.
  - nix build .#docker-image && docker load produces a 158 MB image.
  - docker compose up shows asteria_player_validators_loaded_<id>
    events with the expected four script hashes
    (69090085... / 443d84cd... / 74f43ee1... / 845cbd52...).