@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 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.1.0** — initial release: `buildComplianceReport`, `renderComplianceMarkdown`, `ControlMap`.
38
-
39
- ## License
40
-
41
- Apache-2.0.
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
@@ -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.1.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.2.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
+ }