@kashscript/hudhud 0.1.0 → 0.2.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.
- package/LICENSE +135 -133
- package/README.md +11 -0
- package/dist/certificate/certificate.d.ts +11 -4
- package/dist/certificate/certificate.d.ts.map +1 -1
- package/dist/certificate/certificate.js +21 -18
- package/dist/certificate/certificate.js.map +1 -1
- package/dist/certificate/html.d.ts.map +1 -1
- package/dist/certificate/html.js +1 -2
- package/dist/certificate/html.js.map +1 -1
- package/dist/errors.d.ts +29 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +6 -2
- package/dist/errors.js.map +1 -1
- package/dist/exception/index.d.ts +127 -24
- package/dist/exception/index.d.ts.map +1 -1
- package/dist/exception/index.js +209 -15
- package/dist/exception/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/ledger/writer.d.ts +10 -2
- package/dist/ledger/writer.d.ts.map +1 -1
- package/dist/ledger/writer.js +16 -4
- package/dist/ledger/writer.js.map +1 -1
- package/dist/runtime/escalation.d.ts +5 -0
- package/dist/runtime/escalation.d.ts.map +1 -1
- package/dist/runtime/escalation.js +15 -3
- package/dist/runtime/escalation.js.map +1 -1
- package/dist/sop/compiler.d.ts.map +1 -1
- package/dist/sop/compiler.js +2 -2
- package/dist/sop/compiler.js.map +1 -1
- package/dist/sop/service.d.ts +5 -0
- package/dist/sop/service.d.ts.map +1 -1
- package/dist/sop/service.js +25 -6
- package/dist/sop/service.js.map +1 -1
- package/package.json +3 -3
- package/src/certificate/certificate.ts +25 -17
- package/src/certificate/html.ts +1 -2
- package/src/errors.ts +27 -2
- package/src/exception/index.ts +315 -33
- package/src/index.ts +1 -1
- package/src/ledger/writer.ts +24 -4
- package/src/runtime/escalation.ts +21 -9
- package/src/sop/compiler.ts +2 -1
- package/src/sop/service.ts +30 -5
package/dist/ledger/writer.js
CHANGED
|
@@ -16,10 +16,19 @@ import { LedgerAppendError } from "../errors";
|
|
|
16
16
|
import { SessionMutex } from "./mutex";
|
|
17
17
|
import { resolvePreviousBlockHash } from "./store";
|
|
18
18
|
export const ACTOR_CLASSES = ["AGENT", "SYSTEM_KERNEL", "OPERATOR_ADMIN", "COMPLIANCE_AUDITOR"];
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
19
|
+
/** Default DID acceptance policy: the canonical `did:kash:<base58btc>` shape
|
|
20
|
+
* (identity-core `DID_KASH_RE` / attest `KASH_DID_PATTERN`). A consumer whose
|
|
21
|
+
* DID method-specific-ids are STRUCTURED (e.g. hierarchical role DIDs such as
|
|
22
|
+
* `did:kash:oreoasis:kernel:host`) injects its own validator — DID-format is an
|
|
23
|
+
* identity-method policy the CONSUMER owns; the ledger's hard gates stay
|
|
24
|
+
* registry-resolution + signature-verification, not string shape. */
|
|
25
|
+
const isCanonicalKashDid = (did) => KASH_DID_PATTERN.test(did);
|
|
26
|
+
/** Build a HostActorSigner from a raw Ed25519 private key. `actorDid` must be
|
|
27
|
+
* accepted by `isValidActorDid` (default: canonical did:kash) and be registered
|
|
28
|
+
* in the DidRegistry the service verifies against. */
|
|
21
29
|
export function createEd25519HostSigner(opts) {
|
|
22
|
-
|
|
30
|
+
const isValidActorDid = opts.isValidActorDid ?? isCanonicalKashDid;
|
|
31
|
+
if (!isValidActorDid(opts.actorDid)) {
|
|
23
32
|
throw new LedgerAppendError("host signer actorDid is not a valid did:kash:… identifier");
|
|
24
33
|
}
|
|
25
34
|
return {
|
|
@@ -33,13 +42,16 @@ export class ForensicLedgerService {
|
|
|
33
42
|
constructor(deps) {
|
|
34
43
|
this.deps = deps;
|
|
35
44
|
}
|
|
45
|
+
isValidActorDid(did) {
|
|
46
|
+
return (this.deps.isValidActorDid ?? isCanonicalKashDid)(did);
|
|
47
|
+
}
|
|
36
48
|
/** Append a caller-pre-signed transition. @throws LedgerAppendError on any
|
|
37
49
|
* validation / signature / store failure. */
|
|
38
50
|
async appendTransitionLog(input) {
|
|
39
51
|
if (typeof input.sessionId !== "string" || input.sessionId.length === 0) {
|
|
40
52
|
throw new LedgerAppendError("sessionId is required");
|
|
41
53
|
}
|
|
42
|
-
if (typeof input.actorDid !== "string" || !
|
|
54
|
+
if (typeof input.actorDid !== "string" || !this.isValidActorDid(input.actorDid)) {
|
|
43
55
|
throw new LedgerAppendError("actorDid must be a valid did:kash:… identifier");
|
|
44
56
|
}
|
|
45
57
|
if (typeof input.signature !== "string" || input.signature.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/ledger/writer.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,qEAAqE;AACrE,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,gFAAgF;AAChF,yEAAyE;AACzE,+EAA+E;AAC/E,4EAA4E;AAC5E,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,eAAe,EACf,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAGnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,CAAU,CAAC;AAWzG;
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/ledger/writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,9 @@ export interface BuildHumanApprovalEnvelopeInput {
|
|
|
26
26
|
readonly publicKey: Uint8Array;
|
|
27
27
|
};
|
|
28
28
|
readonly ttlMs?: number;
|
|
29
|
+
/** Override the DID acceptance policy for agent/operator `did` (default:
|
|
30
|
+
* canonical `did:kash`). */
|
|
31
|
+
readonly isValidDid?: (did: string) => boolean;
|
|
29
32
|
}
|
|
30
33
|
/**
|
|
31
34
|
* Build the two-key `SignedActionEnvelope` that authorizes a resume of a
|
|
@@ -49,6 +52,8 @@ export interface AppendOperatorSignoffInput {
|
|
|
49
52
|
/** MANDATORY classification (required `failureClass`, no "unclassified"). */
|
|
50
53
|
readonly classification: ExceptionClassificationInput;
|
|
51
54
|
readonly exceptionClassificationStore: ExceptionClassificationStore;
|
|
55
|
+
/** Override the DID acceptance policy for operator `did` (default: canonical). */
|
|
56
|
+
readonly isValidDid?: (did: string) => boolean;
|
|
52
57
|
}
|
|
53
58
|
/**
|
|
54
59
|
* Append a SIGNED ledger row recording the operator's sign-off (OPERATOR key,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["../../src/runtime/escalation.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAsC,oBAAoB,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAOvH,OAAO,KAAK,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE9H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"escalation.d.ts","sourceRoot":"","sources":["../../src/runtime/escalation.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAsC,oBAAoB,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAOvH,OAAO,KAAK,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE9H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAc9D,MAAM,MAAM,mBAAmB,GAC3B,mBAAmB,GACnB,sBAAsB,GACtB,6BAA6B,GAC7B,wBAAwB,CAAC;AAE7B,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBACvC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;CAMvG;AAcD,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;oFACgF;IAChF,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAA;KAAE,CAAC;IAC1G,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAA;KAAE,CAAC;IAC7G,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;iCAC6B;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CAChD;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAgDtH;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;KAAE,CAAC;IAC7E,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrH,6EAA6E;IAC7E,QAAQ,CAAC,cAAc,EAAE,4BAA4B,CAAC;IACtD,QAAQ,CAAC,4BAA4B,EAAE,4BAA4B,CAAC;IACpE,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CAChD;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,6BAA6B,CAAA;CAAE,CAAC,CAqC/E;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,6EAA6E;IAC7E,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC;IACpC,6EAA6E;IAC7E,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC;IACvC,2FAA2F;IAC3F,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,uFAAuF;IACvF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,0BAA0B,GAClC,uBAAuB,GACvB,mBAAmB,GACnB,eAAe,GACf,WAAW,GACX,SAAS,GACT,2BAA2B,GAC3B,4BAA4B,CAAC;AAEjC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI,CAAC;CACpD;AAYD;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAgC9G;AAED;;4DAE4D;AAC5D,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C;yDACqD;IACrD,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAOlC,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;CAG1C"}
|
|
@@ -20,6 +20,16 @@ import { PermissionGate, assembleEnvelope, stripDerivedFields, } from "@kashscri
|
|
|
20
20
|
import { NEURON_DST } from "@kashscript/neuron/schemas";
|
|
21
21
|
import { assertFailureClass, buildSignedClassification, } from "../exception";
|
|
22
22
|
import { resolvePreviousBlockHash } from "../ledger/store";
|
|
23
|
+
// Both identities are `did:kash` keys so the operator sign-off is a first-class
|
|
24
|
+
// ledger actor. The two-key guarantee comes from DISTINCTNESS, not a DID
|
|
25
|
+
// namespace: the agent key is the one the host holds; the operator key is
|
|
26
|
+
// SEPARATE, so the host cannot mint the operator (invoker) signature. Enforced
|
|
27
|
+
// below by requiring agent.did ≠ operator.did (their derived DIDs differ because
|
|
28
|
+
// their keys do). The DID-STRING shape is an identity-method policy the consumer
|
|
29
|
+
// owns (`isValidDid`, default canonical); it is NOT a security boundary here.
|
|
30
|
+
/** Default DID acceptance policy: the canonical `did:kash:<base58btc>` shape.
|
|
31
|
+
* Consumers with structured DIDs (e.g. `did:kash:operator:…`) inject their own. */
|
|
32
|
+
const isCanonicalKashDid = (did) => KASH_DID_PATTERN.test(did);
|
|
23
33
|
export class EscalationError extends Error {
|
|
24
34
|
code;
|
|
25
35
|
detail;
|
|
@@ -46,10 +56,11 @@ function deriveKashDid(publicKey) {
|
|
|
46
56
|
* operator), so forging human judgment would require the operator private key.
|
|
47
57
|
*/
|
|
48
58
|
export async function buildHumanApprovalEnvelope(input) {
|
|
49
|
-
|
|
59
|
+
const isValidDid = input.isValidDid ?? isCanonicalKashDid;
|
|
60
|
+
if (!isValidDid(input.agent.did)) {
|
|
50
61
|
throw new EscalationError("AGENT_DID_INVALID", "agent.did must be a valid did:kash identifier");
|
|
51
62
|
}
|
|
52
|
-
if (!
|
|
63
|
+
if (!isValidDid(input.operator.did)) {
|
|
53
64
|
throw new EscalationError("OPERATOR_DID_INVALID", "operator.did must be a valid did:kash identifier");
|
|
54
65
|
}
|
|
55
66
|
if (input.agent.did === input.operator.did) {
|
|
@@ -87,7 +98,8 @@ export async function buildHumanApprovalEnvelope(input) {
|
|
|
87
98
|
* The mandatory `failureClass` gate fails-fast before any row is written.
|
|
88
99
|
*/
|
|
89
100
|
export async function appendOperatorSignoff(input) {
|
|
90
|
-
|
|
101
|
+
const isValidDid = input.isValidDid ?? isCanonicalKashDid;
|
|
102
|
+
if (!isValidDid(input.operator.did)) {
|
|
91
103
|
throw new EscalationError("OPERATOR_DID_INVALID", "operator.did must be a valid did:kash identifier");
|
|
92
104
|
}
|
|
93
105
|
assertFailureClass(input.classification.failureClass);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation.js","sourceRoot":"","sources":["../../src/runtime/escalation.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kEAAkE;AAClE,+EAA+E;AAC/E,6EAA6E;AAC7E,2EAA2E;AAC3E,kCAAkC;AAClC,+EAA+E;AAC/E,4EAA4E;AAC5E,wEAAwE;AACxE,uEAAuE;AACvE,6EAA6E;AAC7E,+CAA+C;AAC/C,iFAAiF;AACjF,8EAA8E;AAC9E,uCAAuC;AACvC,+EAA+E;AAE/E,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,EACL,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"escalation.js","sourceRoot":"","sources":["../../src/runtime/escalation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/sop/compiler.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;QAC5C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAOD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../src/sop/compiler.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;QAC5C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAOD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuC5F"}
|
package/dist/sop/compiler.js
CHANGED
|
@@ -22,7 +22,7 @@ const LIST_ITEM_PATTERN = /^\s*(?:\d+[.)]|[-*•])\s+(.+)$/;
|
|
|
22
22
|
export async function compileSopStructural(input) {
|
|
23
23
|
const lines = input.sopText.split(/\r?\n/);
|
|
24
24
|
if (input.sopText.trim().length === 0) {
|
|
25
|
-
throw new SopCompilationError("SOP text is empty or whitespace-only — at least one step required");
|
|
25
|
+
throw new SopCompilationError("SOP text is empty or whitespace-only — at least one step required", { kind: "empty" });
|
|
26
26
|
}
|
|
27
27
|
const nodes = [];
|
|
28
28
|
for (let i = 0; i < lines.length; i++) {
|
|
@@ -32,7 +32,7 @@ export async function compileSopStructural(input) {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
if (nodes.length === 0) {
|
|
35
|
-
throw new SopCompilationError("No numbered/bulleted steps detected — structural compiler requires `1.` / `-` / `*` / `•` prefixes");
|
|
35
|
+
throw new SopCompilationError("No numbered/bulleted steps detected — structural compiler requires `1.` / `-` / `*` / `•` prefixes", { kind: "no-steps" });
|
|
36
36
|
}
|
|
37
37
|
const edges = [];
|
|
38
38
|
for (let i = 0; i < nodes.length - 1; i++) {
|
package/dist/sop/compiler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/sop/compiler.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,gEAAgE;AAChE,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAC5E,qEAAqE;AACrE,8EAA8E;AAC9E,yEAAyE;AACzE,EAAE;AACF,6EAA6E;AAC7E,oEAAoE;AACpE,+EAA+E;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAyBhD,MAAM,2BAA2B,GAAG,OAAO,CAAC;AAE5C,oDAAoD;AACpD,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAc1D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAsB;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE3C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,mBAAmB,CAAC,mEAAmE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/sop/compiler.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,gEAAgE;AAChE,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAC5E,qEAAqE;AACrE,8EAA8E;AAC9E,yEAAyE;AACzE,EAAE;AACF,6EAA6E;AAC7E,oEAAoE;AACpE,+EAA+E;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAyBhD,MAAM,2BAA2B,GAAG,OAAO,CAAC;AAE5C,oDAAoD;AACpD,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAc1D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAsB;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE3C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,mBAAmB,CAAC,mEAAmE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACxH,CAAC;IAED,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;QAChD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,mBAAmB,CAC3B,oGAAoG,EACpG,EAAE,IAAI,EAAE,UAAU,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAY;QACvB,KAAK;QACL,KAAK;QACL,IAAI,EAAE;YACJ,YAAY,EAAE,oBAAoB;YAClC,eAAe,EAAE,2BAA2B;YAC5C,eAAe,EAAE,KAAK,CAAC,MAAM;YAC7B,SAAS;SACV;KACF,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC"}
|
package/dist/sop/service.d.ts
CHANGED
|
@@ -4,6 +4,10 @@ export interface SopCompilerServiceOptions {
|
|
|
4
4
|
/** Seam for the deferred LLM decomposer wire-up (not yet invoked). */
|
|
5
5
|
readonly llmProvider?: LLMProvider;
|
|
6
6
|
readonly llmModel?: string;
|
|
7
|
+
/** Override the `institutionDid` acceptance policy (default: canonical
|
|
8
|
+
* `did:kash`). A consumer with structured institution DIDs injects its own —
|
|
9
|
+
* DID-string shape is an identity-method policy the consumer owns. */
|
|
10
|
+
readonly isValidInstitutionDid?: (did: string) => boolean;
|
|
7
11
|
}
|
|
8
12
|
export interface CompiledCorporateManual {
|
|
9
13
|
readonly taskDag: TaskDag;
|
|
@@ -13,6 +17,7 @@ export interface CompiledCorporateManual {
|
|
|
13
17
|
}
|
|
14
18
|
export declare class SopCompilerService {
|
|
15
19
|
private readonly llmBackendActive;
|
|
20
|
+
private readonly isValidInstitutionDid;
|
|
16
21
|
constructor(opts?: SopCompilerServiceOptions);
|
|
17
22
|
/** Whether an LLM provider seam is plumbed. */
|
|
18
23
|
hasLlmBackend(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/sop/service.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,yBAAyB;IACxC,sEAAsE;IACtE,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/sop/service.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,yBAAyB;IACxC,sEAAsE;IACtE,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;2EAEuE;IACvE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3D;AAKD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAOD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA2B;gBAErD,IAAI,GAAE,yBAA8B;IAKhD,+CAA+C;IACxC,aAAa,IAAI,OAAO;IAI/B;uEACmE;IACtD,sBAAsB,CACjC,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,CAAC;CAoDpC;AAED,UAAU,QAAQ;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;kFACkF;AAClF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAmB3F;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;4EAC4E;AAC5E,wBAAgB,WAAW,CACzB,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,EACjC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,GAChC,WAAW,GAAG,IAAI,CAmDpB"}
|
package/dist/sop/service.js
CHANGED
|
@@ -11,14 +11,18 @@
|
|
|
11
11
|
import { KASH_DID_PATTERN } from "@kashscript/attest";
|
|
12
12
|
import { SopCompilationError } from "../errors";
|
|
13
13
|
import { compileSopStructural } from "./compiler";
|
|
14
|
+
/** Default DID acceptance policy: the canonical `did:kash:<base58btc>` shape. */
|
|
15
|
+
const isCanonicalKashDid = (did) => KASH_DID_PATTERN.test(did);
|
|
14
16
|
/** Match `goto N`, `goto step N`, `go to step N`, `→ step N`. Captures `N`. */
|
|
15
17
|
const GOTO_MARKER_PATTERN = /(?:goto|go\s+to|→)\s*(?:step\s*)?(\d{1,4})/gi;
|
|
16
18
|
/** Semver MAJOR.MINOR.PATCH. */
|
|
17
19
|
const SEMVER_PATTERN = /^\d+\.\d+\.\d+$/;
|
|
18
20
|
export class SopCompilerService {
|
|
19
21
|
llmBackendActive;
|
|
22
|
+
isValidInstitutionDid;
|
|
20
23
|
constructor(opts = {}) {
|
|
21
24
|
this.llmBackendActive = opts.llmProvider !== undefined;
|
|
25
|
+
this.isValidInstitutionDid = opts.isValidInstitutionDid ?? isCanonicalKashDid;
|
|
22
26
|
}
|
|
23
27
|
/** Whether an LLM provider seam is plumbed. */
|
|
24
28
|
hasLlmBackend() {
|
|
@@ -28,16 +32,22 @@ export class SopCompilerService {
|
|
|
28
32
|
* @throws SopCompilationError on nil / empty / cyclical input. */
|
|
29
33
|
async compileCorporateManual(institutionDid, rawText, version) {
|
|
30
34
|
if (typeof institutionDid !== "string" || institutionDid.length === 0) {
|
|
31
|
-
throw new SopCompilationError("institutionDid is required (non-empty did:kash:… identifier)"
|
|
35
|
+
throw new SopCompilationError("institutionDid is required (non-empty did:kash:… identifier)", {
|
|
36
|
+
kind: "invalid-institution-did",
|
|
37
|
+
});
|
|
32
38
|
}
|
|
33
|
-
if (!
|
|
34
|
-
throw new SopCompilationError("institutionDid is not a valid did:kash:… identifier"
|
|
39
|
+
if (!this.isValidInstitutionDid(institutionDid)) {
|
|
40
|
+
throw new SopCompilationError("institutionDid is not a valid did:kash:… identifier", {
|
|
41
|
+
kind: "invalid-institution-did",
|
|
42
|
+
});
|
|
35
43
|
}
|
|
36
44
|
if (typeof version !== "string" || version.length === 0 || !SEMVER_PATTERN.test(version)) {
|
|
37
|
-
throw new SopCompilationError("version must be a semver MAJOR.MINOR.PATCH string"
|
|
45
|
+
throw new SopCompilationError("version must be a semver MAJOR.MINOR.PATCH string", {
|
|
46
|
+
kind: "invalid-version",
|
|
47
|
+
});
|
|
38
48
|
}
|
|
39
49
|
if (typeof rawText !== "string") {
|
|
40
|
-
throw new SopCompilationError("rawText is required and must be a string");
|
|
50
|
+
throw new SopCompilationError("rawText is required and must be a string", { kind: "invalid-input" });
|
|
41
51
|
}
|
|
42
52
|
// Structural compile (throws SopCompilationError on empty / no steps).
|
|
43
53
|
const { taskDag: structural, sopSha256 } = await compileSopStructural({
|
|
@@ -51,7 +61,16 @@ export class SopCompilerService {
|
|
|
51
61
|
];
|
|
52
62
|
const cycle = detectCycle(structural.nodes, allEdges);
|
|
53
63
|
if (cycle !== null) {
|
|
54
|
-
|
|
64
|
+
// The offending goto lives on the source line of the node whose edge
|
|
65
|
+
// closes the cycle — surface it so a consumer can point at the raw line.
|
|
66
|
+
const closingNode = structural.nodes.find((n) => n.id === cycle.closingFrom);
|
|
67
|
+
throw new SopCompilationError(`SOP TaskDAG contains a cycle: ${cycle.path.join(" → ")} (closing edge ${cycle.closingFrom} → ${cycle.closingTo})`, {
|
|
68
|
+
kind: "cycle",
|
|
69
|
+
cyclePath: cycle.path,
|
|
70
|
+
closingFrom: cycle.closingFrom,
|
|
71
|
+
closingTo: cycle.closingTo,
|
|
72
|
+
lineIndex: closingNode?.sourceLine ?? null,
|
|
73
|
+
});
|
|
55
74
|
}
|
|
56
75
|
const taskDag = { nodes: structural.nodes, edges: allEdges, meta: structural.meta };
|
|
57
76
|
return { taskDag, sopSha256, institutionDid, version };
|
package/dist/sop/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/sop/service.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,uEAAuE;AACvE,+EAA+E;AAC/E,8EAA8E;AAC9E,2EAA2E;AAC3E,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,iCAAiC;AACjC,+EAA+E;AAE/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/sop/service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kashscript/hudhud",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "The Agent Protocol — the accountable agent runtime. SOP compiler, MCP allowlist + circuit breaker, PII-redaction interceptor, a signed action ledger + forensic scan (on @kashscript/attest), exception classification, AIUC-1 work certificates, DID registry, and a neuron-kernel work runtime. Agent auth via @kashscript/identity-server MCP OAuth 2.1 tokens. Ventures import hudhud, never raw neuron. Commercial (SSLA Schedule B).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -79,8 +79,8 @@
|
|
|
79
79
|
},
|
|
80
80
|
"dependencies": {
|
|
81
81
|
"@kashscript/identity-core": "0.3.1",
|
|
82
|
-
"@kashscript/attest": "0.1.
|
|
83
|
-
"@kashscript/identity-server": "0.
|
|
82
|
+
"@kashscript/attest": "0.1.7",
|
|
83
|
+
"@kashscript/identity-server": "0.2.0",
|
|
84
84
|
"@kashscript/neuron": "0.1.1"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
@@ -16,9 +16,12 @@ import type { DsseEnvelope, DsseSigner } from "@kashscript/attest";
|
|
|
16
16
|
|
|
17
17
|
import type { AnchorRecord } from "../anchor";
|
|
18
18
|
import { FAILURE_CLASSES } from "../exception";
|
|
19
|
-
import type {
|
|
19
|
+
import type { AnyExceptionClassificationRecord, FailureClass } from "../exception";
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
/** /2 (2026-09-23, d43 §4.7): the summary no longer carries `automationRatePct`.
|
|
22
|
+
* /1 certificates still verify — including their rate, when present. */
|
|
23
|
+
export const WORK_CERTIFICATE_FORMAT_VERSION = "kash-work-certificate/2" as const;
|
|
24
|
+
export const WORK_CERTIFICATE_FORMAT_VERSION_V1 = "kash-work-certificate/1" as const;
|
|
22
25
|
export const WORK_CERTIFICATE_PAYLOAD_TYPE = "application/vnd.kash.work-certificate+json" as const;
|
|
23
26
|
|
|
24
27
|
/** The AIUC-1 standard's canonical reference (web-verified). */
|
|
@@ -53,7 +56,7 @@ export interface CertifiedWorkRecord {
|
|
|
53
56
|
readonly ledgerRowCount: number;
|
|
54
57
|
readonly ledgerTipHash: string;
|
|
55
58
|
readonly signoff: { readonly operatorDid: string; readonly ledgerStepIndex: number } | null;
|
|
56
|
-
readonly classification:
|
|
59
|
+
readonly classification: AnyExceptionClassificationRecord | null;
|
|
57
60
|
readonly anchor: AnchorRecord | null;
|
|
58
61
|
}
|
|
59
62
|
|
|
@@ -75,7 +78,11 @@ export interface BuildWorkCertificateInput {
|
|
|
75
78
|
export interface WorkCertificateSummary {
|
|
76
79
|
readonly workVolumeDelivered: number;
|
|
77
80
|
readonly workVolumeDeclined: number;
|
|
78
|
-
|
|
81
|
+
/** @deprecated Present only on `kash-work-certificate/1` certificates; never
|
|
82
|
+
* minted since /2 — founder decision 2026-09-23 under d43 §4.7 (no
|
|
83
|
+
* productivity metric). Still recomputed on verify when present, so an old
|
|
84
|
+
* certificate cannot claim a rate its own outcomes do not support. */
|
|
85
|
+
readonly automationRatePct?: number;
|
|
79
86
|
readonly exceptionCount: number;
|
|
80
87
|
readonly exceptionsByClass: Record<FailureClass, number>;
|
|
81
88
|
readonly humanSignoffCount: number;
|
|
@@ -138,26 +145,23 @@ function emptyClassMix(): Record<FailureClass, number> {
|
|
|
138
145
|
}
|
|
139
146
|
|
|
140
147
|
function summarize(records: ReadonlyArray<CertifiedWorkRecord>, slaTargetPct: number | undefined): WorkCertificateSummary {
|
|
141
|
-
let
|
|
142
|
-
let withSignoff = 0;
|
|
148
|
+
let delivered = 0;
|
|
143
149
|
let declined = 0;
|
|
144
150
|
let slaMet = 0;
|
|
145
151
|
let anchored = 0;
|
|
146
152
|
const exceptionsByClass = emptyClassMix();
|
|
147
153
|
for (const r of records) {
|
|
148
|
-
if (r.status === "
|
|
149
|
-
else
|
|
150
|
-
else declined += 1;
|
|
154
|
+
if (r.status === "declined") declined += 1;
|
|
155
|
+
else delivered += 1;
|
|
151
156
|
if (r.slaMet) slaMet += 1;
|
|
152
157
|
if (r.anchor !== null) anchored += 1;
|
|
153
|
-
|
|
158
|
+
const fc = r.classification?.failureClass;
|
|
159
|
+
if (fc !== undefined) exceptionsByClass[fc] += 1;
|
|
154
160
|
}
|
|
155
|
-
const delivered = autonomous + withSignoff;
|
|
156
161
|
const total = records.length;
|
|
157
162
|
return {
|
|
158
163
|
workVolumeDelivered: delivered,
|
|
159
164
|
workVolumeDeclined: declined,
|
|
160
|
-
automationRatePct: delivered === 0 ? 0 : round1((autonomous / delivered) * 100),
|
|
161
165
|
exceptionCount: records.filter((r) => r.classification !== null).length,
|
|
162
166
|
exceptionsByClass,
|
|
163
167
|
humanSignoffCount: records.filter((r) => r.signoff !== null).length,
|
|
@@ -179,9 +183,9 @@ function mapAiuc1Coverage(records: ReadonlyArray<CertifiedWorkRecord>, summary:
|
|
|
179
183
|
case "B":
|
|
180
184
|
return { ...d, status: "evidenced", evidence: [`Every action Ed25519-signed into an append-only, hash-chained ledger (${records.reduce((n, r) => n + r.ledgerRowCount, 0)} signed rows this period).`, anchoredEvidence] };
|
|
181
185
|
case "C":
|
|
182
|
-
return { ...d, status: "evidenced", evidence: [`${summary.exceptionCount} exception(s) flagged for human review and resolved this period; each classified
|
|
186
|
+
return { ...d, status: "evidenced", evidence: [`${summary.exceptionCount} exception(s) flagged for human review and resolved this period; each classified and signed by a named human (and, where a model was involved, by where the model failed).`, "Restricted actions suspend for human judgment rather than proceed autonomously."] };
|
|
183
187
|
case "D":
|
|
184
|
-
return { ...d, status: "evidenced", evidence: ["Tools restricted to a per-provider allowlist (scope-gating): an out-of-allowlist or restricted tool call cannot be dispatched by construction."
|
|
188
|
+
return { ...d, status: "evidenced", evidence: ["Tools restricted to a per-provider allowlist (scope-gating): an out-of-allowlist or restricted tool call cannot be dispatched by construction."] };
|
|
185
189
|
case "E":
|
|
186
190
|
return { ...d, status: "evidenced", evidence: ["Complete signed activity log (the ledger) for every work item; a self-contained audit bundle is independently verifiable offline.", `${summary.humanSignoffCount} human sign-off(s), each a SECOND-key signed ledger row (the host cannot forge human judgment).`] };
|
|
187
191
|
case "F":
|
|
@@ -273,7 +277,6 @@ function recomputeCountsMatch(body: WorkCertificateBody): ReadonlyArray<string>
|
|
|
273
277
|
const o = body.outcomes;
|
|
274
278
|
const delivered = o.filter((x) => x.status !== "declined").length;
|
|
275
279
|
const declined = o.filter((x) => x.status === "declined").length;
|
|
276
|
-
const autonomous = o.filter((x) => x.status === "delivered_autonomous").length;
|
|
277
280
|
const slaMet = o.filter((x) => x.slaMet).length;
|
|
278
281
|
const exceptionCount = o.filter((x) => x.classificationId !== null).length;
|
|
279
282
|
const signoffCount = o.filter((x) => x.signoffLedgerStepIndex !== null).length;
|
|
@@ -288,8 +291,13 @@ function recomputeCountsMatch(body: WorkCertificateBody): ReadonlyArray<string>
|
|
|
288
291
|
check("exceptionCount", exceptionCount, s.exceptionCount);
|
|
289
292
|
check("humanSignoffCount", signoffCount, s.humanSignoffCount);
|
|
290
293
|
check("anchoredCount", anchored, s.anchoredCount);
|
|
291
|
-
|
|
292
|
-
|
|
294
|
+
// /1 certificates carried a rate; it is still held to its own outcomes. /2
|
|
295
|
+
// never mints one, and a /2 body that claims one is checked all the same.
|
|
296
|
+
if (s.automationRatePct !== undefined) {
|
|
297
|
+
const autonomous = o.filter((x) => x.status === "delivered_autonomous").length;
|
|
298
|
+
const wantAutomation = delivered === 0 ? 0 : round1((autonomous / delivered) * 100);
|
|
299
|
+
if (wantAutomation !== s.automationRatePct) mismatches.push(`automationRatePct: recomputed=${wantAutomation} vs summary=${s.automationRatePct}`);
|
|
300
|
+
}
|
|
293
301
|
const wantSla = total === 0 ? 0 : round1((slaMet / total) * 100);
|
|
294
302
|
if (wantSla !== s.slaAdherencePct) mismatches.push(`slaAdherencePct: recomputed=${wantSla} vs summary=${s.slaAdherencePct}`);
|
|
295
303
|
const classMix = emptyClassMix();
|
package/src/certificate/html.ts
CHANGED
|
@@ -89,7 +89,7 @@ export function renderWorkCertificateHtml(body: WorkCertificateBody, brand: Work
|
|
|
89
89
|
.band .verifiable { margin-top: 12px; display: inline-block; font-size: 12px; background: rgba(255,255,255,.16); padding: 4px 10px; border-radius: 3px; }
|
|
90
90
|
.body { padding: 28px 40px 40px; }
|
|
91
91
|
h2 { font-size: 15px; text-transform: uppercase; letter-spacing: .06em; color: var(--accent); border-bottom: 2px solid #eceff2; padding-bottom: 6px; margin: 30px 0 14px; }
|
|
92
|
-
.cards { display: grid; grid-template-columns: repeat(
|
|
92
|
+
.cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
|
|
93
93
|
.card { border: 1px solid #e6eaee; border-radius: 5px; padding: 14px; }
|
|
94
94
|
.card-v { font-size: 24px; font-weight: 680; color: var(--accent); }
|
|
95
95
|
.card-l { font-size: 12px; font-weight: 600; margin-top: 2px; }
|
|
@@ -124,7 +124,6 @@ export function renderWorkCertificateHtml(body: WorkCertificateBody, brand: Work
|
|
|
124
124
|
<h2>Delivered work this period</h2>
|
|
125
125
|
<div class="cards">
|
|
126
126
|
${metricCard("Outcomes delivered", String(s.workVolumeDelivered), `${s.workVolumeDeclined} declined at sign-off`)}
|
|
127
|
-
${metricCard("Automation rate", `${s.automationRatePct}%`, "delivered without human touch")}
|
|
128
127
|
${metricCard("Exceptions", String(s.exceptionCount), `${s.humanSignoffCount} human sign-off(s)`)}
|
|
129
128
|
${metricCard("SLA adherence", `${s.slaAdherencePct}%`, s.slaTargetPct === null ? "no target set" : `target ${s.slaTargetPct}%`)}
|
|
130
129
|
</div>
|
package/src/errors.ts
CHANGED
|
@@ -19,11 +19,36 @@ export class HudhudError extends Error {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
/**
|
|
22
|
+
/** Structured diagnostic for a SOP compilation failure. A consuming venture maps
|
|
23
|
+
* this onto its own wire envelope (e.g. an "empty" vs "error" track + a
|
|
24
|
+
* line-indexed cycle diagnostic) — the message alone is lossy. */
|
|
25
|
+
export type SopCompilationDetail =
|
|
26
|
+
| { readonly kind: "empty" }
|
|
27
|
+
| { readonly kind: "no-steps" }
|
|
28
|
+
| { readonly kind: "invalid-institution-did" }
|
|
29
|
+
| { readonly kind: "invalid-version" }
|
|
30
|
+
| { readonly kind: "invalid-input" }
|
|
31
|
+
| {
|
|
32
|
+
readonly kind: "cycle";
|
|
33
|
+
/** Node ids on the cycle, in traversal order. */
|
|
34
|
+
readonly cyclePath: ReadonlyArray<string>;
|
|
35
|
+
/** The edge that closes the cycle (`closingFrom` → `closingTo`). */
|
|
36
|
+
readonly closingFrom: string;
|
|
37
|
+
readonly closingTo: string;
|
|
38
|
+
/** 1-indexed source line of the node whose goto closes the cycle, or null
|
|
39
|
+
* if it could not be resolved. */
|
|
40
|
+
readonly lineIndex: number | null;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/** Thrown when an SOP manual cannot be compiled (cycle, malformed goto, empty).
|
|
44
|
+
* `detail` carries a structured discriminant so a consumer can build a precise
|
|
45
|
+
* wire diagnostic without parsing the message. */
|
|
23
46
|
export class SopCompilationError extends HudhudError {
|
|
24
|
-
|
|
47
|
+
readonly detail: SopCompilationDetail | null;
|
|
48
|
+
constructor(message: string, detail: SopCompilationDetail | null = null) {
|
|
25
49
|
super("SOP_COMPILATION", message);
|
|
26
50
|
this.name = "SopCompilationError";
|
|
51
|
+
this.detail = detail;
|
|
27
52
|
}
|
|
28
53
|
}
|
|
29
54
|
|