From e53e2f583d2265a323a6ae2d9d5a5bb6cf8a4532 Mon Sep 17 00:00:00 2001 From: MechaCat02 Date: Mon, 29 Jun 2026 21:09:57 +0200 Subject: [PATCH] =?UTF-8?q?chore(apply):=20log=20deferred=20provider=20che?= =?UTF-8?q?cks=20on=20the=20tree=20path=20(=C2=A75.5=20review)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The single-node path runs `check_imports_resolve` + `check_extension_points_provided`; the tree path can't (an in-tree, uncommitted node may legitimately provide a module, so a pool-based check would false-positive) and leans on the runtime backstop. Emit a debug log when a tree apply contains app nodes so the deferral isn't a silent gap. Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/manager-core/src/apply_service.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/crates/manager-core/src/apply_service.rs b/crates/manager-core/src/apply_service.rs index b86f61f..44b2812 100644 --- a/crates/manager-core/src/apply_service.rs +++ b/crates/manager-core/src/apply_service.rs @@ -1276,6 +1276,22 @@ impl ApplyService { }); } + // §5.5 / Phase 4b: the single-node path runs `check_imports_resolve` and + // `check_extension_points_provided`, but the tree path cannot — a node + // may legitimately import a module another in-tree (uncommitted) node + // declares, so a pool-based provider check would false-positive. Both + // lean on the runtime backstop here. Log it so the gap isn't silent. + if prepared + .iter() + .any(|p| matches!(p.owner, ApplyOwner::App(_))) + { + tracing::debug!( + nodes = prepared.len(), + "tree apply: per-node import / extension-point provider checks \ + deferred to the runtime backstop (single-node-only at plan time)" + ); + } + // Fold in every in-scope group's structure version, so a reparent or a // new app under the subtree between plan and apply trips StateMoved. for gid in &versioned_groups {