Reuse checked reflection inputs before acquiring controller ownership
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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/);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user