instar 1.3.384 → 1.3.385
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/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +6 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/PeerPresencePuller.d.ts +18 -0
- package/dist/core/PeerPresencePuller.d.ts.map +1 -1
- package/dist/core/PeerPresencePuller.js +1 -1
- package/dist/core/PeerPresencePuller.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- package/upgrades/1.3.385.md +43 -0
- package/upgrades/side-effects/peer-quota-propagation.md +58 -0
|
@@ -53,6 +53,19 @@ export interface PeerCapacity {
|
|
|
53
53
|
incarnation: string;
|
|
54
54
|
replicationSeq: number;
|
|
55
55
|
};
|
|
56
|
+
/**
|
|
57
|
+
* The peer's self-reported LLM-account quota state (live-matrix finding A2,
|
|
58
|
+
* 2026-06-06). It IS carried in the peer's session-status response (its
|
|
59
|
+
* getCapacity(self) already includes it) but was being PARSED AWAY on the
|
|
60
|
+
* receive side — so the router only ever saw its OWN quota and quota-aware
|
|
61
|
+
* placement (#804) could never avoid a rate-limited PEER (the original EXO
|
|
62
|
+
* failure). Absent from old peers = treated as not blocked (fail-open).
|
|
63
|
+
*/
|
|
64
|
+
quotaState?: {
|
|
65
|
+
blocked: boolean;
|
|
66
|
+
blockedUntil?: string;
|
|
67
|
+
reason?: string;
|
|
68
|
+
};
|
|
56
69
|
}
|
|
57
70
|
/** One stream slice of a journal-sync delta (mirrors MeshRpc's `journal-sync.batch`). */
|
|
58
71
|
export interface JournalDeltaStream {
|
|
@@ -77,6 +90,11 @@ export interface PeerPresencePullerDeps {
|
|
|
77
90
|
machineId: string;
|
|
78
91
|
selfReportedLastSeen: string;
|
|
79
92
|
loadAvg?: number;
|
|
93
|
+
quotaState?: {
|
|
94
|
+
blocked: boolean;
|
|
95
|
+
blockedUntil?: string;
|
|
96
|
+
reason?: string;
|
|
97
|
+
};
|
|
80
98
|
}) => void;
|
|
81
99
|
/** Wall clock — injectable for tests. Defaults to `Date`. */
|
|
82
100
|
now?: () => Date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PeerPresencePuller.d.ts","sourceRoot":"","sources":["../../src/core/PeerPresencePuller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,6FAA6F;AAC7F,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,sFAAsF;AACtF,MAAM,WAAW,YAAY;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE;;;;OAIG;IACH,iBAAiB,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"PeerPresencePuller.d.ts","sourceRoot":"","sources":["../../src/core/PeerPresencePuller.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,7 +47,7 @@ export class PeerPresencePuller {
|
|
|
47
47
|
if (!cap)
|
|
48
48
|
return null;
|
|
49
49
|
const seen = cap.selfReportedLastSeen ?? (this.d.now?.() ?? new Date()).toISOString();
|
|
50
|
-
this.d.recordHeartbeat({ machineId: m.machineId, selfReportedLastSeen: seen, loadAvg: cap.loadAvg });
|
|
50
|
+
this.d.recordHeartbeat({ machineId: m.machineId, selfReportedLastSeen: seen, loadAvg: cap.loadAvg, ...(cap.quotaState ? { quotaState: cap.quotaState } : {}) });
|
|
51
51
|
// REPLICATION-GATED journal-delta drive — only when the server wired the
|
|
52
52
|
// delta deps (i.e. replication.enabled === true). Otherwise a complete
|
|
53
53
|
// no-op (engine/transport stay dark). Never throws into the puller.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PeerPresencePuller.js","sourceRoot":"","sources":["../../src/core/PeerPresencePuller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;
|
|
1
|
+
{"version":3,"file":"PeerPresencePuller.js","sourceRoot":"","sources":["../../src/core/PeerPresencePuller.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-06-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-06-06T23:14:06.425Z",
|
|
5
|
+
"instarVersion": "1.3.385",
|
|
6
6
|
"entryCount": 199,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
Quota-aware placement is meant to route work away from a rate-limited machine.
|
|
9
|
+
But each machine only ever knew its OWN quota: a peer's quota state rides the
|
|
10
|
+
session-status response (the peer's own capacity already includes it), yet the
|
|
11
|
+
receive side parsed it away — the exact same narrowing bug that previously
|
|
12
|
+
dropped the commitments advert (#931). So the router could avoid placing onto a
|
|
13
|
+
rate-limited LOCAL machine but never onto a rate-limited PEER — which is the
|
|
14
|
+
original EXO failure (the laptop placing work onto a rate-limited Mini).
|
|
15
|
+
|
|
16
|
+
The peer-capacity parse + the PeerPresencePuller now carry `quotaState` through
|
|
17
|
+
to the pool registry. Absent from an older peer = treated as not blocked
|
|
18
|
+
(fail-open, unchanged).
|
|
19
|
+
|
|
20
|
+
## What to Tell Your User
|
|
21
|
+
|
|
22
|
+
If one of your machines hits its usage limit, the other machine now actually
|
|
23
|
+
knows and stops sending new work to it — instead of finding out the hard way.
|
|
24
|
+
|
|
25
|
+
- audience: agent-only
|
|
26
|
+
- maturity: stable
|
|
27
|
+
|
|
28
|
+
## Summary of New Capabilities
|
|
29
|
+
|
|
30
|
+
- `PeerCapacity.quotaState` carried from the session-status response through
|
|
31
|
+
`fetchPeerCapacity` and `PeerPresencePuller` into the pool registry.
|
|
32
|
+
- `GET /pool` now shows a peer's `quotaState`, not just the local machine's.
|
|
33
|
+
- Pairs with finding A1 (the collector that produces the data now runs on
|
|
34
|
+
lifeline-driven agents).
|
|
35
|
+
|
|
36
|
+
## Evidence
|
|
37
|
+
|
|
38
|
+
- `tests/unit/peer-presence-puller.test.ts` (+2): a peer quotaState propagates
|
|
39
|
+
into the recorded heartbeat; an old peer omitting it records no quotaState
|
|
40
|
+
(fail-open). 13/13 in file incl. the existing wiring suite.
|
|
41
|
+
- Live (pre-fix, v1.3.384): laptop `/pool` shows its own `quotaState:{blocked:false}`
|
|
42
|
+
but the Mini's stays `null` after 5+ minutes despite the Mini's `/quota`
|
|
43
|
+
reading `status:ok`.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Side-Effects Review — Peer quota propagation (finding A2)
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `peer-quota-propagation`
|
|
4
|
+
**Date:** `2026-06-06`
|
|
5
|
+
**Author:** `echo`
|
|
6
|
+
**Second-pass reviewer:** `not required`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
The peer's `quotaState` (already in its session-status response via
|
|
11
|
+
getCapacity(self)) was parsed away on the receive side — same narrowing bug as
|
|
12
|
+
the #931 commitmentsAdvert drop. Now carried through `fetchPeerCapacity` ->
|
|
13
|
+
`PeerCapacity` -> `PeerPresencePuller.recordHeartbeat` -> pool registry, so the
|
|
14
|
+
router sees a peer's quota and quota-aware placement (#804) can avoid a
|
|
15
|
+
rate-limited peer (the original EXO failure).
|
|
16
|
+
|
|
17
|
+
## Decision-point inventory
|
|
18
|
+
|
|
19
|
+
One: carry the field or not. Carried, additively, with absent = not blocked.
|
|
20
|
+
|
|
21
|
+
## 1. Over-block
|
|
22
|
+
|
|
23
|
+
A correctly-reported `blocked:true` peer is now AVOIDED by placement where
|
|
24
|
+
before it was silently chosen. That is the intended behavior, not over-block:
|
|
25
|
+
the data is the peer's own self-report (the gemini quota-conflation lesson —
|
|
26
|
+
never another machine's file; this is the peer asserting its OWN state).
|
|
27
|
+
|
|
28
|
+
## 2. Under-block
|
|
29
|
+
|
|
30
|
+
An old peer that omits quotaState still reads as not-blocked (fail-open,
|
|
31
|
+
unchanged) — no regression, just no improvement for un-upgraded peers.
|
|
32
|
+
|
|
33
|
+
## 3. Level-of-abstraction fit
|
|
34
|
+
|
|
35
|
+
The field travels the SAME path the commitmentsAdvert/journalAdvert already
|
|
36
|
+
travel (session-status -> fetchPeerCapacity -> puller). No new transport, no
|
|
37
|
+
new endpoint. The serving side already emitted it (getCapacity spread).
|
|
38
|
+
|
|
39
|
+
## 4. Signal vs authority compliance
|
|
40
|
+
|
|
41
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
42
|
+
|
|
43
|
+
Placement remains advisory + fail-open: a hard pin still wins
|
|
44
|
+
(pinned-machine-quota-blocked), all-blocked proceeds least-loaded. This change
|
|
45
|
+
only feeds the existing decision real peer data.
|
|
46
|
+
|
|
47
|
+
## 5. Interactions
|
|
48
|
+
|
|
49
|
+
- #804 quota-aware placement: the consumer — now has peer data.
|
|
50
|
+
- A1 (collector hoist): the producer — together they make placement real.
|
|
51
|
+
- gemini quota-conflation lesson: respected — this is the peer's OWN
|
|
52
|
+
self-report carried verbatim, never this machine reading another's file.
|
|
53
|
+
- Old peers: forward/backward compatible (optional field).
|
|
54
|
+
|
|
55
|
+
## 6. External surfaces
|
|
56
|
+
|
|
57
|
+
`GET /pool` now populates a peer's `quotaState` (was always null for peers).
|
|
58
|
+
No new routes/config/notifications.
|