Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions config/CEREMONY.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
14 changes: 6 additions & 8 deletions config/challenges.staging.toml
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
# 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

[[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"
2 changes: 1 addition & 1 deletion config/challenges.staging.toml.sig
Original file line number Diff line number Diff line change
@@ -1 +1 @@
4e532b0c449ee744bbc8877dc677647003e21176a0dd074026458f62fd9b486379aeea8736bddb16b04834ae2ec422409d18f1eac757633354a12919df1ec98c
fae237ccecf24f35cc65fb0d56906db25f0909d016f36bc48bc9788ab6d3324f3c305dab54f0de76fa9700ec6a4cef1dfa5be02dde1a63a7e8260b1a1a440789
10 changes: 5 additions & 5 deletions config/challenges.toml
Original file line number Diff line number Diff line change
@@ -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]]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win

Remove the duplicate challenge-table header from both trust roots.

Each file contains two consecutive [[challenges]] headers at Line 16. This creates an empty challenge entry and prevents the loader from producing the intended two-row body.

  • config/challenges.toml#L16-L16: keep one [[challenges]] header before the prism row.
  • config/challenges.staging.toml#L16-L16: keep one [[challenges]] header before the prism row.
📍 Affects 2 files
  • config/challenges.toml#L16-L16 (this comment)
  • config/challenges.staging.toml#L16-L16
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@config/challenges.toml` at line 16, Remove the duplicate [[challenges]] table
header before the prism row in both config/challenges.toml at lines 16-16 and
config/challenges.staging.toml at lines 16-16, leaving exactly one header in
each file so the intended two-row challenge body is loaded.

id = "prism"
public_key = "bcd50bb830e050ed4b011dd8f1d2f126fdb42dc55b45ece30a7d5c8ceb3c5219"
emission_share_bps = 8000
emission_share_bps = 5000
policy = "all_metagraph_hotkeys"
2 changes: 1 addition & 1 deletion config/challenges.toml.sig
Original file line number Diff line number Diff line change
@@ -1 +1 @@
e68a49e313f41aa892898d50b99e94393424a5c173e6136b397e24c726f14d13f031f75f685213f3d84f791fc67836e4765e5a9c70f4f4c956022679fabac98f
c0c1be58a06daa6713c482ac3619649354ae3229fdc307f212f401dc5d2c17318f8ac9f8d3f9be6ab605a525907b77d9e083cb47c37f4df8231285a4fc104f80

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

for pair in \
  "config/challenges.toml config/challenges.toml.sig" \
  "config/challenges.staging.toml config/challenges.staging.toml.sig"
do
  read -r config signature <<<"$pair"
  test -f "$config"
  test -f "$signature"
  value="$(tr -d '[:space:]' <"$signature")"
  [[ "$value" =~ ^[0-9a-fA-F]{128}$ ]]
done

rg -n -C 6 \
  'load_config_dir|challenges(\.staging)?\.toml\.sig|verify|signature' \
  config crates/trustroot

Repository: BaseIntelligence/base

Length of output: 34272


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== local lock/config files for trustroot =="
git ls-files | rg '(^|/)(Cargo\.lock|Cargo\.toml|trustroot|config/.*\.toml|config/.*\.sig|config/owner\.pubkey)$' || true

echo "== config ownership/signature files =="
for f in config/owner.pubkey config/challenges.toml config/challenges.toml.sig config/challenges.staging.toml config/challenges.staging.toml.sig; do
  if [ -f "$f" ]; then
    echo "--- $f"
    wc -c "$f"
    if [[ "$f" == *.toml ]]; then
      sed -n '1,120p' "$f"
    else
      cat "$f"
    fi
  else
    echo "MISSING $f"
  fi
done

echo "== trustroot bin CLI candidate files =="
fd -i 'main\.rs|cli|bin' crates/trustroot 2>/dev/null || true
rg -n "struct .*Cli|clap|sign --|verify --|owner-pub|kind" crates/trustroot .cargo 2>/dev/null || true

echo "== local build tool availability =="
command -v cargo || true
command -v rustc || true

Repository: BaseIntelligence/base

Length of output: 5060


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== trustroot CLI files =="
git ls-files | rg 'trustroot|bins/trustroot|xtask|cargo-hack|xtask|dev|ci' | rg -v '(^|/)(README\.md|LICENSE|\.md)$' || true
sed -n '1,260p' bins/trustroot/Cargo.toml
echo
rg -n "runbin|bin|trustroot|verify|sign|owner-pub|kind" bins/trustroot crates/trustroot xtask Cargo.toml Cargo.lock crates/crypto/src crates/crypto -g '*.rs' || true

Repository: BaseIntelligence/base

Length of output: 34833


Verify both replacement signatures against their exact environment-specific configurations.

load_challenges_file_with_sig reads the adjacent TOML, parses /version, /introduced_epoch, and [[challenges]], SCALE-encodes the TOML body, and verifies the 64-byte sr25519 signature under config/owner.pubkey over scale(version, introduced_epoch, body) in the base-trustroot-v1 domain. Use the CLI or library verifier for both paths; a 128-character hexadecimal value is only a format check.

  • config/challenges.toml.sig#L1-L1: verify against committed config/challenges.toml.
  • config/challenges.staging.toml.sig#L1-L1: verify against committed config/challenges.staging.toml.
📍 Affects 2 files
  • config/challenges.toml.sig#L1-L1 (this comment)
  • config/challenges.staging.toml.sig#L1-L1
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@config/challenges.toml.sig` at line 1, Verify the signature in
config/challenges.toml.sig:1 against the committed config/challenges.toml using
load_challenges_file_with_sig or the CLI/library verifier, including the parsed
metadata, SCALE-encoded body, owner.pubkey, and base-trustroot-v1 domain. Apply
the same exact-environment verification to config/challenges.staging.toml.sig:1
against config/challenges.staging.toml; do not rely only on hexadecimal format
validation.

8 changes: 4 additions & 4 deletions crates/site-api/src/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1042,16 +1042,16 @@ 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),
);
let app = site_router(st);

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);
Expand All @@ -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());
}
Expand Down
2 changes: 1 addition & 1 deletion crates/site-data/src/metrics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
12 changes: 6 additions & 6 deletions crates/site-data/src/weights.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)],
}
}

Expand All @@ -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)],
Expand All @@ -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]
Expand All @@ -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);
Expand Down
10 changes: 5 additions & 5 deletions crates/trustroot/tests/trustroot_verify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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!(
Expand Down
7 changes: 3 additions & 4 deletions deploy/compose/env-staging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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:
Expand Down
10 changes: 5 additions & 5 deletions deploy/scripts/prod-burn-seal.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand Down
2 changes: 1 addition & 1 deletion docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand Down
6 changes: 3 additions & 3 deletions docs/COMPLETENESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand Down Expand Up @@ -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. |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Do not mark production emission as live before activation.

Line 83 still marks the production master as pending. The PR also requires configuration deployment, service restarts, and a subsequent sealed: true seal before the new shares become active. Use a status such as “configured at 5000/5000; production activation pending.”

As per coding guidelines, normative documentation is the source of truth for contracts, operations, and status.

Proposed wording
-| Design emission ceremony | Emission live at 5000/5000 with design; optional prod `design_sk` / owner key rotation still pending. |
+| Design emission ceremony | Configured at 5000/5000; production activation pending deployment, restart, and `sealed: true` verification. |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| Design emission ceremony | Emission live at 5000/5000 with design; optional prod `design_sk` / owner key rotation still pending. |
| Design emission ceremony | Configured at 5000/5000; production activation pending deployment, restart, and `sealed: true` verification. |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/COMPLETENESS.md` at line 120, Update the “Design emission ceremony”
status entry in COMPLETENESS.md to avoid claiming production emission is live;
state that it is configured at 5000/5000 with production activation still
pending, including the required deployment, restarts, and sealed:true step as
appropriate.

Source: Coding guidelines

| 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. |
Expand Down
9 changes: 5 additions & 4 deletions docs/DESIGN_CHALLENGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) |
Expand All @@ -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).

---

Expand Down
6 changes: 3 additions & 3 deletions docs/DESIGN_CHALLENGE_CHECKLIST.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` |
Expand All @@ -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` |
Expand Down
2 changes: 1 addition & 1 deletion docs/PRISM.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions docs/external-miner/prism.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Comment on lines +124 to +125

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n -C 4 'github\.com|emission|5000|10000' docs/external-miner docs/PRISM.md

Repository: BaseIntelligence/base

Length of output: 7974


🌐 Web query:

BaseIntelligence prism github BaseIntelligence/prism emission share prism design 5000 10000

💡 Result:

Prism is a decentralized neural architecture search (NAS) challenge hosted on the BASE subnet (Subnet 100 on the Bittensor network) [1][2]. It is designed to evaluate a model's ability to learn from scratch by having miners submit two-script bundles (architecture.py and training.py) [1]. Regarding your query on emission and design: 1. Emission Share: Recent documentation for the BaseIntelligence ecosystem explicitly confirms an "absolute 50/50 emission" split between the Prism challenge and other challenges (such as the agent-challenge) within the subnet [3]. This policy is emphasized in the context of "emission honesty" to ensure transparent distribution [3][4]. 2. Design (5000/10000): The specific figures 5000 and 10000 do not appear as fundamental design constants or emission parameters in the Prism repository documentation [1][5]. Prism's design centers on "prequential" (online) compression metrics, where submitted models are evaluated using a locked FineWeb-Edu dataset under forced random initialization [1]. The score is based on the area under the from-scratch loss curve, normalized by bytes consumed [1]. The platform operates as a decentralized challenge where miners own their models and training loops, while the challenge retains ownership of the data and the scoring process [1]. System tools for managing these environments are maintained within the BaseIntelligence monorepo, which provides lab tools for local deployment and testing of Prism miners [6][7][4].

Citations:


🌐 Web query:

site:github.com/BaseIntelligence/prism emission_share prism 5000 design

💡 Result:

I couldn’t find an indexed GitHub result matching all terms for BaseIntelligence/prism, emission_share, 5000, and design.

The search results mainly surfaced unrelated Prism repositories, including PrismLibrary and runprism/prism. (github.com)

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
curl -fsSL https://raw.githubusercontent.com/BaseIntelligence/prism/main/README.md > /tmp/prism_readme.txt 2>/tmp/curl_error.txt || true
if [ -s /tmp/prism_readme.txt ]; then
  rg -n -C 4 'emission|5000|10000|split|shares?|subnets?|docs?/.*md#L|docs/|docs' /tmp/prism_readme.txt || true
  echo '---'
  wc -l /tmp/prism_readme.txt
else
  echo 'README fetch empty or failed'
  cat /tmp/curl_error.txt || true
fi

printf '\n--- README docs/prism-related files ---\n'
if command -v gh >/dev/null 2>&1; then
  gh api repos/BaseIntelligence/prism/contents/docs 2>/tmp/gh_api_err.txt | jq -r '.[].name // empty' || true
else
  echo 'gh not available'
fi

Repository: BaseIntelligence/base

Length of output: 1582


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- public BaseIntelligence/prism docs: mining docs ---'
github=BaseIntelligence/prism

for file in docs/README.md docs/getting-started.md docs/submit.md docs/scoring.md docs/api.md; do
  echo "### $file"
  curl -fsSL "https://raw.githubusercontent.com/$github/main/$file" > "/tmp/$file"
  rg -n -C 5 'emission|emission|5000|10000|split|shares?|competit(ion|ing)|challenge|prism|design' "/tmp/$file" || true
done

echo '--- local external-miner/prism.md excerpt ---'
sed -n '1,150p' docs/external-miner/prism.md | rg -n -C 5 'README|Miner|emission|5000|10000|split|docs/getting-started|Getting started' || true

Repository: BaseIntelligence/base

Length of output: 295


🏁 Script executed:

#!/bin/bash
set -euo pipefail

github=BaseIntelligence/prism

for file in docs/README.md docs/getting-started.md docs/submit.md docs/scoring.md docs/api.md; do
  echo "### $file"
  curl -fsSL "https://raw.githubusercontent.com/$github/main/$file" ">/tmp/prism-$file" 2>/tmp/curl-err.txt || { echo "fetch failed"; cat /tmp/curl-err.txt; continue; }
  rg -n -C 5 'emission|5000|10000|split|shares?|competit(ion|ing)|challenge|prism|design' "/tmp/prism-$file" || true
done

echo '--- local external-miner/prism.md relevant excerpt ---'
rg -n -C 6 'emission|5000|10000|split|README|Getting started|getting-started' docs/external-miner/prism.md docs/external-miner/README.md

Repository: BaseIntelligence/base

Length of output: 13429


Update the public Prism miner docs for the allocation.

docs/external-miner/prism.md now documents a 5000/5000 Prism/Design split, but BaseIntelligence/prism mining docs only say prism’s emission share is owner-controlled and does not include the current allocation. Keep miner-facing documentation synchronized.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/external-miner/prism.md` around lines 124 - 125, Update the Prism miner
allocation section in prism.md to include the current 5000 bps Prism / 5000 bps
Design (50/50) split, while retaining the note that the emission share is
owner-controlled via the trust root. Ensure the public documentation matches the
allocation stated in the BaseIntelligence/prism mining docs.

Source: Coding guidelines

[`../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).
16 changes: 8 additions & 8 deletions docs/runbooks/design-enable-and-emission.md
Original file line number Diff line number Diff line change
@@ -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).

Expand All @@ -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`)

Expand All @@ -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

Expand All @@ -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.
Comment on lines +72 to +74

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Make the fresh seal the activation boundary in both runbooks.

Re-signing and validator rollout do not modify an existing sealed bundle. Both procedures must state the environment-specific trust-root deployment, required consumer restarts, fresh sealing, and /v1/weights/latest verification before operators rely on the new allocation.

  • docs/runbooks/design-enable-and-emission.md#L72-L74: extend rollback with deployment, restart, fresh-seal, and sealed: true verification steps.
  • docs/runbooks/prism-enable-lium-and-emission.md#L13-L26: extend the emission ceremony with the same activation sequence.

As per coding guidelines: docs/{runbooks/**/*.md,external-miner/**/*.md} requires verifying the raw-weight seal path produces sealed: true weights.

📍 Affects 2 files
  • docs/runbooks/design-enable-and-emission.md#L72-L74 (this comment)
  • docs/runbooks/prism-enable-lium-and-emission.md#L13-L26
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/runbooks/design-enable-and-emission.md` around lines 72 - 74, Update
docs/runbooks/design-enable-and-emission.md lines 72-74 and
docs/runbooks/prism-enable-lium-and-emission.md lines 13-26 so the fresh seal is
the activation boundary: document environment-specific trust-root deployment,
required consumer restarts, fresh sealing, and verification that
/v1/weights/latest returns sealed: true before relying on the allocation. In
both runbooks, preserve the existing ceremony details while explicitly requiring
this sequence for activation.

Source: Coding guidelines

Loading
Loading