Reuse checked reflection inputs before acquiring controller ownership

This commit is contained in:
Timothy J. Aveni
2026-10-12 18:30:07 -07:00
parent a48fccc328
commit a4ba6169a6
2 changed files with 21 additions and 17 deletions
+10 -15
View File
@@ -1,26 +1,21 @@
import { compileInspectionTemplates } from "./inspection.js"; import { compileInspectionTemplates, type InspectionKernel } from "./inspection.js";
import { compileKernelProgram } from "./kernel.js";
import { hexDigest, type ExecutionPlan } from "./plan.js"; import { hexDigest, type ExecutionPlan } from "./plan.js";
import { clientContractCatalog, type ExecutionInstallation } from "./installation.js"; import { clientContractCatalog, type ExecutionInstallation } from "./installation.js";
import { publicOperationContract, publicQueryContract } from "./client-contracts.js"; import { publicOperationContract, publicQueryContract } from "./client-contracts.js";
/** Explicit public projection. Never serialize conformance storage or package ports. */ /** Explicit public projection of checked inputs. Never serialize conformance
export function publicDefinitionSnapshot(plan: ExecutionPlan, installation: ExecutionInstallation) { * storage or package ports, or recompile a historical Candidate at runtime. */
export function publicDefinitionSnapshot(
plan: ExecutionPlan,
installation: ExecutionInstallation,
kernel: InspectionKernel,
) {
const workspace = plan.definition.workspace; const workspace = plan.definition.workspace;
const kernel = compileKernelProgram(plan) as {
operations: {
atom: string;
interface: string;
operation: string;
unsupported: string | null;
effect: string;
targets: string[];
}[];
};
const catalog = clientContractCatalog( const catalog = clientContractCatalog(
plan, plan,
installation, installation,
installation.packages.map((pkg) => pkg.revision), installation.packages.map((pkg) => pkg.revision),
kernel,
); );
const rows = { const rows = {
atoms: workspace.atoms.map((atom) => ({ id: atom.id, name: atom.displayName, documentation: atom.documentation })), atoms: workspace.atoms.map((atom) => ({ id: atom.id, name: atom.displayName, documentation: atom.documentation })),
@@ -68,7 +63,7 @@ export function publicDefinitionSnapshot(plan: ExecutionPlan, installation: Exec
), ),
})), })),
queries: [ queries: [
...compileInspectionTemplates(plan).contracts.map((descriptor) => ({ ...compileInspectionTemplates(plan, kernel).contracts.map((descriptor) => ({
id: JSON.stringify([descriptor.package, descriptor.query]), id: JSON.stringify([descriptor.package, descriptor.query]),
name: "Public inspection", name: "Public inspection",
package: descriptor.package, package: descriptor.package,
+11 -2
View File
@@ -385,7 +385,8 @@ test("public reflection contains nominal contracts and callable descriptors with
components: [], components: [],
routes: {}, routes: {},
}; };
const snapshot = publicDefinitionSnapshot(plan, installation); const kernel = compileKernelProgram(plan) as import("../src/execution-world/inspection.js").InspectionKernel;
const snapshot = publicDefinitionSnapshot(plan, installation, kernel);
assert.ok(snapshot.rows.interfaces.length); assert.ok(snapshot.rows.interfaces.length);
assert.ok(snapshot.rows.queries.length); assert.ok(snapshot.rows.queries.length);
assert.ok(snapshot.rows.conformances.length); assert.ok(snapshot.rows.conformances.length);
@@ -400,5 +401,13 @@ test("public reflection contains nominal contracts and callable descriptors with
assert.ok(!publicText.includes('"' + privateKey + '"'), privateKey); assert.ok(!publicText.includes('"' + privateKey + '"'), privateKey);
assert.ok(publicText.includes('"descriptor"')); assert.ok(publicText.includes('"descriptor"'));
assert.ok(publicText.includes('"scope":"class"')); assert.ok(publicText.includes('"scope":"class"'));
assert.equal(snapshot.id, publicDefinitionSnapshot(plan, installation).id); assert.equal(snapshot.id, publicDefinitionSnapshot(plan, installation, kernel).id);
// Historical checked availability must survive a newer host compiler. If
// reflection silently regenerates the Kernel, this evidence disappears.
const historical = structuredClone(kernel);
const installed = historical.operations.find((operation) => !operation.unsupported)!;
assert.ok(installed);
installed.unsupported = "CHECKED_HISTORICAL_UNSUPPORTED";
const historicalSnapshot = publicDefinitionSnapshot(plan, installation, historical);
assert.match(JSON.stringify(historicalSnapshot.rows.conformances), /CHECKED_HISTORICAL_UNSUPPORTED/);
}); });