Skip to content
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
2f9facd
feat(prism): v2.1 innovation-scoring additions (opt-in, default-off)
echobt Aug 14, 2026
42211ee
fix(prism): widen G8 muP sweep LR grid after A/B field divergence
echobt Aug 15, 2026
faac738
feat(prism): recipe-v10 miner dep install, CUDA13+TE image, free retry
echobt Aug 15, 2026
f22bc30
feat(prism): strict LAMBADA + anchors v2 (MC form was saturated)
echobt Aug 15, 2026
0208bcd
feat(prism): tokenizer anti-cheat card + agentic tokenizer_gaming rule
echobt Aug 15, 2026
29125fc
feat(prism): multi-GPU 4x5090 rental + NVFP4-ready miner ctx
echobt Aug 16, 2026
f4e65a9
refactor(prism): split emission math into prism-competition crate
echobt Aug 16, 2026
1143210
feat(prism): raise parameter cap 350M -> 1B
echobt Aug 16, 2026
abe9605
fix(prism): fail closed on censored g6 curves; un-invert auc anchor
echobt Aug 16, 2026
cce88a3
fix(prism): give g1/g2 per-item bootstrap clusters
echobt Aug 16, 2026
ee0e95f
fix(prism): reconcile eval budgets; make truncation loud
echobt Aug 16, 2026
a00f619
feat(prism): raise g2 item cap on the discriminative tasks
echobt Aug 16, 2026
89b70e2
docs(prism): document g6 fail-closed, clusters, budgets, g2 caps
echobt Aug 16, 2026
331cbe2
docs(spikes): add scaling-laws and diagnostics research appendix
echobt Aug 16, 2026
8df2f6d
feat(prism): significance-gated emission mode (default-off)
echobt Aug 16, 2026
d41ee0c
feat(prism): make the inert mirror defence loud, gate scored runs
echobt Aug 16, 2026
c16248e
docs(prism): file the incentive design corpus, spec the sig rule
echobt Aug 16, 2026
4b45232
feat(prism): attest training FLOPs as the budget currency
echobt Aug 16, 2026
2334aea
feat(prism): gate on dual caps and reconcile the pod budget
echobt Aug 16, 2026
fee031a
feat(prism): pre-register anchors v3, drop the confounded slope
echobt Aug 16, 2026
2665e60
docs(prism): document the budget currency; add phase-0 tooling
echobt Aug 16, 2026
61bda29
fix(prism): make the sig rule reachable and fail-closed
echobt Aug 16, 2026
cf324c2
fix(prism): upload prismlib/deps.py, assert imports are uploaded
echobt Aug 16, 2026
68e6d90
fix(prism): forward the flops cap and seed override to the pod
echobt Aug 16, 2026
6f31b85
feat(prism): retire the four pinned G2 tasks in anchors v3
echobt Aug 16, 2026
b626958
fix(prism): degrade the flops probe on OOM instead of disarming it
echobt Aug 16, 2026
2e766fd
docs(prism): record phase-0 sigma_seed and real MFU evidence
echobt Aug 16, 2026
6667b41
style(prism): inline the format arg in the step-cap assertion
echobt Aug 16, 2026
a082a80
Merge branch 'prism-v3-incentives' into prism-v2.1-scoring
echobt Aug 17, 2026
cdc9a79
fix(prism): disarm G3 floor; exempt protocol-bound spend
echobt Aug 17, 2026
9ddb8fa
feat(prism): pin TE NVFP4 and rent unsplittable multi-GPU hosts
echobt Aug 17, 2026
f550d08
feat(prism): complete v2.1 evaluation contract
echobt Aug 18, 2026
a4af6b9
docs(prism): publish v2.1 operator contract
echobt Aug 18, 2026
a1b4fbf
chore(deps): patch h2 denial advisory
echobt Aug 18, 2026
d83cd64
fix(ci): retain scoped RSA advisory exception
echobt Aug 18, 2026
f3838f8
fix(prism): use a real CUDA 13 pod base
echobt Aug 18, 2026
08a829d
fix(prism): publish CUDA pod package
echobt Aug 18, 2026
5e41e73
test(prism): exercise four-GPU live pod contract
echobt Aug 18, 2026
ecca7c3
fix(prism): support cold CUDA pod starts
echobt Aug 18, 2026
4f7ea87
fix(prism): retry CUDA package publication
echobt Aug 18, 2026
c640da9
fix(prism): canonicalize CUDA package path
echobt Aug 18, 2026
9893554
fix(ci): use package visibility endpoint
echobt Aug 18, 2026
e5d28e4
fix(prism): pin credentialed provider image
echobt Aug 18, 2026
57ef48f
fix(prism): scope templates to credentials
echobt Aug 18, 2026
c41674c
fix(prism): borrow template name input
echobt Aug 18, 2026
76fcf30
fix(prism): honor provider SSH bootstrap
echobt Aug 18, 2026
088ec1c
fix(ci): retry Prism provider mirror
echobt Aug 18, 2026
bf9b758
chore(prism): pin provider-ready pod
echobt Aug 18, 2026
c4c714f
fix(prism): use allowlisted pod bootstrap
echobt Aug 18, 2026
13fc65f
fix(prism): fit provider CUDA ceiling
echobt Aug 18, 2026
500497d
fix(prism): override TE frontend constraint
echobt Aug 18, 2026
247102a
fix(prism): pin compatible TE wheel
echobt Aug 18, 2026
4e1452c
fix(prism): keep dual cap on FLOPs probe OOM
echobt Aug 18, 2026
c0ebd29
docs(prism): add LoopMoE example and fallback notes
echobt Aug 18, 2026
03478be
fix(prism): close G1/G6/G7/G8 composite eligibility holes
echobt Aug 19, 2026
947fc49
feat(prism): require 850M-1B params and ZeRO-1 LoopMoE
echobt Aug 19, 2026
7fcf56c
feat(prism): replace LoopMoE train example with dense 1B
echobt Aug 19, 2026
2cbcac9
fix(prism): skip 1B parent FLOPs probe before spawn
echobt Aug 19, 2026
bf84a31
fix(prism): skip AutoModel pyproject on dense-1b install
echobt Aug 19, 2026
bf392c6
fix(prism): serialize 1B worker build to avoid host OOM
echobt Aug 19, 2026
2686b91
feat(prism): default 1B pods to 2x RTX PRO 6000
echobt Aug 19, 2026
f6a2c50
feat(prism): default 1B pods to 1x B200 and 4h wall
echobt Aug 19, 2026
d0fd56c
fix(prism): put 1x b200 train batches back on cuda
echobt Aug 19, 2026
e2d6b73
feat(prism): isolate v2.1 as a new competition
echobt Aug 20, 2026
9dff388
Merge origin/main into prism-v2.1-scoring
echobt Aug 20, 2026
1d6c57c
test(prism): mark arch competition rows as v2.1
echobt Aug 20, 2026
824d162
test(prism): seed emit fixtures as recipe 2.1
echobt Aug 20, 2026
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
54 changes: 53 additions & 1 deletion .github/workflows/images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ on:
- "Cargo.lock"
- ".github/workflows/images.yml"
workflow_dispatch:
inputs:
prism_pod_only:
description: Build the CUDA 13 + Transformer Engine Prism pod
required: false
type: boolean
default: false

permissions:
contents: read
Expand All @@ -36,6 +42,7 @@ concurrency:
jobs:
build-push-digests:
name: build · push · record digests
if: ${{ github.event_name != 'workflow_dispatch' || inputs.prism_pod_only != true }}
runs-on: ubuntu-latest
timeout-minutes: 90
strategy:
Expand Down Expand Up @@ -135,6 +142,51 @@ jobs:
path: digests-out/${{ matrix.image_suffix }}.json
if-no-files-found: error

build-prism-pod:
name: build · push Prism CUDA pod
if: ${{ github.event_name == 'workflow_dispatch' && inputs.prism_pod_only }}
runs-on: ubuntu-latest
timeout-minutes: 120
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Free runner disk for the CUDA base
run: |
sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc /usr/local/.ghcup
docker system prune --all --force

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push Prism pod
id: build
uses: docker/build-push-action@v6
with:
context: deploy/prism-pod
file: deploy/prism-pod/Dockerfile
platforms: linux/amd64
push: true
provenance: false
sbom: false
tags: |
ghcr.io/baseintelligence/base/prism-pod:${{ github.sha }}
ghcr.io/baseintelligence/base/prism-pod:v10-cuda13-te
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

- name: Report immutable image reference
env:
DIGEST: ${{ steps.build.outputs.digest }}
run: |
test -n "$DIGEST"
echo "ghcr.io/baseintelligence/base/prism-pod@$DIGEST"

merge-digests:
name: merge digest manifest
needs: build-push-digests
Expand Down Expand Up @@ -329,7 +381,7 @@ jobs:
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/orgs/${OWNER}/packages/container/${enc}/visibility" \
-d '{"visibility":"public"}' || true)
echo "pkg=${pkg} http=${code} body=$(head -c 200 /tmp/vis-${enc}.json || true)"
echo "pkg=${pkg} http=${code} body=$(head -c 200 "/tmp/vis-${enc}.json" || true)"
if [ "$code" = "204" ] || [ "$code" = "200" ]; then
ok=$((ok + 1))
fi
Expand Down
37 changes: 29 additions & 8 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion crates/challenge-agentic/src/prompts.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//! System prompt for the agentic anti-cheat loop.

/// Prompt version stamp (audit).
pub const AGENTIC_PROMPT_VERSION: &str = "agentic_v4";
pub const AGENTIC_PROMPT_VERSION: &str = "agentic_v5";

/// Prism-specific anti-cheat rules (metrics / copy / hooks / non-causal leak).
///
Expand All @@ -16,6 +16,7 @@ pub const PRISM_DOMAIN_RULES: &str = r"Prism domain:
- Causal LM: next-token CE must not see future/label tokens. Dense TokenMix/t_mix/Linear over time after transpose(1,2) WITHOUT triu/tril/is_causal/attn_mask = non_causal_label_leak.
- Cheat if: near-identical AST/byte copy of a corpus architecture/touched surface (AST similarity_bps >= 9500; identical patch_sha256 / patch text); hardcoded METRICS_JSON; bpb impossible vs tokens_seen/wall_clock; recipe-v1 bpb < 1.0; eval peeking; network/exfil in the delta; eval-set leakage patterns in the delta; non_causal_label_leak as above.
- NEVER treat standard modern LM components as plagiarism: RMSNorm, LayerNorm, RoPE/ALiBi, SwiGLU/GeGLU, gated residual, parallel residual, GQA/MQA, Pre-Norm/Post-Norm. Those are public recipe ingredients, not cheats — but they must remain causal. New models/ packages under AutoModel are allowed novelty.
- Tokenizer is SUBMITTED, not imposed (tree `tokenizer/` files or a `build_tokenizer(ctx)` hook beside build_model). Bringing your own tokenizer is allowed and G1 already scores tokenizer-neutral bits/byte. Read metrics.json -> tokenizer.card (probe_tokens_per_byte, vocab_multiword_frac, vocab_max_token_bytes, probe_roundtrip_ok, flags) plus any build_tokenizer/vocab source in the delta. Cheat (tokenizer_gaming) when the tokenizer is engineered for the metric instead of language modeling: multi-word / answer-phrase single tokens (vocab_multiword_frac flag), vocab stuffed with eval-looking strings, decode() that rewrites or injects output text, or extreme compression built to shortcut token-denominated probes. A merely WEAK tokenizer (byte-level, small vocab, poor merges) is NOT a cheat — judge intent to game, not quality; card flags alone without corroborating source evidence → suspicious at most.
- suspicious: only for strong unique structural overlap with a champion (AST >= 8500) or inconsistent metrics without a slam-dunk forge. Below AST 8500 with no other cheat signal → clean.
- Quality/coherence of the model is NOT your job — only anti-cheat.";

Expand Down
11 changes: 11 additions & 0 deletions crates/lium-rent-pool/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ pub const RECOVERY_WINDOW_MS: u64 = 6 * 60 * 60 * 1000;
/// True when a failed row should re-enter the rent queue (429 within window).
#[must_use]
pub fn should_recover(error_detail: &str, updated_at_ms: u64, now_ms: u64) -> bool {
let l = error_detail.to_ascii_lowercase();
// HuggingFace / FineWeb 429s are not Lium rent 429s — re-renting an
// 8×5090 pod does not fix a dataset CDN throttle.
if l.contains("huggingface") || l.contains("fineweb") || l.contains("\"stage\": \"dataset\"") {
return false;
}
is_rate_limited(error_detail) && now_ms.saturating_sub(updated_at_ms) <= RECOVERY_WINDOW_MS
}

Expand Down Expand Up @@ -70,5 +76,10 @@ mod tests {
));
assert!(should_recover("provision: 429 rate limit", 100, 100 + 1));
assert!(!should_recover("provision: 429", 0, RECOVERY_WINDOW_MS + 1));
assert!(!should_recover(
"measure: exec: HTTP Error 429: huggingface.co/datasets/HuggingFaceFW/fineweb-edu",
100,
100 + 1
));
}
}
6 changes: 3 additions & 3 deletions crates/prism-artifacts/src/receive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ pub const CHECKPOINT_OVERHEAD_NUM: u64 = 3;
/// Denominator of the 1.5× overhead factor (with [`CHECKPOINT_OVERHEAD_NUM`] → 3/2).
pub const CHECKPOINT_OVERHEAD_DEN: u64 = 2;

/// Recipe parameter cap (`prism_recipe::MAX_PARAMS` = 350M). Used as the
/// Recipe parameter cap (`prism_recipe::MAX_PARAMS` = 1B). Used as the
/// absolute HTTP body ceiling and as the harvest fallback when measured
/// `n_params` is missing (older harness). Prefer measured `n_params`.
pub const RECIPE_MAX_PARAMS: u64 = 350_000_000;
pub const RECIPE_MAX_PARAMS: u64 = 1_000_000_000;

/// Absolute max packed/upload bytes = [`RECIPE_MAX_PARAMS`] × FP32 × 2 × 1.5.
/// Per-receive budgets are tighter when measured `n_params` is known.
pub const MAX_CHECKPOINT_BYTES: usize = 4_200_000_000; // 350_000_000 * 12
pub const MAX_CHECKPOINT_BYTES: usize = 12_000_000_000; // 1_000_000_000 * 12

const _: () = assert!(RECIPE_MAX_PARAMS * 12 == MAX_CHECKPOINT_BYTES as u64);

Expand Down
31 changes: 18 additions & 13 deletions crates/prism-automodel/src/intake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ pub const MEMBER_BASE: &str = "automodel.base";
pub const MEMBER_PATCH: &str = "automodel.patch";
/// Optional entry / recipe knobs.
pub const MEMBER_TOML: &str = "prism.toml";
/// Optional miner dependency manifest: pip `requirements.txt` installed on
/// the pod (network-on install phase) before the netns-isolated train/eval.
/// Delivered to the pod when the miner's patch adds it to the applied tree
/// (it becomes a touched file, so slim delivery keeps it); the harness
/// installs any manifest it finds in the tree (see `prismlib/deps.py`).
pub const MEMBER_REQUIREMENTS: &str = "requirements.txt";
/// Optional miner dependency manifest: `pyproject.toml` (PEP 621) installed
/// with `pip install .` on the pod's install phase.
pub const MEMBER_PYPROJECT: &str = "pyproject.toml";

/// Persisted under the packed tree for `GET …/diff`.
pub const META_BASE: &str = ".prism/automodel.base";
Expand Down Expand Up @@ -149,22 +158,16 @@ pub fn extract_automodel_zip(zip_bytes: &[u8]) -> Result<AutomodelMembers, Intak
.map_err(|_| IntakeError::Invalid(format!("non-utf8: {MEMBER_BASE}")))?
.trim()
.to_owned();
if pin_id.is_empty() {
return Err(IntakeError::Invalid(format!("empty {MEMBER_BASE}")));
}
if pin_id.chars().any(char::is_whitespace) {
if pin_id.is_empty() || pin_id.chars().any(char::is_whitespace) {
return Err(IntakeError::Invalid(format!(
"{MEMBER_BASE} must be a single-line pin id without whitespace"
"{MEMBER_BASE} must be a non-empty single-line pin id without whitespace"
)));
}
let prism_toml = match files.get(MEMBER_TOML) {
Some(b) => Some(
std::str::from_utf8(b)
.map_err(|_| IntakeError::Invalid(format!("non-utf8: {MEMBER_TOML}")))?
.to_owned(),
),
None => None,
};
let prism_toml = files
.get(MEMBER_TOML)
.map(|b| std::str::from_utf8(b).map(str::to_owned))
.transpose()
.map_err(|_| IntakeError::Invalid(format!("non-utf8: {MEMBER_TOML}")))?;
Ok(AutomodelMembers {
pin_id,
patch,
Expand Down Expand Up @@ -309,6 +312,8 @@ fn slim_delivery_files(mat: &MaterializedAutomodel) -> BTreeMap<String, Vec<u8>>
META_DIFFSTAT,
mat.entry.as_str(),
MEMBER_TOML,
MEMBER_REQUIREMENTS,
MEMBER_PYPROJECT,
]
.into_iter()
.chain(mat.diffstat.files.iter().map(|entry| entry.path.as_str()))
Expand Down
4 changes: 2 additions & 2 deletions crates/prism-automodel/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ pub use intake::{
expand_tree_blob_for_pod, extract_automodel_zip, fixture_automodel_zip, intake_automodel_zip,
materialize, pack_tree_blob, pin_checkout_dir, resolve_pin, submission_id_for_patch,
zip_is_automodel_layout, AutomodelMembers, ExpandedAutomodel, IntakeError,
MaterializedAutomodel, ALLOW_LEGACY_ENV, MEMBER_BASE, MEMBER_PATCH, MEMBER_TOML, META_BASE,
META_DIFFSTAT, META_PATCH,
MaterializedAutomodel, ALLOW_LEGACY_ENV, MEMBER_BASE, MEMBER_PATCH, MEMBER_PYPROJECT,
MEMBER_REQUIREMENTS, MEMBER_TOML, META_BASE, META_DIFFSTAT, META_PATCH,
};
pub use pin::{
fixture_happy_patch_path, fixture_pin_dir, tree_content_sha256, verify_pin_tree, AutomodelPin,
Expand Down
18 changes: 18 additions & 0 deletions crates/prism-budget/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[package]
name = "prism-budget"
description = "PRISM dual-cap budget facts + lexicographic budget gates (split out of prism-pipeline::composite for the per-crate LOC cap; re-exported there)"
version.workspace = true
edition.workspace = true
license.workspace = true
repository.workspace = true
rust-version.workspace = true
publish = false

[dependencies]
serde = { version = "1", features = ["derive"] }

[dev-dependencies]
serde_json = "1"

[lints]
workspace = true
Loading
Loading