Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
91cd35e
feat(skippy): add experimental Inkling text split serving
michaelneale Jul 30, 2026
533cdd0
feat(skippy): add Laguna staged runtime candidate
michaelneale Jul 27, 2026
431a944
docs(skippy): record Laguna package certification
michaelneale Jul 27, 2026
b3b043f
fix(skippy): integrate hybrid verify recovery and lane cleanup
michaelneale Jul 30, 2026
ffa48e9
docs(skippy): record Laguna M5 parity
michaelneale Jul 28, 2026
6275d94
test(skippy): certify Laguna three-stage parity
michaelneale Jul 28, 2026
4ee94f7
docs(skippy): record Laguna distributed serving smoke
michaelneale Jul 28, 2026
f0cd1da
docs(skippy): record real Laguna mesh evidence
michaelneale Jul 28, 2026
92d1b90
fix(skippy): make stage memory truly layer-local
michaelneale Jul 28, 2026
93f3b18
fix(packaging): preserve source revisions
michaelneale Jul 28, 2026
cd3d8a6
feat(skippy): honor package verification depth
michaelneale Jul 28, 2026
57368b2
test(skippy): assert Laguna cache policy
michaelneale Jul 29, 2026
115e77a
llama: linearize Laguna Inkling and recovery patches
michaelneale Jul 30, 2026
8ebda85
fix(skippy): reconcile combined family recovery state
michaelneale Jul 30, 2026
a47cb0c
Harden combined Skippy family support
michaelneale Jul 30, 2026
21f0528
fix(skippy): harden combined family runtime
michaelneale Jul 30, 2026
635d240
fix(skippy): retire final committed verify span
michaelneale Jul 30, 2026
9319897
fix(skippy): retire failed lane before replacement
michaelneale Jul 30, 2026
779d27b
fix(skippy): retire partial exact replay trials
michaelneale Jul 30, 2026
51da4a9
fix(skippy): close combined review gaps
michaelneale Jul 30, 2026
bec5973
docs(skippy): promote pinned Laguna Q4 package
michaelneale Jul 30, 2026
a3a60e2
refactor(skippy): isolate prediction return startup
michaelneale Jul 30, 2026
8ce2c7e
Merge branch 'main' into feat/skippy-laguna-inkling
michaelneale Jul 31, 2026
b265857
fix: address consolidated model review
michaelneale Jul 31, 2026
64ab9f3
fix(skippy): surface orphan cleanup failures
michaelneale Jul 31, 2026
6c54cd0
skippy: complete Inkling tool path and operator notes
michaelneale Aug 1, 2026
068bcd2
Merge remote-tracking branch 'origin/main' into fix/pr1118-nick-review
michaelneale Aug 2, 2026
102aa6f
llama: refresh Inkling patch for updated upstream
michaelneale Aug 2, 2026
60bff74
Merge branch 'main' into feat/skippy-laguna-inkling
michaelneale Aug 3, 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
4 changes: 3 additions & 1 deletion .github/workflows/queue-unsloth-layer-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ on:
required: false
default: "main"
quant_preference:
description: "Comma-separated 4-bit quant preference"
description: "Comma-separated quant preference"
required: false
default: "UD-Q4_K_XL,UD-Q4_K_M,Q4_K_XL,Q4_K_M"
split_candidate_vram_gib:
Expand Down Expand Up @@ -64,6 +64,8 @@ jobs:

steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0
with:
persist-credentials: false

- uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 # stable 2026-07-16

Expand Down
2 changes: 2 additions & 0 deletions Cargo.lock

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

8 changes: 6 additions & 2 deletions Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,15 @@ skippy-quantize-release-build:
# llama.cpp quantization ABI linked into the executable.
[unix]
skippy-quantize-standalone-build backend="cpu":
LLAMA_STAGE_BACKEND="{{ backend }}" LLAMA_STAGE_LINK_MODE=static just with-lld cargo build -p skippy-quantize
scripts/prepare-llama.sh pinned
LLAMA_STAGE_BACKEND="{{ backend }}" LLAMA_STAGE_LINK_MODE=static scripts/build-llama.sh
LLAMA_STAGE_BACKEND="{{ backend }}" LLAMA_STAGE_LINK_MODE=static just with-lld cargo build -p skippy-quantize --no-default-features

[unix]
skippy-quantize-standalone-release-build backend="cpu":
LLAMA_STAGE_BACKEND="{{ backend }}" LLAMA_STAGE_LINK_MODE=static just with-lld cargo build --release --locked -p skippy-quantize
scripts/prepare-llama.sh pinned
LLAMA_STAGE_BACKEND="{{ backend }}" LLAMA_STAGE_LINK_MODE=static scripts/build-llama.sh
LLAMA_STAGE_BACKEND="{{ backend }}" LLAMA_STAGE_LINK_MODE=static just with-lld cargo build --release --locked -p skippy-quantize --no-default-features

# Generate a reproducible benchmark corpus for skippy bench tooling.
bench-corpus tier="smoke" *ARGS="":
Expand Down
1 change: 1 addition & 0 deletions crates/llama-quant-ffi/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ pub enum LlamaFileType {
MostlyMxfp4Moe = 38,
MostlyNvfp4 = 39,
MostlyQ1_0 = 40,
MostlyQ2_0 = 41,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
Expand Down
3 changes: 3 additions & 0 deletions crates/mesh-llm-cli/src/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ pub enum ModelsCommand {
/// Branch or tag of mesh-llm to build in the job.
#[arg(long, default_value = "main")]
mesh_llm_ref: String,
/// Publish a public package marked experimental and open an unmerged HF catalog PR.
#[arg(long)]
experimental: bool,
/// Explicitly keep this as a dry run. This is the default unless --confirm is set.
#[arg(long)]
dry_run: bool,
Expand Down
28 changes: 27 additions & 1 deletion crates/mesh-llm-cli/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ pub fn assert_mesh_requirements_docs_examples_parse() {

#[cfg(test)]
mod tests {
use super::Cli;
use super::{Cli, Command};
use crate::models::ModelsCommand;
use clap::Parser;

#[test]
Expand Down Expand Up @@ -138,4 +139,29 @@ mod tests {
Some(std::path::PathBuf::from("topology.json"))
);
}

#[test]
fn models_package_parses_experimental_publication() {
let cli = Cli::parse_from([
"mesh-llm",
"models",
"package",
"unsloth/inkling-GGUF:UD-Q2_K_XL",
"--experimental",
"--dry-run",
]);

match cli.command.expect("models command expected") {
Command::Models {
command:
ModelsCommand::Package {
source_repo: Some(source_repo),
experimental: true,
dry_run: true,
..
},
} => assert_eq!(source_repo, "unsloth/inkling-GGUF:UD-Q2_K_XL"),
other => panic!("unexpected command: {other:?}"),
}
}
}
172 changes: 115 additions & 57 deletions crates/mesh-llm-commands/src/model_package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use tokio_stream::StreamExt;

use ::model_package::jobs::HfJobsClient;
use ::model_package::permissions;
use ::model_package::prepare::{self, DiscoveredQuant, PrepareParams};
use ::model_package::prepare::{self, DiscoveredQuant, PrepareJob, PrepareParams};
use ::model_package::script;
use serde_json::json;

Expand All @@ -16,6 +16,7 @@ pub struct ModelPrepareArgs<'a> {
pub flavor: &'a str,
pub timeout: &'a str,
pub mesh_llm_ref: &'a str,
pub experimental: bool,
pub dry_run: bool,
pub confirm: bool,
pub follow: bool,
Expand All @@ -37,6 +38,7 @@ pub async fn dispatch_model_package(args: ModelPrepareArgs<'_>) -> Result<()> {
flavor,
timeout,
mesh_llm_ref,
experimental,
dry_run,
confirm,
follow,
Expand Down Expand Up @@ -95,7 +97,13 @@ pub async fn dispatch_model_package(args: ModelPrepareArgs<'_>) -> Result<()> {
// If no quant specified, list available quants and exit.
// This path doesn't need HF_TOKEN — works for public repos.
if source_quant.is_none() {
return run_list_quants(&hf_client, source_repo, json).await;
return run_list_quants(
&hf_client,
source_repo,
source_model_ref.revision.as_deref(),
json,
)
.await;
}

let submitting = confirm && !dry_run;
Expand All @@ -116,71 +124,22 @@ pub async fn dispatch_model_package(args: ModelPrepareArgs<'_>) -> Result<()> {
eprintln!("🔍 Resolving source...");
let params = PrepareParams {
source_repo: source_repo.to_string(),
source_revision: source_model_ref.revision.clone(),
quant: source_quant.map(|s| s.to_string()),
target: target.map(|s| s.to_string()),
model_id: model_id.map(|s| s.to_string()),
flavor: flavor.to_string(),
timeout_seconds,
mesh_llm_ref: mesh_llm_ref.to_string(),
experimental,
hf_token: jobs_client
.as_ref()
.map(|client| client.token().to_string()),
};

let job = prepare::resolve(&hf_client, params, &perms).await?;

// Print resolved info.
let shard_info = model_ref::split_gguf_shard_info(&job.source_file);
let shard_str = if let Some(shard) = shard_info {
format!(" ({} shards)", shard.total)
} else {
String::new()
};

eprintln!(" Repo: {}", job.source_repo);
eprintln!(" File: {}{}", job.source_file, shard_str);
eprintln!();
eprintln!(
"🔑 Permissions: {} ({})",
perms.username,
if perms.is_meshllm_member {
"meshllm org member"
} else {
"not in meshllm org"
}
);
eprintln!(" Target: {}", job.target_repo);
eprintln!(
" Catalog: meshllm/catalog ({})",
if job.catalog_create_pr {
"will open PR"
} else {
"direct commit"
}
);
eprintln!();
eprintln!(
"📋 Job: {}, timeout {}, mesh-llm@{}",
job.spec.flavor,
format_timeout(job.spec.timeout_seconds),
job.spec
.environment
.get("MESH_LLM_REF")
.map(|s| s.as_str())
.unwrap_or("main")
);
eprintln!(
" Hardware: {} {} ({})",
job.job_plan.pretty_name,
hardware_label(job.job_plan.cpu.as_deref(), job.job_plan.ram.as_deref()),
job.job_plan.selection_reason
);
eprintln!(
" Pricing: ${:.6}/{}, max {}",
job.job_plan.unit_cost_usd,
job.job_plan.unit_label,
format_cost(job.job_plan.max_cost_usd)
);
print_prepare_job(&job, &perms);

if !submitting {
let redacted = redacted_spec(&job.spec);
Expand All @@ -191,9 +150,12 @@ pub async fn dispatch_model_package(args: ModelPrepareArgs<'_>) -> Result<()> {
"dryRun": true,
"confirmRequired": true,
"sourceRepo": job.source_repo,
"sourceRevision": job.source_revision,
"sourceFile": job.source_file,
"projectors": job.projectors,
"targetRepo": job.target_repo,
"modelId": job.model_id,
"experimental": job.experimental,
"jobPlan": job.job_plan,
"spec": redacted,
}))?
Expand Down Expand Up @@ -232,9 +194,12 @@ pub async fn dispatch_model_package(args: ModelPrepareArgs<'_>) -> Result<()> {
"jobUrl": job_url,
"namespace": job.namespace,
"sourceRepo": job.source_repo,
"sourceRevision": job.source_revision,
"sourceFile": job.source_file,
"projectors": job.projectors,
"targetRepo": job.target_repo,
"modelId": job.model_id,
"experimental": job.experimental,
"jobPlan": job.job_plan,
}))?
);
Expand All @@ -251,19 +216,89 @@ pub async fn dispatch_model_package(args: ModelPrepareArgs<'_>) -> Result<()> {
Ok(())
}

fn print_prepare_job(job: &PrepareJob, perms: &permissions::PermissionCheck) {
let shard_info = model_ref::split_gguf_shard_info(&job.source_file);
let shard_str = if let Some(shard) = shard_info {
format!(" ({} shards)", shard.total)
} else {
String::new()
};

eprintln!(" Repo: {}", job.source_repo);
eprintln!(" Commit: {}", job.source_revision);
eprintln!(" File: {}{}", job.source_file, shard_str);
for projector in &job.projectors {
eprintln!(" MMProj: {}", projector.path);
}
eprintln!();
eprintln!(
"🔑 Permissions: {} ({})",
perms.username,
if perms.is_meshllm_member {
"meshllm org member"
} else {
"not in meshllm org"
}
);
eprintln!(" Target: {}", job.target_repo);
eprintln!(
" Release: {}",
if job.experimental {
"experimental (public, not cataloged until HF PR merge)"
} else {
"stable"
}
);
eprintln!(
" Catalog: meshllm/catalog ({})",
if job.catalog_create_pr {
"will open PR"
} else {
"direct commit"
}
);
eprintln!();
eprintln!(
"📋 Job: {}, timeout {}, mesh-llm@{}",
job.spec.flavor,
format_timeout(job.spec.timeout_seconds),
job.spec
.environment
.get("MESH_LLM_REF")
.map(|s| s.as_str())
.unwrap_or("main")
);
eprintln!(
" Hardware: {} {} ({})",
job.job_plan.pretty_name,
hardware_label(job.job_plan.cpu.as_deref(), job.job_plan.ram.as_deref()),
job.job_plan.selection_reason
);
eprintln!(
" Pricing: ${:.6}/{}, max {}",
job.job_plan.unit_cost_usd,
job.job_plan.unit_label,
format_cost(job.job_plan.max_cost_usd)
);
}

async fn run_list_quants(
client: &hf_hub::HFClient,
source_repo: &str,
source_revision: Option<&str>,
json_output: bool,
) -> Result<()> {
let quants = prepare::list_quants(client, source_repo).await?;
let inventory = prepare::list_inventory(client, source_repo, source_revision).await?;
let quants = inventory.quants;

if json_output {
println!(
"{}",
serde_json::to_string_pretty(&json!({
"sourceRepo": source_repo,
"sourceRevision": source_revision,
"quants": quants,
"projectors": inventory.projectors,
}))?
);
return Ok(());
Expand All @@ -280,13 +315,20 @@ async fn run_list_quants(
eprintln!();
eprintln!("Specify one as a model ref, e.g.:");
eprintln!(
" mesh-llm models package {}:{}",
source_repo, quants[0].name
" mesh-llm models package {}",
source_quant_ref(source_repo, source_revision, &quants[0].name)
);

Ok(())
}

fn source_quant_ref(source_repo: &str, source_revision: Option<&str>, quant: &str) -> String {
source_revision.map_or_else(
|| format!("{source_repo}:{quant}"),
|revision| format!("{source_repo}@{revision}:{quant}"),
)
}

fn print_quant_table(quants: &[DiscoveredQuant]) {
// Find the longest name for alignment.
let max_name = quants.iter().map(|q| q.name.len()).max().unwrap_or(0);
Expand Down Expand Up @@ -639,4 +681,20 @@ mod tests {
fn parse_timeout_mixed() {
assert_eq!(parse_timeout("1h30m45s").unwrap(), 5445);
}

#[test]
fn source_quant_ref_preserves_revision() {
assert_eq!(
source_quant_ref("poolside/Laguna-S-2.1-GGUF", Some("abc123"), "Q4_K_M"),
"poolside/Laguna-S-2.1-GGUF@abc123:Q4_K_M"
);
}

#[test]
fn source_quant_ref_omits_absent_revision() {
assert_eq!(
source_quant_ref("poolside/Laguna-S-2.1-GGUF", None, "Q4_K_M"),
"poolside/Laguna-S-2.1-GGUF:Q4_K_M"
);
}
}
Loading
Loading