@blamejs/core 0.13.5 → 0.13.7
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/CHANGELOG.md +4 -0
- package/README.md +1 -0
- package/index.js +1 -0
- package/lib/ai-disclosure.js +2 -3
- package/lib/ai-frontier-protocol.js +196 -0
- package/lib/archive-tar.js +2 -3
- package/lib/backup/index.js +2 -3
- package/lib/cose.js +4 -3
- package/lib/mail-server-jmap.js +9 -9
- package/lib/mail-server-submission.js +3 -2
- package/lib/mdoc.js +14 -14
- package/lib/network-dnssec.js +10 -8
- package/package.json +1 -1
- package/sbom.cdx.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,10 @@ upgrading across more than a few patches at a time.
|
|
|
8
8
|
|
|
9
9
|
## v0.13.x
|
|
10
10
|
|
|
11
|
+
- v0.13.7 (2026-05-26) — **Documentation accuracy — several primitives described shipped features as deferred.** A documentation sweep corrected primitive descriptions that still called features deferred after they shipped, so the wiki and inline docs now match the code. b.mdoc documents that device authentication (the ISO 18013-5 §9.1.3 signature variant, verifyDeviceAuth) is verified, not deferred — only the COSE_Mac0 device-auth variant remains refused. b.network.dns.dnssec documents that the root-to-zone chain walk against the IANA trust anchors (verifyChain) and NSEC / NSEC3 denial of existence (verifyDenial / nsec3Hash) ship, where the card previously said they were deferred. b.cose lists COSE_Mac0 and COSE_Encrypt0 among what it ships. The JMAP server documents its push channel, blob upload/download, and EmailSubmission handlers as present, and the submission server documents CHUNKING / BDAT as supported. A new test detector keeps this class of drift from recurring: it fails the build when a comment promises a feature lands in a version that has already shipped. **Fixed:** *Corrected `deferred`/`does-not-ship` docs for features that have shipped* — `b.mdoc` (device authentication, §9.1.3), `b.network.dns.dnssec` (chain walk + NSEC/NSEC3), `b.cose` (COSE_Mac0 + COSE_Encrypt0), the JMAP server (push, blob, EmailSubmission), and the submission server (BDAT/CHUNKING) all carried `@card`/`@intro` text describing shipped capabilities as deferred or not-shipped. The descriptions now match the implemented surface; genuinely-deferred items (the mdoc MAC variant, DNSSEC in-RDATA name canonicalization, COSE multi-signer/multi-recipient) remain documented as such. **Detectors:** *Overdue-defer detector in the codebase-pattern gate* — A new check fails the build when a comment promises a feature "lands in" / is "deferred to" / is "not supported in" a version that the package has already reached — catching stale deferral notes (a feature that shipped but whose comment still says otherwise, or a missed deadline) before they reach a release. An allowlist records the deliberate defer-with-condition exceptions.
|
|
12
|
+
|
|
13
|
+
- v0.13.6 (2026-05-26) — **`b.ai.frontierModelProtocol` — California SB 53 frontier-AI obligations.** b.ai.frontierModelProtocol assesses a developer's obligations under California's Transparency in Frontier Artificial Intelligence Act — SB 53, Cal. Bus. & Prof. Code §22757.10, effective 2026-01-01 — from a model's training compute and the developer's revenue. It reports whether the model crosses the frontier threshold (more than 10^26 training FLOPs), whether the developer is a large frontier developer (prior-year revenue, with affiliates, above $500M), and the resulting obligations: every frontier developer must report critical safety incidents and publish a transparency report, and a large frontier developer must additionally publish an annual safety framework and disclose its catastrophic-risk assessment. Passing a candidate safety framework reports which required elements (risk identification, mitigation, governance, cybersecurity, standards alignment) are missing. b.ai.frontierModelProtocol.incidentReport validates a critical-incident type against the Act's four categories and computes the notification deadline to the California Office of Emergency Services — 15 days from discovery, or 24 hours when there is an imminent risk of death or serious physical injury. The ca-tfaia compliance posture was already in the catalog. **Added:** *`b.ai.frontierModelProtocol` — SB 53 threshold classification, obligations, and incident reporting* — `b.ai.frontierModelProtocol({ trainingFlops, annualRevenueUsd, framework? })` returns `isFrontierModel`, `isLargeFrontierDeveloper`, the `obligations` list, and (when a framework is supplied) its `frameworkGaps`. `b.ai.frontierModelProtocol.incidentReport({ type, discoveredAt, imminentRiskToLife? })` builds a critical-safety-incident report with the California OES recipient and a `dueAt` / `deadlineHours` computed from the 15-day (or 24-hour imminent-risk) statutory window; `type` must be one of the four categories in `INCIDENT_TYPES`. Throws `FrontierProtocolError` on malformed input.
|
|
14
|
+
|
|
11
15
|
- v0.13.5 (2026-05-26) — **`b.ai.aedtBiasAudit` — NYC Local Law 144 bias audit.** b.ai.aedtBiasAudit computes the bias-audit figures New York City Local Law 144 requires before an Automated Employment Decision Tool may screen candidates (NYC Admin. Code §20-870 et seq.; DCWP rules 6 RCNY §5-300). Given the per-category counts an independent auditor collected — selected/total for a pass-fail tool, or scored-above-the-overall-median/total for a continuous-score tool — it returns the selection (or scoring) rate, the impact ratio (each group's rate divided by the most-selected group's rate), and an adverse-impact flag (impact ratio below the EEOC four-fifths threshold of 0.8) for every group, across the sex, race/ethnicity, and intersectional dimensions, plus the most-selected group per dimension and an overall flag. Categories under 2% of the audited data are marked excluded per DCWP discretion. It is a pure calculation that produces exactly the figures the annual published summary must contain — the law mandates the calculation, not any particular remediation. The relevant compliance postures (nyc-ll144, and ca-tfaia for California SB 53) were already in the catalog. **Added:** *`b.ai.aedtBiasAudit` — Local Law 144 selection/scoring rates and four-fifths impact ratios* — `b.ai.aedtBiasAudit({ type, metadata, categories, minCategoryShare? })` where `type` is `"selection"` (group entries `{ selected, total }`) or `"scoring"` (`{ scoredAboveMedian, total }`). Returns per-group rate, impact ratio, and `adverseImpact` flag across the `sex`, `raceEthnicity`, and `intersectional` dimensions, plus the most-selected group per dimension and an `anyAdverseImpact` summary. Categories below `minCategoryShare` (2% default) are excluded from the impact-ratio basis. Throws `AedtBiasAuditError` on malformed input.
|
|
12
16
|
|
|
13
17
|
- v0.13.4 (2026-05-26) — **`b.crdt` — conflict-free replicated data types.** b.crdt adds state-based Conflict-free Replicated Data Types: data structures that independent replicas update without coordination and still converge to the same value once they have exchanged state. Each type's merge is a join over a semilattice — commutative, associative, and idempotent — so replicas can merge in any order, any number of times, and agree, which makes these the substrate for active/active cluster state, offline-first clients that reconcile on reconnect, and eventually-consistent counters, sets, and maps. The release ships the full state-based family: grow-only and positive-negative counters (gCounter / pnCounter), grow-only, two-phase, and observed-remove sets (gSet / twoPSet / orSet), a last-write-wins register (lwwRegister), and an observed-remove map (orMap). Every type exposes the same contract — local mutators, merge(other) that returns a converged instance without mutating either operand, value() for the materialized value, and state() / fromState() for a JSON-serializable form to snapshot via b.archive or b.backup or ship to a peer — and carries a replicaId so per-replica contributions stay distinct. **Added:** *`b.crdt` — state-based CvRDT counters, sets, register, and map* — `b.crdt.gCounter` / `pnCounter` (grow-only and increment/decrement counters), `b.crdt.gSet` / `twoPSet` / `orSet` (grow-only, two-phase, and observed-remove sets — `orSet` supports re-add and resolves a concurrent add-vs-remove as add-wins), `b.crdt.lwwRegister` (last-write-wins with a deterministic replicaId tie-break), and `b.crdt.orMap` (observed-remove keys with last-write-wins values). Each exposes `merge` / `value` / `state` / `fromState` and converges by the CvRDT laws. `orSet` and `orMap` accept `tombstoneRetention` to bound tombstone memory against a remove flood.
|
package/README.md
CHANGED
|
@@ -190,6 +190,7 @@ The framework bundles the surface a typical Node app reaches for. Every primitiv
|
|
|
190
190
|
- **AI usage quotas** — per-tenant / per-model budgets metered by tokens / requests / cost-usd / compute-hours over calendar-aligned windows, with an atomic conditional reserve (no charge-then-refund race) + hard/soft/warn enforcement and an optional cross-node store; defends OWASP LLM10:2025 unbounded consumption / denial-of-wallet (`b.ai.quota`)
|
|
191
191
|
- **AI capability routing** — model-capability registry (context window / modalities / tool use / reasoning tier / cost rates) + a router that picks the cheapest model satisfying a request's requirements, refusing capability mismatches before the inference call (NIST AI RMF MAP + Model Cards); composes with `b.ai.quota` cost budgets (`b.ai.capability`)
|
|
192
192
|
- **AEDT bias audit** — NYC Local Law 144 bias-audit figures (`b.ai.aedtBiasAudit`): selection / scoring rates and EEOC four-fifths-rule impact ratios across sex, race/ethnicity, and their intersection, with the most-selected group and adverse-impact flags (impact ratio < 0.8) for the annual published summary; sub-2% categories excludable per DCWP §5-301
|
|
193
|
+
- **Frontier AI protocol** — California SB 53 (Transparency in Frontier AI Act) obligations (`b.ai.frontierModelProtocol`): classify the frontier-model (>10²⁶ training FLOPs) and large-frontier-developer (>$500M revenue) thresholds, enumerate the resulting obligations, check a safety framework for required elements, and build a critical-safety-incident report with the 15-day / 24-hour California OES notification deadline (`.incidentReport`)
|
|
193
194
|
### Compliance regimes
|
|
194
195
|
|
|
195
196
|
- **Posture coordinator** — `b.compliance` cascades operator-declared regime into retention / audit / db / cryptoField via POSTURE_DEFAULTS:
|
package/index.js
CHANGED
|
@@ -478,6 +478,7 @@ module.exports = {
|
|
|
478
478
|
capability: require("./lib/ai-capability"),
|
|
479
479
|
dp: require("./lib/ai-dp"),
|
|
480
480
|
aedtBiasAudit: require("./lib/ai-aedt-bias-audit"),
|
|
481
|
+
frontierModelProtocol: require("./lib/ai-frontier-protocol"),
|
|
481
482
|
},
|
|
482
483
|
promisePool: require("./lib/promise-pool"),
|
|
483
484
|
sdNotify: require("./lib/sd-notify"),
|
package/lib/ai-disclosure.js
CHANGED
|
@@ -187,9 +187,8 @@ function chatbot(session, opts) {
|
|
|
187
187
|
* machine-readable manner. This primitive returns the disclosure
|
|
188
188
|
* payload (visible label + structured metadata) the operator wires
|
|
189
189
|
* into the encoder / response pipeline. C2PA manifest emission is
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* adapter consumes when it lands.
|
|
190
|
+
* handled by `b.contentCredentials`; this primitive supplies the label
|
|
191
|
+
* markup and the metadata schema that the C2PA adapter consumes.
|
|
193
192
|
*
|
|
194
193
|
* @opts
|
|
195
194
|
* contentType: "image" | "audio" | "video" | "text", // required
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @module b.ai.frontierModelProtocol
|
|
4
|
+
* @nav Compliance
|
|
5
|
+
* @title Frontier AI Protocol
|
|
6
|
+
*
|
|
7
|
+
* @intro
|
|
8
|
+
* Assess a developer's obligations under California's Transparency in
|
|
9
|
+
* Frontier Artificial Intelligence Act — SB 53, Cal. Bus. & Prof. Code
|
|
10
|
+
* §22757.10 et seq., signed 2025-09-29 and effective 2026-01-01 — and build
|
|
11
|
+
* the critical-safety-incident report the law requires. SB 53 attaches
|
|
12
|
+
* obligations by two thresholds: a <em>frontier model</em> is one trained
|
|
13
|
+
* with more than 10<sup>26</sup> floating-point operations (including
|
|
14
|
+
* cumulative fine-tuning), and a <em>large frontier developer</em> is a
|
|
15
|
+
* frontier developer whose annual revenue, with affiliates, exceeded
|
|
16
|
+
* $500,000,000 in the prior calendar year. Frontier developers must report
|
|
17
|
+
* critical safety incidents; large frontier developers must additionally
|
|
18
|
+
* publish an annual frontier-AI safety framework.
|
|
19
|
+
*
|
|
20
|
+
* <code>frontierModelProtocol(opts)</code> takes the model's training compute
|
|
21
|
+
* and the developer's revenue and returns which thresholds are crossed and
|
|
22
|
+
* the resulting obligations, optionally checking that a supplied safety
|
|
23
|
+
* framework carries the elements the Act expects (risk identification,
|
|
24
|
+
* mitigation, governance, cybersecurity, and alignment with a recognized
|
|
25
|
+
* standard such as the NIST AI RMF or ISO/IEC 42001).
|
|
26
|
+
* <code>frontierModelProtocol.incidentReport(opts)</code> validates a
|
|
27
|
+
* critical-incident type against the Act's four definitions and computes the
|
|
28
|
+
* notification deadline: a routine report goes to the California Office of
|
|
29
|
+
* Emergency Services within 15 days of discovery; an imminent risk of death
|
|
30
|
+
* or serious physical injury is reported to an applicable authority within 24
|
|
31
|
+
* hours.
|
|
32
|
+
*
|
|
33
|
+
* @card
|
|
34
|
+
* California SB 53 frontier-AI protocol (`b.ai.frontierModelProtocol`) —
|
|
35
|
+
* classify frontier-model / large-developer thresholds (10²⁶ FLOPs, $500M
|
|
36
|
+
* revenue), enumerate obligations, and build the critical-safety-incident
|
|
37
|
+
* report with the 15-day / 24-hour OES notification deadline.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
var C = require("./constants");
|
|
41
|
+
var { defineClass } = require("./framework-error");
|
|
42
|
+
|
|
43
|
+
var FrontierProtocolError = defineClass("FrontierProtocolError", { alwaysPermanent: true });
|
|
44
|
+
|
|
45
|
+
// SB 53 thresholds.
|
|
46
|
+
var FRONTIER_FLOP_THRESHOLD = 1e26; // > 10^26 training FLOPs → frontier model
|
|
47
|
+
var LARGE_DEVELOPER_REVENUE_USD = 5e8; // > $500,000,000 prior-year revenue → large developer
|
|
48
|
+
var INCIDENT_DEADLINE_MS = C.TIME.days(15); // report to CA OES within 15 days of discovery
|
|
49
|
+
var IMMINENT_DEADLINE_MS = C.TIME.hours(24); // within 24 hours if imminent risk to life
|
|
50
|
+
|
|
51
|
+
// The four critical safety incident categories (Cal. Bus. & Prof. Code §22757.10).
|
|
52
|
+
var CRITICAL_INCIDENT_TYPES = {
|
|
53
|
+
"weights-exfiltration-harm": "Unauthorized access, modification, or exfiltration of frontier-model weights resulting in death or bodily injury",
|
|
54
|
+
"catastrophic-risk-materialization": "Harm resulting from the materialization of a catastrophic risk (including loss of life or property from a dangerous capability)",
|
|
55
|
+
"loss-of-control-harm": "Loss of control of a frontier model causing death or bodily injury",
|
|
56
|
+
"deceptive-control-subversion": "A frontier model using deceptive techniques to subvert developer controls, demonstrating materially increased catastrophic risk",
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Elements a large frontier developer's published safety framework must address.
|
|
60
|
+
var REQUIRED_FRAMEWORK_ELEMENTS = ["riskIdentification", "riskMitigation", "governance", "cybersecurity", "standardsAlignment"];
|
|
61
|
+
|
|
62
|
+
function _posNum(v, label) {
|
|
63
|
+
if (typeof v !== "number" || !isFinite(v) || v < 0) throw new FrontierProtocolError("frontier/bad-value", "frontierModelProtocol: " + label + " must be a non-negative finite number");
|
|
64
|
+
return v;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @primitive b.ai.frontierModelProtocol
|
|
69
|
+
* @signature b.ai.frontierModelProtocol(opts)
|
|
70
|
+
* @since 0.13.6
|
|
71
|
+
* @status stable
|
|
72
|
+
* @compliance ca-tfaia, soc2
|
|
73
|
+
* @related b.ai.aedtBiasAudit, b.ai.disclosure.applyAll
|
|
74
|
+
*
|
|
75
|
+
* Determine SB 53 obligations from a model's training compute and the
|
|
76
|
+
* developer's revenue. Returns <code>isFrontierModel</code> (training FLOPs
|
|
77
|
+
* above 10<sup>26</sup>), <code>isLargeFrontierDeveloper</code> (a frontier
|
|
78
|
+
* developer with revenue above $500M), and the resulting
|
|
79
|
+
* <code>obligations</code>. When <code>framework</code> is supplied, its
|
|
80
|
+
* required elements are checked and reported in <code>frameworkGaps</code>.
|
|
81
|
+
* Throws <code>FrontierProtocolError</code> on malformed input.
|
|
82
|
+
*
|
|
83
|
+
* @opts
|
|
84
|
+
* trainingFlops: number, // total training FLOPs incl. fine-tuning (required)
|
|
85
|
+
* annualRevenueUsd: number, // developer prior-year revenue with affiliates (default: 0)
|
|
86
|
+
* framework: object, // optional safety framework to check for required elements
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* var p = b.ai.frontierModelProtocol({ trainingFlops: 5e26, annualRevenueUsd: 1e9 });
|
|
90
|
+
* p.isFrontierModel; // → true
|
|
91
|
+
* p.isLargeFrontierDeveloper; // → true
|
|
92
|
+
* p.obligations; // → ["report-critical-safety-incidents", "publish-annual-safety-framework", ...]
|
|
93
|
+
*/
|
|
94
|
+
function frontierModelProtocol(opts) {
|
|
95
|
+
opts = opts || {};
|
|
96
|
+
if (typeof opts !== "object") throw new FrontierProtocolError("frontier/bad-opts", "frontierModelProtocol: opts must be an object");
|
|
97
|
+
var allowed = { trainingFlops: 1, annualRevenueUsd: 1, framework: 1 };
|
|
98
|
+
Object.keys(opts).forEach(function (k) { if (!allowed[k]) throw new FrontierProtocolError("frontier/bad-opts", "frontierModelProtocol: unknown option '" + k + "'"); });
|
|
99
|
+
|
|
100
|
+
var flops = _posNum(opts.trainingFlops, "trainingFlops");
|
|
101
|
+
var revenue = opts.annualRevenueUsd != null ? _posNum(opts.annualRevenueUsd, "annualRevenueUsd") : 0;
|
|
102
|
+
|
|
103
|
+
var isFrontierModel = flops > FRONTIER_FLOP_THRESHOLD;
|
|
104
|
+
var isLargeFrontierDeveloper = isFrontierModel && revenue > LARGE_DEVELOPER_REVENUE_USD;
|
|
105
|
+
|
|
106
|
+
var obligations = [];
|
|
107
|
+
if (isFrontierModel) {
|
|
108
|
+
obligations.push("report-critical-safety-incidents");
|
|
109
|
+
obligations.push("publish-transparency-report");
|
|
110
|
+
}
|
|
111
|
+
if (isLargeFrontierDeveloper) {
|
|
112
|
+
obligations.push("publish-annual-safety-framework");
|
|
113
|
+
obligations.push("disclose-catastrophic-risk-assessment");
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
var out = {
|
|
117
|
+
isFrontierModel: isFrontierModel,
|
|
118
|
+
isLargeFrontierDeveloper: isLargeFrontierDeveloper,
|
|
119
|
+
thresholds: { frontierFlops: FRONTIER_FLOP_THRESHOLD, largeDeveloperRevenueUsd: LARGE_DEVELOPER_REVENUE_USD },
|
|
120
|
+
obligations: obligations,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
if (opts.framework != null) {
|
|
124
|
+
if (typeof opts.framework !== "object") throw new FrontierProtocolError("frontier/bad-value", "frontierModelProtocol: framework must be an object");
|
|
125
|
+
var gaps = REQUIRED_FRAMEWORK_ELEMENTS.filter(function (el) { return !opts.framework[el]; });
|
|
126
|
+
out.frameworkGaps = gaps;
|
|
127
|
+
out.frameworkComplete = gaps.length === 0;
|
|
128
|
+
}
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @primitive b.ai.frontierModelProtocol.incidentReport
|
|
134
|
+
* @signature b.ai.frontierModelProtocol.incidentReport(opts)
|
|
135
|
+
* @since 0.13.6
|
|
136
|
+
* @status stable
|
|
137
|
+
* @compliance ca-tfaia, soc2
|
|
138
|
+
* @related b.ai.frontierModelProtocol, b.ai.aedtBiasAudit
|
|
139
|
+
*
|
|
140
|
+
* Build a critical-safety-incident report and compute its notification
|
|
141
|
+
* deadline to the California Office of Emergency Services. <code>type</code>
|
|
142
|
+
* must be one of the Act's four categories; <code>discoveredAt</code> is when
|
|
143
|
+
* the incident was discovered. The deadline is 15 days from discovery, or 24
|
|
144
|
+
* hours when <code>imminentRiskToLife</code> is set. Returns the structured
|
|
145
|
+
* report with <code>dueAt</code> and <code>deadlineHours</code>. Throws
|
|
146
|
+
* <code>FrontierProtocolError</code> on an unknown type or bad timestamp.
|
|
147
|
+
*
|
|
148
|
+
* @opts
|
|
149
|
+
* type: string, // one of b.ai.frontierModelProtocol.INCIDENT_TYPES (required)
|
|
150
|
+
* discoveredAt: Date, // discovery time (Date or epoch-ms; default: now)
|
|
151
|
+
* imminentRiskToLife: boolean, // true → 24-hour deadline (default: false → 15 days)
|
|
152
|
+
* description: string, // free-text incident description (optional)
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* var r = b.ai.frontierModelProtocol.incidentReport({
|
|
156
|
+
* type: "loss-of-control-harm", discoveredAt: new Date("2026-06-01T00:00:00Z"),
|
|
157
|
+
* });
|
|
158
|
+
* r.deadlineHours; // → 360 (15 days)
|
|
159
|
+
* r.recipient; // → "California Office of Emergency Services"
|
|
160
|
+
*/
|
|
161
|
+
function incidentReport(opts) {
|
|
162
|
+
opts = opts || {};
|
|
163
|
+
if (typeof opts !== "object") throw new FrontierProtocolError("frontier/bad-opts", "incidentReport: opts must be an object");
|
|
164
|
+
if (!CRITICAL_INCIDENT_TYPES[opts.type]) throw new FrontierProtocolError("frontier/bad-incident-type", "incidentReport: type must be one of " + Object.keys(CRITICAL_INCIDENT_TYPES).join(", "));
|
|
165
|
+
|
|
166
|
+
var discoveredMs;
|
|
167
|
+
if (opts.discoveredAt == null) discoveredMs = Date.now();
|
|
168
|
+
else if (opts.discoveredAt instanceof Date) discoveredMs = opts.discoveredAt.getTime();
|
|
169
|
+
else discoveredMs = Number(opts.discoveredAt);
|
|
170
|
+
if (!isFinite(discoveredMs) || discoveredMs < 0) throw new FrontierProtocolError("frontier/bad-value", "incidentReport: discoveredAt must be a Date or non-negative epoch-ms");
|
|
171
|
+
|
|
172
|
+
var imminent = opts.imminentRiskToLife === true;
|
|
173
|
+
var windowMs = imminent ? IMMINENT_DEADLINE_MS : INCIDENT_DEADLINE_MS;
|
|
174
|
+
|
|
175
|
+
return {
|
|
176
|
+
type: opts.type,
|
|
177
|
+
typeDescription: CRITICAL_INCIDENT_TYPES[opts.type],
|
|
178
|
+
description: typeof opts.description === "string" ? opts.description : null,
|
|
179
|
+
imminentRiskToLife: imminent,
|
|
180
|
+
discoveredAt: new Date(discoveredMs).toISOString(),
|
|
181
|
+
dueAt: new Date(discoveredMs + windowMs).toISOString(),
|
|
182
|
+
deadlineHours: windowMs / C.TIME.hours(1),
|
|
183
|
+
// §22757.13: the routine report goes to OES within 15 days; an imminent
|
|
184
|
+
// risk of death or serious physical injury is reported to an applicable
|
|
185
|
+
// authority within 24 hours, which the operator selects for the incident.
|
|
186
|
+
recipient: imminent ? "An applicable authority with jurisdiction (e.g. law enforcement or a public-safety agency)" : "California Office of Emergency Services",
|
|
187
|
+
citation: "Cal. Bus. & Prof. Code §22757.13 (SB 53)",
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
frontierModelProtocol.incidentReport = incidentReport;
|
|
192
|
+
frontierModelProtocol.INCIDENT_TYPES = Object.keys(CRITICAL_INCIDENT_TYPES);
|
|
193
|
+
frontierModelProtocol.REQUIRED_FRAMEWORK_ELEMENTS = REQUIRED_FRAMEWORK_ELEMENTS;
|
|
194
|
+
frontierModelProtocol.FrontierProtocolError = FrontierProtocolError;
|
|
195
|
+
|
|
196
|
+
module.exports = frontierModelProtocol;
|
package/lib/archive-tar.js
CHANGED
|
@@ -56,11 +56,10 @@
|
|
|
56
56
|
* - CVE-2024-12905 / CVE-2025-48387 (tar-fs path traversal).
|
|
57
57
|
* - CVE-2025-4138 / 4330 (Python tarfile data filter bypass).
|
|
58
58
|
*
|
|
59
|
-
* Out of scope
|
|
59
|
+
* Compression is via `b.archive.gz` composition (tar.gz). Out of scope
|
|
60
|
+
* (v1):
|
|
60
61
|
* - Sparse-file emission (read reconstructs them; write doesn't
|
|
61
62
|
* produce sparse).
|
|
62
|
-
* - Compression (tar.gz lands v0.12.9 via `b.archive.gz`
|
|
63
|
-
* composition).
|
|
64
63
|
* - BSD-tar extensions beyond pax.
|
|
65
64
|
*
|
|
66
65
|
* @card
|
package/lib/backup/index.js
CHANGED
|
@@ -1028,9 +1028,8 @@ module.exports = {
|
|
|
1028
1028
|
* Adapter-driven storage backend. Wraps the bundle directory's file
|
|
1029
1029
|
* tree into per-file key-value pairs routed through an operator-
|
|
1030
1030
|
* supplied byte-store adapter so backup bundles can land anywhere
|
|
1031
|
-
* that exposes the contract
|
|
1032
|
-
* folding
|
|
1033
|
-
* objectStore v0.12.11).
|
|
1031
|
+
* that exposes the contract: local fs (the default), tar / tar.gz
|
|
1032
|
+
* folding, and S3 / MinIO / Azure / GCS objectStore adapters.
|
|
1034
1033
|
*
|
|
1035
1034
|
* The adapter contract (small surface; an `fs` implementation is the
|
|
1036
1035
|
* default + ships in `lib/backup/_adapter-fs.js`):
|
package/lib/cose.js
CHANGED
|
@@ -41,9 +41,10 @@
|
|
|
41
41
|
* 2) listing a header label the verifier does not understand is
|
|
42
42
|
* refused (RFC 9052 §3.1) — a crit-bypass defense.
|
|
43
43
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
44
|
+
* Ships COSE_Sign1 (single-signer, attached payload), COSE_Mac0, and
|
|
45
|
+
* COSE_Encrypt0 (single-recipient AEAD). Detached payload, COSE_Sign
|
|
46
|
+
* (multi-signer), and COSE_Encrypt (multi-recipient) are
|
|
47
|
+
* deferred-with-condition (operator demand).
|
|
47
48
|
*
|
|
48
49
|
* @card
|
|
49
50
|
* COSE_Sign1 sign / verify (RFC 9052) over the in-tree CBOR codec —
|
package/lib/mail-server-jmap.js
CHANGED
|
@@ -95,17 +95,17 @@
|
|
|
95
95
|
* - `urn:ietf:params:jmap:error:accountNotFound`
|
|
96
96
|
* - `urn:ietf:params:jmap:error:serverFail` (opaque last-resort)
|
|
97
97
|
*
|
|
98
|
+
* ## Beyond Core + Mail, this also ships
|
|
99
|
+
*
|
|
100
|
+
* - **Push channel (RFC 8887)** — `eventSourceHandler` (SSE) and
|
|
101
|
+
* `webSocketHandler` (WebSocket, with `StateChange` push).
|
|
102
|
+
* - **Blob upload/download (RFC 8620 §6)** — `uploadHandler` /
|
|
103
|
+
* `downloadHandler`, routing uploads through the guard-* family.
|
|
104
|
+
* - **EmailSubmission/set (RFC 8621 §7.5)** — `emailSubmissionSetHandler`,
|
|
105
|
+
* composing `b.mail.send.deliver`.
|
|
106
|
+
*
|
|
98
107
|
* ## What v1 does NOT ship
|
|
99
108
|
*
|
|
100
|
-
* - **Push channel (SSE + WebSocket per RFC 8887)** — operator wires
|
|
101
|
-
* `b.sse` or `b.websocket` to the `pushSubscribe` hook. v1.5
|
|
102
|
-
* bundles a turnkey push handler.
|
|
103
|
-
* - **Blob upload/download endpoints** — operator wires their own
|
|
104
|
-
* `/jmap/upload` / `/jmap/download` handlers; the framework
|
|
105
|
-
* supplies `b.storage` + `b.objectStore` + the guard-* family
|
|
106
|
-
* for the actual upload path.
|
|
107
|
-
* - **EmailSubmission (RFC 8621 §7)** — operator wires the bridge
|
|
108
|
-
* to `b.mail.server.submission`'s outbound agent.
|
|
109
109
|
* - **Calendars / Contacts (RFC 9610)**, **Sieve (RFC 9404)**,
|
|
110
110
|
* **MDN (RFC 9007)** — opt-in capabilities.
|
|
111
111
|
*
|
|
@@ -79,11 +79,12 @@
|
|
|
79
79
|
*
|
|
80
80
|
* - **DKIM signing pre-relay** — operator wires `b.mail.dkim.sign`
|
|
81
81
|
* in their outbound agent.
|
|
82
|
-
* - **CHUNKING (BDAT) extension** — RFC 3030 BDAT not yet
|
|
83
|
-
* supported on submission; clients use DATA instead.
|
|
84
82
|
* - **Per-actor outbound quota** — operator implements via
|
|
85
83
|
* `b.dailyByteQuota` against the authenticated actor.
|
|
86
84
|
*
|
|
85
|
+
* (CHUNKING / BDAT, RFC 3030, IS supported — advertised in EHLO and
|
|
86
|
+
* handled alongside DATA.)
|
|
87
|
+
*
|
|
87
88
|
* ## Composition contract
|
|
88
89
|
*
|
|
89
90
|
* Every gate is a primitive that already exists. Submission listener
|
package/lib/mdoc.js
CHANGED
|
@@ -30,22 +30,22 @@
|
|
|
30
30
|
* <code>opts.trustAnchorsPem</code> additionally verifies the issuer
|
|
31
31
|
* certificate chain and its validity at the asserted time.
|
|
32
32
|
*
|
|
33
|
-
* <strong>Scope.</strong>
|
|
34
|
-
* (ISO 18013-5 §9.1.2.4
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* ecosystems.
|
|
33
|
+
* <strong>Scope.</strong> Two halves are verified: issuer-data
|
|
34
|
+
* authentication (ISO 18013-5 §9.1.2.4 — the data is genuine and
|
|
35
|
+
* issuer-signed, via <code>verifyIssuerSigned</code>) and mdoc device
|
|
36
|
+
* authentication (§9.1.3 — holder binding over the verifier's
|
|
37
|
+
* <code>SessionTranscript</code>, via <code>verifyDeviceAuth</code>).
|
|
38
|
+
* Device auth covers the COSE_Sign1 signature variant; the COSE_Mac0
|
|
39
|
+
* (deviceMac) variant is refused rather than mis-verified. Composes
|
|
40
|
+
* <code>b.cose</code> + <code>b.cbor</code>; no new runtime dependency.
|
|
41
|
+
* Distinct from W3C VCDM (<code>b.vc</code>) and IETF SD-JWT VC
|
|
42
|
+
* (<code>b.auth.sdJwtVc</code>) — the three credential ecosystems.
|
|
43
43
|
*
|
|
44
44
|
* @card
|
|
45
|
-
* ISO 18013-5 mdoc / mDL
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* b.cose + b.cbor
|
|
45
|
+
* ISO 18013-5 mdoc / mDL verification — issuer-data (COSE_Sign1
|
|
46
|
+
* IssuerAuth, MSO validity window, disclosed-element digests) plus
|
|
47
|
+
* device-auth holder binding (§9.1.3 signature variant over the session
|
|
48
|
+
* transcript). Composes b.cose + b.cbor.
|
|
49
49
|
*/
|
|
50
50
|
|
|
51
51
|
var nodeCrypto = require("node:crypto");
|
package/lib/network-dnssec.js
CHANGED
|
@@ -30,16 +30,18 @@
|
|
|
30
30
|
* <code>dnssec/uncanonicalizable-type</code> rather than mis-validated
|
|
31
31
|
* — the security-critical DNSKEY / DS and the name-free address /
|
|
32
32
|
* text types (A, AAAA, TXT, …) are fully supported. The recursive
|
|
33
|
-
* chain-walk (root → TLD → zone
|
|
34
|
-
*
|
|
35
|
-
*
|
|
33
|
+
* chain-walk (root → TLD → zone via <code>verifyChain</code> against the
|
|
34
|
+
* bundled IANA root trust anchors) and NSEC / NSEC3 denial-of-existence
|
|
35
|
+
* (<code>verifyDenial</code> / <code>nsec3Hash</code>) ship alongside the
|
|
36
|
+
* per-RRset verification core.
|
|
36
37
|
*
|
|
37
38
|
* @card
|
|
38
|
-
* Local DNSSEC verification (RFC 4035) — verify an RRSIG
|
|
39
|
-
* canonicalised RRset against a DNSKEY (RSA / ECDSA P-256·P-384 /
|
|
40
|
-
* Ed25519)
|
|
41
|
-
*
|
|
42
|
-
*
|
|
39
|
+
* Local DNSSEC verification (RFC 4035 / 4034 / 5155) — verify an RRSIG
|
|
40
|
+
* over a canonicalised RRset against a DNSKEY (RSA / ECDSA P-256·P-384 /
|
|
41
|
+
* Ed25519) + DS-digest + key-tag, walk the root→zone chain to the IANA
|
|
42
|
+
* trust anchors, and check NSEC / NSEC3 denial of existence. Don't trust
|
|
43
|
+
* the upstream AD bit; verify the signature. Name-bearing RR types are
|
|
44
|
+
* refused, not mis-validated.
|
|
43
45
|
*/
|
|
44
46
|
|
|
45
47
|
var nodeCrypto = require("node:crypto");
|
package/package.json
CHANGED
package/sbom.cdx.json
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json",
|
|
3
3
|
"bomFormat": "CycloneDX",
|
|
4
4
|
"specVersion": "1.5",
|
|
5
|
-
"serialNumber": "urn:uuid:
|
|
5
|
+
"serialNumber": "urn:uuid:22a52afe-2217-4e18-a7a1-15e6a137ec0c",
|
|
6
6
|
"version": 1,
|
|
7
7
|
"metadata": {
|
|
8
|
-
"timestamp": "2026-05-
|
|
8
|
+
"timestamp": "2026-05-27T04:39:38.785Z",
|
|
9
9
|
"lifecycles": [
|
|
10
10
|
{
|
|
11
11
|
"phase": "build"
|
|
@@ -19,14 +19,14 @@
|
|
|
19
19
|
}
|
|
20
20
|
],
|
|
21
21
|
"component": {
|
|
22
|
-
"bom-ref": "@blamejs/core@0.13.
|
|
22
|
+
"bom-ref": "@blamejs/core@0.13.7",
|
|
23
23
|
"type": "application",
|
|
24
24
|
"name": "blamejs",
|
|
25
|
-
"version": "0.13.
|
|
25
|
+
"version": "0.13.7",
|
|
26
26
|
"scope": "required",
|
|
27
27
|
"author": "blamejs contributors",
|
|
28
28
|
"description": "The Node framework that owns its stack.",
|
|
29
|
-
"purl": "pkg:npm/%40blamejs/core@0.13.
|
|
29
|
+
"purl": "pkg:npm/%40blamejs/core@0.13.7",
|
|
30
30
|
"properties": [],
|
|
31
31
|
"externalReferences": [
|
|
32
32
|
{
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"components": [],
|
|
55
55
|
"dependencies": [
|
|
56
56
|
{
|
|
57
|
-
"ref": "@blamejs/core@0.13.
|
|
57
|
+
"ref": "@blamejs/core@0.13.7",
|
|
58
58
|
"dependsOn": []
|
|
59
59
|
}
|
|
60
60
|
]
|