instar 1.3.204 → 1.3.206
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/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +2 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +104 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/installCodexHooks.js +1 -1
- package/dist/core/installCodexHooks.js.map +1 -1
- package/dist/core/instarSettingsHooks.d.ts.map +1 -1
- package/dist/core/instarSettingsHooks.js +5 -0
- package/dist/core/instarSettingsHooks.js.map +1 -1
- package/package.json +1 -1
- package/scripts/generate-builtin-manifest.cjs +1 -0
- package/src/data/builtin-manifest.json +28 -19
- package/upgrades/1.3.205.md +53 -0
- package/upgrades/1.3.206.md +46 -0
- package/upgrades/side-effects/gemini-scaffold-leak-fix.md +114 -0
- package/upgrades/side-effects/self-stop-guard.md +83 -0
|
@@ -77,7 +77,7 @@ export function buildInstarCodexHookGroups(projectDir) {
|
|
|
77
77
|
// tool_input.cmd (Claude uses tool_input.command); the scripts accept both field
|
|
78
78
|
// names AND both tool names (Bash | exec_command).
|
|
79
79
|
PreToolUse: [
|
|
80
|
-
{ matcher: '.*', hooks: [sh('dangerous-command-guard.sh'), node('external-operation-gate.js'), sh('grounding-before-messaging.sh'), node('deferral-detector.js')] },
|
|
80
|
+
{ matcher: '.*', hooks: [sh('dangerous-command-guard.sh'), node('external-operation-gate.js'), sh('grounding-before-messaging.sh'), node('deferral-detector.js'), node('self-stop-guard.js')] },
|
|
81
81
|
],
|
|
82
82
|
// Codex-only checkpoint. Routes to the same gate; the trust system
|
|
83
83
|
// auto-decides (allow/deny) with NO human prompt so autonomy is preserved.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installCodexHooks.js","sourceRoot":"","sources":["../../src/core/installCodexHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,oFAAoF;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AAC/D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,yDAAyD,CAAC;AAgBtG,2FAA2F;AAC3F,MAAM,UAAU,0BAA0B,CACxC,UAAkB;IAElB,MAAM,IAAI,GAAG,CAAC,MAAc,EAAoB,EAAE,CAAC,CAAC;QAClD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE;QACzE,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,CAAC,MAAc,EAAoB,EAAE,CAAC,CAAC;QAChD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE;QACzE,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IACH,uFAAuF;IACvF,uFAAuF;IACvF,4EAA4E;IAC5E,iFAAiF;IACjF,MAAM,kBAAkB,GAAG,GAAqB,EAAE,CAAC,CAAC;QAClD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,4BAA4B,CAAC,UAAU;QAC9E,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,OAAO;QACL,8EAA8E;QAC9E,0EAA0E;QAC1E,wEAAwE;QACxE,gFAAgF;QAChF,gFAAgF;QAChF,6EAA6E;QAC7E,oFAAoF;QACpF,4EAA4E;QAC5E,gFAAgF;QAChF,mFAAmF;QACnF,uEAAuE;QACvE,iFAAiF;QACjF,mDAAmD;QACnD,UAAU,EAAE;YACV,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,4BAA4B,CAAC,EAAE,IAAI,CAAC,4BAA4B,CAAC,EAAE,EAAE,CAAC,+BAA+B,CAAC,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"installCodexHooks.js","sourceRoot":"","sources":["../../src/core/installCodexHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instarSettingsHooks.d.ts","sourceRoot":"","sources":["../../src/core/instarSettingsHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAE,aAAa,CAAC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"instarSettingsHooks.d.ts","sourceRoot":"","sources":["../../src/core/instarSettingsHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAE,aAAa,CAAC,uBAAuB,CA+B/E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,aAAa,CAAC,uBAAuB,CAO9E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,aAAa,CAAC,MAAM,CACW,CAAC;AAE/E;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1F;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAmB5F"}
|
|
@@ -50,6 +50,11 @@ export const INSTAR_BASH_PRETOOLUSE_HOOKS = [
|
|
|
50
50
|
command: `node ${PD}/.instar/hooks/instar/deferral-detector.js`,
|
|
51
51
|
timeout: 5000,
|
|
52
52
|
},
|
|
53
|
+
{
|
|
54
|
+
type: 'command',
|
|
55
|
+
command: `node ${PD}/.instar/hooks/instar/self-stop-guard.js`,
|
|
56
|
+
timeout: 5000,
|
|
57
|
+
},
|
|
53
58
|
{
|
|
54
59
|
type: 'command',
|
|
55
60
|
command: `node ${PD}/.instar/hooks/instar/external-communication-guard.js`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instarSettingsHooks.js","sourceRoot":"","sources":["../../src/core/instarSettingsHooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AASH,MAAM,EAAE,GAAG,uBAAuB,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAA2C;IAClF;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ,EAAE,gEAAgE;QACnF,QAAQ,EAAE,IAAI;KACf;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ,EAAE,mEAAmE;QACtF,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ,EAAE,4CAA4C;QAC/D,OAAO,EAAE,IAAI;KACd;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ,EAAE,uDAAuD;QAC1E,OAAO,EAAE,IAAI;KACd;IACD;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ,EAAE,iDAAiD;QACpE,OAAO,EAAE,IAAI;KACd;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAA2C;IACjF;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,QAAQ,EAAE,kDAAkD;QACrE,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;KACd;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAC3C,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAE/E;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;IACnF,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzB,CAAC;AAQD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,+BAA+B,CAAC,UAAkC;IAChF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC3C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;IAE3C,KAAK,MAAM,SAAS,IAAI,4BAA4B,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACxG,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"instarSettingsHooks.js","sourceRoot":"","sources":["../../src/core/instarSettingsHooks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -56,6 +56,7 @@ function scanHooks() {
|
|
|
56
56
|
{ file: 'compaction-recovery.sh', domain: 'identity' },
|
|
57
57
|
{ file: 'external-operation-gate.js', domain: 'safety' },
|
|
58
58
|
{ file: 'deferral-detector.js', domain: 'safety' },
|
|
59
|
+
{ file: 'self-stop-guard.js', domain: 'coherence' },
|
|
59
60
|
{ file: 'post-action-reflection.js', domain: 'evolution' },
|
|
60
61
|
{ file: 'external-communication-guard.js', domain: 'safety' },
|
|
61
62
|
{ file: 'scope-coherence-collector.js', domain: 'coherence' },
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-06-
|
|
5
|
-
"instarVersion": "1.3.
|
|
6
|
-
"entryCount":
|
|
4
|
+
"generatedAt": "2026-06-02T20:50:08.043Z",
|
|
5
|
+
"instarVersion": "1.3.206",
|
|
6
|
+
"entryCount": 195,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
9
9
|
"id": "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": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
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": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
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": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
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": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
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": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
51
51
|
"since": "2025-01-01"
|
|
52
52
|
},
|
|
53
53
|
"hook:deferral-detector": {
|
|
@@ -56,7 +56,16 @@
|
|
|
56
56
|
"domain": "safety",
|
|
57
57
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
58
58
|
"installedPath": ".instar/hooks/instar/deferral-detector.js",
|
|
59
|
-
"contentHash": "
|
|
59
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
60
|
+
"since": "2025-01-01"
|
|
61
|
+
},
|
|
62
|
+
"hook:self-stop-guard": {
|
|
63
|
+
"id": "hook:self-stop-guard",
|
|
64
|
+
"type": "hook",
|
|
65
|
+
"domain": "coherence",
|
|
66
|
+
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
67
|
+
"installedPath": ".instar/hooks/instar/self-stop-guard.js",
|
|
68
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
60
69
|
"since": "2025-01-01"
|
|
61
70
|
},
|
|
62
71
|
"hook:post-action-reflection": {
|
|
@@ -65,7 +74,7 @@
|
|
|
65
74
|
"domain": "evolution",
|
|
66
75
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
67
76
|
"installedPath": ".instar/hooks/instar/post-action-reflection.js",
|
|
68
|
-
"contentHash": "
|
|
77
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
69
78
|
"since": "2025-01-01"
|
|
70
79
|
},
|
|
71
80
|
"hook:external-communication-guard": {
|
|
@@ -74,7 +83,7 @@
|
|
|
74
83
|
"domain": "safety",
|
|
75
84
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
76
85
|
"installedPath": ".instar/hooks/instar/external-communication-guard.js",
|
|
77
|
-
"contentHash": "
|
|
86
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
78
87
|
"since": "2025-01-01"
|
|
79
88
|
},
|
|
80
89
|
"hook:scope-coherence-collector": {
|
|
@@ -83,7 +92,7 @@
|
|
|
83
92
|
"domain": "coherence",
|
|
84
93
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
85
94
|
"installedPath": ".instar/hooks/instar/scope-coherence-collector.js",
|
|
86
|
-
"contentHash": "
|
|
95
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
87
96
|
"since": "2025-01-01"
|
|
88
97
|
},
|
|
89
98
|
"hook:scope-coherence-checkpoint": {
|
|
@@ -92,7 +101,7 @@
|
|
|
92
101
|
"domain": "coherence",
|
|
93
102
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
94
103
|
"installedPath": ".instar/hooks/instar/scope-coherence-checkpoint.js",
|
|
95
|
-
"contentHash": "
|
|
104
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
96
105
|
"since": "2025-01-01"
|
|
97
106
|
},
|
|
98
107
|
"hook:free-text-guard": {
|
|
@@ -101,7 +110,7 @@
|
|
|
101
110
|
"domain": "safety",
|
|
102
111
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
103
112
|
"installedPath": ".instar/hooks/instar/free-text-guard.sh",
|
|
104
|
-
"contentHash": "
|
|
113
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
105
114
|
"since": "2025-01-01"
|
|
106
115
|
},
|
|
107
116
|
"hook:claim-intercept": {
|
|
@@ -110,7 +119,7 @@
|
|
|
110
119
|
"domain": "coherence",
|
|
111
120
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
112
121
|
"installedPath": ".instar/hooks/instar/claim-intercept.js",
|
|
113
|
-
"contentHash": "
|
|
122
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
114
123
|
"since": "2025-01-01"
|
|
115
124
|
},
|
|
116
125
|
"hook:claim-intercept-response": {
|
|
@@ -119,7 +128,7 @@
|
|
|
119
128
|
"domain": "coherence",
|
|
120
129
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
121
130
|
"installedPath": ".instar/hooks/instar/claim-intercept-response.js",
|
|
122
|
-
"contentHash": "
|
|
131
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
123
132
|
"since": "2025-01-01"
|
|
124
133
|
},
|
|
125
134
|
"hook:stop-gate-router": {
|
|
@@ -128,7 +137,7 @@
|
|
|
128
137
|
"domain": "safety",
|
|
129
138
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
130
139
|
"installedPath": ".instar/hooks/instar/stop-gate-router.js",
|
|
131
|
-
"contentHash": "
|
|
140
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
132
141
|
"since": "2025-01-01"
|
|
133
142
|
},
|
|
134
143
|
"hook:auto-approve-permissions": {
|
|
@@ -137,7 +146,7 @@
|
|
|
137
146
|
"domain": "safety",
|
|
138
147
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
139
148
|
"installedPath": ".instar/hooks/instar/auto-approve-permissions.js",
|
|
140
|
-
"contentHash": "
|
|
149
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
141
150
|
"since": "2025-01-01"
|
|
142
151
|
},
|
|
143
152
|
"job:health-check": {
|
|
@@ -1497,7 +1506,7 @@
|
|
|
1497
1506
|
"type": "subsystem",
|
|
1498
1507
|
"domain": "updates",
|
|
1499
1508
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
1500
|
-
"contentHash": "
|
|
1509
|
+
"contentHash": "90bfb6c540825ac2bf3393e22c4b7ae324159407acaac58b2c464762ef69901a",
|
|
1501
1510
|
"since": "2025-01-01"
|
|
1502
1511
|
},
|
|
1503
1512
|
"subsystem:scheduler": {
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
A new signal-only PreToolUse hook, `self-stop-guard.js`, joins the behavioral-guard
|
|
9
|
+
family (alongside `deferral-detector.js`). It scans **outbound user messages** for
|
|
10
|
+
context/length stop-excuses — "maxed out context", "session too long / long-running
|
|
11
|
+
session", "let's start a fresh session", "good stopping point", "close this out and
|
|
12
|
+
restart" — and, when matched, injects a self-reminder that those are never valid stop
|
|
13
|
+
reasons (compaction infrastructure handles context; the only legitimate stops are a
|
|
14
|
+
question only the user can answer, missing info, a genuine error, or real completion).
|
|
15
|
+
|
|
16
|
+
It is **signal-only**: it never blocks a message and is never destructive. An
|
|
17
|
+
allow-list suppresses it on genuine completion (the `ALL_TASKS_COMPLETE` promise,
|
|
18
|
+
"all tests passing", etc.) and when the user themselves asked to stop. It runs for
|
|
19
|
+
both Claude (`Bash`) and Codex (`exec_command`) agents and reaches existing agents on
|
|
20
|
+
their next update via `INSTAR_BASH_PRETOOLUSE_HOOKS` (init + migrate parity) — it is
|
|
21
|
+
also registered in the Codex PreToolUse chain and drift-verified in the builtin
|
|
22
|
+
manifest. This is the structural enforcement (Structure > Willpower) of the existing
|
|
23
|
+
"No context-death self-stops" principle already present in the CLAUDE.md template.
|
|
24
|
+
|
|
25
|
+
## What to Tell Your User
|
|
26
|
+
|
|
27
|
+
- **A guard against quitting early**: "I added a small safety check on myself — if I
|
|
28
|
+
ever start to tell you I'm stopping just because I've been running a while or my
|
|
29
|
+
memory is filling up, it now catches me and reminds me that's not a real reason to
|
|
30
|
+
quit. My memory gets refreshed automatically, so I can keep going as long as the
|
|
31
|
+
work needs. It only nudges me — it never blocks anything, and it stays quiet when a
|
|
32
|
+
job is genuinely finished or when you've asked me to stop."
|
|
33
|
+
|
|
34
|
+
## Summary of New Capabilities
|
|
35
|
+
|
|
36
|
+
| Capability | How to Use |
|
|
37
|
+
|-----------|-----------|
|
|
38
|
+
| Self-stop excuse guard | Automatic (PreToolUse hook on every agent, Claude + Codex) |
|
|
39
|
+
|
|
40
|
+
## Evidence
|
|
41
|
+
|
|
42
|
+
Not a code-bug fix — this adds a new preventive behavioral guard, so no
|
|
43
|
+
reproduction-of-a-broken-code-path applies. Origin and verification:
|
|
44
|
+
|
|
45
|
+
- **Origin (the behavior it guards):** on 2026-06-02 an agent ended a multi-hour
|
|
46
|
+
autonomous run early, telling the user "this session's almost done, let's start
|
|
47
|
+
fresh" while citing "maxed out context." The user flagged this as a recurring,
|
|
48
|
+
invalid excuse and asked for a structural check.
|
|
49
|
+
- **Verified behavior:** the shipped hook is spawned end-to-end by 16 unit tests that
|
|
50
|
+
feed it real outbound-message payloads. It emits the reminder for each excuse
|
|
51
|
+
phrasing (Claude `Bash` and Codex `exec_command`) and stays silent on the other
|
|
52
|
+
side of the boundary — normal messages, genuine completion, the completion promise,
|
|
53
|
+
user-requested stops, and non-communication shell commands.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
`refreshHooksAndSettings()` (and the sibling resolver in init) read the persisted
|
|
9
|
+
`enabledFrameworks` from config.json through a hardcoded filter
|
|
10
|
+
`f === 'claude-code' || f === 'codex-cli'` that silently DROPPED `gemini-cli`. For a
|
|
11
|
+
gemini-only agent (`enabledFrameworks: ['gemini-cli']`) the filtered list came back
|
|
12
|
+
empty, so the code fell through to its `['claude-code']` default, `claudeEnabled`
|
|
13
|
+
became true, and `installClaudeSettings()` wrote a full Claude `.claude/settings.json`
|
|
14
|
+
into an agent that does not run Claude Code. Both filter sites now validate through a
|
|
15
|
+
single canonical `isKnownFramework` guard (backed by a `KNOWN_FRAMEWORKS` list kept in
|
|
16
|
+
sync with `IntelligenceFramework`), so no installed framework is dropped and a new one
|
|
17
|
+
cannot silently regress this again. New gemini-only and codex-only installs no longer
|
|
18
|
+
get a stray Claude settings file; claude-code installs are unchanged.
|
|
19
|
+
|
|
20
|
+
## What to Tell Your User
|
|
21
|
+
|
|
22
|
+
- **Cleaner non-Claude installs**: "If you set me up as a Gemini-only or Codex-only
|
|
23
|
+
agent, I was accidentally dropping a Claude configuration file into your project even
|
|
24
|
+
though I don't use Claude there. That's fixed — a Gemini agent now stays a Gemini
|
|
25
|
+
agent, with no stray Claude settings."
|
|
26
|
+
|
|
27
|
+
## Summary of New Capabilities
|
|
28
|
+
|
|
29
|
+
| Capability | How to Use |
|
|
30
|
+
|-----------|-----------|
|
|
31
|
+
| Framework-correct scaffolding | Automatic (gemini/codex-only installs skip Claude settings) |
|
|
32
|
+
|
|
33
|
+
## Evidence
|
|
34
|
+
|
|
35
|
+
- **Live before:** the gemini agent installed during dogfooding
|
|
36
|
+
(`~/.instar/agents/gemini`, `enabledFrameworks: ['gemini-cli']`) contained a
|
|
37
|
+
7559-byte `.claude/settings.json` plus `.claude/skills`/`.claude/scripts` — Claude
|
|
38
|
+
hook config it can never use. Confirmed by direct inspection of the agent home.
|
|
39
|
+
- **After (code path):** a behavioral test drives `refreshHooksAndSettings()` against a
|
|
40
|
+
temp project with `enabledFrameworks: ['gemini-cli']` and asserts no
|
|
41
|
+
`.claude/settings.json` is written; `['codex-cli']` likewise; `['claude-code']` and
|
|
42
|
+
`['claude-code','gemini-cli']` still write it (no regression). A fresh gemini-only
|
|
43
|
+
install therefore no longer leaks the file.
|
|
44
|
+
- **Residue note:** agents installed BEFORE this fix keep their already-written stray
|
|
45
|
+
`.claude/settings.json` (the fix stops re-writing it but does not delete the residue);
|
|
46
|
+
cleaning that inert leftover is a separate follow-up.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Side-Effects Review — fix gemini/codex-only scaffold leak
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `gemini-scaffold-leak-fix`
|
|
4
|
+
**Date:** `2026-06-02`
|
|
5
|
+
**Author:** `echo`
|
|
6
|
+
**Second-pass reviewer:** `not required (Tier-1 surgical bug fix; the change is strictly more permissive)`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
`src/commands/init.ts`: replace two hardcoded `enabledFrameworks` filters
|
|
11
|
+
(`f === 'claude-code' || f === 'codex-cli'`) — which dropped `gemini-cli` and caused
|
|
12
|
+
gemini-only agents to fall through to the `['claude-code']` default and scaffold a
|
|
13
|
+
Claude `.claude/settings.json` — with a single canonical `isKnownFramework` guard
|
|
14
|
+
(+ exported `KNOWN_FRAMEWORKS`, kept in sync with `IntelligenceFramework`). Adds a
|
|
15
|
+
unit test proving gemini/codex-only installs skip Claude settings while claude-code
|
|
16
|
+
installs are unchanged.
|
|
17
|
+
|
|
18
|
+
## Decision-point inventory
|
|
19
|
+
|
|
20
|
+
- `refreshHooksAndSettings: claudeEnabled?` (init.ts:~3524) — **modify** — the input
|
|
21
|
+
(`enabledFrameworks` parsed from config) is now framework-complete; the gate logic is
|
|
22
|
+
unchanged.
|
|
23
|
+
- `initStandalone framework resolution` (init.ts:~3707) — **modify** — same filter fix.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 1. Over-block
|
|
28
|
+
|
|
29
|
+
**What legitimate inputs does this change reject that it shouldn't?** None. The change
|
|
30
|
+
is strictly MORE permissive than before: the old filter kept `{claude-code, codex-cli}`;
|
|
31
|
+
the new guard keeps `{claude-code, codex-cli, gemini-cli}`. Nothing that previously
|
|
32
|
+
passed is now dropped. Garbage values (non-framework strings) are still dropped, as
|
|
33
|
+
before.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. Under-block
|
|
38
|
+
|
|
39
|
+
**What failure modes does this still miss?** A future framework added to
|
|
40
|
+
`IntelligenceFramework` must also be added to `KNOWN_FRAMEWORKS` (they are co-located
|
|
41
|
+
with a doc comment to make the coupling obvious). It does NOT retroactively clean the
|
|
42
|
+
stray `.claude/settings.json` already written into agents installed before the fix —
|
|
43
|
+
that inert residue is a separate follow-up (a destructive cleanup migration deserving
|
|
44
|
+
its own careful gating).
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 3. Level-of-abstraction fit
|
|
49
|
+
|
|
50
|
+
Correct layer — a data-validation guard at the config-read boundary, replacing an
|
|
51
|
+
inline literal with a named, type-safe, single-source-of-truth predicate. It does not
|
|
52
|
+
add a gate or authority; it fixes the INPUT to an existing gate (`claudeEnabled`).
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 4. Signal vs authority compliance
|
|
57
|
+
|
|
58
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
59
|
+
|
|
60
|
+
- [x] No — this change has no block/allow surface. It corrects which frameworks survive
|
|
61
|
+
a config-parse filter; the downstream `claudeEnabled` gate already existed.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 5. Interactions
|
|
66
|
+
|
|
67
|
+
- **Shadowing:** none — single in-function filter, no ordering with other checks.
|
|
68
|
+
- **Double-fire:** none.
|
|
69
|
+
- **Races:** none — pure synchronous config parse.
|
|
70
|
+
- **Feedback loops:** none.
|
|
71
|
+
|
|
72
|
+
The only behavioral change: for a gemini-only or codex-only config, `claudeEnabled` is
|
|
73
|
+
now correctly `false`, so `installClaudeSettings()` / `refreshClaudeMd()` are skipped.
|
|
74
|
+
For claude-code (alone or among multiple frameworks) behavior is identical.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 6. External surfaces
|
|
79
|
+
|
|
80
|
+
- Persistent state: a NEW gemini/codex-only install no longer creates a stray
|
|
81
|
+
`projectDir/.claude/settings.json`. Existing agents: on their next update,
|
|
82
|
+
`refreshHooksAndSettings` stops re-writing the file for non-claude configs (the
|
|
83
|
+
pre-existing file is left in place — inert, see §2).
|
|
84
|
+
- Other agents / external systems: none.
|
|
85
|
+
- Timing: none.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 7. Rollback cost
|
|
90
|
+
|
|
91
|
+
Pure code change — revert the two filter lines + the guard, ship a patch. No persistent
|
|
92
|
+
state created by this change to clean up (it REMOVES an unwanted write; it does not add
|
|
93
|
+
state). No user-visible regression during rollback.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Conclusion
|
|
98
|
+
|
|
99
|
+
The review produced no design changes. The fix is a minimal, strictly-more-permissive
|
|
100
|
+
correction of a framework-blind filter (the same drift class as the Step-2 resolver
|
|
101
|
+
bugs), with a behavioral test that proves both sides of the boundary. Clear to ship as
|
|
102
|
+
a Tier-1 bug fix. One honest residual logged: the inert leftover file on
|
|
103
|
+
already-installed agents is a separate, carefully-gated cleanup follow-up.
|
|
104
|
+
|
|
105
|
+
## Second-pass review (if required)
|
|
106
|
+
|
|
107
|
+
Not required (Tier-1, strictly-more-permissive). Discovered via live dogfooding (Codey's
|
|
108
|
+
gemini install) — the empirical "before" is itself an independent confirmation.
|
|
109
|
+
|
|
110
|
+
## Evidence pointers
|
|
111
|
+
|
|
112
|
+
- `tests/unit/gemini-scaffold-leak.test.ts` — 5 tests, both sides of the boundary.
|
|
113
|
+
- Live before: `~/.instar/agents/gemini/.claude/settings.json` (7559 bytes) on a
|
|
114
|
+
`['gemini-cli']` config.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Side-Effects Review — self-stop-guard hook
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `self-stop-guard`
|
|
4
|
+
**Date:** `2026-06-02`
|
|
5
|
+
**Author:** `echo`
|
|
6
|
+
**Second-pass reviewer:** `not required (Tier-1, signal-only additive hook; external cross-model capacity-blocked this session — codex absent, gemini 429)`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
Adds `self-stop-guard.js`, a signal-only PreToolUse hook (sibling of `deferral-detector.js`) that scans outbound user messages for context/length stop-excuses ("maxed out context", "session too long", "start a fresh session", "good stopping point") and, on a match, injects a self-reminder that those are never valid stop reasons. Files: new `.instar/hooks/instar/self-stop-guard.js` + its embedded twin `getSelfStopGuardHook()` in `src/core/PostUpdateMigrator.ts` (+ `getHookContent` case, `migrateHooks` write, `builtinHooks` layout array); registration in `src/core/instarSettingsHooks.ts` (`INSTAR_BASH_PRETOOLUSE_HOOKS` → both init and migrate), `src/commands/init.ts` (new-agent write), `src/core/installCodexHooks.ts` (Codex PreToolUse chain); manifest entry via `scripts/generate-builtin-manifest.cjs`.
|
|
11
|
+
|
|
12
|
+
## Decision-point inventory
|
|
13
|
+
|
|
14
|
+
- `self-stop-guard: is this outbound message a context/length stop-excuse?` — **add** — a regex detector that, on match, injects `additionalContext`. Produces a SIGNAL; holds NO block/allow authority.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. Over-block
|
|
19
|
+
|
|
20
|
+
**What legitimate inputs does this change reject that it shouldn't?** None — there is no block surface. The worst case is an over-FIRE (a harmless self-reminder injected when it shouldn't be). Concrete over-fire shapes: a message that legitimately contains a trigger phrase out of context — e.g. discussing this very feature ("I added a good-stopping-point detector"), or quoting the user. These inject a reminder into the agent's own turn; the message still sends unchanged and nothing is blocked. Mitigated by the completion/user-asked-to-stop allow-list, which suppresses the common legitimate cases.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. Under-block
|
|
25
|
+
|
|
26
|
+
**What failure modes does this still miss?** (a) It only scans outbound communication commands (telegram-reply / send-*); a stop-excuse expressed in internal reasoning but never sent is not seen. (b) It does not cover the autonomous-stop-hook / session-end layer — that is a separate level (the user asked for checks "on multiple levels"; this is the pre-send level). (c) Novel phrasings outside the pattern set slip through (e.g. a creative euphemism for "I'm out of context"). These are acceptable: the hook reduces, not eliminates, the anti-pattern, and is one layer of several.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 3. Level-of-abstraction fit
|
|
31
|
+
|
|
32
|
+
Correct layer. This is a low-level, cheap detector that produces a SIGNAL (an `additionalContext` injection into the agent's own context), exactly like its sibling `deferral-detector`. It does not attempt to be an authority — it never blocks. The "authority" that can actually hold/redirect a turn is the agent's own reasoning, which this feeds. It reuses the existing PreToolUse-Bash hook surface rather than inventing a new mechanism.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 4. Signal vs authority compliance
|
|
37
|
+
|
|
38
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
39
|
+
|
|
40
|
+
- [x] No — this change produces a signal consumed by an existing smart gate (the agent's own next-turn reasoning).
|
|
41
|
+
|
|
42
|
+
It writes `{ decision: 'approve', additionalContext: <reminder> }` — `approve` is unconditional; the hook can never block or delay a message. Brittle regex is acceptable precisely because it holds no authority: a false match costs one harmless reminder.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 5. Interactions
|
|
47
|
+
|
|
48
|
+
- **Shadowing:** runs in the PreToolUse Bash matcher chain after `deferral-detector` and before `external-communication-guard`. All non-`dangerous-command-guard` hooks in the chain emit `approve`+`additionalContext` (never block), so it cannot shadow or be shadowed — each contributes additive context.
|
|
49
|
+
- **Double-fire:** a message containing both a defer-pattern and a stop-excuse triggers both `deferral-detector` and this hook; both inject context. That is additive and non-conflicting, not a harmful double-fire.
|
|
50
|
+
- **Races:** none — the hook is a stateless, pure stdin→stdout process. It writes no files and shares no state (logging was deliberately omitted to keep it ESM-host-safe and side-effect-free).
|
|
51
|
+
- **Feedback loops:** none — it injects context into the agent; the agent's resulting message is not re-fed to the hook in a loop (the injected reminder text is not itself a stop-excuse).
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 6. External surfaces
|
|
56
|
+
|
|
57
|
+
- Other agents on the machine: unaffected (per-session PreToolUse hook).
|
|
58
|
+
- Install base: ships to ALL agents on next update via `INSTAR_BASH_PRETOOLUSE_HOOKS` (init + migrate parity) and the Codex chain — intended.
|
|
59
|
+
- External systems: none — the hook never makes network calls and never touches Telegram/Slack/GitHub.
|
|
60
|
+
- Persistent state: none — writes nothing to disk.
|
|
61
|
+
- Timing/runtime: a sub-second `node` process per outbound command (5s timeout, same as deferral-detector). Negligible.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 7. Rollback cost
|
|
66
|
+
|
|
67
|
+
Pure additive code change. Back-out = remove the `self-stop-guard.js` entry from `INSTAR_BASH_PRETOOLUSE_HOOKS` + the file writes + the manifest entry, ship as a patch. No persistent state, no data migration, no agent-state repair. Existing agents drop the hook on their next update (settings re-derive from the canonical list). No user-visible regression during the rollback window (the hook never blocked anything).
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Conclusion
|
|
72
|
+
|
|
73
|
+
The review produced no design changes — the hook was deliberately scoped signal-only and stateless from the start, mirroring the proven `deferral-detector` contract. The only residuals are harmless over-fires (mitigated by the allow-list) and the deliberate single-layer scope (pre-send only; the stop-hook layer is future work the user explicitly framed as "multiple levels"). Clear to ship as a Tier-1 additive guard.
|
|
74
|
+
|
|
75
|
+
## Second-pass review (if required)
|
|
76
|
+
|
|
77
|
+
Not required for a Tier-1 signal-only additive hook. External cross-model review was unavailable this session (codex CLI not installed; Gemini CLI returned 429 "exhausted capacity"). A cross-model pass by Codey (codex) is queued after his current keystone build.
|
|
78
|
+
|
|
79
|
+
## Evidence pointers
|
|
80
|
+
|
|
81
|
+
- 16 unit tests spawn the shipped hook end-to-end (`tests/unit/self-stop-guard.test.ts`) — both sides of the boundary, Claude `Bash` + Codex `exec_command`.
|
|
82
|
+
- Drift/parity green: `instar-settings-hooks`, `builtin-manifest`, `PostUpdateMigrator-pretooluse-parity`, `migration-parity-hooks`.
|
|
83
|
+
- Origin incident: 2026-06-02 early-close of a 12h autonomous run citing "maxed out context" (the behavior this guards).
|