@shield-agent/kya 0.4.4 → 0.6.0

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.
Files changed (81) hide show
  1. package/.mcp.json +1 -1
  2. package/LIMITATIONS.md +1 -0
  3. package/README.md +30 -3
  4. package/amp/settings.example.json +1 -1
  5. package/catalog/agent-trust-baseline-v0.json +103 -0
  6. package/claude/claude_desktop_config.example.json +1 -1
  7. package/cline/cline_mcp_settings.example.json +1 -1
  8. package/copilot/mcp-config.example.json +1 -1
  9. package/dist/certify/attest.d.ts +10 -0
  10. package/dist/certify/attest.d.ts.map +1 -0
  11. package/dist/certify/attest.js +105 -0
  12. package/dist/certify/attest.js.map +1 -0
  13. package/dist/certify/catalog.d.ts +70 -0
  14. package/dist/certify/catalog.d.ts.map +1 -0
  15. package/dist/certify/catalog.js +245 -0
  16. package/dist/certify/catalog.js.map +1 -0
  17. package/dist/certify/evaluate.d.ts +85 -0
  18. package/dist/certify/evaluate.d.ts.map +1 -0
  19. package/dist/certify/evaluate.js +175 -0
  20. package/dist/certify/evaluate.js.map +1 -0
  21. package/dist/certify/render.d.ts +6 -0
  22. package/dist/certify/render.d.ts.map +1 -0
  23. package/dist/certify/render.js +242 -0
  24. package/dist/certify/render.js.map +1 -0
  25. package/dist/cli.d.ts +1 -1
  26. package/dist/cli.d.ts.map +1 -1
  27. package/dist/cli.js +56 -3
  28. package/dist/cli.js.map +1 -1
  29. package/dist/commands/certify.d.ts +48 -0
  30. package/dist/commands/certify.d.ts.map +1 -0
  31. package/dist/commands/certify.js +229 -0
  32. package/dist/commands/certify.js.map +1 -0
  33. package/dist/commands/connect.d.ts +1 -8
  34. package/dist/commands/connect.d.ts.map +1 -1
  35. package/dist/commands/connect.js +3 -39
  36. package/dist/commands/connect.js.map +1 -1
  37. package/dist/commands/wire-hooks.d.ts.map +1 -1
  38. package/dist/commands/wire-hooks.js +2 -1
  39. package/dist/commands/wire-hooks.js.map +1 -1
  40. package/dist/config.d.ts +21 -1
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +42 -9
  43. package/dist/config.js.map +1 -1
  44. package/dist/fs-atomic.d.ts +9 -0
  45. package/dist/fs-atomic.d.ts.map +1 -0
  46. package/dist/fs-atomic.js +44 -0
  47. package/dist/fs-atomic.js.map +1 -0
  48. package/dist/index.d.ts +8 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +8 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/receipt/dashboard.d.ts +63 -0
  53. package/dist/receipt/dashboard.d.ts.map +1 -0
  54. package/dist/receipt/dashboard.js +172 -0
  55. package/dist/receipt/dashboard.js.map +1 -0
  56. package/dist/receipt/enrich.d.ts +6 -0
  57. package/dist/receipt/enrich.d.ts.map +1 -1
  58. package/dist/receipt/enrich.js +22 -0
  59. package/dist/receipt/enrich.js.map +1 -1
  60. package/dist/receipt/render-receipt.d.ts.map +1 -1
  61. package/dist/receipt/render-receipt.js +179 -3
  62. package/dist/receipt/render-receipt.js.map +1 -1
  63. package/dist/sign/evidence-bundle.d.ts +59 -0
  64. package/dist/sign/evidence-bundle.d.ts.map +1 -0
  65. package/dist/sign/evidence-bundle.js +193 -0
  66. package/dist/sign/evidence-bundle.js.map +1 -0
  67. package/droid/README.md +1 -1
  68. package/droid/mcp.example.json +1 -1
  69. package/gemini/settings.example.json +1 -1
  70. package/grok/README.md +1 -1
  71. package/kilo/kilo.example.json +1 -1
  72. package/kimi/mcp.example.json +1 -1
  73. package/kiro/mcp.example.json +1 -1
  74. package/manifest.json +1 -1
  75. package/mastracode/mcp.example.json +1 -1
  76. package/mcp.json +1 -1
  77. package/openai/codex.config.example.toml +1 -1
  78. package/opencode/opencode.example.json +1 -1
  79. package/package.json +2 -1
  80. package/qwen/settings.example.json +1 -1
  81. package/server.json +2 -2
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Agent Trust Baseline catalog: types, loader, validator.
3
+ * The bundled catalog/agent-trust-baseline-v0.json at the package root is the
4
+ * source of truth (shipped via package.json "files"). Evidence only — a
5
+ * catalog requirement never ALLOWs anything.
6
+ */
7
+ import { existsSync, readFileSync, statSync } from "node:fs";
8
+ import { fileURLToPath } from "node:url";
9
+ import { UsageError } from "../errors.js";
10
+ export const MAX_CATALOG_BYTES = 512 * 1024;
11
+ const SEVERITIES = new Set(["critical", "high", "medium", "low"]);
12
+ const CHECK_KINDS = new Set([
13
+ "config_mode",
14
+ "hooks_wired",
15
+ "trail_zero",
16
+ "trail_min",
17
+ "trail_ratio",
18
+ "orr_overall",
19
+ "orr_category",
20
+ "orr_fresh",
21
+ "sandbox_inventory",
22
+ "receipts_present",
23
+ "showback_present",
24
+ "attest",
25
+ ]);
26
+ const ORR_MAX = new Set(["green", "amber"]);
27
+ const TRAIL_MODES = new Set(["observe", "hold", "offline"]);
28
+ const REQ_ID = /^[A-Z]+-\d+$/;
29
+ /** Bundled catalog: <pkg>/catalog/… — works from both src/ (vitest) and dist/ (built). */
30
+ export function defaultCatalogPath() {
31
+ return fileURLToPath(new URL("../../catalog/agent-trust-baseline-v0.json", import.meta.url));
32
+ }
33
+ export function loadCatalog(path) {
34
+ const file = path ?? defaultCatalogPath();
35
+ if (!existsSync(file) || !statSync(file).isFile()) {
36
+ throw new UsageError(`catalog not found: ${file}`);
37
+ }
38
+ if (statSync(file).size > MAX_CATALOG_BYTES) {
39
+ throw new UsageError(`catalog exceeds ${MAX_CATALOG_BYTES} bytes: ${file}`);
40
+ }
41
+ let text;
42
+ try {
43
+ text = readFileSync(file, "utf8");
44
+ }
45
+ catch {
46
+ throw new UsageError(`catalog is not readable: ${file}`);
47
+ }
48
+ let raw;
49
+ try {
50
+ raw = JSON.parse(text);
51
+ }
52
+ catch {
53
+ throw new UsageError(`catalog is not valid JSON: ${file}`);
54
+ }
55
+ return validateCatalog(raw);
56
+ }
57
+ function reqErr(id, msg) {
58
+ return new UsageError(`catalog requirement ${id}: ${msg}`);
59
+ }
60
+ function posInt(v) {
61
+ return typeof v === "number" && Number.isInteger(v) && v > 0;
62
+ }
63
+ function nonEmpty(v) {
64
+ return typeof v === "string" && v.trim().length > 0;
65
+ }
66
+ function parseMatch(id, raw) {
67
+ if (raw === undefined)
68
+ return {};
69
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
70
+ throw reqErr(id, "match must be an object");
71
+ }
72
+ const m = raw;
73
+ const out = {};
74
+ if (m.verdict !== undefined) {
75
+ if (!nonEmpty(m.verdict))
76
+ throw reqErr(id, "match.verdict must be a non-empty string");
77
+ out.verdict = m.verdict;
78
+ }
79
+ if (m.reasonCode !== undefined) {
80
+ if (!nonEmpty(m.reasonCode))
81
+ throw reqErr(id, "match.reasonCode must be a non-empty string");
82
+ out.reasonCode = m.reasonCode;
83
+ }
84
+ if (m.mode !== undefined) {
85
+ if (typeof m.mode !== "string" || !TRAIL_MODES.has(m.mode)) {
86
+ throw reqErr(id, "match.mode must be observe|hold|offline");
87
+ }
88
+ out.mode = m.mode;
89
+ }
90
+ if (m.neverEvent !== undefined) {
91
+ if (typeof m.neverEvent !== "boolean")
92
+ throw reqErr(id, "match.neverEvent must be boolean");
93
+ out.neverEvent = m.neverEvent;
94
+ }
95
+ return out;
96
+ }
97
+ function windowDaysOf(id, c) {
98
+ if (!posInt(c.windowDays))
99
+ throw reqErr(id, "trail checks require positive integer windowDays");
100
+ return c.windowDays;
101
+ }
102
+ function minOf(id, c, kind) {
103
+ if (!posInt(c.min))
104
+ throw reqErr(id, `${kind} requires positive integer min`);
105
+ return c.min;
106
+ }
107
+ function orrMaxOf(id, c) {
108
+ if (typeof c.max !== "string" || !ORR_MAX.has(c.max)) {
109
+ throw reqErr(id, 'orr checks require max "green" or "amber"');
110
+ }
111
+ return c.max;
112
+ }
113
+ function parseCheck(id, raw) {
114
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
115
+ throw reqErr(id, "check must be an object");
116
+ }
117
+ const c = raw;
118
+ if (typeof c.kind !== "string" || !CHECK_KINDS.has(c.kind)) {
119
+ throw reqErr(id, `unknown check kind ${JSON.stringify(c.kind)}`);
120
+ }
121
+ switch (c.kind) {
122
+ case "config_mode":
123
+ if (c.not !== "observe") {
124
+ throw reqErr(id, 'config_mode requires not:"observe"');
125
+ }
126
+ return { kind: "config_mode", not: "observe" };
127
+ case "hooks_wired":
128
+ return { kind: "hooks_wired", min: minOf(id, c, "hooks_wired") };
129
+ case "sandbox_inventory":
130
+ return { kind: "sandbox_inventory", min: minOf(id, c, "sandbox_inventory") };
131
+ case "receipts_present":
132
+ return { kind: "receipts_present", min: minOf(id, c, "receipts_present") };
133
+ case "trail_zero":
134
+ return {
135
+ kind: "trail_zero",
136
+ windowDays: windowDaysOf(id, c),
137
+ match: parseMatch(id, c.match),
138
+ };
139
+ case "trail_min":
140
+ return {
141
+ kind: "trail_min",
142
+ windowDays: windowDaysOf(id, c),
143
+ match: parseMatch(id, c.match),
144
+ min: minOf(id, c, "trail_min"),
145
+ };
146
+ case "trail_ratio": {
147
+ const maxRatio = c.maxRatio;
148
+ if (typeof maxRatio !== "number" || !(maxRatio > 0) || maxRatio > 1) {
149
+ throw reqErr(id, "trail_ratio requires 0 < maxRatio <= 1");
150
+ }
151
+ return {
152
+ kind: "trail_ratio",
153
+ windowDays: windowDaysOf(id, c),
154
+ match: parseMatch(id, c.match),
155
+ maxRatio,
156
+ };
157
+ }
158
+ case "orr_overall":
159
+ return { kind: "orr_overall", max: orrMaxOf(id, c) };
160
+ case "orr_category": {
161
+ if (!nonEmpty(c.id))
162
+ throw reqErr(id, "orr_category requires non-empty id");
163
+ return { kind: "orr_category", id: c.id, max: orrMaxOf(id, c) };
164
+ }
165
+ case "orr_fresh": {
166
+ if (!posInt(c.maxAgeDays))
167
+ throw reqErr(id, "orr_fresh requires positive integer maxAgeDays");
168
+ return { kind: "orr_fresh", maxAgeDays: c.maxAgeDays };
169
+ }
170
+ case "showback_present":
171
+ return { kind: "showback_present" };
172
+ case "attest": {
173
+ if (!nonEmpty(c.prompt))
174
+ throw reqErr(id, "attest requires non-empty prompt");
175
+ // Prompts are interpolated into one-line evidence — no control chars.
176
+ if (/[\x00-\x1f\x7f]/.test(c.prompt)) {
177
+ throw reqErr(id, "attest prompt must not contain control characters");
178
+ }
179
+ return { kind: "attest", prompt: c.prompt };
180
+ }
181
+ }
182
+ // Unreachable: kind membership checked above.
183
+ throw reqErr(id, `unknown check kind ${JSON.stringify(c.kind)}`);
184
+ }
185
+ export function validateCatalog(raw) {
186
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
187
+ throw new UsageError("catalog root must be an object");
188
+ }
189
+ const c = raw;
190
+ for (const k of ["id", "version", "updated"]) {
191
+ if (!nonEmpty(c[k]))
192
+ throw new UsageError(`catalog.${k} must be a non-empty string`);
193
+ }
194
+ if (!Array.isArray(c.domains) ||
195
+ c.domains.length === 0 ||
196
+ !c.domains.every((d) => typeof d === "string" && d.length > 0)) {
197
+ throw new UsageError("catalog.domains must be a non-empty string array");
198
+ }
199
+ if (!Array.isArray(c.requirements) || c.requirements.length === 0) {
200
+ throw new UsageError("catalog.requirements must be a non-empty array");
201
+ }
202
+ const domains = c.domains;
203
+ const domainSet = new Set(domains);
204
+ const seen = new Set();
205
+ const requirements = [];
206
+ for (const item of c.requirements) {
207
+ if (!item || typeof item !== "object" || Array.isArray(item)) {
208
+ throw new UsageError("catalog requirement must be an object");
209
+ }
210
+ const rec = item;
211
+ const id = typeof rec.id === "string" ? rec.id : "";
212
+ if (!REQ_ID.test(id)) {
213
+ throw new UsageError(`catalog requirement id must match ^[A-Z]+-\\d+$: ${JSON.stringify(rec.id)}`);
214
+ }
215
+ if (seen.has(id))
216
+ throw new UsageError(`duplicate requirement id ${id}`);
217
+ seen.add(id);
218
+ if (typeof rec.domain !== "string" || !domainSet.has(rec.domain)) {
219
+ throw reqErr(id, `unknown domain ${JSON.stringify(rec.domain)}`);
220
+ }
221
+ if (!nonEmpty(rec.title))
222
+ throw reqErr(id, "title required");
223
+ if (!nonEmpty(rec.text))
224
+ throw reqErr(id, "text required");
225
+ if (typeof rec.severity !== "string" || !SEVERITIES.has(rec.severity)) {
226
+ throw reqErr(id, `bad severity ${JSON.stringify(rec.severity)}`);
227
+ }
228
+ requirements.push({
229
+ id,
230
+ domain: rec.domain,
231
+ title: rec.title,
232
+ text: rec.text,
233
+ severity: rec.severity,
234
+ check: parseCheck(id, rec.check),
235
+ });
236
+ }
237
+ return {
238
+ id: c.id,
239
+ version: c.version,
240
+ updated: c.updated,
241
+ domains,
242
+ requirements,
243
+ };
244
+ }
245
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/certify/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Agent Trust Baseline evaluators. Pure functions over a pre-assembled
3
+ * EvidenceContext — no I/O here; all loading lives in commands/certify.ts.
4
+ * Evidence only: never a second PEP, never ALLOWs anything. Empty evidence
5
+ * windows yield insufficient_evidence, never a vacuous pass.
6
+ */
7
+ import type { OrrRating } from "../commands/orr.js";
8
+ import type { OrrCard } from "../receipt/enrich.js";
9
+ import type { TrailEvent } from "../trail.js";
10
+ import type { CatalogRequirement, RequirementSeverity, TrailMatch } from "./catalog.js";
11
+ export type RequirementStatus = "pass" | "gap" | "insufficient_evidence" | "attested";
12
+ export interface RequirementAttestation {
13
+ readonly text: string;
14
+ readonly at: string;
15
+ }
16
+ export interface CertifyRequirementResult {
17
+ readonly id: string;
18
+ readonly domain: string;
19
+ readonly title: string;
20
+ readonly severity: RequirementSeverity;
21
+ readonly status: RequirementStatus;
22
+ /** One line, redacted, safe for reports and bundles. */
23
+ readonly evidence: string;
24
+ readonly attestation?: RequirementAttestation;
25
+ }
26
+ export interface CertifyTrailStats {
27
+ readonly eventCount: number;
28
+ readonly verdictMix: {
29
+ readonly ALLOW: number;
30
+ readonly DENY: number;
31
+ readonly REQUIRE_APPROVE: number;
32
+ };
33
+ readonly modes: {
34
+ readonly observe: number;
35
+ readonly hold: number;
36
+ readonly offline: number;
37
+ };
38
+ }
39
+ export interface CertifyReport {
40
+ readonly format: "shield-kya-certify-report";
41
+ readonly version: 1;
42
+ readonly generatedAt: string;
43
+ readonly catalog: {
44
+ readonly id: string;
45
+ readonly version: string;
46
+ readonly updated: string;
47
+ };
48
+ readonly window: {
49
+ readonly days: number;
50
+ readonly since: string;
51
+ readonly until: string;
52
+ };
53
+ readonly trail: CertifyTrailStats;
54
+ readonly requirements: readonly CertifyRequirementResult[];
55
+ readonly overall: {
56
+ readonly pass: number;
57
+ readonly gap: number;
58
+ readonly insufficientEvidence: number;
59
+ readonly attested: number;
60
+ readonly result: "pass" | "gap";
61
+ };
62
+ }
63
+ export interface EvidenceContext {
64
+ readonly now: Date;
65
+ /**
66
+ * Full merged trail (global + legacy). Each check filters its own window.
67
+ * Merged `readTrail` output is ts-ascending, but evaluators do not rely on
68
+ * that ordering.
69
+ */
70
+ readonly events: readonly TrailEvent[];
71
+ readonly gateMode: "observe" | "hold" | "offline";
72
+ readonly wiredHostCount: number;
73
+ readonly orr: OrrCard | undefined;
74
+ /** Category id → rating from the latest ORR report, when present. */
75
+ readonly orrCategories: Readonly<Record<string, OrrRating>> | undefined;
76
+ readonly sandboxCount: number;
77
+ readonly receiptCount: number;
78
+ readonly showbackPresent: boolean;
79
+ readonly attestations: ReadonlyMap<string, RequirementAttestation>;
80
+ }
81
+ export declare function matchEvent(e: TrailEvent, m: TrailMatch): boolean;
82
+ /** Events with parseable ts within [now - windowDays, now]. */
83
+ export declare function trailWindow(events: readonly TrailEvent[], windowDays: number, now: Date): TrailEvent[];
84
+ export declare function evaluateRequirement(req: CatalogRequirement, ctx: EvidenceContext): CertifyRequirementResult;
85
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/certify/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ const DAY_MS = 24 * 60 * 60 * 1000;
2
+ export function matchEvent(e, m) {
3
+ if (m.verdict !== undefined && e.verdict.toUpperCase() !== m.verdict.toUpperCase()) {
4
+ return false;
5
+ }
6
+ if (m.reasonCode !== undefined && e.reasonCode !== m.reasonCode)
7
+ return false;
8
+ if (m.mode !== undefined && e.mode !== m.mode)
9
+ return false;
10
+ if (m.neverEvent !== undefined && (e.neverEvent === true) !== m.neverEvent)
11
+ return false;
12
+ return true;
13
+ }
14
+ /** Events with parseable ts within [now - windowDays, now]. */
15
+ export function trailWindow(events, windowDays, now) {
16
+ const sinceMs = now.getTime() - windowDays * DAY_MS;
17
+ return events.filter((e) => {
18
+ const t = Date.parse(e.ts);
19
+ return !Number.isNaN(t) && t >= sinceMs && t <= now.getTime();
20
+ });
21
+ }
22
+ function describeMatch(m) {
23
+ const parts = [];
24
+ if (m.verdict)
25
+ parts.push(`verdict=${m.verdict.toUpperCase()}`);
26
+ if (m.reasonCode)
27
+ parts.push(`reason=${m.reasonCode}`);
28
+ if (m.mode)
29
+ parts.push(`mode=${m.mode}`);
30
+ if (m.neverEvent !== undefined)
31
+ parts.push(`neverEvent=${m.neverEvent}`);
32
+ return parts.length > 0 ? parts.join(" ") : "any event";
33
+ }
34
+ const RATING_RANK = { green: 0, amber: 1, red: 2 };
35
+ export function evaluateRequirement(req, ctx) {
36
+ const attestation = ctx.attestations.get(req.id);
37
+ const result = (status, evidence) => ({
38
+ id: req.id,
39
+ domain: req.domain,
40
+ title: req.title,
41
+ severity: req.severity,
42
+ status,
43
+ evidence,
44
+ ...(attestation
45
+ ? { attestation: { text: attestation.text, at: attestation.at } }
46
+ : {}),
47
+ });
48
+ const check = req.check;
49
+ switch (check.kind) {
50
+ case "trail_zero": {
51
+ const window = trailWindow(ctx.events, check.windowDays, ctx.now);
52
+ if (window.length === 0) {
53
+ return result("insufficient_evidence", `no trail events in the last ${check.windowDays}d`);
54
+ }
55
+ const matches = window.filter((e) => matchEvent(e, check.match));
56
+ if (matches.length === 0) {
57
+ return result("pass", `0/${window.length} events match ${describeMatch(check.match)} in ${check.windowDays}d`);
58
+ }
59
+ const latestMs = matches.reduce((acc, e) => {
60
+ const t = Date.parse(e.ts);
61
+ return Number.isNaN(t) ? acc : Math.max(acc, t);
62
+ }, Number.NEGATIVE_INFINITY);
63
+ // ISO-normalized: raw event ts is attacker-controllable, the quoted
64
+ // value in evidence must stay a single line.
65
+ const latest = new Date(latestMs).toISOString();
66
+ return result("gap", `${matches.length} event(s) match ${describeMatch(check.match)} in ${check.windowDays}d (latest ${latest})`);
67
+ }
68
+ case "trail_min": {
69
+ const window = trailWindow(ctx.events, check.windowDays, ctx.now);
70
+ if (window.length === 0) {
71
+ return result("insufficient_evidence", `no trail events in the last ${check.windowDays}d`);
72
+ }
73
+ const matches = window.filter((e) => matchEvent(e, check.match)).length;
74
+ if (matches >= check.min) {
75
+ return result("pass", `${matches} event(s) match ${describeMatch(check.match)} in ${check.windowDays}d (min ${check.min})`);
76
+ }
77
+ return result("gap", `${matches} event(s) match ${describeMatch(check.match)} in ${check.windowDays}d, need ${check.min}`);
78
+ }
79
+ case "trail_ratio": {
80
+ const window = trailWindow(ctx.events, check.windowDays, ctx.now);
81
+ if (window.length === 0) {
82
+ return result("insufficient_evidence", `no trail events in the last ${check.windowDays}d`);
83
+ }
84
+ const matches = window.filter((e) => matchEvent(e, check.match)).length;
85
+ const ratio = matches / window.length;
86
+ const pct = `${(ratio * 100).toFixed(1)}%`;
87
+ // Clean threshold rendering: 0.29 * 100 would print 28.999999999999996.
88
+ const maxPct = `${+(check.maxRatio * 100).toFixed(4)}%`;
89
+ if (ratio <= check.maxRatio) {
90
+ return result("pass", `${matches}/${window.length} = ${pct} ≤ ${maxPct} for ${describeMatch(check.match)}`);
91
+ }
92
+ return result("gap", `${matches}/${window.length} = ${pct} > ${maxPct} for ${describeMatch(check.match)}`);
93
+ }
94
+ case "config_mode": {
95
+ if (ctx.gateMode === check.not) {
96
+ return result("gap", `gate mode is ${ctx.gateMode} — set KYA_HOLD=1 / KYA_OFFLINE=1 or "gateMode" in .kya/config.json`);
97
+ }
98
+ return result("pass", `gate mode is ${ctx.gateMode}`);
99
+ }
100
+ case "hooks_wired": {
101
+ if (ctx.wiredHostCount >= check.min) {
102
+ return result("pass", `${ctx.wiredHostCount} wired host(s) (need ${check.min})`);
103
+ }
104
+ return result("gap", `${ctx.wiredHostCount} wired host(s), need ${check.min} — kya connect <host> --hooks`);
105
+ }
106
+ case "sandbox_inventory": {
107
+ if (ctx.sandboxCount >= check.min) {
108
+ return result("pass", `${ctx.sandboxCount} sandbox record(s)`);
109
+ }
110
+ return result("gap", `no sandbox inventory — KYA_SANDBOX=mock kya sandbox spawn`);
111
+ }
112
+ case "receipts_present": {
113
+ if (ctx.receiptCount >= check.min) {
114
+ return result("pass", `${ctx.receiptCount} receipt file(s) in .kya/receipts`);
115
+ }
116
+ return result("gap", `no receipts yet — run kya receipt`);
117
+ }
118
+ case "showback_present": {
119
+ return ctx.showbackPresent
120
+ ? result("pass", "showback card present (.kya/usage.json)")
121
+ : result("gap", "no showback card — add .kya/usage.json or run orr with --usage");
122
+ }
123
+ case "attest": {
124
+ if (attestation)
125
+ return result("attested", `attested ${attestation.at}`);
126
+ return result("gap", `no attestation recorded — kya certify --attest ${req.id} --text "…" (${check.prompt})`);
127
+ }
128
+ case "orr_overall": {
129
+ if (!ctx.orr) {
130
+ return result("insufficient_evidence", "no ORR report — kya orr run --path .");
131
+ }
132
+ if (RATING_RANK[ctx.orr.overall] <= RATING_RANK[check.max]) {
133
+ return result("pass", `ORR overall ${ctx.orr.overall} (max ${check.max})`);
134
+ }
135
+ return result("gap", `ORR overall ${ctx.orr.overall} exceeds max ${check.max}`);
136
+ }
137
+ case "orr_category": {
138
+ if (!ctx.orrCategories) {
139
+ return result("insufficient_evidence", "no ORR report — kya orr run --path .");
140
+ }
141
+ const rating = ctx.orrCategories[check.id];
142
+ if (!rating) {
143
+ return result("insufficient_evidence", `ORR category ${check.id} not present in latest report`);
144
+ }
145
+ if (RATING_RANK[rating] <= RATING_RANK[check.max]) {
146
+ return result("pass", `ORR ${check.id} ${rating} (max ${check.max})`);
147
+ }
148
+ return result("gap", `ORR ${check.id} ${rating} exceeds max ${check.max}`);
149
+ }
150
+ case "orr_fresh": {
151
+ if (!ctx.orr || !ctx.orr.generatedAt) {
152
+ return result("insufficient_evidence", "no ORR report — kya orr run --path .");
153
+ }
154
+ const t = Date.parse(ctx.orr.generatedAt);
155
+ if (Number.isNaN(t)) {
156
+ return result("insufficient_evidence", "ORR generatedAt unparseable");
157
+ }
158
+ const nowMs = ctx.now.getTime();
159
+ if (t > nowMs) {
160
+ return result("insufficient_evidence", "ORR generatedAt is in the future — clock skew, re-run kya orr run");
161
+ }
162
+ const ageMs = nowMs - t;
163
+ // Exact ms comparison decides; the floored day count is display-only.
164
+ const ageDays = Math.floor(ageMs / DAY_MS);
165
+ if (ageMs <= check.maxAgeDays * DAY_MS) {
166
+ return result("pass", `ORR is ${ageDays}d old (max ${check.maxAgeDays}d)`);
167
+ }
168
+ return result("gap", `ORR is ${ageDays}d old (max ${check.maxAgeDays}d) — re-run kya orr run`);
169
+ }
170
+ }
171
+ // Unreachable: RequirementCheck union is exhaustive (checked at compile time).
172
+ const exhaustive = check;
173
+ throw new Error(`unknown check kind ${JSON.stringify(exhaustive)}`);
174
+ }
175
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/certify/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CertifyReport } from "./evaluate.js";
2
+ /** Catalog order of domains, derived from requirement order in the report. */
3
+ export declare function domainOrder(report: CertifyReport): string[];
4
+ export declare function formatCertifyMarkdown(report: CertifyReport): string;
5
+ export declare function renderCertifyHtml(report: CertifyReport): string;
6
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/certify/render.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,aAAa,EAGd,MAAM,eAAe,CAAC;AAWvB,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAM3D;AASD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA+CnE;AAiCD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAoJ/D"}