clinkx 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +34 -1
- package/clinkx-workflows/dist/architecture-comparison/admission.d.ts +5 -0
- package/clinkx-workflows/dist/architecture-comparison/admission.js +50 -0
- package/clinkx-workflows/dist/architecture-comparison/admission.js.map +1 -0
- package/clinkx-workflows/dist/architecture-comparison/contract.d.ts +995 -0
- package/clinkx-workflows/dist/architecture-comparison/contract.js +149 -0
- package/clinkx-workflows/dist/architecture-comparison/contract.js.map +1 -0
- package/clinkx-workflows/dist/architecture-comparison/runtime.d.ts +29 -0
- package/clinkx-workflows/dist/architecture-comparison/runtime.js +387 -0
- package/clinkx-workflows/dist/architecture-comparison/runtime.js.map +1 -0
- package/clinkx-workflows/dist/contained-file.js +1 -1
- package/clinkx-workflows/dist/contained-file.js.map +1 -1
- package/clinkx-workflows/dist/council-execution-policy.d.ts +4 -2
- package/clinkx-workflows/dist/council-execution-policy.js +5 -1
- package/clinkx-workflows/dist/council-execution-policy.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/activity-contract.d.ts +72 -72
- package/clinkx-workflows/dist/dashboard/contracts.d.ts +1564 -122
- package/clinkx-workflows/dist/dashboard/contracts.js +4 -0
- package/clinkx-workflows/dist/dashboard/contracts.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/progress-report-contract.d.ts +12 -12
- package/clinkx-workflows/dist/dashboard/progress-report-status-overlay.d.ts +8 -8
- package/clinkx-workflows/dist/dashboard/scanner.d.ts +3 -0
- package/clinkx-workflows/dist/dashboard/scanner.js +27 -0
- package/clinkx-workflows/dist/dashboard/scanner.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/session-log-contract.d.ts +48 -48
- package/clinkx-workflows/dist/dashboard/session-log-redaction.d.ts +2 -0
- package/clinkx-workflows/dist/dashboard/session-log-redaction.js +4 -0
- package/clinkx-workflows/dist/dashboard/session-log-redaction.js.map +1 -1
- package/clinkx-workflows/dist/dashboard/verified-repair-contract.d.ts +191 -0
- package/clinkx-workflows/dist/dashboard/verified-repair-contract.js +28 -0
- package/clinkx-workflows/dist/dashboard/verified-repair-contract.js.map +1 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/index-BdpmbPps.js +115 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/style-Im5i1iAs.css +1 -0
- package/clinkx-workflows/dist/dashboard-ui/index.html +2 -2
- package/clinkx-workflows/dist/engine.d.ts +6 -0
- package/clinkx-workflows/dist/engine.js +78 -7
- package/clinkx-workflows/dist/engine.js.map +1 -1
- package/clinkx-workflows/dist/index.d.ts +3 -0
- package/clinkx-workflows/dist/index.js +3 -2
- package/clinkx-workflows/dist/index.js.map +1 -1
- package/clinkx-workflows/dist/reducers/index.d.ts +9 -1
- package/clinkx-workflows/dist/reducers/index.js +22 -0
- package/clinkx-workflows/dist/reducers/index.js.map +1 -1
- package/clinkx-workflows/dist/state.js +17 -7
- package/clinkx-workflows/dist/state.js.map +1 -1
- package/clinkx-workflows/dist/validators/architecture-comparison.d.ts +2 -0
- package/clinkx-workflows/dist/validators/architecture-comparison.js +12 -0
- package/clinkx-workflows/dist/validators/architecture-comparison.js.map +1 -0
- package/clinkx-workflows/dist/validators/index.js +4 -0
- package/clinkx-workflows/dist/validators/index.js.map +1 -1
- package/clinkx-workflows/dist/validators/verified-repair.d.ts +2 -0
- package/clinkx-workflows/dist/validators/verified-repair.js +12 -0
- package/clinkx-workflows/dist/validators/verified-repair.js.map +1 -0
- package/clinkx-workflows/dist/verification-proof.d.ts +254 -0
- package/clinkx-workflows/dist/verification-proof.js +195 -0
- package/clinkx-workflows/dist/verification-proof.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/admission.d.ts +72 -0
- package/clinkx-workflows/dist/verified-repair/admission.js +63 -0
- package/clinkx-workflows/dist/verified-repair/admission.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/contract.d.ts +1910 -0
- package/clinkx-workflows/dist/verified-repair/contract.js +127 -0
- package/clinkx-workflows/dist/verified-repair/contract.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/host.d.ts +32 -0
- package/clinkx-workflows/dist/verified-repair/host.js +2 -0
- package/clinkx-workflows/dist/verified-repair/host.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/prompts.d.ts +12 -0
- package/clinkx-workflows/dist/verified-repair/prompts.js +58 -0
- package/clinkx-workflows/dist/verified-repair/prompts.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/result.d.ts +16 -0
- package/clinkx-workflows/dist/verified-repair/result.js +102 -0
- package/clinkx-workflows/dist/verified-repair/result.js.map +1 -0
- package/clinkx-workflows/dist/verified-repair/runtime.d.ts +28 -0
- package/clinkx-workflows/dist/verified-repair/runtime.js +186 -0
- package/clinkx-workflows/dist/verified-repair/runtime.js.map +1 -0
- package/clinkx-workflows/dist/workflow-tools.d.ts +3 -0
- package/clinkx-workflows/dist/workflow-tools.js +148 -14
- package/clinkx-workflows/dist/workflow-tools.js.map +1 -1
- package/clinkx-workflows/dist/workflow-verification-contract.d.ts +539 -0
- package/clinkx-workflows/dist/workflow-verification-contract.js +52 -0
- package/clinkx-workflows/dist/workflow-verification-contract.js.map +1 -0
- package/clinkx-workflows/dist/workflow-verification.d.ts +15 -0
- package/clinkx-workflows/dist/workflow-verification.js +218 -0
- package/clinkx-workflows/dist/workflow-verification.js.map +1 -0
- package/clinkx-workflows/templates/architecture-comparison/candidate.txt +29 -0
- package/clinkx-workflows/templates/architecture-comparison/judge.txt +31 -0
- package/clinkx-workflows/templates/verified-repair/investigate.txt +20 -0
- package/clinkx-workflows/templates/verified-repair/repair.txt +11 -0
- package/clinkx-workflows/templates/verified-repair/review.txt +18 -0
- package/clinkx-workflows/workflows/architecture-comparison.yaml +133 -0
- package/clinkx-workflows/workflows/verified-repair.yaml +104 -0
- package/dist/allowed-roots.js +4 -1
- package/dist/allowed-roots.js.map +1 -1
- package/dist/codex/app-server-client.d.ts +1 -0
- package/dist/codex/app-server-client.js +3 -2
- package/dist/codex/app-server-client.js.map +1 -1
- package/dist/context-builder/diagnostics.d.ts +1 -0
- package/dist/context-builder/diagnostics.js +1 -1
- package/dist/context-builder/diagnostics.js.map +1 -1
- package/dist/context-builder/discovery.d.ts +18 -1
- package/dist/context-builder/discovery.js +69 -1
- package/dist/context-builder/discovery.js.map +1 -1
- package/dist/context-builder/handler.js +8 -1
- package/dist/context-builder/handler.js.map +1 -1
- package/dist/context-builder/lifecycle-contract.d.ts +24 -24
- package/dist/context-builder/refine-handler.js +16 -1
- package/dist/context-builder/refine-handler.js.map +1 -1
- package/dist/context-builder/secrets.d.ts +11 -0
- package/dist/context-builder/secrets.js +75 -0
- package/dist/context-builder/secrets.js.map +1 -1
- package/dist/context-builder/versions.d.ts +5 -2
- package/dist/context-builder/versions.js +5 -2
- package/dist/context-builder/versions.js.map +1 -1
- package/dist/dashboard-cli.js +10 -3
- package/dist/dashboard-cli.js.map +1 -1
- package/dist/dashboard-gateway/main.js +8 -3
- package/dist/dashboard-gateway/main.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/project-verification/contract.d.ts +537 -0
- package/dist/project-verification/contract.js +40 -0
- package/dist/project-verification/contract.js.map +1 -0
- package/dist/project-verification/files.d.ts +23 -0
- package/dist/project-verification/files.js +80 -0
- package/dist/project-verification/files.js.map +1 -0
- package/dist/project-verification/process.d.ts +7 -0
- package/dist/project-verification/process.js +115 -0
- package/dist/project-verification/process.js.map +1 -0
- package/dist/project-verification/runner.d.ts +35 -0
- package/dist/project-verification/runner.js +185 -0
- package/dist/project-verification/runner.js.map +1 -0
- package/dist/project-verification/service.d.ts +37 -0
- package/dist/project-verification/service.js +151 -0
- package/dist/project-verification/service.js.map +1 -0
- package/dist/provider-doctor.d.ts +22 -0
- package/dist/provider-doctor.js +22 -0
- package/dist/provider-doctor.js.map +1 -0
- package/dist/server.js +29 -1
- package/dist/server.js.map +1 -1
- package/dist/verification-tools.d.ts +90 -0
- package/dist/verification-tools.js +120 -0
- package/dist/verification-tools.js.map +1 -0
- package/dist/verified-repair/files.d.ts +22 -0
- package/dist/verified-repair/files.js +114 -0
- package/dist/verified-repair/files.js.map +1 -0
- package/dist/verified-repair/host.d.ts +14 -0
- package/dist/verified-repair/host.js +612 -0
- package/dist/verified-repair/host.js.map +1 -0
- package/docs/configuration.md +68 -1
- package/docs/engineering-recipes.md +415 -0
- package/docs/verification/README.md +59 -0
- package/docs/verification/dashboard-real-disk.md +436 -0
- package/docs/verification/project-checks.example.json +14 -0
- package/docs/verification/project-checks.md +444 -0
- package/docs/verification/workflow-handoff.md +113 -0
- package/package.json +10 -2
- package/scripts/provider-doctor-core.mjs +364 -0
- package/scripts/provider-doctor-probe.mjs +34 -0
- package/clinkx-workflows/dist/dashboard-ui/assets/index-JPHQVtn9.js +0 -106
- package/clinkx-workflows/dist/dashboard-ui/assets/style-DOMHk-j6.css +0 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export const ARCHITECTURE_WORKFLOW = "architecture-comparison";
|
|
4
|
+
export const MAX_SHARED_BYTES = 48 * 1024;
|
|
5
|
+
export const MAX_CANDIDATE_BYTES = 16 * 1024;
|
|
6
|
+
export const MAX_VIEW_BYTES = 96 * 1024;
|
|
7
|
+
export const MAX_JUDGE_BYTES = 12 * 1024;
|
|
8
|
+
export const MAX_RECORD_BYTES = 128 * 1024;
|
|
9
|
+
export const ARCHITECTURE_STATE_PATH = "architecture-comparison.v1.json";
|
|
10
|
+
export const ALIASES = ["candidate_A", "candidate_B"];
|
|
11
|
+
export const CANDIDATE_REFS = ["candidates.author_a", "candidates.author_b"];
|
|
12
|
+
export const SHARED_REF = "freeze.input";
|
|
13
|
+
export const VIEW_REF = "judge_view.view";
|
|
14
|
+
export const JUDGE_REF = "judge.judge";
|
|
15
|
+
export const RECORD_REF = "comparison.record";
|
|
16
|
+
export const DigestSchema = z.string().regex(/^[a-f0-9]{64}$/);
|
|
17
|
+
const Text = z.string().trim().min(1).max(6000);
|
|
18
|
+
const Notes = z.array(z.string().trim().min(1).max(1500)).max(12);
|
|
19
|
+
export const SourceRefSchema = z.string().regex(/^(requirements|source_\d{3})$/);
|
|
20
|
+
const SourceRefs = z.array(SourceRefSchema).min(1).max(33).refine((refs) => new Set(refs).size === refs.length, "source references must be unique");
|
|
21
|
+
const Alias = z.enum(ALIASES);
|
|
22
|
+
export const SharedInputSchema = z.object({
|
|
23
|
+
schema_version: z.literal("architecture-shared-input-v1"),
|
|
24
|
+
requirements: z.string().min(1).max(16 * 1024),
|
|
25
|
+
source_identity: z.string().min(1).max(2000),
|
|
26
|
+
sources: z.array(z.object({
|
|
27
|
+
source_ref: SourceRefSchema,
|
|
28
|
+
sha256: DigestSchema,
|
|
29
|
+
size_bytes: z.number().int().nonnegative().max(MAX_SHARED_BYTES),
|
|
30
|
+
content: z.string().max(MAX_SHARED_BYTES),
|
|
31
|
+
}).strict()).max(32),
|
|
32
|
+
source_refs: SourceRefs,
|
|
33
|
+
frozen_digest: DigestSchema,
|
|
34
|
+
}).strict();
|
|
35
|
+
export const CandidateSchema = z.object({
|
|
36
|
+
schema_version: z.literal("architecture-candidate-v1"),
|
|
37
|
+
frozen_digest: DigestSchema,
|
|
38
|
+
caller_usage: Text,
|
|
39
|
+
public_signatures: Text,
|
|
40
|
+
ownership: Text,
|
|
41
|
+
failure_behavior: Text,
|
|
42
|
+
tradeoffs: Notes.min(1),
|
|
43
|
+
assumptions: Notes,
|
|
44
|
+
rejected_alternatives: Notes.min(1),
|
|
45
|
+
source_refs: SourceRefs,
|
|
46
|
+
}).strict();
|
|
47
|
+
export const JudgeViewSchema = z.object({
|
|
48
|
+
schema_version: z.literal("architecture-judge-view-v1"),
|
|
49
|
+
shared: SharedInputSchema,
|
|
50
|
+
candidates: z.tuple([
|
|
51
|
+
z.object({ alias: z.literal("candidate_A"), body: CandidateSchema }).strict(),
|
|
52
|
+
z.object({ alias: z.literal("candidate_B"), body: CandidateSchema }).strict(),
|
|
53
|
+
]),
|
|
54
|
+
}).strict();
|
|
55
|
+
export const JudgeSchema = z.object({
|
|
56
|
+
schema_version: z.literal("architecture-judge-v1"),
|
|
57
|
+
frozen_digest: DigestSchema,
|
|
58
|
+
assessments: z.array(z.object({ alias: Alias, strengths: Notes.min(1), weaknesses: Notes }).strict()).length(2),
|
|
59
|
+
ranking: z.array(Alias).length(2),
|
|
60
|
+
recommendation: z.enum(["candidate_A", "candidate_B", "neither"]),
|
|
61
|
+
rationale: Text,
|
|
62
|
+
source_refs: SourceRefs,
|
|
63
|
+
}).strict().superRefine((body, ctx) => {
|
|
64
|
+
if (new Set(body.assessments.map((entry) => entry.alias)).size !== 2) {
|
|
65
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["assessments"], message: "assess each delivered alias exactly once" });
|
|
66
|
+
}
|
|
67
|
+
if (new Set(body.ranking).size !== 2) {
|
|
68
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["ranking"], message: "rank each delivered alias exactly once" });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
export const RouteSchema = z.object({ cli_name: z.string().min(1).max(128), model: z.string().min(1).max(128).optional(), effort: z.string().min(1).max(32).optional() }).strict();
|
|
72
|
+
const ArtifactFactSchema = z.object({ path: z.string().regex(/^artifacts\/[A-Za-z0-9_/-]+\.json$/), sha256: DigestSchema }).strict();
|
|
73
|
+
export const ArchitectureStateSchema = z.object({
|
|
74
|
+
schema_version: z.literal("architecture-comparison-state-v1"),
|
|
75
|
+
run_id: z.string().regex(/^[A-Za-z0-9_-]{1,64}$/),
|
|
76
|
+
definition_sha256: DigestSchema,
|
|
77
|
+
variables_sha256: DigestSchema,
|
|
78
|
+
frozen_digest: DigestSchema,
|
|
79
|
+
routes: z.object({ candidate_A: RouteSchema, candidate_B: RouteSchema, judge: RouteSchema }).strict(),
|
|
80
|
+
source_files: z.array(z.object({ path: z.string().min(1).max(4096), sha256: DigestSchema }).strict()).max(32),
|
|
81
|
+
artifacts: z.record(z.string(), ArtifactFactSchema),
|
|
82
|
+
}).strict();
|
|
83
|
+
export const ComparisonRecordSchema = z.object({
|
|
84
|
+
schema_version: z.literal("architecture-comparison-record-v1"),
|
|
85
|
+
run_id: z.string().min(1).max(64),
|
|
86
|
+
status: z.enum(["complete", "incomplete"]),
|
|
87
|
+
missing: z.array(z.string().min(1).max(200)).max(12),
|
|
88
|
+
frozen_digest: DigestSchema.optional(),
|
|
89
|
+
source_identity: z.string().max(2000).optional(),
|
|
90
|
+
evidence: z.array(z.object({ reference: z.string().max(128), path: z.string().max(512), sha256: DigestSchema }).strict()).max(5),
|
|
91
|
+
candidates: z.array(z.object({ alias: Alias, route: RouteSchema, body: CandidateSchema }).strict()).max(2),
|
|
92
|
+
judge: JudgeSchema.optional(),
|
|
93
|
+
owner_acceptance: z.literal("not_recorded"),
|
|
94
|
+
owner_next_steps: z.array(z.string()).max(4),
|
|
95
|
+
limitations: z.array(z.string()).max(6),
|
|
96
|
+
}).strict().superRefine((record, ctx) => {
|
|
97
|
+
if (new Set(record.candidates.map((candidate) => candidate.alias)).size !== record.candidates.length) {
|
|
98
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["candidates"], message: "candidate aliases must be unique" });
|
|
99
|
+
}
|
|
100
|
+
if (record.status === "complete" && (record.missing.length !== 0 || record.candidates.length !== 2 || record.judge === undefined || record.frozen_digest === undefined)) {
|
|
101
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, message: "complete requires the frozen input, both candidates, and independent judge" });
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
export function canonicalJson(value) {
|
|
105
|
+
if (Array.isArray(value))
|
|
106
|
+
return `[${value.map(canonicalJson).join(",")}]`;
|
|
107
|
+
if (value !== null && typeof value === "object") {
|
|
108
|
+
const object = value;
|
|
109
|
+
return `{${Object.keys(object).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(object[key])}`).join(",")}}`;
|
|
110
|
+
}
|
|
111
|
+
return JSON.stringify(value) ?? "null";
|
|
112
|
+
}
|
|
113
|
+
export function digest(value) {
|
|
114
|
+
return createHash("sha256").update(canonicalJson(value)).digest("hex");
|
|
115
|
+
}
|
|
116
|
+
export function bytesDigest(value) {
|
|
117
|
+
return createHash("sha256").update(value).digest("hex");
|
|
118
|
+
}
|
|
119
|
+
export function serialized(value) { return `${JSON.stringify(value, null, 2)}\n`; }
|
|
120
|
+
export function assertBounded(value, maximum) {
|
|
121
|
+
if (Buffer.byteLength(serialized(value), "utf8") > maximum)
|
|
122
|
+
throw new Error(`architecture artifact exceeds ${maximum} bytes; candidates are never truncated`);
|
|
123
|
+
}
|
|
124
|
+
export function assertSharedInput(input) {
|
|
125
|
+
const shared = SharedInputSchema.parse(input);
|
|
126
|
+
const { frozen_digest, ...body } = shared;
|
|
127
|
+
if (digest(body) !== frozen_digest || shared.sources.some((source) => bytesDigest(source.content) !== source.sha256 || Buffer.byteLength(source.content, "utf8") !== source.size_bytes)) {
|
|
128
|
+
throw new Error("frozen shared input integrity mismatch");
|
|
129
|
+
}
|
|
130
|
+
const refs = ["requirements", ...shared.sources.map((source) => source.source_ref)];
|
|
131
|
+
if (new Set(refs).size !== refs.length || canonicalJson(refs) !== canonicalJson(shared.source_refs))
|
|
132
|
+
throw new Error("frozen source references conflict");
|
|
133
|
+
assertBounded(shared, MAX_SHARED_BYTES);
|
|
134
|
+
return shared;
|
|
135
|
+
}
|
|
136
|
+
export function assertReferences(body, shared) {
|
|
137
|
+
if (body.frozen_digest !== shared.frozen_digest)
|
|
138
|
+
throw new Error("artifact frozen digest does not match shared input");
|
|
139
|
+
if (body.source_refs.some((ref) => !shared.source_refs.includes(ref)))
|
|
140
|
+
throw new Error("artifact cites an undelivered source reference");
|
|
141
|
+
}
|
|
142
|
+
// Reject clear self-attribution without deleting legitimate technical references
|
|
143
|
+
// to a CLI or model name. This does not prove semantic anonymity of arbitrary prose.
|
|
144
|
+
export function assertNoSelfAttribution(candidate) {
|
|
145
|
+
if (/\b(?:i am|i'm|authored by|written by|my (?:model|provider|seat|route) is)\s+(?:an?\s+)?(?:codex|claude|grok|gemini|chatgpt|openai|anthropic)\b/i.test(canonicalJson(candidate))) {
|
|
146
|
+
throw new Error("candidate contains explicit author self-attribution");
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/architecture-comparison/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ArtifactRecord } from "../artifacts.js";
|
|
2
|
+
import type { NormalizedWorkflowDefinition } from "../definition-normalizer.js";
|
|
3
|
+
import type { EngineResumeState } from "../engine.js";
|
|
4
|
+
export declare function inspectArchitectureComparisonRecord(runDir: string, runId: string, includeResult: boolean): Promise<Record<string, unknown>>;
|
|
5
|
+
/** Fixed-method policy and evidence storage; all dispatch/lifecycle stays in WorkflowEngine. */
|
|
6
|
+
export declare class ArchitectureComparisonRuntime {
|
|
7
|
+
private readonly definition;
|
|
8
|
+
private readonly variables;
|
|
9
|
+
private readonly runId;
|
|
10
|
+
private readonly runDir;
|
|
11
|
+
private readonly allowedRoots;
|
|
12
|
+
private state;
|
|
13
|
+
private shared;
|
|
14
|
+
private sourceFiles;
|
|
15
|
+
private writeSequence;
|
|
16
|
+
private readonly retainedBodies;
|
|
17
|
+
constructor(definition: NormalizedWorkflowDefinition, variables: Readonly<Record<string, unknown>>, runId: string, runDir: string, allowedRoots: readonly string[]);
|
|
18
|
+
restore(resume: EngineResumeState | undefined): Promise<void>;
|
|
19
|
+
freeze(variables: Readonly<Record<string, unknown>>): Promise<string>;
|
|
20
|
+
makeJudgeView(artifacts: readonly ArtifactRecord[]): Promise<string>;
|
|
21
|
+
comparison(artifacts: readonly ArtifactRecord[]): Promise<string>;
|
|
22
|
+
validateOutput(reference: string, parsed: unknown): void;
|
|
23
|
+
recordWritten(artifact: ArtifactRecord): void;
|
|
24
|
+
beforeDispatch(reference: string, input: Readonly<Record<string, unknown>>): Promise<void>;
|
|
25
|
+
private validatePrepared;
|
|
26
|
+
private requireShared;
|
|
27
|
+
private readRetained;
|
|
28
|
+
private verifyRetained;
|
|
29
|
+
}
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { closeSync, existsSync, openSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { basename, join, relative } from "node:path";
|
|
3
|
+
import { readContainedAbsoluteFile, readContainedRelativeFile } from "../contained-file.js";
|
|
4
|
+
import { renderContextSummary } from "../template.js";
|
|
5
|
+
import { logger } from "../logger.js";
|
|
6
|
+
import { ALIASES, ARCHITECTURE_STATE_PATH, ArchitectureStateSchema, CANDIDATE_REFS, CandidateSchema, ComparisonRecordSchema, JUDGE_REF, JudgeSchema, JudgeViewSchema, MAX_CANDIDATE_BYTES, MAX_JUDGE_BYTES, MAX_RECORD_BYTES, MAX_SHARED_BYTES, MAX_VIEW_BYTES, RECORD_REF, SHARED_REF, VIEW_REF, assertBounded, assertNoSelfAttribution, assertReferences, assertSharedInput, bytesDigest, canonicalJson, digest, serialized, } from "./contract.js";
|
|
7
|
+
const KNOWN_REFS = [SHARED_REF, ...CANDIDATE_REFS, VIEW_REF, JUDGE_REF, RECORD_REF];
|
|
8
|
+
function variablesIdentity(variables) {
|
|
9
|
+
const { context_bundle_files: _preflightCopies, ...caller } = variables;
|
|
10
|
+
return digest(caller);
|
|
11
|
+
}
|
|
12
|
+
const PATHS = {
|
|
13
|
+
[SHARED_REF]: "artifacts/freeze/01-input.json",
|
|
14
|
+
[CANDIDATE_REFS[0]]: "artifacts/candidates/01-author_a.json",
|
|
15
|
+
[CANDIDATE_REFS[1]]: "artifacts/candidates/02-author_b.json",
|
|
16
|
+
[VIEW_REF]: "artifacts/judge_view/01-view.json",
|
|
17
|
+
[JUDGE_REF]: "artifacts/judge/01-judge.json",
|
|
18
|
+
[RECORD_REF]: "artifacts/comparison/01-record.json",
|
|
19
|
+
};
|
|
20
|
+
function assertRecordBinding(parsed, state, shared, bodies) {
|
|
21
|
+
const record = ComparisonRecordSchema.parse(parsed);
|
|
22
|
+
if (state === undefined || shared === undefined) {
|
|
23
|
+
if (record.status !== "incomplete" || record.candidates.length !== 0 || record.judge !== undefined || record.evidence.length !== 0 || record.frozen_digest !== undefined)
|
|
24
|
+
throw new Error("comparison record has no frozen evidence authority");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (record.run_id !== state.run_id || record.frozen_digest !== shared.frozen_digest || record.source_identity !== shared.source_identity)
|
|
28
|
+
throw new Error("comparison record differs from frozen input identity");
|
|
29
|
+
const expectedEvidence = Object.entries(state.artifacts).filter(([ref]) => ref !== RECORD_REF).map(([reference, fact]) => ({ reference, ...fact }));
|
|
30
|
+
if (canonicalJson(record.evidence) !== canonicalJson(expectedEvidence))
|
|
31
|
+
throw new Error("comparison record references differ from retained evidence");
|
|
32
|
+
for (const candidate of record.candidates) {
|
|
33
|
+
const index = ALIASES.indexOf(candidate.alias);
|
|
34
|
+
if (canonicalJson(candidate.route) !== canonicalJson(state.routes[candidate.alias]) || canonicalJson(candidate.body) !== canonicalJson(bodies.get(CANDIDATE_REFS[index])))
|
|
35
|
+
throw new Error("comparison candidate does not match its retained author artifact");
|
|
36
|
+
}
|
|
37
|
+
if (record.judge !== undefined && canonicalJson(record.judge) !== canonicalJson(bodies.get(JUDGE_REF)))
|
|
38
|
+
throw new Error("comparison judge differs from retained judgment");
|
|
39
|
+
if (record.status === "complete" && (!state.artifacts[VIEW_REF] || !state.artifacts[JUDGE_REF] || record.candidates.some((candidate) => !state.artifacts[CANDIDATE_REFS[ALIASES.indexOf(candidate.alias)]])))
|
|
40
|
+
throw new Error("complete comparison lacks retained delivered evidence");
|
|
41
|
+
}
|
|
42
|
+
export async function inspectArchitectureComparisonRecord(runDir, runId, includeResult) {
|
|
43
|
+
const recordPath = PATHS[RECORD_REF];
|
|
44
|
+
if (!existsSync(join(runDir, recordPath)))
|
|
45
|
+
return { status: "unrecorded", owner_acceptance: "not_recorded" };
|
|
46
|
+
try {
|
|
47
|
+
const recordRead = await readContainedRelativeFile(runDir, recordPath, { wantContent: true, requireRegular: true, requireExactRequestedPath: true, maxBytes: MAX_RECORD_BYTES });
|
|
48
|
+
const record = ComparisonRecordSchema.parse(JSON.parse(recordRead.content));
|
|
49
|
+
if (record.run_id !== runId)
|
|
50
|
+
throw new Error("comparison run identity mismatch");
|
|
51
|
+
if (existsSync(join(runDir, ARCHITECTURE_STATE_PATH))) {
|
|
52
|
+
const sidecarRead = await readContainedRelativeFile(runDir, ARCHITECTURE_STATE_PATH, { wantContent: true, requireRegular: true, requireExactRequestedPath: true, maxBytes: MAX_RECORD_BYTES });
|
|
53
|
+
const sidecar = ArchitectureStateSchema.parse(JSON.parse(sidecarRead.content));
|
|
54
|
+
if (sidecar.run_id !== runId || sidecar.artifacts[RECORD_REF]?.sha256 !== bytesDigest(recordRead.content) || sidecar.artifacts[RECORD_REF]?.path !== recordPath || sidecar.frozen_digest !== record.frozen_digest)
|
|
55
|
+
throw new Error("comparison retained record identity mismatch");
|
|
56
|
+
const bodies = new Map();
|
|
57
|
+
for (const [ref, fact] of Object.entries(sidecar.artifacts)) {
|
|
58
|
+
if (fact.path !== PATHS[ref])
|
|
59
|
+
throw new Error("comparison artifact reference mismatch");
|
|
60
|
+
const read = await readContainedRelativeFile(runDir, fact.path, { wantContent: true, requireRegular: true, requireExactRequestedPath: true, maxBytes: MAX_RECORD_BYTES });
|
|
61
|
+
if (bytesDigest(read.content) !== fact.sha256)
|
|
62
|
+
throw new Error("comparison evidence integrity mismatch");
|
|
63
|
+
bodies.set(ref, JSON.parse(read.content));
|
|
64
|
+
}
|
|
65
|
+
const shared = assertSharedInput(bodies.get(SHARED_REF));
|
|
66
|
+
for (const ref of CANDIDATE_REFS) {
|
|
67
|
+
if (!bodies.has(ref))
|
|
68
|
+
continue;
|
|
69
|
+
const candidate = CandidateSchema.parse(bodies.get(ref));
|
|
70
|
+
assertBounded(candidate, MAX_CANDIDATE_BYTES);
|
|
71
|
+
assertReferences(candidate, shared);
|
|
72
|
+
assertNoSelfAttribution(candidate);
|
|
73
|
+
}
|
|
74
|
+
if (bodies.has(JUDGE_REF)) {
|
|
75
|
+
const judge = JudgeSchema.parse(bodies.get(JUDGE_REF));
|
|
76
|
+
assertBounded(judge, MAX_JUDGE_BYTES);
|
|
77
|
+
assertReferences(judge, shared);
|
|
78
|
+
}
|
|
79
|
+
if (bodies.has(VIEW_REF)) {
|
|
80
|
+
const view = JudgeViewSchema.parse(bodies.get(VIEW_REF));
|
|
81
|
+
assertBounded(view, MAX_VIEW_BYTES);
|
|
82
|
+
if (canonicalJson(view.shared) !== canonicalJson(shared) || view.candidates.some((entry, index) => canonicalJson(entry.body) !== canonicalJson(bodies.get(CANDIDATE_REFS[index]))))
|
|
83
|
+
throw new Error("comparison judge view is not the retained alias projection");
|
|
84
|
+
}
|
|
85
|
+
assertRecordBinding(record, sidecar, shared, bodies);
|
|
86
|
+
}
|
|
87
|
+
else if (record.status === "complete")
|
|
88
|
+
throw new Error("comparison has no retained frozen-input proof");
|
|
89
|
+
return { status: record.status, missing: record.missing, owner_acceptance: "not_recorded", artifact_path: recordPath, ...(record.frozen_digest !== undefined ? { frozen_digest: record.frozen_digest } : {}), ...(includeResult ? { result: recordRead.content } : {}) };
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return { status: "unavailable", reason: "retained_record_missing_malformed_or_mismatched", owner_acceptance: "not_recorded" };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Fixed-method policy and evidence storage; all dispatch/lifecycle stays in WorkflowEngine. */
|
|
96
|
+
export class ArchitectureComparisonRuntime {
|
|
97
|
+
definition;
|
|
98
|
+
variables;
|
|
99
|
+
runId;
|
|
100
|
+
runDir;
|
|
101
|
+
allowedRoots;
|
|
102
|
+
state;
|
|
103
|
+
shared;
|
|
104
|
+
sourceFiles = [];
|
|
105
|
+
writeSequence = 0;
|
|
106
|
+
retainedBodies = new Map();
|
|
107
|
+
constructor(definition, variables, runId, runDir, allowedRoots) {
|
|
108
|
+
this.definition = definition;
|
|
109
|
+
this.variables = variables;
|
|
110
|
+
this.runId = runId;
|
|
111
|
+
this.runDir = runDir;
|
|
112
|
+
this.allowedRoots = allowedRoots;
|
|
113
|
+
const shape = definition.stages.map((stage) => [stage.id, stage.calls.map((call) => call.id)]);
|
|
114
|
+
if (canonicalJson(shape) !== canonicalJson([["freeze", ["input"]], ["candidates", ["author_a", "author_b"]], ["judge_view", ["view"]], ["judge", ["judge"]], ["comparison", ["record"]]]))
|
|
115
|
+
throw new Error("architecture workflow topology does not match v1");
|
|
116
|
+
}
|
|
117
|
+
async restore(resume) {
|
|
118
|
+
const sidecarExists = existsSync(join(this.runDir, ARCHITECTURE_STATE_PATH));
|
|
119
|
+
const hasCompletedFreeze = resume?.completedCalls?.has(SHARED_REF) === true;
|
|
120
|
+
const hasPrepared = (resume?.preparedInputs?.size ?? 0) > 0;
|
|
121
|
+
if (!sidecarExists) {
|
|
122
|
+
if (hasCompletedFreeze || hasPrepared)
|
|
123
|
+
throw new Error("architecture resume is missing its frozen-input sidecar");
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const sidecar = await readContainedRelativeFile(this.runDir, ARCHITECTURE_STATE_PATH, { wantContent: true, requireRegular: true, requireExactRequestedPath: true, maxBytes: MAX_RECORD_BYTES });
|
|
127
|
+
this.state = ArchitectureStateSchema.parse(JSON.parse(sidecar.content));
|
|
128
|
+
if (this.state.run_id !== this.runId || this.state.definition_sha256 !== digest(this.definition) || this.state.variables_sha256 !== variablesIdentity(this.variables))
|
|
129
|
+
throw new Error("architecture resume definition/input identity mismatch");
|
|
130
|
+
if (Object.keys(this.state.artifacts).some((ref) => !KNOWN_REFS.includes(ref)))
|
|
131
|
+
throw new Error("architecture sidecar contains an unexpected artifact reference");
|
|
132
|
+
for (const [ref, fact] of Object.entries(this.state.artifacts)) {
|
|
133
|
+
if (fact.path !== PATHS[ref])
|
|
134
|
+
throw new Error("architecture artifact path conflicts with its bound reference");
|
|
135
|
+
const artifact = await this.readRetained(ref);
|
|
136
|
+
if (ref === SHARED_REF)
|
|
137
|
+
this.shared = assertSharedInput(artifact);
|
|
138
|
+
}
|
|
139
|
+
if (this.shared === undefined || this.shared.frozen_digest !== this.state.frozen_digest)
|
|
140
|
+
throw new Error("architecture sidecar shared-input identity mismatch");
|
|
141
|
+
for (const ref of Object.keys(this.state.artifacts))
|
|
142
|
+
this.validateOutput(ref, await this.readRetained(ref));
|
|
143
|
+
for (const [ref, call] of resume?.completedCalls ?? []) {
|
|
144
|
+
const fact = this.state.artifacts[ref];
|
|
145
|
+
if (fact === undefined || call.artifact === undefined || relative(this.runDir, call.artifact.filePath).replaceAll("\\", "/") !== fact.path || canonicalJson(call.artifact.parsed) !== canonicalJson(await this.readRetained(ref)))
|
|
146
|
+
throw new Error(`architecture completed artifact ${ref} conflicts with retained proof`);
|
|
147
|
+
}
|
|
148
|
+
for (const [ref, prepared] of resume?.preparedInputs ?? [])
|
|
149
|
+
this.validatePrepared(ref, prepared);
|
|
150
|
+
// A resumed design must still name the source bytes initially supplied.
|
|
151
|
+
// Authors and judge nevertheless receive the retained copy, never live files.
|
|
152
|
+
for (const source of this.state.source_files) {
|
|
153
|
+
const current = await readContainedAbsoluteFile(this.allowedRoots, source.path, { wantBytes: true, requireRegular: true, maxBytes: MAX_SHARED_BYTES });
|
|
154
|
+
if (bytesDigest(current.bytes) !== source.sha256)
|
|
155
|
+
throw new Error("architecture resume source content changed");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async freeze(variables) {
|
|
159
|
+
if (this.shared !== undefined)
|
|
160
|
+
return serialized(this.shared);
|
|
161
|
+
const paths = [...new Set([...(variables["context_files"] ?? []), ...(variables["context_bundle_files"] ?? [])])];
|
|
162
|
+
if (paths.length > 32)
|
|
163
|
+
throw new Error("architecture shared input exceeds 32 files");
|
|
164
|
+
const sources = [];
|
|
165
|
+
this.sourceFiles = [];
|
|
166
|
+
for (const [index, path] of paths.entries()) {
|
|
167
|
+
const read = await readContainedAbsoluteFile(this.allowedRoots, path, { wantContent: true, wantBytes: true, requireRegular: true, maxBytes: MAX_SHARED_BYTES });
|
|
168
|
+
if (!Buffer.from(read.content, "utf8").equals(read.bytes))
|
|
169
|
+
throw new Error("architecture source files must contain valid UTF-8");
|
|
170
|
+
const sha256 = bytesDigest(read.bytes);
|
|
171
|
+
sources.push({ source_ref: `source_${String(index + 1).padStart(3, "0")}`, sha256, size_bytes: read.size, content: read.content });
|
|
172
|
+
this.sourceFiles.push({ path: read.realPath, sha256 });
|
|
173
|
+
}
|
|
174
|
+
const body = { schema_version: "architecture-shared-input-v1", requirements: this.variables["user_request"], source_identity: this.variables["source_identity"], sources, source_refs: ["requirements", ...sources.map((source) => source.source_ref)] };
|
|
175
|
+
this.shared = assertSharedInput({ ...body, frozen_digest: digest(body) });
|
|
176
|
+
return serialized(this.shared);
|
|
177
|
+
}
|
|
178
|
+
async makeJudgeView(artifacts) {
|
|
179
|
+
await this.verifyRetained();
|
|
180
|
+
const shared = this.requireShared();
|
|
181
|
+
const candidates = CANDIDATE_REFS.map((reference, index) => {
|
|
182
|
+
const artifact = artifacts.find((entry) => entry.reference === reference);
|
|
183
|
+
if (artifact === undefined)
|
|
184
|
+
throw new Error(`comparison incomplete: missing ${ALIASES[index]}`);
|
|
185
|
+
const body = CandidateSchema.parse(artifact.parsed);
|
|
186
|
+
assertReferences(body, shared);
|
|
187
|
+
assertNoSelfAttribution(body);
|
|
188
|
+
// Strict parse is the semantic allowlist. No transport field or original
|
|
189
|
+
// filename is copied into the judge packet.
|
|
190
|
+
return { alias: ALIASES[index], body };
|
|
191
|
+
});
|
|
192
|
+
const view = JudgeViewSchema.parse({ schema_version: "architecture-judge-view-v1", shared, candidates });
|
|
193
|
+
assertBounded(view, MAX_VIEW_BYTES);
|
|
194
|
+
return serialized(view);
|
|
195
|
+
}
|
|
196
|
+
async comparison(artifacts) {
|
|
197
|
+
const missing = [];
|
|
198
|
+
try {
|
|
199
|
+
await this.verifyRetained();
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
missing.push("retained evidence integrity");
|
|
203
|
+
}
|
|
204
|
+
const shared = this.shared;
|
|
205
|
+
const candidates = CANDIDATE_REFS.flatMap((reference, index) => {
|
|
206
|
+
const artifact = artifacts.find((entry) => entry.reference === reference);
|
|
207
|
+
if (artifact === undefined || this.state?.artifacts[reference] === undefined) {
|
|
208
|
+
missing.push(ALIASES[index]);
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
this.validateOutput(reference, artifact.parsed);
|
|
213
|
+
return [{ alias: ALIASES[index], route: this.state.routes[ALIASES[index]], body: CandidateSchema.parse(artifact.parsed) }];
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
missing.push(`${ALIASES[index]} invalid evidence`);
|
|
217
|
+
return [];
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
let judge;
|
|
221
|
+
const judgeArtifact = artifacts.find((entry) => entry.reference === JUDGE_REF);
|
|
222
|
+
try {
|
|
223
|
+
if (judgeArtifact === undefined || this.state?.artifacts[JUDGE_REF] === undefined || this.state.artifacts[VIEW_REF] === undefined)
|
|
224
|
+
throw new Error("missing judge");
|
|
225
|
+
this.validateOutput(JUDGE_REF, judgeArtifact.parsed);
|
|
226
|
+
judge = JudgeSchema.parse(judgeArtifact.parsed);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
missing.push("independent judge");
|
|
230
|
+
}
|
|
231
|
+
if (shared === undefined)
|
|
232
|
+
missing.push("frozen shared input");
|
|
233
|
+
const record = ComparisonRecordSchema.parse({
|
|
234
|
+
schema_version: "architecture-comparison-record-v1", run_id: this.runId,
|
|
235
|
+
status: missing.length === 0 ? "complete" : "incomplete", missing,
|
|
236
|
+
...(shared !== undefined ? { frozen_digest: shared.frozen_digest, source_identity: shared.source_identity } : {}),
|
|
237
|
+
evidence: Object.entries(this.state?.artifacts ?? {}).filter(([ref]) => ref !== RECORD_REF).map(([reference, fact]) => ({ reference, ...fact })),
|
|
238
|
+
candidates, ...(judge !== undefined ? { judge } : {}),
|
|
239
|
+
owner_acceptance: "not_recorded",
|
|
240
|
+
owner_next_steps: ["Review the judge recommendation independently, synthesize the design and record the owner decision.", "Verify any implementation or prototype before acceptance."],
|
|
241
|
+
limitations: [
|
|
242
|
+
"Complete means the comparison artifacts passed structural and identity checks; the judge recommendation is advisory and is not correctness proof or owner acceptance.",
|
|
243
|
+
"Source identity is caller-declared; retained bytes establish only the delivered packet scope.",
|
|
244
|
+
"Free-text self-attribution detection is bounded and does not prove semantic anonymity.",
|
|
245
|
+
"Only structured source references and aliases are validated; prose citations and design correctness require independent assessment.",
|
|
246
|
+
this.variables["judge_prompt_token_limit"] === undefined ? "Judge token capacity is unknown; input is constrained by small artifact caps and the workflow byte budget." : "Caller declared judge capacity; conservative byte-token upper bound checked at admission.",
|
|
247
|
+
],
|
|
248
|
+
});
|
|
249
|
+
assertBounded(record, MAX_RECORD_BYTES);
|
|
250
|
+
return serialized(record);
|
|
251
|
+
}
|
|
252
|
+
validateOutput(reference, parsed) {
|
|
253
|
+
if (reference === SHARED_REF) {
|
|
254
|
+
this.shared = assertSharedInput(parsed);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (reference === RECORD_REF) {
|
|
258
|
+
assertRecordBinding(parsed, this.state, this.shared, this.retainedBodies);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const shared = this.requireShared();
|
|
262
|
+
if (CANDIDATE_REFS.some((ref) => ref === reference)) {
|
|
263
|
+
const candidate = CandidateSchema.parse(parsed);
|
|
264
|
+
assertBounded(candidate, MAX_CANDIDATE_BYTES);
|
|
265
|
+
assertReferences(candidate, shared);
|
|
266
|
+
assertNoSelfAttribution(candidate);
|
|
267
|
+
}
|
|
268
|
+
else if (reference === VIEW_REF) {
|
|
269
|
+
const view = JudgeViewSchema.parse(parsed);
|
|
270
|
+
assertBounded(view, MAX_VIEW_BYTES);
|
|
271
|
+
if (canonicalJson(view.shared) !== canonicalJson(shared))
|
|
272
|
+
throw new Error("judge shared context differs from frozen author context");
|
|
273
|
+
for (const [index, candidate] of view.candidates.entries()) {
|
|
274
|
+
assertReferences(candidate.body, shared);
|
|
275
|
+
assertNoSelfAttribution(candidate.body);
|
|
276
|
+
const expected = this.state?.artifacts[CANDIDATE_REFS[index]];
|
|
277
|
+
if (expected === undefined || bytesDigest(serialized(candidate.body)) !== expected.sha256)
|
|
278
|
+
throw new Error("judge candidate view conflicts with retained author artifact");
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else if (reference === JUDGE_REF) {
|
|
282
|
+
const judge = JudgeSchema.parse(parsed);
|
|
283
|
+
assertBounded(judge, MAX_JUDGE_BYTES);
|
|
284
|
+
assertReferences(judge, shared);
|
|
285
|
+
if (this.state?.artifacts[VIEW_REF] === undefined)
|
|
286
|
+
throw new Error("judge has no retained delivered alias view");
|
|
287
|
+
}
|
|
288
|
+
else
|
|
289
|
+
throw new Error(`unexpected architecture artifact ${reference}`);
|
|
290
|
+
}
|
|
291
|
+
recordWritten(artifact) {
|
|
292
|
+
const path = relative(this.runDir, artifact.filePath).replaceAll("\\", "/");
|
|
293
|
+
if (path !== PATHS[artifact.reference])
|
|
294
|
+
throw new Error("architecture artifact does not match the fixed storage reference");
|
|
295
|
+
if (this.state === undefined) {
|
|
296
|
+
if (artifact.reference !== SHARED_REF)
|
|
297
|
+
return;
|
|
298
|
+
const route = (stageId, callId) => {
|
|
299
|
+
const call = this.definition.stages.find((stage) => stage.id === stageId).calls.find((call) => call.id === callId);
|
|
300
|
+
return { cli_name: call.cli_name, ...(call.model !== undefined ? { model: call.model } : {}), ...(call.effort !== undefined ? { effort: call.effort } : {}) };
|
|
301
|
+
};
|
|
302
|
+
this.state = ArchitectureStateSchema.parse({ schema_version: "architecture-comparison-state-v1", run_id: this.runId, definition_sha256: digest(this.definition), variables_sha256: variablesIdentity(this.variables), frozen_digest: this.requireShared().frozen_digest, routes: { candidate_A: route("candidates", "author_a"), candidate_B: route("candidates", "author_b"), judge: route("judge", "judge") }, source_files: this.sourceFiles, artifacts: {} });
|
|
303
|
+
}
|
|
304
|
+
const sha256 = bytesDigest(serialized(artifact.parsed));
|
|
305
|
+
const previous = this.state.artifacts[artifact.reference];
|
|
306
|
+
if (previous !== undefined && (previous.path !== path || previous.sha256 !== sha256))
|
|
307
|
+
throw new Error("conflicting architecture artifact replay");
|
|
308
|
+
this.state.artifacts[artifact.reference] = { path, sha256 };
|
|
309
|
+
this.retainedBodies.set(artifact.reference, artifact.parsed);
|
|
310
|
+
const temporary = join(this.runDir, `${ARCHITECTURE_STATE_PATH}.${process.pid}.${this.writeSequence++}.tmp`);
|
|
311
|
+
const fd = openSync(temporary, "wx", 0o600);
|
|
312
|
+
let closed = false;
|
|
313
|
+
try {
|
|
314
|
+
writeFileSync(fd, serialized(this.state));
|
|
315
|
+
closeSync(fd);
|
|
316
|
+
closed = true;
|
|
317
|
+
renameSync(temporary, join(this.runDir, ARCHITECTURE_STATE_PATH));
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
if (!closed) {
|
|
321
|
+
try {
|
|
322
|
+
closeSync(fd);
|
|
323
|
+
}
|
|
324
|
+
catch (cleanupError) {
|
|
325
|
+
logger.warn({ run_id: this.runId, err: cleanupError }, "architecture temporary descriptor cleanup failed");
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
unlinkSync(temporary);
|
|
330
|
+
}
|
|
331
|
+
catch (cleanupError) {
|
|
332
|
+
logger.warn({ run_id: this.runId, err: cleanupError }, "owned architecture temporary file cleanup failed");
|
|
333
|
+
}
|
|
334
|
+
throw error;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
async beforeDispatch(reference, input) {
|
|
338
|
+
await this.verifyRetained();
|
|
339
|
+
this.validatePrepared(reference, input);
|
|
340
|
+
}
|
|
341
|
+
validatePrepared(reference, input) {
|
|
342
|
+
const required = reference === JUDGE_REF ? VIEW_REF : CANDIDATE_REFS.some((ref) => ref === reference) ? SHARED_REF : undefined;
|
|
343
|
+
if (required === undefined)
|
|
344
|
+
throw new Error("architecture prepared provider reference is unexpected");
|
|
345
|
+
const expectedPaths = [join(this.runDir, PATHS[required])];
|
|
346
|
+
if (canonicalJson(input["absolute_file_paths"]) !== canonicalJson(expectedPaths) || input["continuation_id"] !== undefined || input["images"] !== undefined)
|
|
347
|
+
throw new Error("architecture prepared input is not the isolated frozen packet");
|
|
348
|
+
const expectedCall = this.definition.stages.flatMap((stage) => stage.calls.map((call) => ({ reference: `${stage.id}.${call.id}`, call }))).find((entry) => entry.reference === reference).call;
|
|
349
|
+
const allowedKeys = ["cli_name", "role", "model", "effort", "prompt", "absolute_file_paths", "context", "timeout_seconds", "max_response_chars", "expect_json"];
|
|
350
|
+
const body = this.retainedBodies.get(required);
|
|
351
|
+
const expectedContext = body === undefined ? undefined : renderContextSummary(required.split(".")[0], [{ filename: basename(PATHS[required]), sizeBytes: Buffer.byteLength(serialized(body), "utf8") }]);
|
|
352
|
+
if (Object.keys(input).some((key) => !allowedKeys.includes(key)) || input["cli_name"] !== expectedCall.cli_name || input["role"] !== "json" || input["model"] !== expectedCall.model || input["effort"] !== expectedCall.effort || input["prompt"] !== expectedCall.prompt || input["context"] !== expectedContext || input["expect_json"] !== true || input["timeout_seconds"] !== expectedCall.timeout_seconds || input["max_response_chars"] !== expectedCall.max_response_chars)
|
|
353
|
+
throw new Error("architecture prepared invocation conflicts with its frozen contract");
|
|
354
|
+
if (this.state?.artifacts[required] === undefined)
|
|
355
|
+
throw new Error("architecture dispatch is missing its required frozen artifact");
|
|
356
|
+
}
|
|
357
|
+
requireShared() {
|
|
358
|
+
if (this.shared === undefined)
|
|
359
|
+
throw new Error("comparison incomplete: frozen shared input missing");
|
|
360
|
+
return this.shared;
|
|
361
|
+
}
|
|
362
|
+
async readRetained(reference) {
|
|
363
|
+
const fact = this.state?.artifacts[reference];
|
|
364
|
+
if (fact === undefined)
|
|
365
|
+
throw new Error(`comparison incomplete: missing ${reference}`);
|
|
366
|
+
const read = await readContainedRelativeFile(this.runDir, fact.path, { wantContent: true, requireRegular: true, requireExactRequestedPath: true, maxBytes: reference === RECORD_REF ? MAX_RECORD_BYTES : reference === VIEW_REF ? MAX_VIEW_BYTES : reference === SHARED_REF ? MAX_SHARED_BYTES : reference === JUDGE_REF ? MAX_JUDGE_BYTES : MAX_CANDIDATE_BYTES });
|
|
367
|
+
if (bytesDigest(read.content) !== fact.sha256)
|
|
368
|
+
throw new Error(`retained architecture artifact ${reference} integrity mismatch`);
|
|
369
|
+
const body = JSON.parse(read.content);
|
|
370
|
+
this.retainedBodies.set(reference, body);
|
|
371
|
+
return body;
|
|
372
|
+
}
|
|
373
|
+
async verifyRetained() {
|
|
374
|
+
if (this.state === undefined)
|
|
375
|
+
throw new Error("comparison incomplete: frozen input unavailable");
|
|
376
|
+
const snapshot = canonicalJson(this.state);
|
|
377
|
+
const read = await readContainedRelativeFile(this.runDir, ARCHITECTURE_STATE_PATH, { wantContent: true, requireRegular: true, requireExactRequestedPath: true, maxBytes: MAX_RECORD_BYTES });
|
|
378
|
+
const retained = canonicalJson(ArchitectureStateSchema.parse(JSON.parse(read.content)));
|
|
379
|
+
// Parallel author completion can commit a new host-owned sidecar while this
|
|
380
|
+
// read is in flight. Only compare a stable revision, then inspect all facts.
|
|
381
|
+
if (snapshot === canonicalJson(this.state) && retained !== snapshot)
|
|
382
|
+
throw new Error("architecture sidecar changed during execution");
|
|
383
|
+
for (const reference of Object.keys(this.state.artifacts))
|
|
384
|
+
this.validateOutput(reference, await this.readRetained(reference));
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/architecture-comparison/runtime.ts"],"names":[],"mappings":"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"}
|