76 lines
2.8 KiB
JavaScript
76 lines
2.8 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { readFile } from "node:fs/promises";
|
|
import test from "node:test";
|
|
|
|
const source = (path) => readFile(new URL(path, import.meta.url), "utf8");
|
|
|
|
test("connects the milestone 9 CPL explorer and HARP preparation views", async () => {
|
|
const [app, workspace, native, modules] = await Promise.all([
|
|
source("../src/Thinkloom.tsx"),
|
|
source("../src/ProvenanceWorkspace.tsx"),
|
|
source("../src-tauri/src/lib.rs"),
|
|
source("../src-tauri/src/provenance/mod.rs"),
|
|
]);
|
|
|
|
assert.match(app, /import ProvenanceWorkspace/);
|
|
assert.match(app, /<ProvenanceWorkspace onNotice=/);
|
|
assert.match(modules, /pub mod explorer;/);
|
|
assert.match(native, /fn load_cpl_explorer/);
|
|
assert.match(native, /fn prepare_harp/);
|
|
assert.match(workspace, /CPL explorer/);
|
|
assert.match(workspace, /Prepare HARP/);
|
|
assert.match(workspace, /load_cpl_explorer/);
|
|
assert.match(workspace, /prepare_harp/);
|
|
});
|
|
|
|
test("renders native evidence, lineage, evaluation, and verification boundaries", async () => {
|
|
const workspace = await source("../src/ProvenanceWorkspace.tsx");
|
|
|
|
for (const requirement of [
|
|
"Native CPL verification",
|
|
"Composition timeline",
|
|
"Expression lineage",
|
|
"Assertions and current evaluations",
|
|
"Underlying records",
|
|
"Exact, degraded, stale, and unverified",
|
|
"Statement → assertion → evaluation → record",
|
|
]) assert.match(workspace, new RegExp(requirement));
|
|
|
|
assert.doesNotMatch(workspace, /human_percentage/);
|
|
assert.match(workspace, /not a human-authorship score/);
|
|
});
|
|
|
|
test("keeps evidence categories and legal limits explicit", async () => {
|
|
const workspace = await source("../src/ProvenanceWorkspace.tsx");
|
|
|
|
for (const category of [
|
|
"Evidence fact",
|
|
"User declaration",
|
|
"Derived classification",
|
|
"Suggested application language",
|
|
"Legal determination not made",
|
|
]) assert.match(workspace, new RegExp(category));
|
|
|
|
assert.match(workspace, /does not determine legal authorship, originality, copyrightability, ownership, or registrability/);
|
|
});
|
|
|
|
test("requires explicit review and approval before native HARP generation", async () => {
|
|
const workspace = await source("../src/ProvenanceWorkspace.tsx");
|
|
|
|
for (const action of [
|
|
"Freeze or select the exact deposit",
|
|
"Confirm the author identity declaration",
|
|
"Review AI systems used",
|
|
"Review final-text classifications",
|
|
"Resolve or accept evidence boundaries",
|
|
"Preview suggested registration language",
|
|
"Choose the archive and explicitly approve",
|
|
"I explicitly approve HARP generation",
|
|
"Approve and generate HARP",
|
|
]) assert.match(workspace, new RegExp(action));
|
|
|
|
assert.match(workspace, /userApproved: true/);
|
|
assert.match(workspace, /generate_harp/);
|
|
assert.match(workspace, /disabled=\{!approved \|\| busy\}/);
|
|
});
|