diff --git a/config/CEREMONY.md b/config/CEREMONY.md index 6e2be1042..21ecf2789 100644 --- a/config/CEREMONY.md +++ b/config/CEREMONY.md @@ -14,18 +14,17 @@ Offline, operator-only. Never commit secrets. Prefer `/root/.base-secrets/` (mod ### Design challenge enablement (post agent/hypertraining removal) -Current committed `challenges.toml` has **two** rows: `prism` @ 10000 bps and `design` @ 0 bps. -The `design` public key was generated with the **dev throwaway** `challenge-design.age` under -`~/.base-secrets/`. Before production emission moves to design: +Current committed `challenges.toml` has **two** rows: `design` @ 5000 bps and +`prism` @ 5000 bps (50/50; sum = 10000). The `design` public key was generated +with the **dev throwaway** `challenge-design.age` under `~/.base-secrets/`. +A future production owner/key ceremony may still: 1. Keygen a production `design_sk` (keep off-git; materialize as `deploy/secrets/design_sk`). 2. Replace the `design` `public_key` row in `config/challenges.toml`. -3. Optionally move bps from `prism` → `design` (sum must remain 10000). +3. Optionally move bps between `prism` and `design` (sum must remain 10000). 4. Re-sign with the **production** owner key (`sign --kind challenges`). 5. Verify under `config/owner.pubkey` (or the production owner pubkey after rotation). -Until that ceremony, prism alone covers E; design leaves (when the service ships) carry 0 weight. - ## Secret layout (never git) | Path | Contents | diff --git a/config/challenges.staging.toml b/config/challenges.staging.toml index ba934d596..700edb322 100644 --- a/config/challenges.staging.toml +++ b/config/challenges.staging.toml @@ -1,10 +1,8 @@ -# STAGING-ONLY trust root override (testnet 541): enables the design emission -# share so the staging e2e can prove design weights end-to-end. +# STAGING-ONLY trust root override (testnet 541): mirrors prod emission shares +# so the staging e2e can prove design + prism weights end-to-end. # -# Production remains `emission_share_bps = 0` for design until the owner -# ceremony (see config/challenges.toml + CEREMONY.md) — this file is mounted -# over /etc/base/config/challenges.toml by deploy/compose/env-staging.yml only. -# Signed with the same throwaway owner key as config/challenges.toml +# Mounted over /etc/base/config/challenges.toml by deploy/compose/env-staging.yml +# only. Signed with the same throwaway owner key as config/challenges.toml # (config/owner.pubkey); re-sign after any edit (docs/runbooks/trust-root-rotation.md). version = 1 introduced_epoch = 0 @@ -12,11 +10,11 @@ introduced_epoch = 0 [[challenges]] id = "design" public_key = "3e27f87d8330006a73174001120c3455f16b95fee098bb8c2bab9d5053840418" -emission_share_bps = 2000 +emission_share_bps = 5000 policy = "all_metagraph_hotkeys" [[challenges]] id = "prism" public_key = "bcd50bb830e050ed4b011dd8f1d2f126fdb42dc55b45ece30a7d5c8ceb3c5219" -emission_share_bps = 8000 +emission_share_bps = 5000 policy = "all_metagraph_hotkeys" diff --git a/config/challenges.staging.toml.sig b/config/challenges.staging.toml.sig index 2117add99..2574dfa85 100644 --- a/config/challenges.staging.toml.sig +++ b/config/challenges.staging.toml.sig @@ -1 +1 @@ -4e532b0c449ee744bbc8877dc677647003e21176a0dd074026458f62fd9b486379aeea8736bddb16b04834ae2ec422409d18f1eac757633354a12919df1ec98c +fae237ccecf24f35cc65fb0d56906db25f0909d016f36bc48bc9788ab6d3324f3c305dab54f0de76fa9700ec6a4cef1dfa5be02dde1a63a7e8260b1a1a440789 diff --git a/config/challenges.toml b/config/challenges.toml index 3547717f6..5e33461b0 100644 --- a/config/challenges.toml +++ b/config/challenges.toml @@ -1,20 +1,20 @@ # Owner-signed challenges trust root (D18/D23/D24). # Signed with throwaway owner key (see owner.pubkey). Production rotation: CEREMONY.md. # -# Emission: design = 2000 bps, prism = 8000 bps (activated 2026-08-06, same -# owner key + same challenge keys as the staging override; a future production -# owner/key ceremony per CEREMONY.md remains pending). +# Emission: design = 5000 bps, prism = 5000 bps (50/50; rebalanced 2026-08-07 from +# design 2000 / prism 8000 activated 2026-08-06). Same owner key + challenge keys; +# a future production owner/key ceremony per CEREMONY.md remains pending). version = 1 introduced_epoch = 0 [[challenges]] id = "design" public_key = "3e27f87d8330006a73174001120c3455f16b95fee098bb8c2bab9d5053840418" -emission_share_bps = 2000 +emission_share_bps = 5000 policy = "all_metagraph_hotkeys" [[challenges]] id = "prism" public_key = "bcd50bb830e050ed4b011dd8f1d2f126fdb42dc55b45ece30a7d5c8ceb3c5219" -emission_share_bps = 8000 +emission_share_bps = 5000 policy = "all_metagraph_hotkeys" diff --git a/config/challenges.toml.sig b/config/challenges.toml.sig index 44107b397..8f8a4ee6d 100644 --- a/config/challenges.toml.sig +++ b/config/challenges.toml.sig @@ -1 +1 @@ -e68a49e313f41aa892898d50b99e94393424a5c173e6136b397e24c726f14d13f031f75f685213f3d84f791fc67836e4765e5a9c70f4f4c956022679fabac98f +c0c1be58a06daa6713c482ac3619649354ae3229fdc307f212f401dc5d2c17318f8ac9f8d3f9be6ab605a525907b77d9e083cb47c37f4df8231285a4fc104f80 diff --git a/crates/site-api/src/handlers.rs b/crates/site-api/src/handlers.rs index cb8928843..d6eb4019c 100644 --- a/crates/site-api/src/handlers.rs +++ b/crates/site-api/src/handlers.rs @@ -1042,7 +1042,7 @@ mod tests { }; let st = st.with_weights( Arc::new(ChallengesBody { - challenges: vec![entry("design", 2_000), entry("prism", 8_000)], + challenges: vec![entry("design", 5_000), entry("prism", 5_000)], }), Arc::new(|| None), ); @@ -1050,8 +1050,8 @@ mod tests { let (s, v) = call(app.clone(), "/v1/site/arenas").await; assert_eq!(s, StatusCode::OK, "{v}"); - assert_eq!(v[1]["emissionShare"], 0.2); - assert_eq!(v[2]["emissionShare"], 0.8); + assert_eq!(v[1]["emissionShare"], 0.5); + assert_eq!(v[2]["emissionShare"], 0.5); // Unsealed: effective weights stay 0. assert_eq!(v[1]["weight"], 0.0); assert_eq!(v[2]["weight"], 0.0); @@ -1061,7 +1061,7 @@ mod tests { assert_eq!(v["sealed"], false); assert_eq!(v["burnShare"], 1.0); assert_eq!(v["emissionShares"][0]["arena"], "design"); - assert_eq!(v["emissionShares"][0]["share"], 0.2); + assert_eq!(v["emissionShares"][0]["share"], 0.5); assert_eq!(v["emissionShares"][1]["arena"], "prism"); assert!(v["hotkeyWeights"].as_array().unwrap().is_empty()); } diff --git a/crates/site-data/src/metrics.rs b/crates/site-data/src/metrics.rs index d7ad8b088..c921750d7 100644 --- a/crates/site-data/src/metrics.rs +++ b/crates/site-data/src/metrics.rs @@ -96,7 +96,7 @@ mod tests { design.agents = 4; let mut prism = prism_frame(); prism.agents = 8; - prism.emission_share = 0.8; + prism.emission_share = 0.5; let rows = population_rows(&[design, prism]); assert_eq!(rows[1]["agents"], 8); assert!((rows[0]["ratio"].as_f64().unwrap() - 0.5).abs() < f64::EPSILON); diff --git a/crates/site-data/src/weights.rs b/crates/site-data/src/weights.rs index 9e8ea9000..74122bf55 100644 --- a/crates/site-data/src/weights.rs +++ b/crates/site-data/src/weights.rs @@ -167,7 +167,7 @@ mod tests { fn trust_root() -> ChallengesBody { ChallengesBody { - challenges: vec![entry("design", 2_000), entry("prism", 8_000)], + challenges: vec![entry("design", 5_000), entry("prism", 5_000)], } } @@ -180,7 +180,7 @@ mod tests { block_hash: [1u8; 32], metagraph_root: [2u8; 32], algorithm_version: bundle::ALGORITHM_VERSION, - emission_shares: vec![(b"design".to_vec(), 2_000), (b"prism".to_vec(), 8_000)], + emission_shares: vec![(b"design".to_vec(), 5_000), (b"prism".to_vec(), 5_000)], measurements_digest: [3u8; 32], uid_map: vec![([0xAAu8; 32], 0), ([0xBBu8; 32], 157)], leaves: vec![leaf("design", 0xBB), leaf("prism", 0xBB)], @@ -206,9 +206,9 @@ mod tests { fn shares_come_from_trust_root() { let shares = configured_shares(Some(&trust_root())); assert_eq!(shares.len(), 2); - assert!((shares[0].1 - 0.2).abs() < f64::EPSILON); + assert!((shares[0].1 - 0.5).abs() < f64::EPSILON); assert_eq!(shares[0].0, "design"); - assert!((shares[1].1 - 0.8).abs() < f64::EPSILON); + assert!((shares[1].1 - 0.5).abs() < f64::EPSILON); } #[test] @@ -223,8 +223,8 @@ mod tests { // Arena weight = configured share × non-burn fraction. let root = trust_root(); let latest = sealed_bundle(); - assert!((arena_weight(Some(&root), Some(latest.clone()), "design") - 0.2).abs() < 0.001); - assert!((arena_weight(Some(&root), Some(latest), "prism") - 0.8).abs() < 0.001); + assert!((arena_weight(Some(&root), Some(latest.clone()), "design") - 0.5).abs() < 0.001); + assert!((arena_weight(Some(&root), Some(latest), "prism") - 0.5).abs() < 0.001); let w = site_weights(100, Some(&root), Some(sealed_bundle())); assert!(w.sealed); assert_eq!(w.hotkey_weights.len(), 1); diff --git a/crates/trustroot/tests/trustroot_verify.rs b/crates/trustroot/tests/trustroot_verify.rs index 56122153d..6488b1291 100644 --- a/crates/trustroot/tests/trustroot_verify.rs +++ b/crates/trustroot/tests/trustroot_verify.rs @@ -347,15 +347,15 @@ fn s9_repo_config_loads_when_present() { let (ch, ms) = load_config_dir(&root, 0, 3).expect("committed config must verify"); let primary = ch.primary().unwrap(); assert_eq!(primary.body.challenges.len(), 2); - // Emission activated 2026-08-06 (v3.3.0): design 2000 / prism 8000. + // Emission 50/50 (2026-08-07): design 5000 / prism 5000 (was 2000/8000). let design = primary.body.get(b"design").expect("design row"); - assert_eq!(design.emission_share_bps, 2000); + assert_eq!(design.emission_share_bps, 5000); assert_eq!( encode_hex(&design.public_key), "3e27f87d8330006a73174001120c3455f16b95fee098bb8c2bab9d5053840418" ); let prism = primary.body.get(b"prism").expect("prism row"); - assert_eq!(prism.emission_share_bps, BPS_DENOM - 2000); + assert_eq!(prism.emission_share_bps, BPS_DENOM - 5000); assert_eq!( encode_hex(&prism.public_key), "bcd50bb830e050ed4b011dd8f1d2f126fdb42dc55b45ece30a7d5c8ceb3c5219" @@ -364,9 +364,9 @@ fn s9_repo_config_loads_when_present() { let shares = primary.body.emission_shares(); assert_eq!(shares.len(), 2); assert_eq!(shares[0].0, b"design"); - assert_eq!(shares[0].1, 2000); + assert_eq!(shares[0].1, 5000); assert_eq!(shares[1].0, b"prism"); - assert_eq!(shares[1].1, BPS_DENOM - 2000); + assert_eq!(shares[1].1, BPS_DENOM - 5000); // base-agent CVM path removed — committed allowlist is empty (fail-closed). let entries = &ms.primary().unwrap().body.entries; assert!( diff --git a/deploy/compose/env-staging.yml b/deploy/compose/env-staging.yml index 1e668046f..9e19136e4 100644 --- a/deploy/compose/env-staging.yml +++ b/deploy/compose/env-staging.yml @@ -21,8 +21,7 @@ services: BASE_VALIDATOR_WALLET: base-validator volumes: - ./deploy/secrets/wallets:/run/base/wallets:ro - # Staging-only trust root: design emission share enabled (2000 bps) so - # the e2e lifecycle proof can see design weights. Prod keeps 0 bps. + # Staging-only trust root: mirrors prod emission (design/prism 5000/5000). - ./config/challenges.staging.toml:/etc/base/config/challenges.toml:ro - ./config/challenges.staging.toml.sig:/etc/base/config/challenges.toml.sig:ro gateway: @@ -43,8 +42,8 @@ services: volumes: - ./deploy/secrets/wallets:/run/base/wallets:ro # The sealer must sign with the same staging trust root the validator - # verifies against (design 2000 bps), or /v1/weights/latest never shows - # design weight and the validator flags emission share mismatch (D23). + # verifies against (design/prism 5000/5000), or /v1/weights/latest never + # shows design weight and the validator flags emission share mismatch (D23). - ./config/challenges.staging.toml:/etc/base/config/challenges.toml:ro - ./config/challenges.staging.toml.sig:/etc/base/config/challenges.toml.sig:ro prism-challenge: diff --git a/deploy/scripts/prod-burn-seal.sh b/deploy/scripts/prod-burn-seal.sh index d9cc24479..cf445adc2 100755 --- a/deploy/scripts/prod-burn-seal.sh +++ b/deploy/scripts/prod-burn-seal.sh @@ -13,11 +13,11 @@ # challenge mini-secrets stay at $BASE_CHALLENGE_SK_FILE / $BASE_DESIGN_SK_FILE # (mode 0400). # -# D24 (exact-E): since the 2000/8000 trust-root activation, sealing requires a -# complete leaf set from EVERY >0-bps challenge at the seal epoch. The design -# pass therefore emits NoScore leaves first; its own seal attempt 409s until -# the prism pass lands (tolerated), and the prism pass then seals the complete -# set. All-NoScore still aggregates to the uid-0 burn vector. +# D24 (exact-E): with both challenges at >0 bps (currently 5000/5000), sealing +# requires a complete leaf set from EVERY >0-bps challenge at the seal epoch. +# The design pass therefore emits NoScore leaves first; its own seal attempt +# 409s until the prism pass lands (tolerated), and the prism pass then seals +# the complete set. All-NoScore still aggregates to the uid-0 burn vector. set -euo pipefail BASE_HOME="${BASE_HOME:-/opt/base}" diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 9e4348128..03ed30b20 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -95,7 +95,7 @@ Miner-facing docs (version-pinned): [`external-miner/`](./external-miner/). | `config/measurements.toml` + `.sig` | yes | every validator from **disk** | | Challenge / owner mini-secrets | **never** | challenge service / offline ceremony only | -Current emission posture (until design ceremony): `prism = 10000` bps, `design = 0` bps. +Current emission posture: `design = 5000` bps, `prism = 5000` bps (50/50; sum = 10000). Gateway DB is **routing only**. It is never a source of challenge keys, emission shares, or measurements (D18, D23). diff --git a/docs/COMPLETENESS.md b/docs/COMPLETENESS.md index 6e52a205e..8d69b91ef 100644 --- a/docs/COMPLETENESS.md +++ b/docs/COMPLETENESS.md @@ -58,7 +58,7 @@ Removed (replaced by design + prism HTTP paths; no Phala/CVM miner). | Binary (`bins/design-egress-proxy`) | done | Open egress proxy (internal blocklist) + budgeted LLM path. | | Spec + checklist | done | [`DESIGN_CHALLENGE.md`](DESIGN_CHALLENGE.md) + checklist; `xtask design-check`. | | Compose / images | in progress | deploy-wiring todo (port `28093` local). | -| Emission | **0 bps** | Until owner ceremony; prism holds `10000` bps. | +| Emission | **5000 bps** | Equal split with prism (50/50; sum `10000`). | ## prism-challenge @@ -69,7 +69,7 @@ Removed (replaced by design + prism HTTP paths; no Phala/CVM miner). | Compose service | done | Added to `docker-compose.yml` on `:8092`. | | Dockerfile target | done | `deploy/Dockerfile` target `prism-challenge`. | | GHCR image | done | Added to `images.yml` matrix and `ghcr-public.yml`. | -| Emission | **10000 bps** | Sole share until design enablement ceremony. | +| Emission | **5000 bps** | Equal split with design (50/50; sum `10000`). | ## Infrastructure @@ -117,7 +117,7 @@ Agent/operator contracts: root [`AGENTS.md`](../AGENTS.md), [`deploy/AGENTS.md`] | DCAP verify holds the attest mutex | A cold Intel PCS fetch (up to 20 s) serialises attestation submissions. | | DCAP error classification | Matches on `anyhow` message text; re-run `cargo test -p attest-policy --features dcap` after any `dcap-qvl` bump. | | Design compose/images | deploy-wiring in progress; local port `28093` documented. | -| Design emission ceremony | Owner must keygen prod `design_sk`, set bps, re-sign trust root. | +| Design emission ceremony | Emission live at 5000/5000 with design; optional prod `design_sk` / owner key rotation still pending. | | Mainnet (netuid 100) | Owner wallet not yet on this machine, so prod runs with `BASE_GATEWAY_REQUIRE_OWNER=0`. | | Prod pin placeholders | `deploy/pins/prod.json` still ships zero-digests until the first successful promote; registry mode rejects placeholders. | | Spaces backup secrets | First prod promote is fail-closed without `BASE_BACKUP_ENDPOINT` + `SPACES_ACCESS_KEY_ID` / `SPACES_SECRET_ACCESS_KEY` (or AWS_* fallbacks) in GitHub. | diff --git a/docs/DESIGN_CHALLENGE.md b/docs/DESIGN_CHALLENGE.md index b571630bc..917c0825e 100644 --- a/docs/DESIGN_CHALLENGE.md +++ b/docs/DESIGN_CHALLENGE.md @@ -69,7 +69,7 @@ Sandbox containers attach only to the internal Docker network | Listen port | `8093` (local overlay `28093`) | | Gateway proxy prefix | `/challenge/design/*` | | Bundle `protocol_version` | `1` ([`BUNDLE_SPEC.md`](./BUNDLE_SPEC.md)) | -| `emission_share_bps` | **0** until owner ceremony (prism holds `10000`) | +| `emission_share_bps` | **5000** (equal split with prism; sum `10000`) | | Policy | `all_metagraph_hotkeys` | | Round length | `ROUND_SECS = 8_640` (10 rounds / UTC day) | | Agent run timeout | `AGENT_RUN_TIMEOUT_SECS = 1_800` (30 min; distinct from round length) | @@ -86,9 +86,10 @@ Staging knobs (defaults above are the prod pins and never change implicitly): override round length / run timeout / prompts per round (staging uses ~15-minute rounds; `env-staging.yml`). -Emission posture: `emission_share_bps = 0` for design until the owner ceremony -documented in [`runbooks/design-enable-and-emission.md`](./runbooks/design-enable-and-emission.md). -Until then prism is the sole non-zero share (`10000` bps). +Emission posture: `emission_share_bps = 5000` for design and `5000` for prism +(50/50; sum `10000`). Rebalance via the owner ceremony in +[`runbooks/design-enable-and-emission.md`](./runbooks/design-enable-and-emission.md) +and [`config/challenges.toml`](../config/challenges.toml). --- diff --git a/docs/DESIGN_CHALLENGE_CHECKLIST.md b/docs/DESIGN_CHALLENGE_CHECKLIST.md index 09751cf95..db1d898d3 100644 --- a/docs/DESIGN_CHALLENGE_CHECKLIST.md +++ b/docs/DESIGN_CHALLENGE_CHECKLIST.md @@ -13,7 +13,7 @@ pins without bumping `challenge_scoring_version`. |-----|-------------|-----------------|-------------------------------------| | (T) | Topology: master-only challenge + sandbox + egress; validator no exec | ## 1. What runs where (topology) | `## 1. What runs where (topology)` | | (I) | Identifiers and versions | ## 2. Identifiers and versions | `## 2. Identifiers and versions` | -| (E) | Emission 0 bps posture | ## 2. Identifiers and versions | `emission_share_bps = 0` | +| (E) | Emission 5000 bps (50/50 with prism) | ## 2. Identifiers and versions | `emission_share_bps = 5000` | | (H) | Miner harness contract (`agent.py` / `pyproject.toml`) | ## 3. Miner harness contract | `## 3. Miner harness contract` | | (S) | Sandbox hardening | ## 4. Sandbox hardening | `## 4. Sandbox hardening` | | (Z) | Sanitize rules | ## 5. Sanitize rules | `## 5. Sanitize rules` | @@ -35,8 +35,8 @@ pins without bumping `challenge_scoring_version`. | scoring_version | `challenge_scoring_version` | | scoring_version_3 | `u16 = 3` | | bundle_protocol_version | `protocol_version = 1` | -| emission_zero | `emission_share_bps = 0` | -| prism_bps_sole | `10000` | +| emission_share | `emission_share_bps = 5000` | +| bps_sum | `10000` | | SCORE_MAX | `1_000_000` | | compose_port | `8093` | | round_secs | `8_640` | diff --git a/docs/PRISM.md b/docs/PRISM.md index 88e824fa7..2eac0b701 100644 --- a/docs/PRISM.md +++ b/docs/PRISM.md @@ -4,7 +4,7 @@ **scoring_version:** `2` (bpb-only; v1 blended a 0.3 LLM quality vote; the architecture competition below reallocates credits *inside* this same lattice — no chain-facing version change) **recipe_version:** `1.2.0` (telemetry hooks 1.1.0 + architecture registry / training-only submissions 1.2.0) **port:** `8092` -**emission_share_bps:** `10000` (sole share until design enablement ceremony; then rebalanced with `design`) +**emission_share_bps:** `5000` (equal split with `design`; sum `10000`) **GPU path:** master-centralized **Lium** (no Phala CVM) ## What it is diff --git a/docs/external-miner/prism.md b/docs/external-miner/prism.md index 3a5d28fec..d6c37ed8b 100644 --- a/docs/external-miner/prism.md +++ b/docs/external-miner/prism.md @@ -121,7 +121,7 @@ The global-best model is published to | `GET /v1/jobs` | Active/recent pods (ops) | | `GET /health` | Liveness | -Emission share for prism is owner-controlled via the trust root. Until the design -enablement ceremony, prism typically holds the full `10000` bps share — see +Emission share for prism is owner-controlled via the trust root. Current split is +`5000` bps prism / `5000` bps design (50/50) — see [`../runbooks/prism-enable-lium-and-emission.md`](../runbooks/prism-enable-lium-and-emission.md) and [`../runbooks/design-enable-and-emission.md`](../runbooks/design-enable-and-emission.md). diff --git a/docs/runbooks/design-enable-and-emission.md b/docs/runbooks/design-enable-and-emission.md index 90d620a29..90ccf005e 100644 --- a/docs/runbooks/design-enable-and-emission.md +++ b/docs/runbooks/design-enable-and-emission.md @@ -1,7 +1,7 @@ # Design challenge — enable real backends + emission unlock -Design ships with `emission_share_bps = 0` until an explicit owner ceremony. -Until then **prism holds `10000` bps** (sole weight source). See +Design emission is owner-controlled via the trust root. Current committed +shares are **design = 5000 bps**, **prism = 5000 bps** (50/50). See [`config/challenges.toml`](../../config/challenges.toml) and [`DESIGN_CHALLENGE.md`](../DESIGN_CHALLENGE.md). @@ -22,8 +22,8 @@ Until then **prism holds `10000` bps** (sole weight source). See ```json { "challenge_id": "design", "base_url": "http://design-challenge:8093", "weight": 1 } ``` -6. Keep `emission_share_bps = 0` for design until ceremony. Leaves still emit - (D24 exact-E); they simply carry zero emission share. +6. Emission share is independent of bringing the service up: leaves still emit + (D24 exact-E) even at `0` bps. Current prod/staging shares are 5000/5000. ## B. Keygen (`design_sk`) @@ -48,7 +48,7 @@ Goal: move weight from prism → design (sum must remain exactly **10000** bps). 5. Do **not** change design `challenge_scoring_version` or freeze pins in the same ceremony unless intentionally bumping the scoring contract. -Default until this ceremony: **design = 0 bps**, **prism = 10000 bps**. +Current committed default: **design = 5000 bps**, **prism = 5000 bps**. ## D. Admin winners tokens + OpenRouter @@ -69,6 +69,6 @@ approval; Elo annotate is deprecated / unused on the leaf path). ## E. Rollback emission -Re-sign challenges.toml with previous bps (design 0 / prism 10000), roll -validators. Challenge service can keep running; emission share alone changes -aggregation weight. +Re-sign challenges.toml with previous bps (e.g. design 2000 / prism 8000, or +design 0 / prism 10000), roll validators. Challenge service can keep running; +emission share alone changes aggregation weight. diff --git a/docs/runbooks/prism-enable-lium-and-emission.md b/docs/runbooks/prism-enable-lium-and-emission.md index c4a90eb74..d001bbad9 100644 --- a/docs/runbooks/prism-enable-lium-and-emission.md +++ b/docs/runbooks/prism-enable-lium-and-emission.md @@ -10,7 +10,7 @@ ## Emission ceremony (shared with design) -Trust root today: **`prism = 10000` bps**, **`design = 0` bps** (sum must stay +Trust root today: **`prism = 5000` bps**, **`design = 5000` bps** (sum must stay exactly `10000`). See [`config/challenges.toml`](../../config/challenges.toml). To rebalance shares: @@ -20,7 +20,7 @@ To rebalance shares: 2. Edit `config/challenges.toml`, re-sign with owner key ([`trust-root-rotation.md`](./trust-root-rotation.md)). 3. Roll validators with the new trust root (dual-accept if rotating). -4. Prefer the design-facing checklist when unlocking design emission: +4. Prefer the design-facing checklist when changing design emission: [`design-enable-and-emission.md`](./design-enable-and-emission.md). -Default until a design unlock ceremony: **prism = 10000 bps**, **design = 0 bps**. +Current committed default: **prism = 5000 bps**, **design = 5000 bps**. diff --git a/xtask/src/design_check.rs b/xtask/src/design_check.rs index b06e68033..3c5163114 100644 --- a/xtask/src/design_check.rs +++ b/xtask/src/design_check.rs @@ -28,8 +28,8 @@ const CONTENT_PINS: &[(&str, &str)] = &[ ("scoring_version", "challenge_scoring_version"), ("scoring_version_3", "u16 = 3"), ("bundle_protocol_version", "protocol_version = 1"), - ("emission_zero", "emission_share_bps = 0"), - ("prism_bps_sole", "10000"), + ("emission_share", "emission_share_bps = 5000"), + ("bps_sum", "10000"), ("SCORE_MAX", "1_000_000"), ("compose_port", "8093"), ("round_secs", "8_640"), @@ -126,9 +126,11 @@ pub fn run(workspace_root: &Path) -> Result<(), String> { failures.push("content pin no_latest_ban: spec must mention :latest as forbidden".into()); } - // Emission must stay zero until ceremony. - if !body.contains("emission_share_bps = 0") { - failures.push("content pin emission_posture: need explicit design emission 0 bps".into()); + // Emission split must be explicit (50/50 with prism; sum 10000). + if !body.contains("emission_share_bps = 5000") { + failures.push( + "content pin emission_posture: need explicit design emission_share_bps = 5000".into(), + ); } // CSP sandbox without allow-scripts is the viewer guarantee. @@ -189,7 +191,7 @@ mod tests { .any(|(n, v)| *n == "challenge_id" && *v == "design")); assert!(CONTENT_PINS .iter() - .any(|(n, v)| *n == "emission_zero" && *v == "emission_share_bps = 0")); + .any(|(n, v)| *n == "emission_share" && *v == "emission_share_bps = 5000")); assert!(CONTENT_PINS .iter() .any(|(n, v)| *n == "bank_v1" && *v == "bank_v1.json"));