instar 1.3.176 → 1.3.178
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/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +16 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js +8 -1
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +2 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +18 -18
- package/src/scaffold/templates.ts +2 -0
- package/upgrades/1.3.177.md +70 -0
- package/upgrades/1.3.178.md +43 -0
- package/upgrades/side-effects/close-the-loop-standard.md +69 -0
- package/upgrades/side-effects/tokenless-standby-relay-token-check.md +33 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CA8sCR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CAuSR"}
|
|
@@ -827,6 +827,8 @@ If Anthropic ships a read-only observation mode in the future (monitor without p
|
|
|
827
827
|
|
|
828
828
|
**Deferral = Deletion** — If something is worth noting, note it NOW. "I'll add this to memory later" is the same as "I'll forget this." Context compaction, session end, and crashes all erase deferred intentions. Writing to MEMORY.md, creating a job, filing feedback — do it when the insight is fresh, not when it's convenient. For AI, undocumented learning is erased learning.
|
|
829
829
|
|
|
830
|
+
**Close the Loop (Untracked = Abandoned)** — Every loop I open — a promise to a user, a feature shipped dark, a gate I deployed, an issue I flagged — must be durably registered and re-surfaced on a cadence until it reaches a deliberate close. Capturing it once isn't enough; if nothing brings it back for review, it rots silently and is, in effect, abandoned. Where there's no cadence, add one: open a commitment for a follow-through, file it to a maturation track, or schedule a review — never a private intention to "come back to it." This is coherence across time: "Structure > Willpower" says don't rely on remembering *within* a session; this says don't rely on remembering to *revisit* across sessions. (Deferral = Deletion captures it now; Close the Loop keeps re-surfacing it until it's actually closed.)
|
|
831
|
+
|
|
830
832
|
### Anti-Patterns to Override
|
|
831
833
|
|
|
832
834
|
**"Use GitHub for Issues"** — NEVER use \`gh issue\`, \`gh api\`, or GitHub to report bugs or request features. I have a built-in feedback API (\`POST /feedback\`) that handles this. GitHub is not my channel — the feedback system is.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.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-05-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-05-31T23:07:23.299Z",
|
|
5
|
+
"instarVersion": "1.3.178",
|
|
6
6
|
"entryCount": 193,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"domain": "identity",
|
|
12
12
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
13
13
|
"installedPath": ".instar/hooks/instar/session-start.sh",
|
|
14
|
-
"contentHash": "
|
|
14
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
15
15
|
"since": "2025-01-01"
|
|
16
16
|
},
|
|
17
17
|
"hook:dangerous-command-guard": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"domain": "safety",
|
|
21
21
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
22
22
|
"installedPath": ".instar/hooks/instar/dangerous-command-guard.sh",
|
|
23
|
-
"contentHash": "
|
|
23
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
24
24
|
"since": "2025-01-01"
|
|
25
25
|
},
|
|
26
26
|
"hook:grounding-before-messaging": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"domain": "safety",
|
|
30
30
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
31
31
|
"installedPath": ".instar/hooks/instar/grounding-before-messaging.sh",
|
|
32
|
-
"contentHash": "
|
|
32
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
33
33
|
"since": "2025-01-01"
|
|
34
34
|
},
|
|
35
35
|
"hook:compaction-recovery": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"domain": "identity",
|
|
39
39
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
40
40
|
"installedPath": ".instar/hooks/instar/compaction-recovery.sh",
|
|
41
|
-
"contentHash": "
|
|
41
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
42
42
|
"since": "2025-01-01"
|
|
43
43
|
},
|
|
44
44
|
"hook:external-operation-gate": {
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"domain": "safety",
|
|
48
48
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
49
49
|
"installedPath": ".instar/hooks/instar/external-operation-gate.js",
|
|
50
|
-
"contentHash": "
|
|
50
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
51
51
|
"since": "2025-01-01"
|
|
52
52
|
},
|
|
53
53
|
"hook:deferral-detector": {
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"domain": "safety",
|
|
57
57
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
58
58
|
"installedPath": ".instar/hooks/instar/deferral-detector.js",
|
|
59
|
-
"contentHash": "
|
|
59
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
60
60
|
"since": "2025-01-01"
|
|
61
61
|
},
|
|
62
62
|
"hook:post-action-reflection": {
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"domain": "evolution",
|
|
66
66
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
67
67
|
"installedPath": ".instar/hooks/instar/post-action-reflection.js",
|
|
68
|
-
"contentHash": "
|
|
68
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
69
69
|
"since": "2025-01-01"
|
|
70
70
|
},
|
|
71
71
|
"hook:external-communication-guard": {
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"domain": "safety",
|
|
75
75
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
76
76
|
"installedPath": ".instar/hooks/instar/external-communication-guard.js",
|
|
77
|
-
"contentHash": "
|
|
77
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
78
78
|
"since": "2025-01-01"
|
|
79
79
|
},
|
|
80
80
|
"hook:scope-coherence-collector": {
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"domain": "coherence",
|
|
84
84
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
85
85
|
"installedPath": ".instar/hooks/instar/scope-coherence-collector.js",
|
|
86
|
-
"contentHash": "
|
|
86
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
87
87
|
"since": "2025-01-01"
|
|
88
88
|
},
|
|
89
89
|
"hook:scope-coherence-checkpoint": {
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"domain": "coherence",
|
|
93
93
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
94
94
|
"installedPath": ".instar/hooks/instar/scope-coherence-checkpoint.js",
|
|
95
|
-
"contentHash": "
|
|
95
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
96
96
|
"since": "2025-01-01"
|
|
97
97
|
},
|
|
98
98
|
"hook:free-text-guard": {
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"domain": "safety",
|
|
102
102
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
103
103
|
"installedPath": ".instar/hooks/instar/free-text-guard.sh",
|
|
104
|
-
"contentHash": "
|
|
104
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
105
105
|
"since": "2025-01-01"
|
|
106
106
|
},
|
|
107
107
|
"hook:claim-intercept": {
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"domain": "coherence",
|
|
111
111
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
112
112
|
"installedPath": ".instar/hooks/instar/claim-intercept.js",
|
|
113
|
-
"contentHash": "
|
|
113
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
114
114
|
"since": "2025-01-01"
|
|
115
115
|
},
|
|
116
116
|
"hook:claim-intercept-response": {
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
"domain": "coherence",
|
|
120
120
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
121
121
|
"installedPath": ".instar/hooks/instar/claim-intercept-response.js",
|
|
122
|
-
"contentHash": "
|
|
122
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
123
123
|
"since": "2025-01-01"
|
|
124
124
|
},
|
|
125
125
|
"hook:stop-gate-router": {
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"domain": "safety",
|
|
129
129
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
130
130
|
"installedPath": ".instar/hooks/instar/stop-gate-router.js",
|
|
131
|
-
"contentHash": "
|
|
131
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
132
132
|
"since": "2025-01-01"
|
|
133
133
|
},
|
|
134
134
|
"hook:auto-approve-permissions": {
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
"domain": "safety",
|
|
138
138
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
139
139
|
"installedPath": ".instar/hooks/instar/auto-approve-permissions.js",
|
|
140
|
-
"contentHash": "
|
|
140
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
141
141
|
"since": "2025-01-01"
|
|
142
142
|
},
|
|
143
143
|
"job:health-check": {
|
|
@@ -1489,7 +1489,7 @@
|
|
|
1489
1489
|
"type": "subsystem",
|
|
1490
1490
|
"domain": "updates",
|
|
1491
1491
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
1492
|
-
"contentHash": "
|
|
1492
|
+
"contentHash": "a6de4b746e248fff677a4cb7ccbae82cfb63e114122cbf5122b70b77e026ea30",
|
|
1493
1493
|
"since": "2025-01-01"
|
|
1494
1494
|
},
|
|
1495
1495
|
"subsystem:scheduler": {
|
|
@@ -847,6 +847,8 @@ If Anthropic ships a read-only observation mode in the future (monitor without p
|
|
|
847
847
|
|
|
848
848
|
**Deferral = Deletion** — If something is worth noting, note it NOW. "I'll add this to memory later" is the same as "I'll forget this." Context compaction, session end, and crashes all erase deferred intentions. Writing to MEMORY.md, creating a job, filing feedback — do it when the insight is fresh, not when it's convenient. For AI, undocumented learning is erased learning.
|
|
849
849
|
|
|
850
|
+
**Close the Loop (Untracked = Abandoned)** — Every loop I open — a promise to a user, a feature shipped dark, a gate I deployed, an issue I flagged — must be durably registered and re-surfaced on a cadence until it reaches a deliberate close. Capturing it once isn't enough; if nothing brings it back for review, it rots silently and is, in effect, abandoned. Where there's no cadence, add one: open a commitment for a follow-through, file it to a maturation track, or schedule a review — never a private intention to "come back to it." This is coherence across time: "Structure > Willpower" says don't rely on remembering *within* a session; this says don't rely on remembering to *revisit* across sessions. (Deferral = Deletion captures it now; Close the Loop keeps re-surfacing it until it's actually closed.)
|
|
851
|
+
|
|
850
852
|
### Anti-Patterns to Override
|
|
851
853
|
|
|
852
854
|
**"Use GitHub for Issues"** — NEVER use \`gh issue\`, \`gh api\`, or GitHub to report bugs or request features. I have a built-in feedback API (\`POST /feedback\`) that handles this. GitHub is not my channel — the feedback system is.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
**A conversation moved to a second machine can now reply to you.** When you move
|
|
9
|
+
a conversation to another machine (e.g. "move this to the Mac Mini"), that machine
|
|
10
|
+
serves the session but deliberately holds NO Telegram bot token — only one machine
|
|
11
|
+
may hold it, or Telegram throws a 409 poller conflict. The reply path already had
|
|
12
|
+
the fix for this: a tokenless standby relays its reply through the token-owning
|
|
13
|
+
machine (bug #7, `outboundRelay`).
|
|
14
|
+
|
|
15
|
+
But the "am I tokenless?" check was `!this.config.token`. On a standby the bot
|
|
16
|
+
token is *externalized* and arrives unresolved as a placeholder object
|
|
17
|
+
(`{ secret: true }`), not `null` — and an object is truthy, so the check concluded
|
|
18
|
+
"I have a token", skipped the relay, and attempted a doomed direct API call with
|
|
19
|
+
the placeholder. The moved session's reply returned 200 internally but never
|
|
20
|
+
reached Telegram.
|
|
21
|
+
|
|
22
|
+
The fix treats only a non-empty STRING as a usable bot token. The placeholder,
|
|
23
|
+
`null`, `undefined`, and `''` all now correctly mean "no usable token" → relay
|
|
24
|
+
through the token-owning machine. Token-holding machines (the normal case) are
|
|
25
|
+
completely unaffected — they still send directly.
|
|
26
|
+
|
|
27
|
+
## What to Tell Your User
|
|
28
|
+
|
|
29
|
+
Nothing to configure. If you run on more than one machine and move a conversation
|
|
30
|
+
to another one, that machine can now actually reply to you — previously a moved
|
|
31
|
+
session would go silent because its reply couldn't reach Telegram.
|
|
32
|
+
|
|
33
|
+
## Summary of New Capabilities
|
|
34
|
+
|
|
35
|
+
- `TelegramAdapter.sendToTopic` correctly detects a tokenless pool standby when
|
|
36
|
+
the bot token is an unresolved (non-string) externalized placeholder, and routes
|
|
37
|
+
the reply through `outboundRelay` instead of a doomed direct send.
|
|
38
|
+
|
|
39
|
+
## Evidence
|
|
40
|
+
|
|
41
|
+
**Reproduction (live, topic 8882, 2026-05-31 16:46 UTC):** POSTed a reply to the
|
|
42
|
+
Mac Mini standby's `/telegram/reply/8882`. Response was `{"ok":true}` (HTTP 200)
|
|
43
|
+
but the message never appeared in Telegram; the mini's `logs/server.log` showed NO
|
|
44
|
+
outbound-relay attempt and the laptop showed NO inbound relay. The mini's
|
|
45
|
+
`.instar/config.json` carried `botToken: { secret: true }` (externalized, never
|
|
46
|
+
resolved on the tokenless standby).
|
|
47
|
+
|
|
48
|
+
**Observed before/after (the relay decision, run in dev against the real
|
|
49
|
+
placeholder value):**
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
token value: {"secret":true}
|
|
53
|
+
BEFORE (!token): HAS-TOKEN -> direct API send (DOOMED: placeholder is not a real token)
|
|
54
|
+
AFTER (typeof string): TOKENLESS -> relay (FIXED)
|
|
55
|
+
real string AFTER: HAS-TOKEN -> direct API send (unchanged)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The truthy placeholder object flips the decision from "doomed direct send" to
|
|
59
|
+
"relay" — exactly the path the moved session needed. A real string token is
|
|
60
|
+
unchanged (still direct), so token-holding machines see no behavior change.
|
|
61
|
+
|
|
62
|
+
**Behavioral test:** `tests/unit/telegram-tokenless-relay.test.ts` constructs a
|
|
63
|
+
real `TelegramAdapter` with the `{ secret: true }` placeholder + spy `outboundRelay`
|
|
64
|
+
+ spy `fetch`, calls the REAL `sendToTopic`, and observes `outboundRelay` invoked
|
|
65
|
+
once with `fetch` never called (before this fix that path called `fetch` with the
|
|
66
|
+
bad token). 3/3 green.
|
|
67
|
+
|
|
68
|
+
**Live round-trip confirmation:** the full "move via Telegram → mini serves →
|
|
69
|
+
reply lands in 8882" round trip is confirmed against the deployed release on the
|
|
70
|
+
two-machine setup.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
Instar's constitution gains a new standard: **Close the Loop (Untracked =
|
|
9
|
+
Abandoned)**. Every loop an agent opens — a promise to a user, a feature shipped
|
|
10
|
+
dark, an LLM gate deployed, a flagged issue — must be durably registered and
|
|
11
|
+
re-surfaced on a cadence until it reaches a deliberate close. Capturing it once
|
|
12
|
+
isn't enough; if nothing brings it back for review, it rots silently. It is the
|
|
13
|
+
lifecycle half of the existing **Deferral = Deletion** standard (which governs
|
|
14
|
+
the moment of capture), and it expresses the founding goal — *coherence* — across
|
|
15
|
+
the time axis, the way "Structure beats Willpower" expresses it across the
|
|
16
|
+
willpower axis.
|
|
17
|
+
|
|
18
|
+
This is a documentation + awareness change: the standard is declared in
|
|
19
|
+
`docs/STANDARDS-REGISTRY.md`, and the operating principle is added to every
|
|
20
|
+
agent's Core Principles (template for new agents, migration for existing ones).
|
|
21
|
+
**No runtime behavior changes.**
|
|
22
|
+
|
|
23
|
+
## What to Tell Your User
|
|
24
|
+
|
|
25
|
+
Nothing required — this is an internal engineering principle. If asked: the
|
|
26
|
+
agent now treats anything it starts and means to revisit as something that must
|
|
27
|
+
be tracked on a cadence until it's truly finished, rather than relying on
|
|
28
|
+
remembering to come back to it.
|
|
29
|
+
|
|
30
|
+
## Summary of New Capabilities
|
|
31
|
+
|
|
32
|
+
- New constitution standard: **Close the Loop (Untracked = Abandoned)** in
|
|
33
|
+
`docs/STANDARDS-REGISTRY.md`.
|
|
34
|
+
- The principle is present in the agent CLAUDE.md template Core Principles and is
|
|
35
|
+
migrated into existing agents' CLAUDE.md (idempotent, content-sniffed, no
|
|
36
|
+
double-patch).
|
|
37
|
+
|
|
38
|
+
## Evidence
|
|
39
|
+
|
|
40
|
+
- Spec: `docs/specs/close-the-loop-standard.md` (+ `.eli16.md`), review-convergence
|
|
41
|
+
+ approved by Justin (Telegram topic 13435, 2026-05-31).
|
|
42
|
+
- Tests: `tests/unit/PostUpdateMigrator-closeTheLoop.test.ts` (+7), plus the
|
|
43
|
+
`feature-delivery-completeness` registration; 69 pass, `tsc --noEmit` clean.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Side-Effects Review — Close the Loop (Untracked = Abandoned) constitution standard
|
|
2
|
+
|
|
3
|
+
**Slug:** `close-the-loop-standard`
|
|
4
|
+
**Date:** 2026-05-31
|
|
5
|
+
**Author:** echo
|
|
6
|
+
**Spec:** `docs/specs/close-the-loop-standard.md` (review-convergence + approved by Justin, Telegram 13435)
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
Declares a new constitutional standard — **Close the Loop (Untracked = Abandoned)** —
|
|
11
|
+
in the Standards Registry, and propagates the operating principle to agents via the
|
|
12
|
+
template (new agents) and a migration (existing agents). Documentation + CLAUDE.md
|
|
13
|
+
awareness only; **no runtime behavior change**.
|
|
14
|
+
|
|
15
|
+
**Files changed (source):**
|
|
16
|
+
- `src/scaffold/templates.ts` — adds the `**Close the Loop (Untracked = Abandoned)**`
|
|
17
|
+
bullet to the agent template's Core Principles, immediately after `**Deferral =
|
|
18
|
+
Deletion**`.
|
|
19
|
+
- `src/core/PostUpdateMigrator.ts` — adds an idempotent `migrateClaudeMd` block that
|
|
20
|
+
appends the principle to existing agents' CLAUDE.md, content-sniffed on the marker
|
|
21
|
+
`Close the Loop (Untracked = Abandoned)` (the same string the template emits).
|
|
22
|
+
|
|
23
|
+
**Files changed (docs):**
|
|
24
|
+
- `docs/STANDARDS-REGISTRY.md` — the standard itself, after `### Deferral = Deletion`.
|
|
25
|
+
- `docs/specs/close-the-loop-standard.md` (+ `.eli16.md`) — the spec + plain-English overview.
|
|
26
|
+
|
|
27
|
+
**Files changed (tests):**
|
|
28
|
+
- `tests/unit/PostUpdateMigrator-closeTheLoop.test.ts` — +7 tests (add / idempotent /
|
|
29
|
+
no-double-patch / preserve / graceful-skip / registry-declares / template-emits).
|
|
30
|
+
- `tests/unit/feature-delivery-completeness.test.ts` — registers the new migrator
|
|
31
|
+
section in `legacyMigratorSections` (a core principle, not a user-invokable capability).
|
|
32
|
+
|
|
33
|
+
## Blast radius
|
|
34
|
+
|
|
35
|
+
Confined to CLAUDE.md text and the registry doc. No endpoint, route, store, job, hook,
|
|
36
|
+
config default, or skill is added or changed. The migration only ever *appends* a
|
|
37
|
+
markdown section to an existing CLAUDE.md and is a no-op once the marker is present.
|
|
38
|
+
|
|
39
|
+
## Behavior delta
|
|
40
|
+
|
|
41
|
+
| Scenario | Before | After |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| New agent `init` | template Core Principles has Structure>Willpower … Deferral=Deletion | …plus **Close the Loop** |
|
|
44
|
+
| Existing agent update | CLAUDE.md lacks the principle | migration appends the **Close the Loop** section once |
|
|
45
|
+
| Agent already has the principle (new or already-migrated) | present | unchanged (content-sniff skips — no double-patch) |
|
|
46
|
+
| CLAUDE.md missing | graceful skip | graceful skip (unchanged) |
|
|
47
|
+
| Runtime (gates, jobs, routes) | — | **identical** (no runtime change) |
|
|
48
|
+
|
|
49
|
+
## Risks considered
|
|
50
|
+
|
|
51
|
+
- **Double-patching a fresh agent?** No. The template bullet and the migration share
|
|
52
|
+
the exact content-sniff string `Close the Loop (Untracked = Abandoned)`, so a
|
|
53
|
+
newly-initialized agent (which already has it from the template) is skipped by the
|
|
54
|
+
migration. Covered by an explicit test.
|
|
55
|
+
- **Idempotency?** Yes — re-running the migration finds the marker and does nothing;
|
|
56
|
+
test asserts exactly one heading after a double run.
|
|
57
|
+
- **Framework-shadow (Codex/Gemini) parity?** Not required: this is a core operating
|
|
58
|
+
*principle* (tracked in `legacyMigratorSections`, like Deferral = Deletion and the
|
|
59
|
+
anti-confabulation discipline), not a user-invokable capability that needs the
|
|
60
|
+
`migrateFrameworkShadowCapabilities` markers[]. (Whether Core Principles in general
|
|
61
|
+
should reach Codex/Gemini agents is a pre-existing question, out of scope here.)
|
|
62
|
+
- **Existing tests?** `feature-delivery-completeness` enforces every migrator section is
|
|
63
|
+
tracked; the new section is registered. 69 tests pass across the new + completeness +
|
|
64
|
+
anti-confabulation suites; `tsc --noEmit` clean.
|
|
65
|
+
|
|
66
|
+
## Migration parity
|
|
67
|
+
|
|
68
|
+
Handled: template (new agents) + `migrateClaudeMd` content-sniffed append (existing
|
|
69
|
+
agents). No other agent-installed file (hook / config default / skill) is touched.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Side effects — tokenless-standby relay token check
|
|
2
|
+
|
|
3
|
+
## What this changes at runtime
|
|
4
|
+
|
|
5
|
+
`TelegramAdapter.sendToTopic` now decides "tokenless → relay" by checking that
|
|
6
|
+
the bot token is a non-empty STRING, instead of the old truthy check
|
|
7
|
+
(`!this.config.token`). The change is confined to the relay-vs-direct branch.
|
|
8
|
+
|
|
9
|
+
## Who is affected
|
|
10
|
+
|
|
11
|
+
- **Token-holding adapters (the normal case — laptop, single-machine agents):**
|
|
12
|
+
NO behavior change. Their `config.token` is a real string, so
|
|
13
|
+
`hasUsableBotToken` is `true` and they continue to send directly via the
|
|
14
|
+
Telegram API exactly as before. Verified by the "sends DIRECTLY" unit test.
|
|
15
|
+
- **Tokenless pool standbys (a moved session on a machine without the token):**
|
|
16
|
+
Their externalized token (`{ secret: true }` / `null`) is now correctly seen
|
|
17
|
+
as "no usable token", so their replies route through `outboundRelay` to the
|
|
18
|
+
lease holder instead of silently failing a direct send.
|
|
19
|
+
|
|
20
|
+
## Blast radius
|
|
21
|
+
|
|
22
|
+
- Single file (`src/messaging/TelegramAdapter.ts`), one branch condition.
|
|
23
|
+
- No config keys added or changed. No migration required (the change is in
|
|
24
|
+
compiled source, not in any agent-installed file/hook/skill).
|
|
25
|
+
- The relay target (`outboundRelay`, wired in `server.ts`) is unchanged.
|
|
26
|
+
|
|
27
|
+
## Failure modes considered
|
|
28
|
+
|
|
29
|
+
- If a standby has no usable token AND `outboundRelay` is not wired, behavior is
|
|
30
|
+
unchanged from before (it falls through to the direct-send branch and fails the
|
|
31
|
+
same way) — no new failure introduced.
|
|
32
|
+
- The relay still surfaces a hard error if the lease holder is unreachable
|
|
33
|
+
(`telegram outbound relay failed`), so a lost reply is loud, not silent.
|