commit 165f130dd079d59d9c749275c32328e44ec14829
parent 11e59ce9e6b56d2d248c6be21368f091396bae2c
Author: triesap <tyson@radroots.org>
Date: Mon, 27 Jul 2026 12:48:29 +0000
ci: enforce crates release architecture
- add the repository-owned architecture and freshness aggregate
- pin the coordinated library baseline for migration checks
- isolate workflow caching from outputs and build artifacts
- document separately authorized status-check activation
Diffstat:
3 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/tools/sdk_xtask_import/src/architecture.rs b/tools/sdk_xtask_import/src/architecture.rs
@@ -182,6 +182,12 @@ pub fn validate_api_boundaries(workspace_root: &Path) -> Result<(), String> {
api_leakage::validate_public_api(workspace_root)
}
+pub fn validate_ci(workspace_root: &Path) -> Result<(), String> {
+ validate(workspace_root)?;
+ dependency_boundary::validate_resolved_boundaries(workspace_root)?;
+ api_leakage::validate_public_api(workspace_root)
+}
+
fn validate_workspace_toolchain(
workspace_root: &Path,
architecture: &ArchitectureIdentity,
diff --git a/tools/sdk_xtask_import/src/check.rs b/tools/sdk_xtask_import/src/check.rs
@@ -156,6 +156,18 @@ pub fn check() -> Result<(), String> {
Ok(())
}
+pub fn architecture_ci(root: &Path) -> Result<(), String> {
+ validate_package_matrix()?;
+ check_publication_policy(root)?;
+ check_radroots_facade_scaffold(root)?;
+ validate_sdk_contracts(root)?;
+ check_sdk_feature_matrix(root)?;
+ check_forbidden_packages(root)?;
+ check_binding_crate_sources(root)?;
+ check_package_source_metadata(root)?;
+ check_generated_outputs(root)
+}
+
fn check_radroots_facade_scaffold(root: &Path) -> Result<(), String> {
let manifest_path = root.join("crates/radroots/Cargo.toml");
let manifest_raw = fs::read_to_string(&manifest_path)
diff --git a/tools/sdk_xtask_import/src/main.rs b/tools/sdk_xtask_import/src/main.rs
@@ -19,6 +19,7 @@ mod wasm_declarations;
enum CommandAction<'a> {
Architecture,
+ ArchitectureCi,
CheckApiBoundaries,
CheckDependencyBoundaries,
GenerateAll,
@@ -41,6 +42,11 @@ fn run(args: impl IntoIterator<Item = String>) -> Result<(), String> {
let args = args.into_iter().collect::<Vec<_>>();
match command_action(&args)? {
CommandAction::Architecture => architecture::validate(&fs::workspace_root()?),
+ CommandAction::ArchitectureCi => {
+ let root = fs::workspace_root()?;
+ architecture::validate_ci(&root)?;
+ check::architecture_ci(&root)
+ }
CommandAction::CheckApiBoundaries => {
architecture::validate_api_boundaries(&fs::workspace_root()?)
}
@@ -60,6 +66,7 @@ fn run(args: impl IntoIterator<Item = String>) -> Result<(), String> {
fn command_action(args: &[String]) -> Result<CommandAction<'_>, String> {
match args {
[command] if command == "architecture" => Ok(CommandAction::Architecture),
+ [command] if command == "architecture-ci" => Ok(CommandAction::ArchitectureCi),
[command] if command == "check-api-boundaries" => Ok(CommandAction::CheckApiBoundaries),
[command] if command == "check-dependency-boundaries" => {
Ok(CommandAction::CheckDependencyBoundaries)
@@ -83,7 +90,7 @@ fn command_action(args: &[String]) -> Result<CommandAction<'_>, String> {
}
fn usage() -> String {
- "usage: cargo xtask architecture | cargo xtask check-api-boundaries | cargo xtask check-dependency-boundaries | cargo xtask generate | cargo xtask generate ts | cargo xtask generate wasm [--package <key>] | cargo xtask generate package-metadata | cargo xtask check | cargo xtask smoke knowledge-rust-local | cargo xtask coverage run"
+ "usage: cargo xtask architecture | cargo xtask architecture-ci | cargo xtask check-api-boundaries | cargo xtask check-dependency-boundaries | cargo xtask generate | cargo xtask generate ts | cargo xtask generate wasm [--package <key>] | cargo xtask generate package-metadata | cargo xtask check | cargo xtask smoke knowledge-rust-local | cargo xtask coverage run"
.to_owned()
}
@@ -101,6 +108,15 @@ mod tests {
}
#[test]
+ fn accepts_architecture_ci() {
+ let args = ["architecture-ci".to_owned()];
+ assert!(matches!(
+ command_action(&args).expect("action"),
+ CommandAction::ArchitectureCi
+ ));
+ }
+
+ #[test]
fn accepts_api_boundary_check() {
let args = ["check-api-boundaries".to_owned()];
assert!(matches!(