/*
identity — certification identity diagnostics and identity verification helper functions.
- Do not issue identities — this module verifies them.
- RFC-1097: sweep — werkstatt-engine clean
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.
*/
import {
snapshotCanonicalJsonObjectV1,
canonicalJsonHashV1,
type CanonicalJsonObjectV1,
} from "@warpgogol/werkstatt-shared/fingerprint";
import type { Sha256Digest } from "@warpgogol/werkstatt-shared/fingerprint";
import type {
ReleaseCandidateV1,
CertificationPolicyBundleV1,
EvidenceEnvelopeV1,
CertificationDossierEventV1,
GateDecisionV1,
MainVerificationDecisionV1,
CertificationHealthDecisionV1,
CertificationActionPackV1,
DeploymentOperationEventV1,
} from "./contracts/index.ts";
export type CertificationIdentityDiagnosticV1 = {
readonly code:
| "CERT-IDENTITY-01"
| "CERT-CANONICAL-DOMAIN-01"
| "CERT-CANONICAL-TRAVERSAL-01"
| "CERT-CANONICAL-UNICODE-01"
| "CERT-CANONICAL-LIMIT-01"
| "CERT-REDACTION-01";
readonly message: string;
};
export type IdentityBuildResultV1 =
| {
readonly ok: true;
readonly payload: TPayload;
readonly canonical: CanonicalJsonObjectV1;
readonly digest: Sha256Digest;
}
| { readonly ok: false; readonly diagnostic: CertificationIdentityDiagnosticV1 };
function snapshotAndHash(payload: unknown): IdentityBuildResultV1 {
const result = snapshotCanonicalJsonObjectV1(payload);
if (!result.ok) {
return {
ok: false,
diagnostic: {
code: result.code as CertificationIdentityDiagnosticV1["code"],
message: result.message,
},
};
}
const digest = canonicalJsonHashV1(result.value);
return { ok: true, payload, canonical: result.value, digest };
}
export type ReleaseCandidateIdentityPayloadV1 = {
readonly schema: "werkstatt/release-candidate-identity@1";
readonly systemId: string;
readonly releaseVersion: string;
readonly sourceHash: string;
readonly contentHash: string;
readonly artifactHash: string;
readonly buildConfigHash: string;
readonly deploymentPlanHash: string;
readonly policyBundleRoot: string;
readonly toolchainId: string;
};
export function buildReleaseCandidateIdentityV1(
input: ReleaseCandidateV1,
): IdentityBuildResultV1 {
const payload: ReleaseCandidateIdentityPayloadV1 = {
schema: "werkstatt/release-candidate-identity@1",
systemId: input.systemId,
releaseVersion: input.releaseVersion,
sourceHash: input.sourceHash,
contentHash: input.contentHash,
artifactHash: input.artifactHash,
buildConfigHash: input.buildConfig.buildConfigHash,
deploymentPlanHash: input.deploymentPlan.deploymentPlanHash,
policyBundleRoot: input.policyBundleRoot,
toolchainId: input.toolchainId,
};
const result = snapshotAndHash(payload);
if (!result.ok) return result;
return result as IdentityBuildResultV1;
}
export type PolicyBundleIdentityPayloadV1 = {
readonly schema: "werkstatt/policy-bundle-identity@1";
readonly policyBundleId: string;
readonly version: string;
readonly profileId: string;
readonly resolvedRequirements: readonly unknown[];
readonly producerManifests: readonly unknown[];
readonly rubricManifests: readonly unknown[];
readonly toolchainManifests: readonly unknown[];
readonly issuerManifests: readonly unknown[];
readonly riskPolicy: unknown;
readonly retention: unknown;
};
export function buildPolicyBundleIdentityV1(
input: CertificationPolicyBundleV1,
): IdentityBuildResultV1 {
const payload: PolicyBundleIdentityPayloadV1 = {
schema: "werkstatt/policy-bundle-identity@1",
policyBundleId: input.policyBundleId,
version: input.version,
profileId: input.profileId,
resolvedRequirements: input.resolvedRequirements,
producerManifests: input.producerManifests,
rubricManifests: input.rubricManifests,
toolchainManifests: input.toolchainManifests,
issuerManifests: input.issuerManifests,
riskPolicy: input.riskPolicy,
retention: input.retention,
};
const result = snapshotAndHash(payload);
if (!result.ok) return result;
return result as IdentityBuildResultV1;
}
export type EvidenceIdentityPayloadV1 = {
readonly schema: "werkstatt/evidence-identity@1";
readonly candidateId: string;
readonly producerId: string;
readonly producerAttemptId: string;
readonly producedAt: string;
readonly result: unknown;
readonly payloads: readonly unknown[];
readonly redaction: unknown;
readonly attestation: unknown;
readonly authorityAdmission: unknown;
readonly freshness: unknown;
};
export function buildEvidenceIdentityV1(
input: EvidenceEnvelopeV1,
): IdentityBuildResultV1 {
if (!input.redaction.resolved) {
return {
ok: false,
diagnostic: {
code: "CERT-REDACTION-01",
message: "evidence reports unresolved secret or PII exposure",
},
};
}
const payload: EvidenceIdentityPayloadV1 = {
schema: "werkstatt/evidence-identity@1",
candidateId: input.candidateId,
producerId: input.producerId,
producerAttemptId: input.producerAttemptId,
producedAt: input.producedAt,
result: input.result,
payloads: input.payloads.map((p) => ({
payloadDigest: p.payloadDigest,
mediaType: p.mediaType,
sizeBytes: p.sizeBytes,
role: p.role,
})),
redaction: input.redaction,
attestation: input.attestation ?? null,
authorityAdmission: input.authorityAdmission ?? null,
freshness: input.freshness,
};
const result = snapshotAndHash(payload);
if (!result.ok) return result;
return result as IdentityBuildResultV1;
}
export type DossierEventIdentityPayloadV1 = {
readonly schema: "werkstatt/dossier-event-identity@1";
readonly eventKind: string;
readonly candidateId: string;
readonly authoritySequence: number;
readonly previousEventHash: string | null;
readonly eventPayloadRef: string;
};
export function buildDossierEventIdentityV1(
input: CertificationDossierEventV1,
): IdentityBuildResultV1 {
const payload: DossierEventIdentityPayloadV1 = {
schema: "werkstatt/dossier-event-identity@1",
eventKind: input.eventKind,
candidateId: input.candidateId,
authoritySequence: input.authoritySequence,
previousEventHash: input.previousEventHash,
eventPayloadRef: input.eventPayloadRef,
};
const result = snapshotAndHash(payload);
if (!result.ok) return result;
return result as IdentityBuildResultV1;
}
export type GateDecisionIdentityPayloadV1 = {
readonly schema: "werkstatt/gate-decision-identity@1";
readonly candidateId: string;
readonly policyBundleRoot: string;
readonly gate: string;
readonly evaluationCut: number;
readonly selectedEvidence: readonly unknown[];
readonly status: string;
readonly coverage: unknown;
readonly reasons: readonly string[];
readonly actionPackRef: string | null;
};
export function buildGateDecisionIdentityV1(
input: GateDecisionV1,
): IdentityBuildResultV1 {
const payload: GateDecisionIdentityPayloadV1 = {
schema: "werkstatt/gate-decision-identity@1",
candidateId: input.candidateId,
policyBundleRoot: input.policyBundleRoot,
gate: input.gate,
evaluationCut: input.evaluationCut,
selectedEvidence: input.selectedEvidence,
status: input.status,
coverage: input.coverage,
reasons: input.reasons,
actionPackRef: input.actionPackRef,
};
const result = snapshotAndHash(payload);
if (!result.ok) return result;
return result as IdentityBuildResultV1;
}
export type MainVerificationIdentityPayloadV1 = {
readonly schema: "werkstatt/main-verification-identity@1";
readonly candidateId: string;
readonly policyBundleRoot: string;
readonly gate: string;
readonly evaluationCut: number;
readonly selectedEvidence: readonly unknown[];
readonly status: string;
readonly coverage: unknown;
readonly reasons: readonly string[];
readonly actionPackRef: string | null;
readonly rootDossierRef: string;
readonly priorOperationRef: string | null;
};
export function buildMainVerificationIdentityV1(
input: MainVerificationDecisionV1,
): IdentityBuildResultV1 {
const payload: MainVerificationIdentityPayloadV1 = {
schema: "werkstatt/main-verification-identity@1",
candidateId: input.candidateId,
policyBundleRoot: input.policyBundleRoot,
gate: input.gate,
evaluationCut: input.evaluationCut,
selectedEvidence: input.selectedEvidence,
status: input.status,
coverage: input.coverage,
reasons: input.reasons,
actionPackRef: input.actionPackRef,
rootDossierRef: input.rootDossierRef,
priorOperationRef: input.priorOperationRef,
};
const result = snapshotAndHash(payload);
if (!result.ok) return result;
return result as IdentityBuildResultV1;
}
export type HealthDecisionIdentityPayloadV1 = {
readonly schema: "werkstatt/health-decision-identity@1";
readonly candidateId: string;
readonly currentStatus: string;
readonly lastDecisionId: string | null;
readonly lastDecisionAt: string | null;
readonly staleEvidenceCount: number;
readonly incompleteCount: number;
};
export function buildHealthDecisionIdentityV1(
input: CertificationHealthDecisionV1,
): IdentityBuildResultV1 {
const payload: HealthDecisionIdentityPayloadV1 = {
schema: "werkstatt/health-decision-identity@1",
candidateId: input.candidateId,
currentStatus: input.currentStatus,
lastDecisionId: input.lastDecisionId,
lastDecisionAt: input.lastDecisionAt,
staleEvidenceCount: input.staleEvidenceCount,
incompleteCount: input.incompleteCount,
};
const result = snapshotAndHash(payload);
if (!result.ok) return result;
return result as IdentityBuildResultV1;
}
export type ActionPackIdentityPayloadV1 = {
readonly schema: "werkstatt/action-pack-identity@1";
readonly actionPackId: string;
readonly candidateId: string;
readonly decisionId: string;
readonly tasks: readonly unknown[];
};
export function buildActionPackIdentityV1(
input: CertificationActionPackV1,
): IdentityBuildResultV1 {
const payload: ActionPackIdentityPayloadV1 = {
schema: "werkstatt/action-pack-identity@1",
actionPackId: input.actionPackId,
candidateId: input.candidateId,
decisionId: input.decisionId,
tasks: input.tasks,
};
const result = snapshotAndHash(payload);
if (!result.ok) return result;
return result as IdentityBuildResultV1;
}
export type DeploymentOperationEventIdentityPayloadV1 = {
readonly schema: "werkstatt/deployment-operation-event-identity@1";
readonly operationId: string;
readonly candidateId: string;
readonly channel: string;
readonly target: string;
readonly environment: string;
readonly deploymentPlanHash: string;
readonly environmentIdentityHash: string;
readonly authoritySequence: number;
readonly previousEventHash: string | null;
readonly eventKind: string;
readonly result: unknown;
};
export function buildDeploymentOperationEventIdentityV1(
input: DeploymentOperationEventV1,
): IdentityBuildResultV1 {
const payload: DeploymentOperationEventIdentityPayloadV1 = {
schema: "werkstatt/deployment-operation-event-identity@1",
operationId: input.operationId,
candidateId: input.candidateId,
channel: input.channel,
target: input.target,
environment: input.environment,
deploymentPlanHash: input.deploymentPlanHash,
environmentIdentityHash: input.environmentIdentityHash,
authoritySequence: input.authoritySequence,
previousEventHash: input.previousEventHash,
eventKind: input.eventKind,
result: input.result,
};
const result = snapshotAndHash(payload);
if (!result.ok) return result;
return result as IdentityBuildResultV1;
}