instar 1.3.270 → 1.3.272
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/dashboard/index.html +73 -11
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +15 -2
- package/dist/commands/server.js.map +1 -1
- package/dist/coordination/ReviewExchange.d.ts +135 -0
- package/dist/coordination/ReviewExchange.d.ts.map +1 -0
- package/dist/coordination/ReviewExchange.js +192 -0
- package/dist/coordination/ReviewExchange.js.map +1 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +33 -1
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SecretStore.d.ts.map +1 -1
- package/dist/core/SecretStore.js +10 -1
- package/dist/core/SecretStore.js.map +1 -1
- package/dist/core/TransferByNickname.d.ts +6 -0
- package/dist/core/TransferByNickname.d.ts.map +1 -1
- package/dist/core/TransferByNickname.js +18 -6
- package/dist/core/TransferByNickname.js.map +1 -1
- package/dist/core/seamlessnessConfig.d.ts.map +1 -1
- package/dist/core/seamlessnessConfig.js +12 -1
- package/dist/core/seamlessnessConfig.js.map +1 -1
- package/dist/core/types.d.ts +23 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/feedback-factory/cutoverReadiness.d.ts +103 -0
- package/dist/feedback-factory/cutoverReadiness.d.ts.map +1 -0
- package/dist/feedback-factory/cutoverReadiness.js +118 -0
- package/dist/feedback-factory/cutoverReadiness.js.map +1 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +13 -1
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/scheduler/MentorAutonomousGuardian.d.ts.map +1 -1
- package/dist/scheduler/MentorAutonomousGuardian.js +1 -0
- package/dist/scheduler/MentorAutonomousGuardian.js.map +1 -1
- package/dist/server/AgentServer.d.ts +6 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +54 -6
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +28 -0
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/routes.d.ts +12 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +255 -4
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +64 -64
- package/src/scaffold/templates.ts +13 -1
- package/upgrades/1.3.271.md +154 -0
- package/upgrades/1.3.272.md +40 -0
- package/upgrades/autoloop-gate-compliance.eli16.md +11 -0
- package/upgrades/side-effects/autoloop-gate-compliance.md +43 -0
- package/upgrades/side-effects/cutover-readiness.md +63 -0
- package/upgrades/side-effects/dashboard-pool-sessions.md +103 -0
- package/upgrades/side-effects/review-exchange-protocol.md +60 -0
- package/upgrades/side-effects/secret-drop-store-first.md +117 -0
- package/upgrades/side-effects/transfer-idempotency-exactly-once.md +105 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Side-Effects Review — Transfer idempotency + exactly-once-when-live
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `transfer-idempotency-exactly-once`
|
|
4
|
+
**Date:** `2026-06-05`
|
|
5
|
+
**Author:** `echo`
|
|
6
|
+
**Second-pass reviewer:** `not required` (pure-planner reorder + config-resolution default; every boundary side test-pinned)
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
1. `planTransferByNickname`: the already-satisfied checks (`owner === target`,
|
|
11
|
+
NEW `pin === target` via optional `currentPinOf`) now run BEFORE the rate
|
|
12
|
+
limit, so a duplicate of an already-satisfied move plans `noop` ("already
|
|
13
|
+
there") instead of `reject/rate-limited`. The consumer wires `currentPinOf`
|
|
14
|
+
from `TopicPlacementPinStore` and words the `already-on-target` noop as
|
|
15
|
+
"already running on X — nothing to move."
|
|
16
|
+
2. `resolveSeamlessnessConfig`: `exactlyOnceIngress` defaults ON when the
|
|
17
|
+
session pool stage is `live-transfer`/`rebalance` (a live pool without the
|
|
18
|
+
ingress dedupe ledger re-executes retried/replayed user commands — the
|
|
19
|
+
2026-06-05 4×-execution incident). Explicit values always win.
|
|
20
|
+
|
|
21
|
+
## Decision-point inventory
|
|
22
|
+
|
|
23
|
+
1. `owner === target` → noop vs continue. Both sides pinned (incident test +
|
|
24
|
+
transfer test).
|
|
25
|
+
2. `pin === target` → noop vs continue; absent `currentPinOf` → old behavior.
|
|
26
|
+
All three pinned.
|
|
27
|
+
3. Rate-limit window for a real move (different target) → still rejected.
|
|
28
|
+
Pinned.
|
|
29
|
+
4. Stage-derived `exactlyOnceIngress` default: off (none/dark/shadow), on
|
|
30
|
+
(live-transfer/rebalance), explicit override both directions. All pinned.
|
|
31
|
+
|
|
32
|
+
## 1. Over-block
|
|
33
|
+
|
|
34
|
+
Nothing new is rejected. The planner now rejects strictly LESS (duplicates
|
|
35
|
+
that previously rate-limited now noop). The exactly-once default only
|
|
36
|
+
activates a gate that itself fails open (ledger errors fall through to normal
|
|
37
|
+
routing, per the existing route code).
|
|
38
|
+
|
|
39
|
+
## 2. Under-block
|
|
40
|
+
|
|
41
|
+
- The rate limit no longer applies to same-target duplicates — deliberate:
|
|
42
|
+
re-pinning the same value is idempotent. Rapid same-target spam costs one
|
|
43
|
+
pin-store write + one "already there" reply per message; the per-topic
|
|
44
|
+
Telegram traffic itself is bounded upstream.
|
|
45
|
+
- The exactly-once default does NOT retroactively enable the ledger on pools
|
|
46
|
+
still in dark/shadow — pre-live stages keep the old dark default by design.
|
|
47
|
+
|
|
48
|
+
## 3. Level-of-abstraction fit
|
|
49
|
+
|
|
50
|
+
The idempotency fix lives in the pure planner (the single decision function
|
|
51
|
+
both the natural-language path and `POST /pool/transfer` flow through), not in
|
|
52
|
+
the Telegram consumer. The exactly-once coupling lives in config RESOLUTION
|
|
53
|
+
(`resolveSeamlessnessConfig`) — the one place defaults are derived — not in
|
|
54
|
+
the wiring site.
|
|
55
|
+
|
|
56
|
+
## 4. Signal vs authority compliance
|
|
57
|
+
|
|
58
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
59
|
+
|
|
60
|
+
No new blocking authority. The planner reorder converts rejections into
|
|
61
|
+
no-ops. The exactly-once gate it activates was already authority-bearing by
|
|
62
|
+
design (spec §8 G3a) and fails open on any ledger error.
|
|
63
|
+
|
|
64
|
+
## 5. Interactions
|
|
65
|
+
|
|
66
|
+
- `noop` consumer behavior unchanged structurally (pin set + release-if-self
|
|
67
|
+
+ message): re-setting an identical pin refreshes `updatedAt`, which can
|
|
68
|
+
extend the rate window for a SUBSEQUENT different-target move by up to 10s
|
|
69
|
+
— bounded, harmless.
|
|
70
|
+
- Activating `exactlyOnceIngress` on live pools also activates the
|
|
71
|
+
reply-marker transport (same flag, existing wiring) — that is the intended
|
|
72
|
+
pairing per spec §8 G3a.
|
|
73
|
+
- Sentinel intercepts (emergency stop / pause) run BEFORE the ingress gate in
|
|
74
|
+
the route — unchanged; an emergency stop is never deduped away.
|
|
75
|
+
|
|
76
|
+
## 6. External surfaces
|
|
77
|
+
|
|
78
|
+
No new routes, no new config keys (an existing key's DEFAULT becomes
|
|
79
|
+
stage-aware). One user-visible message wording improvement. No migration:
|
|
80
|
+
config absence means "follow the default," which is the point.
|
|
81
|
+
|
|
82
|
+
## 7. Rollback cost
|
|
83
|
+
|
|
84
|
+
Trivial. `exactlyOnceIngress: false` is an instant per-agent opt-out without
|
|
85
|
+
deploy; reverting the PR restores both old behaviors. No state, no schema.
|
|
86
|
+
|
|
87
|
+
## Conclusion
|
|
88
|
+
|
|
89
|
+
Two small, surgical changes at the correct layers, each killing one half of a
|
|
90
|
+
user-facing incident: duplicates narrated as failures, and duplicates
|
|
91
|
+
executing at all. Strictly less rejection, strictly more dedupe, both
|
|
92
|
+
test-pinned on every side.
|
|
93
|
+
|
|
94
|
+
## Second-pass review (if required)
|
|
95
|
+
|
|
96
|
+
Not required — see header.
|
|
97
|
+
|
|
98
|
+
## Evidence pointers
|
|
99
|
+
|
|
100
|
+
- `tests/unit/TransferByNickname.test.ts` — 5 new idempotency tests (incl. the
|
|
101
|
+
verbatim incident case).
|
|
102
|
+
- `tests/unit/seamlessnessConfig.test.ts` — 4 new coupling tests.
|
|
103
|
+
- Production evidence: `logs/server.log` 2026-06-05T04:20:43/04:20:55 double
|
|
104
|
+
pin + zero `exactly-once` lines; topic 13481 screenshot (Moving →
|
|
105
|
+
rate-limited → Moving → rate-limited).
|