@zanii/compliance 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/README.md +42 -41
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +29 -0
package/README.md
CHANGED
|
@@ -1,41 +1,42 @@
|
|
|
1
|
-
# @zanii/compliance
|
|
2
|
-
|
|
3
|
-
Turn a Zanii **audit bundle** into an auditor-ready compliance report — verified
|
|
4
|
-
offline, no network, no trust in Zanii's servers. Action breakdown by control,
|
|
5
|
-
on-chain anchoring coverage, and a Markdown renderer you can hand straight to an
|
|
6
|
-
auditor.
|
|
7
|
-
|
|
8
|
-
```sh
|
|
9
|
-
npm install @zanii/compliance
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## Usage
|
|
13
|
-
|
|
14
|
-
```ts
|
|
15
|
-
import { buildComplianceReport, renderComplianceMarkdown } from '@zanii/compliance';
|
|
16
|
-
|
|
17
|
-
// bundle = the JSON from `zanii export <did>` (or GET /v1/export/<did>)
|
|
18
|
-
const report = buildComplianceReport(bundle, {
|
|
19
|
-
controls: {
|
|
20
|
-
crm: 'AC-2 Account Management',
|
|
21
|
-
email: 'AU-2 Audit Events',
|
|
22
|
-
pay: 'SC-13 Cryptographic Protection',
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
console.log(report.verified, report.flags); // false-verified bundles still summarize, with a flag
|
|
27
|
-
console.log(renderComplianceMarkdown(report)); // → hand to the auditor
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
`buildComplianceReport` verifies the bundle with `@zanii/core` first; every figure
|
|
31
|
-
is derived from the receipts, and anything an auditor should notice (failed
|
|
32
|
-
verification, unanchored receipts, revoked delegations, unmapped namespaces)
|
|
33
|
-
lands in `report.flags`.
|
|
34
|
-
|
|
35
|
-
## Changelog
|
|
36
|
-
|
|
37
|
-
- **0.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
1
|
+
# @zanii/compliance
|
|
2
|
+
|
|
3
|
+
Turn a Zanii **audit bundle** into an auditor-ready compliance report — verified
|
|
4
|
+
offline, no network, no trust in Zanii's servers. Action breakdown by control,
|
|
5
|
+
on-chain anchoring coverage, and a Markdown renderer you can hand straight to an
|
|
6
|
+
auditor.
|
|
7
|
+
|
|
8
|
+
```sh
|
|
9
|
+
npm install @zanii/compliance
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { buildComplianceReport, renderComplianceMarkdown } from '@zanii/compliance';
|
|
16
|
+
|
|
17
|
+
// bundle = the JSON from `zanii export <did>` (or GET /v1/export/<did>)
|
|
18
|
+
const report = buildComplianceReport(bundle, {
|
|
19
|
+
controls: {
|
|
20
|
+
crm: 'AC-2 Account Management',
|
|
21
|
+
email: 'AU-2 Audit Events',
|
|
22
|
+
pay: 'SC-13 Cryptographic Protection',
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
console.log(report.verified, report.flags); // false-verified bundles still summarize, with a flag
|
|
27
|
+
console.log(renderComplianceMarkdown(report)); // → hand to the auditor
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
`buildComplianceReport` verifies the bundle with `@zanii/core` first; every figure
|
|
31
|
+
is derived from the receipts, and anything an auditor should notice (failed
|
|
32
|
+
verification, unanchored receipts, revoked delegations, unmapped namespaces)
|
|
33
|
+
lands in `report.flags`.
|
|
34
|
+
|
|
35
|
+
## Changelog
|
|
36
|
+
|
|
37
|
+
- **0.2.0** — added `reconcile` (provider-vs-ledger omission catcher).
|
|
38
|
+
- **0.1.0** — initial release: `buildComplianceReport`, `renderComplianceMarkdown`, `ControlMap`.
|
|
39
|
+
|
|
40
|
+
## License
|
|
41
|
+
|
|
42
|
+
Apache-2.0.
|
package/dist/index.d.ts
CHANGED
|
@@ -47,4 +47,22 @@ export declare function buildComplianceReport(bundle: AuditBundle, opts?: {
|
|
|
47
47
|
}): ComplianceReport;
|
|
48
48
|
/** Render a report as auditor-ready Markdown. */
|
|
49
49
|
export declare function renderComplianceMarkdown(r: ComplianceReport): string;
|
|
50
|
+
/**
|
|
51
|
+
* Reconciliation — the omission catcher (Connect / SPEC §14, segregation of duties).
|
|
52
|
+
*
|
|
53
|
+
* Diff the provider's own records (Stripe charges, Meta message ids, bank refs) against
|
|
54
|
+
* the settlement references in your ledger. Anything the provider did that has NO receipt
|
|
55
|
+
* is an unreported action — the exact hole a compromised agent would exploit by acting and
|
|
56
|
+
* simply not submitting a receipt. Run it on a schedule and receipt the report itself.
|
|
57
|
+
*/
|
|
58
|
+
export interface ReconcileReport {
|
|
59
|
+
ok: boolean;
|
|
60
|
+
matched: string[];
|
|
61
|
+
/** Provider did it, but there is no receipt — an UNREPORTED action (the red flag). */
|
|
62
|
+
missing_from_ledger: string[];
|
|
63
|
+
/** A receipt exists, but the provider has no matching record — phantom / failed. */
|
|
64
|
+
missing_from_provider: string[];
|
|
65
|
+
}
|
|
66
|
+
/** Reconcile provider settlement references against the ledger's. */
|
|
67
|
+
export declare function reconcile(ledgerRefs: Iterable<string>, providerRefs: Iterable<string>): ReconcileReport;
|
|
50
68
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAErF,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACtD,aAAa,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,2DAA2D;IAC3D,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9D,sEAAsE;IACtE,QAAQ,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,wDAAwD;IACxD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,UAAU,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,gBAAgB,CAyClB;AAED,iDAAiD;AACjD,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAwBpE"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAErF,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACtD,aAAa,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,2DAA2D;IAC3D,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9D,sEAAsE;IACtE,QAAQ,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,wDAAwD;IACxD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,UAAU,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,gBAAgB,CAyClB;AAED,iDAAiD;AACjD,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAwBpE;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sFAAsF;IACtF,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,oFAAoF;IACpF,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,eAAe,CASvG"}
|
package/dist/index.js
CHANGED
|
@@ -80,4 +80,18 @@ ${rows || '| — | — | 0 |'}
|
|
|
80
80
|
${flags}
|
|
81
81
|
`;
|
|
82
82
|
}
|
|
83
|
+
/** Reconcile provider settlement references against the ledger's. */
|
|
84
|
+
export function reconcile(ledgerRefs, providerRefs) {
|
|
85
|
+
const ledger = new Set(ledgerRefs);
|
|
86
|
+
const provider = new Set(providerRefs);
|
|
87
|
+
const matched = [];
|
|
88
|
+
const missing_from_ledger = [];
|
|
89
|
+
const missing_from_provider = [];
|
|
90
|
+
for (const ref of provider)
|
|
91
|
+
(ledger.has(ref) ? matched : missing_from_ledger).push(ref);
|
|
92
|
+
for (const ref of ledger)
|
|
93
|
+
if (!provider.has(ref))
|
|
94
|
+
missing_from_provider.push(ref);
|
|
95
|
+
return { ok: missing_from_ledger.length === 0, matched, missing_from_ledger, missing_from_provider };
|
|
96
|
+
}
|
|
83
97
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zanii/compliance",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Turn a Zanii audit bundle into an auditor-ready compliance report - offline verification, action breakdown, anchoring coverage, and control mapping, rendered to Markdown.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://ledger.zanii.agency",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@zanii/testing": "0.1.0"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@zanii/core": "0.
|
|
35
|
+
"@zanii/core": "0.3.0"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "tsc -p tsconfig.build.json",
|
package/src/index.ts
CHANGED
|
@@ -107,3 +107,32 @@ ${rows || '| — | — | 0 |'}
|
|
|
107
107
|
${flags}
|
|
108
108
|
`;
|
|
109
109
|
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Reconciliation — the omission catcher (Connect / SPEC §14, segregation of duties).
|
|
113
|
+
*
|
|
114
|
+
* Diff the provider's own records (Stripe charges, Meta message ids, bank refs) against
|
|
115
|
+
* the settlement references in your ledger. Anything the provider did that has NO receipt
|
|
116
|
+
* is an unreported action — the exact hole a compromised agent would exploit by acting and
|
|
117
|
+
* simply not submitting a receipt. Run it on a schedule and receipt the report itself.
|
|
118
|
+
*/
|
|
119
|
+
export interface ReconcileReport {
|
|
120
|
+
ok: boolean;
|
|
121
|
+
matched: string[];
|
|
122
|
+
/** Provider did it, but there is no receipt — an UNREPORTED action (the red flag). */
|
|
123
|
+
missing_from_ledger: string[];
|
|
124
|
+
/** A receipt exists, but the provider has no matching record — phantom / failed. */
|
|
125
|
+
missing_from_provider: string[];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Reconcile provider settlement references against the ledger's. */
|
|
129
|
+
export function reconcile(ledgerRefs: Iterable<string>, providerRefs: Iterable<string>): ReconcileReport {
|
|
130
|
+
const ledger = new Set(ledgerRefs);
|
|
131
|
+
const provider = new Set(providerRefs);
|
|
132
|
+
const matched: string[] = [];
|
|
133
|
+
const missing_from_ledger: string[] = [];
|
|
134
|
+
const missing_from_provider: string[] = [];
|
|
135
|
+
for (const ref of provider) (ledger.has(ref) ? matched : missing_from_ledger).push(ref);
|
|
136
|
+
for (const ref of ledger) if (!provider.has(ref)) missing_from_provider.push(ref);
|
|
137
|
+
return { ok: missing_from_ledger.length === 0, matched, missing_from_ledger, missing_from_provider };
|
|
138
|
+
}
|