@serve.zone/interfaces 32.37.0 → 32.39.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/changelog.md CHANGED
@@ -1,5 +1,57 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-10-02 - 32.39.0
4
+
5
+ ### Maintenance
6
+
7
+ - Update release tooling to tsbuild 5.1.0 and tsdoc 3.0.1 (Node.js types stay 26.6.2 and pnpm 12.6.0 until their seven-day release age).
8
+
9
+ ### Features
10
+
11
+ - A node's managed VPN membership now outlives its network projection.
12
+ `continuesRuntimeManagedVpnMembership(previous, next)` states what a membership is: one
13
+ projection lineage under one protected authority and one handoff lease (its node scope and
14
+ router incarnation), at a later generation (the same generation only as the identical projection). Workload, readiness, egress, router
15
+ selection and DNS window changes keep it; a protection bump, a fresh handoff or a new controller
16
+ epoch ends it. `bindGetRuntimeManagedVpnCredentialSuccessor` binds the credential for a successor
17
+ projection: the same session, transport, hub, authority and key pair as the held credential,
18
+ with only `projection` and `expiresAt` moved and the expiry inside the successor's effective DNS
19
+ window, which must cover the caller's time. A controller keeps a member and its key pair across a
20
+ projection change with it, so the node's hub session survives a workload change.
21
+
22
+ ## 2026-09-30 - 32.38.0
23
+
24
+ ### Features
25
+
26
+ - Rollout: controllers must run this interfaces release before any node sends `discardedCaptures`
27
+ or a `not-kept` loss. A receiver on 32.37.0 or earlier reads a batch by its exact schema and
28
+ refuses such a batch on every retry.
29
+ - A node may now discard workload log captures it cannot deliver, so a crash-looping workload no
30
+ longer fills its RAM-backed runtime directory. A `not-kept` answer to
31
+ `reportRuntimeAssignmentLogs` is the node's permission to discard for that session: it may drop
32
+ every ended capture completely, and each one that ends later under the answer, and may drop a
33
+ running capture's output, stating it as the new `not-kept` loss (`TRuntimeAssignmentLogLossReason`)
34
+ where a later session that keeps logs resumes. While a controller is away or slow, a node keeps
35
+ at most `runtimeAssignmentLogContract.maximumEndedCaptures` (64) ended captures awaiting
36
+ acknowledgement, holding at most `maximumEndedCaptureBytes` (64 MiB) together; past either bound
37
+ it discards the oldest completely. Every capture discarded whole, under either rule, is counted
38
+ in the optional batch field `discardedCaptures`, carried by the next batch it creates; the count
39
+ is node-level evidence that a controller keeping logs records against the node and the session,
40
+ and a lost acknowledgement can repeat it.
41
+ - A log `sequence` number, once sent, is never sent again with other content. When `not-kept` lets
42
+ a node drop a batch it sent that is still unacknowledged, the capture's next batch takes a higher
43
+ number and opens with a `not-kept` loss, so a controller tells the node's discard from its own
44
+ loss by the batch after the gap.
45
+ - `runtimeConfigContract.maximumLogBufferedBytes` (64 MiB) publishes the largest
46
+ `logs.maximumBufferedBytes`; `runtimeAssignmentLogContract.maximumEndedCaptureBytes` is the same
47
+ bound from the same source.
48
+
49
+ ### Maintenance
50
+
51
+ - Release tooling currency: pnpm 12.6.0; `@git.zone/*` are already at their latest releases and
52
+ `@types/node` stays at 26.6.2. The 23 lockfile entries a mirror had rewritten to `sha1` integrity are restored to the
53
+ npmjs `sha512` integrity, each checked against its npmjs shasum first.
54
+
3
55
  ## 2026-09-29 - 32.37.0
4
56
 
5
57
  ### Features
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '32.37.0',
6
+ version: '32.39.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
@@ -7,7 +7,12 @@ export interface IGetRuntimeManagedVpnCredentialRequest {
7
7
  }
8
8
  /** Secret response over the current authenticated physical peer only. Never
9
9
  * persist, hash, log, or include it in a signed network projection. The native
10
- * Noise owner validates and uses the keys; these shapes confer no TUN readiness. */
10
+ * Noise owner validates and uses the keys; these shapes confer no TUN readiness.
11
+ *
12
+ * One response names one exact projection, but its key pair belongs to the node's managed VPN
13
+ * membership, which outlives a projection: a credential for a successor projection of the same
14
+ * membership (`continuesRuntimeManagedVpnMembership`) carries the same transport, hub, authority and
15
+ * keys, bound by `bindGetRuntimeManagedVpnCredentialSuccessor`. */
11
16
  export interface IGetRuntimeManagedVpnCredentialResponse extends IGetRuntimeManagedVpnCredentialRequest {
12
17
  transport: TRuntimeNetworkVpnTransport;
13
18
  /** The cluster hub endpoint this node dials, named by the id its signed projection selected. */
@@ -32,6 +37,24 @@ export declare const snapshotGetRuntimeManagedVpnCredentialResponse: (value: unk
32
37
  /** Content binding only. The caller must resolve the exact current projection
33
38
  * and authenticate/fence the current physical peer before and after native work. */
34
39
  export declare const bindGetRuntimeManagedVpnCredentialRequest: (value: unknown, projectionValue: unknown, trustedSessionValue: unknown) => Promise<IGetRuntimeManagedVpnCredentialRequest>;
40
+ /**
41
+ * Whether `next` continues the managed VPN membership `previous` belongs to: the same projection
42
+ * lineage (`id`), the same protected authority, and the same handoff lease, which names the node
43
+ * scope and carries the node's router incarnation. Both must hold a handoff, because a node without
44
+ * one is no member. `next` is `previous` itself or a later generation; an earlier one, or another
45
+ * projection under the same generation, continues nothing.
46
+ *
47
+ * Everything else a projection states may move under one membership: its workload endpoints, their
48
+ * readiness, observations and egress, its private networks, its router selection and its DNS window.
49
+ * Those are what the member's network carries, never who the member is. A protection bump, a fresh
50
+ * handoff (router reincarnation) or a new controller epoch ends the membership. Whether the hub a
51
+ * credential names is still selected is the credential's question
52
+ * (`bindGetRuntimeManagedVpnCredentialSuccessor`), not the membership's.
53
+ *
54
+ * Validates both complete projections and rejects either that does not validate; a valid pair that
55
+ * is not one membership answers `false`. It samples no clock and fences no session.
56
+ */
57
+ export declare const continuesRuntimeManagedVpnMembership: (previousValue: unknown, nextValue: unknown) => Promise<boolean>;
35
58
  /** Bind the secret response to the original request and the exact selected router
36
59
  * endpoint of the credential's transport, inside the projection's effective DNS window. renewalValue is the
37
60
  * bare lease renewal the caller already verified and admitted for this exact
@@ -39,3 +62,22 @@ export declare const bindGetRuntimeManagedVpnCredentialRequest: (value: unknown,
39
62
  * this helper does not sample a clock, authenticate a transport, admit policy or
40
63
  * prove a running managed connection. */
41
64
  export declare const bindGetRuntimeManagedVpnCredentialResponse: (value: unknown, requestValue: unknown, projectionValue: unknown, trustedSessionValue: unknown, nowValue: unknown, renewalValue?: unknown | null) => Promise<IGetRuntimeManagedVpnCredentialResponse>;
65
+ /**
66
+ * Bind the credential a node holds under its successor projection: `value` names `projectionValue`
67
+ * and is bound exactly as `bindGetRuntimeManagedVpnCredentialResponse` binds the answer to
68
+ * `{ session: trustedSession, projection }`, inside that projection's effective DNS window
69
+ * (`renewalValue`, as there). It must also continue `previousValue`, the credential issued for
70
+ * `previousProjectionValue` over the same session: the two projections are one membership
71
+ * (`continuesRuntimeManagedVpnMembership`) and the transport, hub, authority, server key and client
72
+ * key pair are unchanged. Only `projection` and `expiresAt` move. The current effective window
73
+ * alone bounds the successor, so a membership whose current window does not cover the
74
+ * caller-qualified `nowValue` binds no successor; the held credential's own expiry is not
75
+ * consulted, because a renewal or a successor may have moved the window past it.
76
+ *
77
+ * The issuer binds the successor it states for a member, so the node's session and key pair survive
78
+ * a workload, readiness or policy change; the node binds a fresh answer with it to tell a successor,
79
+ * which keeps its live session, from a new membership, which replaces it. A previous credential for
80
+ * the same projection binds too, which is how a renewal moves the expiry. Content binding only, as
81
+ * for the response binder.
82
+ */
83
+ export declare const bindGetRuntimeManagedVpnCredentialSuccessor: (value: unknown, previousValue: unknown, previousProjectionValue: unknown, projectionValue: unknown, trustedSessionValue: unknown, nowValue: unknown, renewalValue?: unknown | null) => Promise<IGetRuntimeManagedVpnCredentialResponse>;
@@ -1,6 +1,6 @@
1
1
  import { runtimeNetworkAddressPlanContract } from './networkaddressplan.js';
2
2
  import { snapshotRuntimeSessionBinding } from './runtimesession.js';
3
- import { validateRuntimeNetworkProjection } from './networkprojection.js';
3
+ import { snapshotRuntimeNetworkProjection, validateRuntimeNetworkProjection } from './networkprojection.js';
4
4
  import { snapshotRuntimeNetworkDnsLeaseRenewal, validateRuntimeNetworkDnsLeaseRenewal } from './networklease.js';
5
5
  import { captureNetwork, failNetwork, networkAuthorityId, networkCounter, networkEffectiveDnsWindow, networkEqual, networkId, networkIpv4, networkNoiseKey, networkRecord, networkReference, networkReferenceOf, networkSafe, networkSameScope, requireNetwork } from '../private/networkcontract.js';
6
6
  export const snapshotGetRuntimeManagedVpnCredentialRequest = (value) => networkSafe(() => {
@@ -41,6 +41,62 @@ export const bindGetRuntimeManagedVpnCredentialRequest = async (value, projectio
41
41
  return failNetwork();
42
42
  }
43
43
  };
44
+ /**
45
+ * The membership rule of `continuesRuntimeManagedVpnMembership`, over projections already validated.
46
+ * A valid projection's handoff lease names the projection's own node scope, so one handoff
47
+ * reference is one node scope and the scope needs no comparison of its own.
48
+ */
49
+ const continuesMembership = (previous, next) => previous.handoff !== null && next.handoff !== null && previous.id === next.id
50
+ && networkEqual(networkReferenceOf(previous.protectedAuthority), networkReferenceOf(next.protectedAuthority))
51
+ && networkEqual(networkReferenceOf(previous.handoff), networkReferenceOf(next.handoff))
52
+ && (next.generation > previous.generation || networkEqual(networkReferenceOf(previous), networkReferenceOf(next)));
53
+ /** What a membership's credential keeps across its projections: everything but the projection and the expiry. */
54
+ const credentialIdentity = (value) => ({
55
+ transport: value.transport, hub: value.hub, authorityId: value.authorityId, serverPublicKey: value.serverPublicKey,
56
+ clientPublicKey: value.clientPublicKey, clientPrivateKey: value.clientPrivateKey,
57
+ });
58
+ /**
59
+ * Whether `next` continues the managed VPN membership `previous` belongs to: the same projection
60
+ * lineage (`id`), the same protected authority, and the same handoff lease, which names the node
61
+ * scope and carries the node's router incarnation. Both must hold a handoff, because a node without
62
+ * one is no member. `next` is `previous` itself or a later generation; an earlier one, or another
63
+ * projection under the same generation, continues nothing.
64
+ *
65
+ * Everything else a projection states may move under one membership: its workload endpoints, their
66
+ * readiness, observations and egress, its private networks, its router selection and its DNS window.
67
+ * Those are what the member's network carries, never who the member is. A protection bump, a fresh
68
+ * handoff (router reincarnation) or a new controller epoch ends the membership. Whether the hub a
69
+ * credential names is still selected is the credential's question
70
+ * (`bindGetRuntimeManagedVpnCredentialSuccessor`), not the membership's.
71
+ *
72
+ * Validates both complete projections and rejects either that does not validate; a valid pair that
73
+ * is not one membership answers `false`. It samples no clock and fences no session.
74
+ */
75
+ export const continuesRuntimeManagedVpnMembership = async (previousValue, nextValue) => {
76
+ let previous, next;
77
+ try {
78
+ const previousInput = snapshotRuntimeNetworkProjection(previousValue), nextInput = snapshotRuntimeNetworkProjection(nextValue);
79
+ previous = await validateRuntimeNetworkProjection(previousInput);
80
+ next = await validateRuntimeNetworkProjection(nextInput);
81
+ }
82
+ catch {
83
+ return failNetwork();
84
+ }
85
+ return continuesMembership(previous, next);
86
+ };
87
+ /** The response binding over inputs already captured and validated. */
88
+ const bindResponse = (response, request, projection, renewal, trusted, now) => {
89
+ const window = networkEffectiveDnsWindow(projection, renewal);
90
+ bindRequest(request, projection, trusted);
91
+ requireNetwork(networkEqual(response.session, request.session) && networkEqual(response.projection, request.projection));
92
+ requireNetwork(projection.router?.platformEndpointIds.includes(response.hub.id));
93
+ const endpoint = projection.protectedAuthority.platformEndpoints.find(item => item.id === response.hub.id);
94
+ const expected = runtimeNetworkAddressPlanContract.hubTransports.find(row => row.transport === response.transport);
95
+ requireNetwork(endpoint && expected && endpoint.protocol === expected.protocol
96
+ && endpoint.address === response.hub.address && endpoint.port === response.hub.port);
97
+ requireNetwork(window.notBefore <= now && now < response.expiresAt && response.expiresAt <= window.expiresAt);
98
+ return response;
99
+ };
44
100
  /** Bind the secret response to the original request and the exact selected router
45
101
  * endpoint of the credential's transport, inside the projection's effective DNS window. renewalValue is the
46
102
  * bare lease renewal the caller already verified and admitted for this exact
@@ -55,19 +111,49 @@ export const bindGetRuntimeManagedVpnCredentialResponse = async (value, requestV
55
111
  const renewalInput = renewalValue === null ? null : snapshotRuntimeNetworkDnsLeaseRenewal(renewalValue);
56
112
  const projection = await validateRuntimeNetworkProjection(projectionValue);
57
113
  const renewal = renewalInput === null ? null : await validateRuntimeNetworkDnsLeaseRenewal(renewalInput);
58
- const window = networkEffectiveDnsWindow(projection, renewal);
59
- bindRequest(request, projection, trusted);
60
- requireNetwork(networkEqual(response.session, request.session) && networkEqual(response.projection, request.projection));
61
- requireNetwork(projection.router?.platformEndpointIds.includes(response.hub.id));
62
- const endpoint = projection.protectedAuthority.platformEndpoints.find(item => item.id === response.hub.id);
63
- const expected = runtimeNetworkAddressPlanContract.hubTransports.find(row => row.transport === response.transport);
64
- requireNetwork(endpoint && expected && endpoint.protocol === expected.protocol
65
- && endpoint.address === response.hub.address && endpoint.port === response.hub.port);
66
- requireNetwork(window.notBefore <= now && now < response.expiresAt && response.expiresAt <= window.expiresAt);
67
- return response;
114
+ return bindResponse(response, request, projection, renewal, trusted, now);
115
+ }
116
+ catch {
117
+ return failNetwork();
118
+ }
119
+ };
120
+ /**
121
+ * Bind the credential a node holds under its successor projection: `value` names `projectionValue`
122
+ * and is bound exactly as `bindGetRuntimeManagedVpnCredentialResponse` binds the answer to
123
+ * `{ session: trustedSession, projection }`, inside that projection's effective DNS window
124
+ * (`renewalValue`, as there). It must also continue `previousValue`, the credential issued for
125
+ * `previousProjectionValue` over the same session: the two projections are one membership
126
+ * (`continuesRuntimeManagedVpnMembership`) and the transport, hub, authority, server key and client
127
+ * key pair are unchanged. Only `projection` and `expiresAt` move. The current effective window
128
+ * alone bounds the successor, so a membership whose current window does not cover the
129
+ * caller-qualified `nowValue` binds no successor; the held credential's own expiry is not
130
+ * consulted, because a renewal or a successor may have moved the window past it.
131
+ *
132
+ * The issuer binds the successor it states for a member, so the node's session and key pair survive
133
+ * a workload, readiness or policy change; the node binds a fresh answer with it to tell a successor,
134
+ * which keeps its live session, from a new membership, which replaces it. A previous credential for
135
+ * the same projection binds too, which is how a renewal moves the expiry. Content binding only, as
136
+ * for the response binder.
137
+ */
138
+ export const bindGetRuntimeManagedVpnCredentialSuccessor = async (value, previousValue, previousProjectionValue, projectionValue, trustedSessionValue, nowValue, renewalValue = null) => {
139
+ try {
140
+ const response = snapshotGetRuntimeManagedVpnCredentialResponse(value);
141
+ const previous = snapshotGetRuntimeManagedVpnCredentialResponse(previousValue);
142
+ const previousInput = snapshotRuntimeNetworkProjection(previousProjectionValue);
143
+ const projectionInput = snapshotRuntimeNetworkProjection(projectionValue);
144
+ const trusted = snapshotRuntimeSessionBinding(trustedSessionValue), now = networkCounter(nowValue);
145
+ const renewalInput = renewalValue === null ? null : snapshotRuntimeNetworkDnsLeaseRenewal(renewalValue);
146
+ const previousProjection = await validateRuntimeNetworkProjection(previousInput);
147
+ const projection = await validateRuntimeNetworkProjection(projectionInput);
148
+ const renewal = renewalInput === null ? null : await validateRuntimeNetworkDnsLeaseRenewal(renewalInput);
149
+ requireNetwork(continuesMembership(previousProjection, projection));
150
+ requireNetwork(networkEqual(previous.session, trusted)
151
+ && networkEqual(previous.projection, networkReferenceOf(previousProjection)));
152
+ requireNetwork(networkEqual(credentialIdentity(previous), credentialIdentity(response)));
153
+ return bindResponse(response, { session: trusted, projection: networkReferenceOf(projection) }, projection, renewal, trusted, now);
68
154
  }
69
155
  catch {
70
156
  return failNetwork();
71
157
  }
72
158
  };
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya2NyZWRlbnRpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL25ldHdvcmtjcmVkZW50aWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxpQ0FBaUMsRUFBb0MsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsNkJBQTZCLEVBQStCLE1BQU0scUJBQXFCLENBQUM7QUFDakcsT0FBTyxFQUFFLGdDQUFnQyxFQUFrQyxNQUFNLHdCQUF3QixDQUFDO0FBQzFHLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pILE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSx5QkFBeUIsRUFBRSxZQUFZLEVBQy9HLFNBQVMsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQ3pHLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBMEIxRSxNQUFNLENBQUMsTUFBTSw2Q0FBNkMsR0FBRyxDQUFDLEtBQWMsRUFBMEMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUU7SUFDeEksTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsNkJBQTZCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztBQUNqSCxDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBYyxFQUErQixFQUFFO0lBQ2xFLE1BQU0sR0FBRyxHQUFHLGlDQUFpQyxDQUFD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
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya2NyZWRlbnRpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL25ldHdvcmtjcmVkZW50aWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxpQ0FBaUMsRUFBb0MsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsNkJBQTZCLEVBQStCLE1BQU0scUJBQXFCLENBQUM7QUFDakcsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLGdDQUFnQyxFQUN6QyxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxxQ0FBcUMsRUFDOUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxFQUMvRyxTQUFTLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUN6RyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQStCMUUsTUFBTSxDQUFDLE1BQU0sNkNBQTZDLEdBQUcsQ0FBQyxLQUFjLEVBQTBDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO0lBQ3hJLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUM3RSxPQUFPLEVBQUUsT0FBTyxFQUFFLDZCQUE2QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFDakgsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWMsRUFBK0IsRUFBRTtJQUNsRSxNQUFNLEdBQUcsR0FB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
@@ -30,17 +30,21 @@ export interface IRuntimeAssignmentLogLine {
30
30
  * - `capture-restart`: the node's capture restarted without its buffer, for example after a reboot
31
31
  * emptied its disposable capture directory; how much was lost is unknown;
32
32
  * - `not-captured`: the container was started without output capture, so none of its output is
33
- * available; how much there was is unknown.
33
+ * available; how much there was is unknown;
34
+ * - `not-kept`: the node dropped this output while its controller kept no logs. Once a session
35
+ * answered `not-kept`, the node may drop a running capture's output instead of holding it,
36
+ * including a batch it sent that is still unacknowledged; a later session that keeps logs
37
+ * receives the capture from where it stands, after this loss.
34
38
  */
35
- export type TRuntimeAssignmentLogLossReason = 'buffer-overflow' | 'line-cut' | 'capture-restart' | 'not-captured';
39
+ export type TRuntimeAssignmentLogLossReason = 'buffer-overflow' | 'line-cut' | 'capture-restart' | 'not-captured' | 'not-kept';
36
40
  /**
37
41
  * Evidence of output that was lost, in the position of the stream where it was lost.
38
42
  *
39
43
  * `bytes` and `lines` count exactly what was dropped; both are `null` for `capture-restart` and
40
44
  * `not-captured`, whose extent the node cannot know, and both are stated for the other reasons.
41
45
  * A `line-cut` counts the cut bytes and no line, because the line itself was delivered; it names
42
- * the stream of that line. A `buffer-overflow` counts the dropped bytes and the whole lines among
43
- * them, and names a stream only when every dropped byte came from it.
46
+ * the stream of that line. A `buffer-overflow` or `not-kept` loss counts the dropped bytes and the
47
+ * whole lines among them, and names a stream only when every dropped byte came from it.
44
48
  */
45
49
  export interface IRuntimeAssignmentLogLoss {
46
50
  kind: 'lost';
@@ -57,10 +61,23 @@ export type TRuntimeAssignmentLogEntry = IRuntimeAssignmentLogLine | IRuntimeAss
57
61
  *
58
62
  * `captureId` names one capture of the attempt on its node: the node starts a new capture, with a
59
63
  * new id and `sequence` 1, whenever it cannot continue the previous one, and opens it with a
60
- * `capture-restart` loss. Within a capture `sequence` counts batches from 1 without gaps, and the
61
- * node sends the next batch only after the controller acknowledged the previous one, so a batch is
62
- * the one unit of retry. `final` states that no batch follows in this capture: the container is gone
63
- * and its output is drained. Only a final batch may be empty.
64
+ * `capture-restart` loss. Within a capture `sequence` counts batches from 1, and the node sends the
65
+ * next batch only after the controller acknowledged the previous one, so a batch is the one unit of
66
+ * retry. `final` states that no batch follows in this capture: the container is gone and its output
67
+ * is drained. Only a final batch may be empty.
68
+ *
69
+ * A sequence number, once sent, is never sent again with other content: a retry resends the batch
70
+ * unchanged, `discardedCaptures` included. Reusing a number would lose data silently, because a
71
+ * controller that stored the earlier batch while its acknowledgement was lost answers `replay` and
72
+ * drops the new content with its loss evidence. The node skips numbers only after dropping a
73
+ * running capture's batch it sent that is still unacknowledged, which only a `not-kept` answer
74
+ * permits: the next batch it
75
+ * sends of that capture takes a higher number it never sent and opens with a `not-kept` loss that
76
+ * counts what was dropped. Where the controller holds the dropped batch, because only its
77
+ * acknowledgement was lost, it sees no gap, and that loss also counts content it holds.
78
+ *
79
+ * `discardedCaptures` is node-level loss evidence, not part of this capture (see
80
+ * `runtimeAssignmentLogContract.maximumEndedCaptures`).
64
81
  */
65
82
  export interface IRuntimeAssignmentLogBatch {
66
83
  assignmentId: string;
@@ -69,6 +86,24 @@ export interface IRuntimeAssignmentLogBatch {
69
86
  sequence: number;
70
87
  entries: TRuntimeAssignmentLogEntry[];
71
88
  final: boolean;
89
+ /**
90
+ * How many ended captures the node discarded whole and unacknowledged since it last stated a
91
+ * count: past its ended-capture bound, or while a `not-kept` answer stood. The node states the
92
+ * count on the next batch it creates, of any capture, and counts afresh from there. The batch is
93
+ * then the unit of retry for the count: if the node discards that batch unacknowledged, the count
94
+ * passes on to the next batch, so a count whose acknowledgement was lost may reach the controller
95
+ * again inside a later count. It never names the discarded captures, because remembering them
96
+ * would grow without bound while the controller is away. Absent means none; stated, it is at
97
+ * least 1.
98
+ *
99
+ * The count belongs to the node, not to the assignment, attempt or capture of the batch that
100
+ * carries it. A controller that keeps logs records it against the node and the session the batch
101
+ * arrived on, once for each batch it accepts and never for a batch it answers `replay`, which it
102
+ * recorded when it accepted it. Counts are not idempotent: a lost acknowledgement can repeat a
103
+ * count, so their sum may exceed the captures discarded. A controller that keeps no logs does
104
+ * nothing with the count beyond answering `not-kept`; the node keeps it for a later session.
105
+ */
106
+ discardedCaptures?: number;
72
107
  }
73
108
  /** Pallet push over its current authenticated session. */
74
109
  export interface IReportRuntimeAssignmentLogsRequest {
@@ -81,12 +116,22 @@ export interface IReportRuntimeAssignmentLogsRequest {
81
116
  * - `accepted`: it holds the batch durably;
82
117
  * - `replay`: it already holds this batch and does not store it again;
83
118
  * - `not-kept`: it keeps no workload logs. It holds nothing, and the node sends no more batches on
84
- * this session; a later session may be answered differently.
119
+ * this session; a later session may be answered differently. The answer is the node's permission
120
+ * to discard for that session: it may discard every ended capture completely, its content and
121
+ * identity, and each capture that ends later while the answer stands, counting them in
122
+ * `discardedCaptures`. A running capture stays within `logs.maximumBufferedBytes`, whose overflow
123
+ * is a `buffer-overflow` loss, or the node drops its output, a sent and unacknowledged batch
124
+ * included, and states a `not-kept` loss where delivery resumes.
85
125
  *
86
126
  * A controller answers every batch with one of these; it never leaves the method unhandled, so a
87
127
  * node can tell a controller that keeps no logs from a failure worth retrying. It never refuses a
88
- * batch for a gap in `sequence`: the node discards only what was acknowledged, so a missing batch
89
- * can only be the controller's own loss, which it records.
128
+ * batch for a gap in `sequence`. Every gap the node leaves by discarding carries evidence: the
129
+ * batch after numbers it skipped opens with a `not-kept` loss (see `IRuntimeAssignmentLogBatch`),
130
+ * and a capture it discarded whole is counted in `discardedCaptures`. A controller therefore reads
131
+ * a gap before a batch that opens with a `not-kept` loss as the node's discard, which that loss
132
+ * counts, and a gap before any other batch as its own loss, which it records. A capture whose
133
+ * final batch never arrives leaves no gap to read: it may still be running, and one discarded whole
134
+ * is counted but never named.
90
135
  */
91
136
  export type TRuntimeAssignmentLogsStatus = 'accepted' | 'replay' | 'not-kept';
92
137
  export interface IReportRuntimeAssignmentLogsResponse {
@@ -95,12 +140,37 @@ export interface IReportRuntimeAssignmentLogsResponse {
95
140
  captureId: string;
96
141
  sequence: number;
97
142
  }
143
+ /**
144
+ * Rollout: a receiver on interfaces 32.37.0 or earlier reads a batch by its exact schema and
145
+ * refuses one that carries `discardedCaptures` or a `not-kept` loss, on every retry. A controller
146
+ * must therefore run a later release before any node sends either.
147
+ */
98
148
  export declare const runtimeAssignmentLogContract: Readonly<{
99
149
  readonly error: "Runtime assignment log contract rejected.";
100
150
  /** Pallet pushes; the controller persists metadata and payloads and acknowledges by sequence. */
101
151
  readonly delivery: "node-pushes-controller-acknowledges-each-batch";
102
- /** A controller that keeps no logs answers `not-kept`, and the node stops for that session. */
152
+ /**
153
+ * A controller that keeps no logs answers `not-kept`, and the node stops for that session. It may
154
+ * then discard ended captures completely, counted in `discardedCaptures`, and drop running
155
+ * output, stated as a `not-kept` loss.
156
+ */
103
157
  readonly notKept: "node-stops-for-the-session";
158
+ /**
159
+ * The most ended captures a node keeps awaiting acknowledgement, while its controller is away or
160
+ * slow. An ended capture holds its buffer, cursor record and waiting batch in the node's RAM-backed
161
+ * runtime directory, and a crash-looping workload ends one per restart; 64 covers a burst of
162
+ * restarts across the node's workloads before any of them loses its tail. Past this bound, or past
163
+ * `maximumEndedCaptureBytes`, the node discards the oldest ended captures completely and counts
164
+ * them in the next batch's `discardedCaptures`.
165
+ */
166
+ readonly maximumEndedCaptures: 64;
167
+ /**
168
+ * The most bytes all ended captures awaiting acknowledgement hold together, measured as the node
169
+ * measures its `logs.maximumBufferedBytes` buffer. It equals the largest buffer a runtime config
170
+ * may set (`runtimeConfigContract.maximumLogBufferedBytes`), so one capture always fits whole, and
171
+ * it keeps the node's RAM-backed runtime directory from growing with the number of restarts.
172
+ */
173
+ readonly maximumEndedCaptureBytes: 67108864;
104
174
  /** The most entries in one batch. */
105
175
  readonly maximumEntriesPerBatch: 1024;
106
176
  /** The most UTF-8 bytes of `text` in one entry; a longer line travels as `partial` pieces. */
@@ -1,13 +1,38 @@
1
1
  import { snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
2
2
  import { snapshotRuntimeSessionBinding } from './runtimesession.js';
3
3
  import { captureNetwork, networkCounter, networkEqual, networkId, networkList, networkRecord, requireNetwork, } from '../private/networkcontract.js';
4
- import { isRuntimeLogPolicy } from '../private/runtimepolicy.js';
4
+ import { isRuntimeLogPolicy, runtimePolicyLimits } from '../private/runtimepolicy.js';
5
+ /**
6
+ * Rollout: a receiver on interfaces 32.37.0 or earlier reads a batch by its exact schema and
7
+ * refuses one that carries `discardedCaptures` or a `not-kept` loss, on every retry. A controller
8
+ * must therefore run a later release before any node sends either.
9
+ */
5
10
  export const runtimeAssignmentLogContract = Object.freeze({
6
11
  error: 'Runtime assignment log contract rejected.',
7
12
  /** Pallet pushes; the controller persists metadata and payloads and acknowledges by sequence. */
8
13
  delivery: 'node-pushes-controller-acknowledges-each-batch',
9
- /** A controller that keeps no logs answers `not-kept`, and the node stops for that session. */
14
+ /**
15
+ * A controller that keeps no logs answers `not-kept`, and the node stops for that session. It may
16
+ * then discard ended captures completely, counted in `discardedCaptures`, and drop running
17
+ * output, stated as a `not-kept` loss.
18
+ */
10
19
  notKept: 'node-stops-for-the-session',
20
+ /**
21
+ * The most ended captures a node keeps awaiting acknowledgement, while its controller is away or
22
+ * slow. An ended capture holds its buffer, cursor record and waiting batch in the node's RAM-backed
23
+ * runtime directory, and a crash-looping workload ends one per restart; 64 covers a burst of
24
+ * restarts across the node's workloads before any of them loses its tail. Past this bound, or past
25
+ * `maximumEndedCaptureBytes`, the node discards the oldest ended captures completely and counts
26
+ * them in the next batch's `discardedCaptures`.
27
+ */
28
+ maximumEndedCaptures: 64,
29
+ /**
30
+ * The most bytes all ended captures awaiting acknowledgement hold together, measured as the node
31
+ * measures its `logs.maximumBufferedBytes` buffer. It equals the largest buffer a runtime config
32
+ * may set (`runtimeConfigContract.maximumLogBufferedBytes`), so one capture always fits whole, and
33
+ * it keeps the node's RAM-backed runtime directory from growing with the number of restarts.
34
+ */
35
+ maximumEndedCaptureBytes: runtimePolicyLimits.maximumLogBufferedBytes,
11
36
  /** The most entries in one batch. */
12
37
  maximumEntriesPerBatch: 1024,
13
38
  /** The most UTF-8 bytes of `text` in one entry; a longer line travels as `partial` pieces. */
@@ -27,7 +52,7 @@ catch {
27
52
  } };
28
53
  const encoder = new TextEncoder();
29
54
  const streams = ['stdout', 'stderr'];
30
- const lossReasons = ['buffer-overflow', 'line-cut', 'capture-restart', 'not-captured'];
55
+ const lossReasons = ['buffer-overflow', 'line-cut', 'capture-restart', 'not-captured', 'not-kept'];
31
56
  const statuses = ['accepted', 'replay', 'not-kept'];
32
57
  const literalOf = (valueArg, allowedArg) => {
33
58
  requireNetwork(allowedArg.includes(valueArg));
@@ -74,12 +99,13 @@ const entryOf = (valueArg) => {
74
99
  return valueArg.kind === 'lost' ? lossOf(valueArg) : lineOf(valueArg);
75
100
  };
76
101
  const batchOf = (valueArg) => {
77
- const value = networkRecord(valueArg, ['assignmentId', 'attemptId', 'captureId', 'sequence', 'entries', 'final']);
102
+ const value = networkRecord(valueArg, ['assignmentId', 'attemptId', 'captureId', 'sequence', 'entries', 'final'], ['discardedCaptures']);
78
103
  const entries = networkList(value.entries, runtimeAssignmentLogContract.maximumEntriesPerBatch, entryOf);
79
104
  requireNetwork(typeof value.final === 'boolean' && (entries.length > 0 || value.final));
80
105
  return {
81
106
  assignmentId: networkId(value.assignmentId), attemptId: networkId(value.attemptId),
82
107
  captureId: networkId(value.captureId), sequence: networkCounter(value.sequence), entries, final: value.final,
108
+ ...(Object.hasOwn(value, 'discardedCaptures') ? { discardedCaptures: networkCounter(value.discardedCaptures) } : {}),
83
109
  };
84
110
  };
85
111
  /** Detached exact-schema snapshot of one batch, bounded like a whole report. */
@@ -138,4 +164,4 @@ export const bindReportRuntimeAssignmentLogsResponse = (valueArg, requestArg) =>
138
164
  && response.sequence === batch.sequence);
139
165
  return response;
140
166
  });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWFzc2lnbm1lbnRsb2dzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lYXNzaWdubWVudGxvZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUNMLGNBQWMsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGNBQWMsR0FDcEcsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQXlHakUsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4RCxLQUFLLEVBQUUsMkNBQTJDO0lBQ2xELGlHQUFpRztJQUNqRyxRQUFRLEVBQUUsZ0RBQWdEO0lBQzFELCtGQUErRjtJQUMvRixPQUFPLEVBQUUsNEJBQTRCO0lBQ3JDLHFDQUFxQztJQUNyQyxzQkFBc0IsRUFBRSxJQUFJO0lBQzVCLDhGQUE4RjtJQUM5RixxQkFBcUIsRUFBRSxNQUFNO0lBQzdCOzs7T0FHRztJQUNILDJCQUEyQixFQUFFLFNBQVM7Q0FDOUIsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRixNQUFNLElBQUksR0FBRyxDQUFJLFlBQXFCLEVBQUssRUFBRSxHQUFHLElBQUksQ0FBQztJQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7QUFBQyxDQUFDO0FBQUMsTUFBTSxDQUFDO0lBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUFDLENBQUMs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
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWFzc2lnbm1lbnRsb2dzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lYXNzaWdubWVudGxvZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUNMLGNBQWMsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGNBQWMsR0FDcEcsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQXVKdEY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDeEQsS0FBSyxFQUFFLDJDQUEyQztJQUNsRCxpR0FBaUc7SUFDakcsUUFBUSxFQUFFLGdEQUFnRDtJQUMxRDs7OztPQUlHO0lBQ0gsT0FBTyxFQUFFLDRCQUE0QjtJQUNyQzs7Ozs7OztPQU9HO0lBQ0gsb0JBQW9CLEVBQUUsRUFBRTtJQUN4Qjs7Ozs7T0FLRztJQUNILHdCQUF3QixFQUFFLG1CQUFtQixDQUFDLHVCQUF1QjtJQUNyRSxxQ0FBcUM7SUFDckMsc0JBQXNCLEVBQUUsSUFBSTtJQUM1Qiw4RkFBOEY7SUFDOUYscUJBQXFCLEVBQUUsTUFBTTtJQUM3Qjs7O09BR0c7SUFDSCwyQkFBMkIsRUFBRSxTQUFTO0NBQzlCLENBQUMsQ0FBQztBQUVaLE1BQU0sSUFBSSxHQUFHLEdBQVUsRUFBRSxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkYsTUFBTSxJQUFJLEdBQUcsQ0FBSSxZ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
@@ -112,6 +112,7 @@ export declare const runtimeConfigContract: Readonly<{
112
112
  readonly maximumTargetPorts: 64;
113
113
  readonly maximumReadinessDurationMs: 3600000;
114
114
  readonly maximumLogRetentionMs: 31536000000;
115
+ readonly maximumLogBufferedBytes: 67108864;
115
116
  }>;
116
117
  /**
117
118
  * Detached exact-schema snapshot for synchronous persistence assertions. Digest
@@ -9,6 +9,7 @@ export const runtimeConfigContract = Object.freeze({
9
9
  maximumTargetPorts: 64,
10
10
  maximumReadinessDurationMs: runtimePolicyLimits.maximumReadinessDurationMs,
11
11
  maximumLogRetentionMs: runtimePolicyLimits.maximumLogRetentionMs,
12
+ maximumLogBufferedBytes: runtimePolicyLimits.maximumLogBufferedBytes,
12
13
  });
13
14
  const fail = (messageArg) => { throw new Error(messageArg); };
14
15
  const encoder = new TextEncoder();
@@ -212,4 +213,4 @@ export const bindRuntimeConfigToAssignment = async (configArg, assignmentArg) =>
212
213
  fail('runtime config lacks exact assignment platform evidence');
213
214
  return { config, assignment, platformEvidence };
214
215
  };
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvcnVudGltZWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGNBQWMsRUFDZCxvQ0FBb0MsRUFDcEMsd0NBQXdDLEdBQ3pDLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkcsT0FBTyxFQUNMLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFDcEcsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEdBQ2pGLE1BQU0sNkJBQTZCLENBQUM7QUErR3JDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDakQsWUFBWSxFQUFFLDJCQUEyQjtJQUN6QyxxQkFBcUIsRUFBRSxPQUFPO0lBQzlCLHlCQUF5QixFQUFFLEdBQUc7SUFDOUIsa0JBQWtCLEVBQUUsRUFBRTtJQUN0QiwwQkFBMEIsRUFBRSxtQkFBbUIsQ0FBQywwQkFBMEI7SUFDMUUscUJBQXFCLEVBQUUsbUJBQW1CLENBQUMscUJBQXFCO0NBQ3hELENBQUMsQ0FBQztBQUVaLE1BQU0sSUFBSSxHQUFrQyxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBQ2xDLE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBaUIsRUFBc0IsRUFBRSxDQUM3RCxPQUFPLFFBQVEsS0FBSyxRQUFR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
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvcnVudGltZWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGNBQWMsRUFDZCxvQ0FBb0MsRUFDcEMsd0NBQXdDLEdBQ3pDLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkcsT0FBTyxFQUNMLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFDcEcsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEdBQ2pGLE1BQU0sNkJBQTZCLENBQUM7QUErR3JDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDakQsWUFBWSxFQUFFLDJCQUEyQjtJQUN6QyxxQkFBcUIsRUFBRSxPQUFPO0lBQzlCLHlCQUF5QixFQUFFLEdBQUc7SUFDOUIsa0JBQWtCLEVBQUUsRUFBRTtJQUN0QiwwQkFBMEIsRUFBRSxtQkFBbUIsQ0FBQywwQkFBMEI7SUFDMUUscUJBQXFCLEVBQUUsbUJBQW1CLENBQUMscUJBQXFCO0lBQ2hFLHVCQUF1QixFQUFFLG1CQUFtQixDQUFDLHVCQUF1QjtDQUM1RCxDQUFDLENBQUM7QUFFWixNQUFNLElBQUksR0FBa0MsQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUNsQyxNQUFNLFlBQVksR0FBRyxDQUFDLFFBQWlC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
@@ -14,6 +14,8 @@ export declare const runtimePolicyLimits: Readonly<{
14
14
  readonly maximumIdentityNumber: number;
15
15
  readonly maximumReadinessDurationMs: 3600000;
16
16
  readonly maximumLogRetentionMs: 31536000000;
17
+ /** The largest `logs.maximumBufferedBytes`; a node's ended captures share the same bound. */
18
+ readonly maximumLogBufferedBytes: 67108864;
17
19
  }>;
18
20
  export type TRuntimePolicyFailure = (messageArg: string) => never;
19
21
  export declare const isBoundedInteger: (valueArg: unknown, minimumArg: number, maximumArg: number) => valueArg is number;
@@ -13,6 +13,8 @@ export const runtimePolicyLimits = Object.freeze({
13
13
  maximumIdentityNumber: 2 ** 31 - 1,
14
14
  maximumReadinessDurationMs: 3_600_000,
15
15
  maximumLogRetentionMs: 31_536_000_000,
16
+ /** The largest `logs.maximumBufferedBytes`; a node's ended captures share the same bound. */
17
+ maximumLogBufferedBytes: 67_108_864,
16
18
  });
17
19
  export const isBoundedInteger = (valueArg, minimumArg, maximumArg) => typeof valueArg === 'number' && Number.isSafeInteger(valueArg) && !Object.is(valueArg, -0)
18
20
  && valueArg >= minimumArg && valueArg <= maximumArg;
@@ -29,7 +31,7 @@ export const isRuntimeMemoryBytes = (valueArg) => isBoundedInteger(valueArg, run
29
31
  export const isRuntimeIdentityNumber = (valueArg) => isBoundedInteger(valueArg, 0, runtimePolicyLimits.maximumIdentityNumber);
30
32
  export const isRuntimeLogPolicy = (valueArg) => isExactRecord(valueArg, ['maximumLineBytes', 'maximumBufferedBytes', 'retentionMs'])
31
33
  && isBoundedInteger(valueArg.maximumLineBytes, 1, 1_048_576)
32
- && isBoundedInteger(valueArg.maximumBufferedBytes, 1, 67_108_864)
34
+ && isBoundedInteger(valueArg.maximumBufferedBytes, 1, runtimePolicyLimits.maximumLogBufferedBytes)
33
35
  && valueArg.maximumBufferedBytes >= valueArg.maximumLineBytes
34
36
  && isBoundedInteger(valueArg.retentionMs, 1, runtimePolicyLimits.maximumLogRetentionMs);
35
37
  const timingKeys = ['initialDelayMs', 'startupGraceMs', 'intervalMs', 'timeoutMs',
@@ -87,4 +89,4 @@ export const assertRuntimeReadiness = (valueArg, selectsTcpTargetArg, failArg) =
87
89
  previousCode = code;
88
90
  }
89
91
  };
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3ByaXZhdGUvcnVudGltZXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUMvQyxrQkFBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUk7SUFDcEMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEVBQUU7SUFDM0IsZ0JBQWdCLEVBQUUsU0FBUztJQUMzQixxQkFBcUIsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7SUFDbEMsMEJBQTBCLEVBQUUsU0FBUztJQUNyQyxxQkFBcUIsRUFBRSxjQUFjO0NBQzdCLENBQUMsQ0FBQztBQUlaLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBaUIsRUFBRSxVQUFrQixFQUFFLFVBQWtCLEVBQXNCLEVBQUUsQ0FDaEgsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztPQUN2RixRQUFRLElBQUksVUFBVSxJQUFJLFFBQVEsSUFBSSxVQUFVLENBQUM7QUFDdEQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUFpQixFQUFzQixFQUFFLENBQ3pFLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0UsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQzNCLFFBQWlCLEVBQUUsT0FBMEIsRUFDUixFQUFFO0lBQ3ZDLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxD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
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3ByaXZhdGUvcnVudGltZXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUMvQyxrQkFBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUk7SUFDcEMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEVBQUU7SUFDM0IsZ0JBQWdCLEVBQUUsU0FBUztJQUMzQixxQkFBcUIsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7SUFDbEMsMEJBQTBCLEVBQUUsU0FBUztJQUNyQyxxQkFBcUIsRUFBRSxjQUFjO0lBQ3JDLDZGQUE2RjtJQUM3Rix1QkFBdUIsRUFBRSxVQUFVO0NBQzNCLENBQUMsQ0FBQztBQUlaLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBaUIsRUFBRSxVQUFrQixFQUFFLFVBQWtCLEVBQXNCLEVBQUUsQ0FDaEgsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztPQUN2RixRQUFRLElBQUksVUFBVSxJQUFJLFFBQVEsSUFBSSxVQUFVLENBQUM7QUFDdEQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUFpQixFQUFzQixFQUFFLENBQ3pFLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0UsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQzNCLFFBQWlCLEVBQUUsT0FBMEIsRUFDUixFQUFFO0lBQ3ZDLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUss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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/interfaces",
3
- "version": "32.37.0",
3
+ "version": "32.39.0",
4
4
  "private": false,
5
5
  "description": "Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.",
6
6
  "exports": {
@@ -27,8 +27,8 @@
27
27
  "@tsclass/tsclass": "^9.5.1"
28
28
  },
29
29
  "devDependencies": {
30
- "@git.zone/tsbuild": "^5.0.0",
31
- "@git.zone/tsdoc": "^2.2.2",
30
+ "@git.zone/tsbuild": "^5.1.0",
31
+ "@git.zone/tsdoc": "^3.0.1",
32
32
  "@git.zone/tsrun": "^3.0.2",
33
33
  "@git.zone/tstest": "6.3.2",
34
34
  "@types/node": "26.6.2"
package/readme.md CHANGED
@@ -728,6 +728,32 @@ Expiry must be after the caller-qualified time and no later than the referenced
728
728
  projection's effective DNS window (see [DNS Lease Renewals](#dns-lease-renewals));
729
729
  acceptance before that window starts rejects.
730
730
 
731
+ A credential names one projection, but its key pair belongs to the node's managed VPN
732
+ membership, which outlives it. Every workload add, removal, readiness change or policy change
733
+ signs a new projection generation; none of them changes who the member is.
734
+ `continuesRuntimeManagedVpnMembership(previous, next)` is that rule: `next` continues the
735
+ membership when it is the same projection lineage (`id`) under the same protected authority and
736
+ the same handoff lease (which names the node scope and carries the router incarnation), and is
737
+ `previous` itself or a later generation. A protection bump, a fresh handoff (router
738
+ reincarnation) or a new controller epoch is a new membership; an earlier generation or another
739
+ projection of the same generation continues nothing. It validates both projections and rejects
740
+ one that does not validate.
741
+
742
+ `bindGetRuntimeManagedVpnCredentialSuccessor(response, previous, previousProjection, projection,
743
+ trustedSession, now, renewal = null)` binds the credential for the successor. `response` is bound
744
+ exactly as the response binder binds an answer to `{ session: trustedSession, projection }`, so
745
+ the hub must still be selected and the expiry stays inside the successor's effective DNS window.
746
+ It must also continue `previous`, the credential issued for `previousProjection` over the same
747
+ session: the two projections are one membership and the transport, hub, authority, server key and
748
+ client key pair are unchanged. Only `projection` and `expiresAt` move. The current effective
749
+ window is the one limit: a membership whose current window does not cover `now` binds no
750
+ successor, while the held credential's own expiry is not consulted, because a renewal or a
751
+ successor may already have moved the window past it. The issuer binds the successor it states
752
+ for a member with it, so the node keeps its key pair and its hub session across a projection
753
+ change; a node binds a fresh answer with it to tell a successor, which keeps the live session,
754
+ from a new membership, which replaces it. A previous credential for the same projection binds as
755
+ its own successor, which is how a DNS lease renewal moves the expiry.
756
+
731
757
  These helpers perform content validation. Callers authenticate and fence the
732
758
  current physical peer and projection before and after native work, qualify time
733
759
  independently, and retain ownership through revocation and shutdown. The native
@@ -1241,7 +1267,8 @@ pushes one `IRuntimeAssignmentLogBatch { assignmentId, attemptId, captureId, seq
1241
1267
  final }` from the node to its controller. Logs are the controller's to keep
1242
1268
  (`IRuntimeConfig.logs`); the node's capture files are disposable transport artifacts, so the node
1243
1269
  pushes and the controller persists. The node discards a batch only after the controller
1244
- acknowledged it, and sends the next one only then.
1270
+ acknowledged it, and sends the next one only then. Two rules below let it discard more: a
1271
+ `not-kept` answer, and its bound on ended captures awaiting acknowledgement.
1245
1272
 
1246
1273
  - `entries` are in capture order. A `line` entry `{ stream, timestampNs, text, partial }` is one
1247
1274
  piece of one line: `text` holds no `\n`, invalid UTF-8 becomes U+FFFD, and a line longer than
@@ -1250,13 +1277,19 @@ acknowledged it, and sends the next one only then.
1250
1277
  - A `lost` entry `{ reason, stream, timestampNs, bytes, lines }` is evidence of output that did not
1251
1278
  arrive, placed where it was lost: `buffer-overflow` (the node's buffer reached
1252
1279
  `logs.maximumBufferedBytes` and it dropped the oldest bytes), `line-cut` (the rest of a line
1253
- beyond `maximumLineBytes`, right after that line's last piece), `capture-restart` and
1254
- `not-captured` (a container started without capture). The last two cannot know how much was
1280
+ beyond `maximumLineBytes`, right after that line's last piece), `capture-restart`,
1281
+ `not-captured` (a container started without capture) and `not-kept` (output the node dropped
1282
+ while its controller kept no logs). `capture-restart` and `not-captured` cannot know how much was
1255
1283
  lost and state `bytes` and `lines` as `null`; the others count exactly.
1256
- - `captureId` names one capture of the attempt. `sequence` counts that capture's batches from 1.
1257
- `final` states that the container is gone and its output drained; only a final batch may be
1258
- empty. A report is at most 1 024 entries and one mebibyte of canonical JSON, and timestamps are
1259
- nanoseconds since the Unix epoch as decimal digits.
1284
+ - `captureId` names one capture of the attempt. `sequence` counts that capture's batches from 1,
1285
+ and a number once sent is never sent again with other content (below). `final` states that the
1286
+ container is gone and its output drained; only a final batch may be empty. A report is at most 1 024
1287
+ entries and one mebibyte of canonical JSON, and timestamps are nanoseconds since the Unix epoch
1288
+ as decimal digits.
1289
+ - `discardedCaptures`, optional, is node-level loss evidence carried by whichever batch the node
1290
+ creates next: how many ended captures it discarded whole, under its ended-capture bound or a
1291
+ `not-kept` answer (below), since it last stated a count. It is absent for none and at least 1
1292
+ when stated.
1260
1293
 
1261
1294
  The answer `{ status, assignmentId, captureId, sequence }` (`TRuntimeAssignmentLogsStatus`) is
1262
1295
  `accepted`, `replay` for a batch the controller already holds, or `not-kept` from a controller that
@@ -1264,8 +1297,50 @@ keeps no workload logs: it holds nothing, and the node sends no more batches on
1264
1297
  later session may be answered differently). A controller answers every batch with one of the
1265
1298
  three and never leaves the method unhandled, so a node tells a controller that keeps no logs from
1266
1299
  a failure worth retrying. A controller must therefore handle the method before a node that
1267
- captures logs runs against it. The controller never refuses a batch for a gap in `sequence`: the
1268
- node only discards what was acknowledged, so a gap is the controller's own loss, which it records.
1300
+ captures logs runs against it. Likewise, a receiver on interfaces 32.37.0 or earlier reads a batch
1301
+ by its exact schema and refuses one that carries `discardedCaptures` or a `not-kept` loss, on every
1302
+ retry: controllers must run a later interfaces release before any node sends either.
1303
+
1304
+ A sequence number, once sent, is never sent again with other content; a retry resends the batch
1305
+ unchanged, its `discardedCaptures` included. Reuse would lose data silently: a controller that
1306
+ stored the batch while its acknowledgement was lost answers `replay` and drops the new content
1307
+ with its loss evidence. So when the node drops a running capture's batch it sent that is still
1308
+ unacknowledged, which only `not-kept` permits, the next batch it sends of that capture takes a higher number it never
1309
+ sent and opens with a `not-kept` loss that counts what was dropped. A controller that holds the
1310
+ dropped batch sees no gap, and that loss also counts content it holds.
1311
+
1312
+ The controller never refuses a batch for a gap in `sequence`. Every gap the node leaves by
1313
+ discarding carries evidence: the batch after skipped numbers opens with a `not-kept` loss, and a
1314
+ capture discarded whole is counted in `discardedCaptures`. A gap before a batch that opens with a
1315
+ `not-kept` loss is therefore the node's discard, which that loss counts; a gap before any other
1316
+ batch is the controller's own loss, which it records. A capture whose final batch never arrives
1317
+ leaves no gap to read: it may still be running, and one discarded whole is counted, never named.
1318
+
1319
+ `not-kept` is the node's permission to discard for the session that answered it. The node may
1320
+ discard every ended capture completely, content and identity, and each capture that ends later
1321
+ while the answer stands, counting them in `discardedCaptures`. A running capture stays within
1322
+ `logs.maximumBufferedBytes` (overflow is a `buffer-overflow` loss), or the node drops its output,
1323
+ a sent and unacknowledged batch included. A later session that keeps logs receives each running
1324
+ capture from where it stands, after a `not-kept` loss that counts what was dropped.
1325
+
1326
+ While a controller is away or slow, ended captures wait for their final batch to be acknowledged,
1327
+ and a crash-looping workload ends one per restart. A node therefore keeps at most
1328
+ `runtimeAssignmentLogContract.maximumEndedCaptures` (64) ended captures awaiting acknowledgement,
1329
+ holding at most `maximumEndedCaptureBytes` (64 MiB, the largest `logs.maximumBufferedBytes` a
1330
+ config may set, `runtimeConfigContract.maximumLogBufferedBytes`, so one capture always fits)
1331
+ together. Past either bound it discards the oldest
1332
+ ended captures completely and counts them in the next batch's `discardedCaptures`. It does not name
1333
+ them: remembering them would grow without bound while the controller is away. The batch is the
1334
+ unit of retry for the count: a batch the node discards unacknowledged passes its count on to the
1335
+ next batch, so a count whose acknowledgement was lost may arrive again inside a later one.
1336
+
1337
+ The count belongs to the node, not to the assignment, attempt or capture of the batch that carries
1338
+ it. A controller that keeps logs records it against the node and the session the batch arrived on,
1339
+ once for each batch it accepts and never for a batch it answers `replay`. Counts are not
1340
+ idempotent: a lost acknowledgement can repeat a count, so their sum may exceed the captures
1341
+ discarded. A controller that keeps no logs does nothing with the count beyond answering
1342
+ `not-kept`; the node keeps it for a later session.
1343
+
1269
1344
  `bindReportRuntimeAssignmentLogsRequest(request, assignment, logPolicy, trustedSession)` checks the
1270
1345
  session, that the assignment is this node's and carries the batch's attempt, and every line's
1271
1346
  joined length against the policy. `bindReportRuntimeAssignmentLogsResponse(response, request)`
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '32.37.0',
6
+ version: '32.39.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  }
@@ -1,8 +1,10 @@
1
1
  import type { IRuntimeAuthorityReference } from './runtimeassignment.js';
2
2
  import { runtimeNetworkAddressPlanContract, type TRuntimeNetworkVpnTransport } from './networkaddressplan.js';
3
3
  import { snapshotRuntimeSessionBinding, type IRuntimeSessionBinding } from './runtimesession.js';
4
- import { validateRuntimeNetworkProjection, type IRuntimeNetworkProjection } from './networkprojection.js';
5
- import { snapshotRuntimeNetworkDnsLeaseRenewal, validateRuntimeNetworkDnsLeaseRenewal } from './networklease.js';
4
+ import { snapshotRuntimeNetworkProjection, validateRuntimeNetworkProjection,
5
+ type IRuntimeNetworkProjection } from './networkprojection.js';
6
+ import { snapshotRuntimeNetworkDnsLeaseRenewal, validateRuntimeNetworkDnsLeaseRenewal,
7
+ type IRuntimeNetworkDnsLeaseRenewal } from './networklease.js';
6
8
  import { captureNetwork, failNetwork, networkAuthorityId, networkCounter, networkEffectiveDnsWindow, networkEqual,
7
9
  networkId, networkIpv4, networkNoiseKey, networkRecord, networkReference, networkReferenceOf, networkSafe,
8
10
  networkSameScope, requireNetwork } from '../private/networkcontract.js';
@@ -14,7 +16,12 @@ export interface IGetRuntimeManagedVpnCredentialRequest {
14
16
 
15
17
  /** Secret response over the current authenticated physical peer only. Never
16
18
  * persist, hash, log, or include it in a signed network projection. The native
17
- * Noise owner validates and uses the keys; these shapes confer no TUN readiness. */
19
+ * Noise owner validates and uses the keys; these shapes confer no TUN readiness.
20
+ *
21
+ * One response names one exact projection, but its key pair belongs to the node's managed VPN
22
+ * membership, which outlives a projection: a credential for a successor projection of the same
23
+ * membership (`continuesRuntimeManagedVpnMembership`) carries the same transport, hub, authority and
24
+ * keys, bound by `bindGetRuntimeManagedVpnCredentialSuccessor`. */
18
25
  export interface IGetRuntimeManagedVpnCredentialResponse extends IGetRuntimeManagedVpnCredentialRequest {
19
26
  transport: TRuntimeNetworkVpnTransport;
20
27
  /** The cluster hub endpoint this node dials, named by the id its signed projection selected. */
@@ -72,6 +79,66 @@ export const bindGetRuntimeManagedVpnCredentialRequest = async (value: unknown,
72
79
  } catch { return failNetwork(); }
73
80
  };
74
81
 
82
+ /**
83
+ * The membership rule of `continuesRuntimeManagedVpnMembership`, over projections already validated.
84
+ * A valid projection's handoff lease names the projection's own node scope, so one handoff
85
+ * reference is one node scope and the scope needs no comparison of its own.
86
+ */
87
+ const continuesMembership = (previous: IRuntimeNetworkProjection, next: IRuntimeNetworkProjection): boolean =>
88
+ previous.handoff !== null && next.handoff !== null && previous.id === next.id
89
+ && networkEqual(networkReferenceOf(previous.protectedAuthority), networkReferenceOf(next.protectedAuthority))
90
+ && networkEqual(networkReferenceOf(previous.handoff), networkReferenceOf(next.handoff))
91
+ && (next.generation > previous.generation || networkEqual(networkReferenceOf(previous), networkReferenceOf(next)));
92
+
93
+ /** What a membership's credential keeps across its projections: everything but the projection and the expiry. */
94
+ const credentialIdentity = (value: IGetRuntimeManagedVpnCredentialResponse) => ({
95
+ transport: value.transport, hub: value.hub, authorityId: value.authorityId, serverPublicKey: value.serverPublicKey,
96
+ clientPublicKey: value.clientPublicKey, clientPrivateKey: value.clientPrivateKey,
97
+ });
98
+
99
+ /**
100
+ * Whether `next` continues the managed VPN membership `previous` belongs to: the same projection
101
+ * lineage (`id`), the same protected authority, and the same handoff lease, which names the node
102
+ * scope and carries the node's router incarnation. Both must hold a handoff, because a node without
103
+ * one is no member. `next` is `previous` itself or a later generation; an earlier one, or another
104
+ * projection under the same generation, continues nothing.
105
+ *
106
+ * Everything else a projection states may move under one membership: its workload endpoints, their
107
+ * readiness, observations and egress, its private networks, its router selection and its DNS window.
108
+ * Those are what the member's network carries, never who the member is. A protection bump, a fresh
109
+ * handoff (router reincarnation) or a new controller epoch ends the membership. Whether the hub a
110
+ * credential names is still selected is the credential's question
111
+ * (`bindGetRuntimeManagedVpnCredentialSuccessor`), not the membership's.
112
+ *
113
+ * Validates both complete projections and rejects either that does not validate; a valid pair that
114
+ * is not one membership answers `false`. It samples no clock and fences no session.
115
+ */
116
+ export const continuesRuntimeManagedVpnMembership = async (previousValue: unknown, nextValue: unknown): Promise<boolean> => {
117
+ let previous: IRuntimeNetworkProjection, next: IRuntimeNetworkProjection;
118
+ try {
119
+ const previousInput = snapshotRuntimeNetworkProjection(previousValue), nextInput = snapshotRuntimeNetworkProjection(nextValue);
120
+ previous = await validateRuntimeNetworkProjection(previousInput);
121
+ next = await validateRuntimeNetworkProjection(nextInput);
122
+ } catch { return failNetwork(); }
123
+ return continuesMembership(previous, next);
124
+ };
125
+
126
+ /** The response binding over inputs already captured and validated. */
127
+ const bindResponse = (response: IGetRuntimeManagedVpnCredentialResponse, request: IGetRuntimeManagedVpnCredentialRequest,
128
+ projection: IRuntimeNetworkProjection, renewal: IRuntimeNetworkDnsLeaseRenewal | null, trusted: IRuntimeSessionBinding,
129
+ now: number): IGetRuntimeManagedVpnCredentialResponse => {
130
+ const window = networkEffectiveDnsWindow(projection, renewal);
131
+ bindRequest(request, projection, trusted);
132
+ requireNetwork(networkEqual(response.session, request.session) && networkEqual(response.projection, request.projection));
133
+ requireNetwork(projection.router?.platformEndpointIds.includes(response.hub.id));
134
+ const endpoint = projection.protectedAuthority.platformEndpoints.find(item => item.id === response.hub.id);
135
+ const expected = runtimeNetworkAddressPlanContract.hubTransports.find(row => row.transport === response.transport);
136
+ requireNetwork(endpoint && expected && endpoint.protocol === expected.protocol
137
+ && endpoint.address === response.hub.address && endpoint.port === response.hub.port);
138
+ requireNetwork(window.notBefore <= now && now < response.expiresAt && response.expiresAt <= window.expiresAt);
139
+ return response;
140
+ };
141
+
75
142
  /** Bind the secret response to the original request and the exact selected router
76
143
  * endpoint of the credential's transport, inside the projection's effective DNS window. renewalValue is the
77
144
  * bare lease renewal the caller already verified and admitted for this exact
@@ -88,15 +155,45 @@ export const bindGetRuntimeManagedVpnCredentialResponse = async (value: unknown,
88
155
  const renewalInput = renewalValue === null ? null : snapshotRuntimeNetworkDnsLeaseRenewal(renewalValue);
89
156
  const projection = await validateRuntimeNetworkProjection(projectionValue);
90
157
  const renewal = renewalInput === null ? null : await validateRuntimeNetworkDnsLeaseRenewal(renewalInput);
91
- const window = networkEffectiveDnsWindow(projection, renewal);
92
- bindRequest(request, projection, trusted);
93
- requireNetwork(networkEqual(response.session, request.session) && networkEqual(response.projection, request.projection));
94
- requireNetwork(projection.router?.platformEndpointIds.includes(response.hub.id));
95
- const endpoint = projection.protectedAuthority.platformEndpoints.find(item => item.id === response.hub.id);
96
- const expected = runtimeNetworkAddressPlanContract.hubTransports.find(row => row.transport === response.transport);
97
- requireNetwork(endpoint && expected && endpoint.protocol === expected.protocol
98
- && endpoint.address === response.hub.address && endpoint.port === response.hub.port);
99
- requireNetwork(window.notBefore <= now && now < response.expiresAt && response.expiresAt <= window.expiresAt);
100
- return response;
158
+ return bindResponse(response, request, projection, renewal, trusted, now);
159
+ } catch { return failNetwork(); }
160
+ };
161
+
162
+ /**
163
+ * Bind the credential a node holds under its successor projection: `value` names `projectionValue`
164
+ * and is bound exactly as `bindGetRuntimeManagedVpnCredentialResponse` binds the answer to
165
+ * `{ session: trustedSession, projection }`, inside that projection's effective DNS window
166
+ * (`renewalValue`, as there). It must also continue `previousValue`, the credential issued for
167
+ * `previousProjectionValue` over the same session: the two projections are one membership
168
+ * (`continuesRuntimeManagedVpnMembership`) and the transport, hub, authority, server key and client
169
+ * key pair are unchanged. Only `projection` and `expiresAt` move. The current effective window
170
+ * alone bounds the successor, so a membership whose current window does not cover the
171
+ * caller-qualified `nowValue` binds no successor; the held credential's own expiry is not
172
+ * consulted, because a renewal or a successor may have moved the window past it.
173
+ *
174
+ * The issuer binds the successor it states for a member, so the node's session and key pair survive
175
+ * a workload, readiness or policy change; the node binds a fresh answer with it to tell a successor,
176
+ * which keeps its live session, from a new membership, which replaces it. A previous credential for
177
+ * the same projection binds too, which is how a renewal moves the expiry. Content binding only, as
178
+ * for the response binder.
179
+ */
180
+ export const bindGetRuntimeManagedVpnCredentialSuccessor = async (value: unknown, previousValue: unknown,
181
+ previousProjectionValue: unknown, projectionValue: unknown, trustedSessionValue: unknown, nowValue: unknown,
182
+ renewalValue: unknown | null = null): Promise<IGetRuntimeManagedVpnCredentialResponse> => {
183
+ try {
184
+ const response = snapshotGetRuntimeManagedVpnCredentialResponse(value);
185
+ const previous = snapshotGetRuntimeManagedVpnCredentialResponse(previousValue);
186
+ const previousInput = snapshotRuntimeNetworkProjection(previousProjectionValue);
187
+ const projectionInput = snapshotRuntimeNetworkProjection(projectionValue);
188
+ const trusted = snapshotRuntimeSessionBinding(trustedSessionValue), now = networkCounter(nowValue);
189
+ const renewalInput = renewalValue === null ? null : snapshotRuntimeNetworkDnsLeaseRenewal(renewalValue);
190
+ const previousProjection = await validateRuntimeNetworkProjection(previousInput);
191
+ const projection = await validateRuntimeNetworkProjection(projectionInput);
192
+ const renewal = renewalInput === null ? null : await validateRuntimeNetworkDnsLeaseRenewal(renewalInput);
193
+ requireNetwork(continuesMembership(previousProjection, projection));
194
+ requireNetwork(networkEqual(previous.session, trusted)
195
+ && networkEqual(previous.projection, networkReferenceOf(previousProjection)));
196
+ requireNetwork(networkEqual(credentialIdentity(previous), credentialIdentity(response)));
197
+ return bindResponse(response, { session: trusted, projection: networkReferenceOf(projection) }, projection, renewal, trusted, now);
101
198
  } catch { return failNetwork(); }
102
199
  };
@@ -6,7 +6,7 @@ import { snapshotRuntimeSessionBinding } from './runtimesession.js';
6
6
  import {
7
7
  captureNetwork, networkCounter, networkEqual, networkId, networkList, networkRecord, requireNetwork,
8
8
  } from '../private/networkcontract.js';
9
- import { isRuntimeLogPolicy } from '../private/runtimepolicy.js';
9
+ import { isRuntimeLogPolicy, runtimePolicyLimits } from '../private/runtimepolicy.js';
10
10
 
11
11
  /** The container output a log line was written to. */
12
12
  export type TRuntimeAssignmentLogStream = 'stdout' | 'stderr';
@@ -39,9 +39,14 @@ export interface IRuntimeAssignmentLogLine {
39
39
  * - `capture-restart`: the node's capture restarted without its buffer, for example after a reboot
40
40
  * emptied its disposable capture directory; how much was lost is unknown;
41
41
  * - `not-captured`: the container was started without output capture, so none of its output is
42
- * available; how much there was is unknown.
42
+ * available; how much there was is unknown;
43
+ * - `not-kept`: the node dropped this output while its controller kept no logs. Once a session
44
+ * answered `not-kept`, the node may drop a running capture's output instead of holding it,
45
+ * including a batch it sent that is still unacknowledged; a later session that keeps logs
46
+ * receives the capture from where it stands, after this loss.
43
47
  */
44
- export type TRuntimeAssignmentLogLossReason = 'buffer-overflow' | 'line-cut' | 'capture-restart' | 'not-captured';
48
+ export type TRuntimeAssignmentLogLossReason =
49
+ | 'buffer-overflow' | 'line-cut' | 'capture-restart' | 'not-captured' | 'not-kept';
45
50
 
46
51
  /**
47
52
  * Evidence of output that was lost, in the position of the stream where it was lost.
@@ -49,8 +54,8 @@ export type TRuntimeAssignmentLogLossReason = 'buffer-overflow' | 'line-cut' | '
49
54
  * `bytes` and `lines` count exactly what was dropped; both are `null` for `capture-restart` and
50
55
  * `not-captured`, whose extent the node cannot know, and both are stated for the other reasons.
51
56
  * A `line-cut` counts the cut bytes and no line, because the line itself was delivered; it names
52
- * the stream of that line. A `buffer-overflow` counts the dropped bytes and the whole lines among
53
- * them, and names a stream only when every dropped byte came from it.
57
+ * the stream of that line. A `buffer-overflow` or `not-kept` loss counts the dropped bytes and the
58
+ * whole lines among them, and names a stream only when every dropped byte came from it.
54
59
  */
55
60
  export interface IRuntimeAssignmentLogLoss {
56
61
  kind: 'lost';
@@ -69,10 +74,23 @@ export type TRuntimeAssignmentLogEntry = IRuntimeAssignmentLogLine | IRuntimeAss
69
74
  *
70
75
  * `captureId` names one capture of the attempt on its node: the node starts a new capture, with a
71
76
  * new id and `sequence` 1, whenever it cannot continue the previous one, and opens it with a
72
- * `capture-restart` loss. Within a capture `sequence` counts batches from 1 without gaps, and the
73
- * node sends the next batch only after the controller acknowledged the previous one, so a batch is
74
- * the one unit of retry. `final` states that no batch follows in this capture: the container is gone
75
- * and its output is drained. Only a final batch may be empty.
77
+ * `capture-restart` loss. Within a capture `sequence` counts batches from 1, and the node sends the
78
+ * next batch only after the controller acknowledged the previous one, so a batch is the one unit of
79
+ * retry. `final` states that no batch follows in this capture: the container is gone and its output
80
+ * is drained. Only a final batch may be empty.
81
+ *
82
+ * A sequence number, once sent, is never sent again with other content: a retry resends the batch
83
+ * unchanged, `discardedCaptures` included. Reusing a number would lose data silently, because a
84
+ * controller that stored the earlier batch while its acknowledgement was lost answers `replay` and
85
+ * drops the new content with its loss evidence. The node skips numbers only after dropping a
86
+ * running capture's batch it sent that is still unacknowledged, which only a `not-kept` answer
87
+ * permits: the next batch it
88
+ * sends of that capture takes a higher number it never sent and opens with a `not-kept` loss that
89
+ * counts what was dropped. Where the controller holds the dropped batch, because only its
90
+ * acknowledgement was lost, it sees no gap, and that loss also counts content it holds.
91
+ *
92
+ * `discardedCaptures` is node-level loss evidence, not part of this capture (see
93
+ * `runtimeAssignmentLogContract.maximumEndedCaptures`).
76
94
  */
77
95
  export interface IRuntimeAssignmentLogBatch {
78
96
  assignmentId: string;
@@ -81,6 +99,24 @@ export interface IRuntimeAssignmentLogBatch {
81
99
  sequence: number;
82
100
  entries: TRuntimeAssignmentLogEntry[];
83
101
  final: boolean;
102
+ /**
103
+ * How many ended captures the node discarded whole and unacknowledged since it last stated a
104
+ * count: past its ended-capture bound, or while a `not-kept` answer stood. The node states the
105
+ * count on the next batch it creates, of any capture, and counts afresh from there. The batch is
106
+ * then the unit of retry for the count: if the node discards that batch unacknowledged, the count
107
+ * passes on to the next batch, so a count whose acknowledgement was lost may reach the controller
108
+ * again inside a later count. It never names the discarded captures, because remembering them
109
+ * would grow without bound while the controller is away. Absent means none; stated, it is at
110
+ * least 1.
111
+ *
112
+ * The count belongs to the node, not to the assignment, attempt or capture of the batch that
113
+ * carries it. A controller that keeps logs records it against the node and the session the batch
114
+ * arrived on, once for each batch it accepts and never for a batch it answers `replay`, which it
115
+ * recorded when it accepted it. Counts are not idempotent: a lost acknowledgement can repeat a
116
+ * count, so their sum may exceed the captures discarded. A controller that keeps no logs does
117
+ * nothing with the count beyond answering `not-kept`; the node keeps it for a later session.
118
+ */
119
+ discardedCaptures?: number;
84
120
  }
85
121
 
86
122
  /** Pallet push over its current authenticated session. */
@@ -95,12 +131,22 @@ export interface IReportRuntimeAssignmentLogsRequest {
95
131
  * - `accepted`: it holds the batch durably;
96
132
  * - `replay`: it already holds this batch and does not store it again;
97
133
  * - `not-kept`: it keeps no workload logs. It holds nothing, and the node sends no more batches on
98
- * this session; a later session may be answered differently.
134
+ * this session; a later session may be answered differently. The answer is the node's permission
135
+ * to discard for that session: it may discard every ended capture completely, its content and
136
+ * identity, and each capture that ends later while the answer stands, counting them in
137
+ * `discardedCaptures`. A running capture stays within `logs.maximumBufferedBytes`, whose overflow
138
+ * is a `buffer-overflow` loss, or the node drops its output, a sent and unacknowledged batch
139
+ * included, and states a `not-kept` loss where delivery resumes.
99
140
  *
100
141
  * A controller answers every batch with one of these; it never leaves the method unhandled, so a
101
142
  * node can tell a controller that keeps no logs from a failure worth retrying. It never refuses a
102
- * batch for a gap in `sequence`: the node discards only what was acknowledged, so a missing batch
103
- * can only be the controller's own loss, which it records.
143
+ * batch for a gap in `sequence`. Every gap the node leaves by discarding carries evidence: the
144
+ * batch after numbers it skipped opens with a `not-kept` loss (see `IRuntimeAssignmentLogBatch`),
145
+ * and a capture it discarded whole is counted in `discardedCaptures`. A controller therefore reads
146
+ * a gap before a batch that opens with a `not-kept` loss as the node's discard, which that loss
147
+ * counts, and a gap before any other batch as its own loss, which it records. A capture whose
148
+ * final batch never arrives leaves no gap to read: it may still be running, and one discarded whole
149
+ * is counted but never named.
104
150
  */
105
151
  export type TRuntimeAssignmentLogsStatus = 'accepted' | 'replay' | 'not-kept';
106
152
 
@@ -111,12 +157,37 @@ export interface IReportRuntimeAssignmentLogsResponse {
111
157
  sequence: number;
112
158
  }
113
159
 
160
+ /**
161
+ * Rollout: a receiver on interfaces 32.37.0 or earlier reads a batch by its exact schema and
162
+ * refuses one that carries `discardedCaptures` or a `not-kept` loss, on every retry. A controller
163
+ * must therefore run a later release before any node sends either.
164
+ */
114
165
  export const runtimeAssignmentLogContract = Object.freeze({
115
166
  error: 'Runtime assignment log contract rejected.',
116
167
  /** Pallet pushes; the controller persists metadata and payloads and acknowledges by sequence. */
117
168
  delivery: 'node-pushes-controller-acknowledges-each-batch',
118
- /** A controller that keeps no logs answers `not-kept`, and the node stops for that session. */
169
+ /**
170
+ * A controller that keeps no logs answers `not-kept`, and the node stops for that session. It may
171
+ * then discard ended captures completely, counted in `discardedCaptures`, and drop running
172
+ * output, stated as a `not-kept` loss.
173
+ */
119
174
  notKept: 'node-stops-for-the-session',
175
+ /**
176
+ * The most ended captures a node keeps awaiting acknowledgement, while its controller is away or
177
+ * slow. An ended capture holds its buffer, cursor record and waiting batch in the node's RAM-backed
178
+ * runtime directory, and a crash-looping workload ends one per restart; 64 covers a burst of
179
+ * restarts across the node's workloads before any of them loses its tail. Past this bound, or past
180
+ * `maximumEndedCaptureBytes`, the node discards the oldest ended captures completely and counts
181
+ * them in the next batch's `discardedCaptures`.
182
+ */
183
+ maximumEndedCaptures: 64,
184
+ /**
185
+ * The most bytes all ended captures awaiting acknowledgement hold together, measured as the node
186
+ * measures its `logs.maximumBufferedBytes` buffer. It equals the largest buffer a runtime config
187
+ * may set (`runtimeConfigContract.maximumLogBufferedBytes`), so one capture always fits whole, and
188
+ * it keeps the node's RAM-backed runtime directory from growing with the number of restarts.
189
+ */
190
+ maximumEndedCaptureBytes: runtimePolicyLimits.maximumLogBufferedBytes,
120
191
  /** The most entries in one batch. */
121
192
  maximumEntriesPerBatch: 1024,
122
193
  /** The most UTF-8 bytes of `text` in one entry; a longer line travels as `partial` pieces. */
@@ -132,7 +203,7 @@ const fail = (): never => { throw new Error(runtimeAssignmentLogContract.error);
132
203
  const safe = <T>(operationArg: () => T): T => { try { return operationArg(); } catch { return fail(); } };
133
204
  const encoder = new TextEncoder();
134
205
  const streams = ['stdout', 'stderr'] as const;
135
- const lossReasons = ['buffer-overflow', 'line-cut', 'capture-restart', 'not-captured'] as const;
206
+ const lossReasons = ['buffer-overflow', 'line-cut', 'capture-restart', 'not-captured', 'not-kept'] as const;
136
207
  const statuses = ['accepted', 'replay', 'not-kept'] as const;
137
208
 
138
209
  const literalOf = <TLiteral extends string>(valueArg: unknown, allowedArg: readonly TLiteral[]): TLiteral => {
@@ -184,12 +255,15 @@ const entryOf = (valueArg: unknown): TRuntimeAssignmentLogEntry => {
184
255
  };
185
256
 
186
257
  const batchOf = (valueArg: unknown): IRuntimeAssignmentLogBatch => {
187
- const value = networkRecord(valueArg, ['assignmentId', 'attemptId', 'captureId', 'sequence', 'entries', 'final']);
258
+ const value = networkRecord(
259
+ valueArg, ['assignmentId', 'attemptId', 'captureId', 'sequence', 'entries', 'final'], ['discardedCaptures'],
260
+ );
188
261
  const entries = networkList(value.entries, runtimeAssignmentLogContract.maximumEntriesPerBatch, entryOf);
189
262
  requireNetwork(typeof value.final === 'boolean' && (entries.length > 0 || value.final));
190
263
  return {
191
264
  assignmentId: networkId(value.assignmentId), attemptId: networkId(value.attemptId),
192
265
  captureId: networkId(value.captureId), sequence: networkCounter(value.sequence), entries, final: value.final,
266
+ ...(Object.hasOwn(value, 'discardedCaptures') ? { discardedCaptures: networkCounter(value.discardedCaptures) } : {}),
193
267
  };
194
268
  };
195
269
 
@@ -133,6 +133,7 @@ export const runtimeConfigContract = Object.freeze({
133
133
  maximumTargetPorts: 64,
134
134
  maximumReadinessDurationMs: runtimePolicyLimits.maximumReadinessDurationMs,
135
135
  maximumLogRetentionMs: runtimePolicyLimits.maximumLogRetentionMs,
136
+ maximumLogBufferedBytes: runtimePolicyLimits.maximumLogBufferedBytes,
136
137
  } as const);
137
138
 
138
139
  const fail: (messageArg: string) => never = (messageArg) => { throw new Error(messageArg); };
@@ -15,6 +15,8 @@ export const runtimePolicyLimits = Object.freeze({
15
15
  maximumIdentityNumber: 2 ** 31 - 1,
16
16
  maximumReadinessDurationMs: 3_600_000,
17
17
  maximumLogRetentionMs: 31_536_000_000,
18
+ /** The largest `logs.maximumBufferedBytes`; a node's ended captures share the same bound. */
19
+ maximumLogBufferedBytes: 67_108_864,
18
20
  } as const);
19
21
 
20
22
  export type TRuntimePolicyFailure = (messageArg: string) => never;
@@ -43,7 +45,7 @@ export const isRuntimeIdentityNumber = (valueArg: unknown): valueArg is number =
43
45
  export const isRuntimeLogPolicy = (valueArg: unknown): valueArg is IRuntimeConfigLogPolicy =>
44
46
  isExactRecord(valueArg, ['maximumLineBytes', 'maximumBufferedBytes', 'retentionMs'])
45
47
  && isBoundedInteger(valueArg.maximumLineBytes, 1, 1_048_576)
46
- && isBoundedInteger(valueArg.maximumBufferedBytes, 1, 67_108_864)
48
+ && isBoundedInteger(valueArg.maximumBufferedBytes, 1, runtimePolicyLimits.maximumLogBufferedBytes)
47
49
  && valueArg.maximumBufferedBytes >= valueArg.maximumLineBytes
48
50
  && isBoundedInteger(valueArg.retentionMs, 1, runtimePolicyLimits.maximumLogRetentionMs);
49
51