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.
Files changed (57) hide show
  1. package/dashboard/index.html +73 -11
  2. package/dist/commands/server.d.ts.map +1 -1
  3. package/dist/commands/server.js +15 -2
  4. package/dist/commands/server.js.map +1 -1
  5. package/dist/coordination/ReviewExchange.d.ts +135 -0
  6. package/dist/coordination/ReviewExchange.d.ts.map +1 -0
  7. package/dist/coordination/ReviewExchange.js +192 -0
  8. package/dist/coordination/ReviewExchange.js.map +1 -0
  9. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  10. package/dist/core/PostUpdateMigrator.js +33 -1
  11. package/dist/core/PostUpdateMigrator.js.map +1 -1
  12. package/dist/core/SecretStore.d.ts.map +1 -1
  13. package/dist/core/SecretStore.js +10 -1
  14. package/dist/core/SecretStore.js.map +1 -1
  15. package/dist/core/TransferByNickname.d.ts +6 -0
  16. package/dist/core/TransferByNickname.d.ts.map +1 -1
  17. package/dist/core/TransferByNickname.js +18 -6
  18. package/dist/core/TransferByNickname.js.map +1 -1
  19. package/dist/core/seamlessnessConfig.d.ts.map +1 -1
  20. package/dist/core/seamlessnessConfig.js +12 -1
  21. package/dist/core/seamlessnessConfig.js.map +1 -1
  22. package/dist/core/types.d.ts +23 -0
  23. package/dist/core/types.d.ts.map +1 -1
  24. package/dist/core/types.js.map +1 -1
  25. package/dist/feedback-factory/cutoverReadiness.d.ts +103 -0
  26. package/dist/feedback-factory/cutoverReadiness.d.ts.map +1 -0
  27. package/dist/feedback-factory/cutoverReadiness.js +118 -0
  28. package/dist/feedback-factory/cutoverReadiness.js.map +1 -0
  29. package/dist/scaffold/templates.d.ts.map +1 -1
  30. package/dist/scaffold/templates.js +13 -1
  31. package/dist/scaffold/templates.js.map +1 -1
  32. package/dist/scheduler/MentorAutonomousGuardian.d.ts.map +1 -1
  33. package/dist/scheduler/MentorAutonomousGuardian.js +1 -0
  34. package/dist/scheduler/MentorAutonomousGuardian.js.map +1 -1
  35. package/dist/server/AgentServer.d.ts +6 -0
  36. package/dist/server/AgentServer.d.ts.map +1 -1
  37. package/dist/server/AgentServer.js +54 -6
  38. package/dist/server/AgentServer.js.map +1 -1
  39. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  40. package/dist/server/CapabilityIndex.js +28 -0
  41. package/dist/server/CapabilityIndex.js.map +1 -1
  42. package/dist/server/routes.d.ts +12 -0
  43. package/dist/server/routes.d.ts.map +1 -1
  44. package/dist/server/routes.js +255 -4
  45. package/dist/server/routes.js.map +1 -1
  46. package/package.json +1 -1
  47. package/src/data/builtin-manifest.json +64 -64
  48. package/src/scaffold/templates.ts +13 -1
  49. package/upgrades/1.3.271.md +154 -0
  50. package/upgrades/1.3.272.md +40 -0
  51. package/upgrades/autoloop-gate-compliance.eli16.md +11 -0
  52. package/upgrades/side-effects/autoloop-gate-compliance.md +43 -0
  53. package/upgrades/side-effects/cutover-readiness.md +63 -0
  54. package/upgrades/side-effects/dashboard-pool-sessions.md +103 -0
  55. package/upgrades/side-effects/review-exchange-protocol.md +60 -0
  56. package/upgrades/side-effects/secret-drop-store-first.md +117 -0
  57. 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).