instar 1.3.210 → 1.3.211
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/.claude/skills/autonomous/SKILL.md +11 -3
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +30 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +20 -20
- package/upgrades/1.3.211.md +63 -0
- package/upgrades/side-effects/autonomous-stop-hook-path-fix.md +156 -0
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-03T05:10:42.873Z",
|
|
5
|
+
"instarVersion": "1.3.211",
|
|
6
6
|
"entryCount": 195,
|
|
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": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
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": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
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": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
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": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
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": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
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": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
60
60
|
"since": "2025-01-01"
|
|
61
61
|
},
|
|
62
62
|
"hook:self-stop-guard": {
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"domain": "coherence",
|
|
66
66
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
67
67
|
"installedPath": ".instar/hooks/instar/self-stop-guard.js",
|
|
68
|
-
"contentHash": "
|
|
68
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
69
69
|
"since": "2025-01-01"
|
|
70
70
|
},
|
|
71
71
|
"hook:post-action-reflection": {
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"domain": "evolution",
|
|
75
75
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
76
76
|
"installedPath": ".instar/hooks/instar/post-action-reflection.js",
|
|
77
|
-
"contentHash": "
|
|
77
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
78
78
|
"since": "2025-01-01"
|
|
79
79
|
},
|
|
80
80
|
"hook:external-communication-guard": {
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"domain": "safety",
|
|
84
84
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
85
85
|
"installedPath": ".instar/hooks/instar/external-communication-guard.js",
|
|
86
|
-
"contentHash": "
|
|
86
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
87
87
|
"since": "2025-01-01"
|
|
88
88
|
},
|
|
89
89
|
"hook:scope-coherence-collector": {
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"domain": "coherence",
|
|
93
93
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
94
94
|
"installedPath": ".instar/hooks/instar/scope-coherence-collector.js",
|
|
95
|
-
"contentHash": "
|
|
95
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
96
96
|
"since": "2025-01-01"
|
|
97
97
|
},
|
|
98
98
|
"hook:scope-coherence-checkpoint": {
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"domain": "coherence",
|
|
102
102
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
103
103
|
"installedPath": ".instar/hooks/instar/scope-coherence-checkpoint.js",
|
|
104
|
-
"contentHash": "
|
|
104
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
105
105
|
"since": "2025-01-01"
|
|
106
106
|
},
|
|
107
107
|
"hook:free-text-guard": {
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"domain": "safety",
|
|
111
111
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
112
112
|
"installedPath": ".instar/hooks/instar/free-text-guard.sh",
|
|
113
|
-
"contentHash": "
|
|
113
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
114
114
|
"since": "2025-01-01"
|
|
115
115
|
},
|
|
116
116
|
"hook:claim-intercept": {
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
"domain": "coherence",
|
|
120
120
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
121
121
|
"installedPath": ".instar/hooks/instar/claim-intercept.js",
|
|
122
|
-
"contentHash": "
|
|
122
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
123
123
|
"since": "2025-01-01"
|
|
124
124
|
},
|
|
125
125
|
"hook:claim-intercept-response": {
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"domain": "coherence",
|
|
129
129
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
130
130
|
"installedPath": ".instar/hooks/instar/claim-intercept-response.js",
|
|
131
|
-
"contentHash": "
|
|
131
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
132
132
|
"since": "2025-01-01"
|
|
133
133
|
},
|
|
134
134
|
"hook:stop-gate-router": {
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
"domain": "safety",
|
|
138
138
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
139
139
|
"installedPath": ".instar/hooks/instar/stop-gate-router.js",
|
|
140
|
-
"contentHash": "
|
|
140
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
141
141
|
"since": "2025-01-01"
|
|
142
142
|
},
|
|
143
143
|
"hook:auto-approve-permissions": {
|
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
"domain": "safety",
|
|
147
147
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
148
148
|
"installedPath": ".instar/hooks/instar/auto-approve-permissions.js",
|
|
149
|
-
"contentHash": "
|
|
149
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
150
150
|
"since": "2025-01-01"
|
|
151
151
|
},
|
|
152
152
|
"job:health-check": {
|
|
@@ -370,7 +370,7 @@
|
|
|
370
370
|
"type": "skill",
|
|
371
371
|
"domain": "skills",
|
|
372
372
|
"sourcePath": ".claude/skills/autonomous/SKILL.md",
|
|
373
|
-
"contentHash": "
|
|
373
|
+
"contentHash": "3075c343b636506da821b1c1483112fb38920f41b1547b4dacdc7ae1734c51be",
|
|
374
374
|
"since": "2025-01-01"
|
|
375
375
|
},
|
|
376
376
|
"skill:build": {
|
|
@@ -1506,7 +1506,7 @@
|
|
|
1506
1506
|
"type": "subsystem",
|
|
1507
1507
|
"domain": "updates",
|
|
1508
1508
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
1509
|
-
"contentHash": "
|
|
1509
|
+
"contentHash": "6cf82b68d5b625f674bfe7e5b43b85a3c51ee750038430f13f09d42d1a3fc14e",
|
|
1510
1510
|
"since": "2025-01-01"
|
|
1511
1511
|
},
|
|
1512
1512
|
"subsystem:scheduler": {
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
The autonomous-mode stop hook was being registered in `settings.json` at
|
|
9
|
+
`.instar/hooks/instar/autonomous-stop-hook.sh` — a path where the hook is **never
|
|
10
|
+
deployed**. The hook ships only in the skill directory
|
|
11
|
+
(`.claude/skills/autonomous/hooks/autonomous-stop-hook.sh`). So on every `Stop`
|
|
12
|
+
event the hook command hit a missing file, failed silently, and the autonomous
|
|
13
|
+
loop never re-injected the task list. The session stayed alive but stopped
|
|
14
|
+
self-continuing between turns — it only advanced when the user sent a message.
|
|
15
|
+
|
|
16
|
+
Three coordinated fixes:
|
|
17
|
+
|
|
18
|
+
1. **`.claude/skills/autonomous/SKILL.md` (Step 2a)** now registers the deployed
|
|
19
|
+
skill path and self-heals: it strips any prior (including wrong-path)
|
|
20
|
+
autonomous stop-hook entry and writes exactly one correct-path entry.
|
|
21
|
+
2. **`PostUpdateMigrator.ensureAutonomousStopHook()`** gained a repair pass that
|
|
22
|
+
rewrites any existing wrong-path registration in `settings.json` to the skill
|
|
23
|
+
path. Without it, the "already registered?" presence check treated the
|
|
24
|
+
wrong-path entry as present and never corrected it — so existing agents would
|
|
25
|
+
stay broken forever.
|
|
26
|
+
3. **`PostUpdateMigrator.migrateAutonomousStopHookTopicKeyed()`** re-deploys the
|
|
27
|
+
fixed `SKILL.md` to existing agents, gated on a marker unique to the corrected
|
|
28
|
+
prompt (stock prompts upgrade; customized prompts are left untouched).
|
|
29
|
+
|
|
30
|
+
## What to Tell Your User
|
|
31
|
+
|
|
32
|
+
If you ran an autonomous session and noticed it went quiet between turns —
|
|
33
|
+
continuing only when you messaged it, rather than driving itself forward — this
|
|
34
|
+
fixes the cause. The loop's re-engagement step was pointed at a file that was
|
|
35
|
+
never installed, so it silently did nothing each time the session tried to
|
|
36
|
+
continue. After this update the autonomous loop re-engages on its own as
|
|
37
|
+
intended, and any agent that already had the broken registration is repaired
|
|
38
|
+
automatically on update. No action is needed on your side.
|
|
39
|
+
|
|
40
|
+
## Summary of New Capabilities
|
|
41
|
+
|
|
42
|
+
- Autonomous sessions reliably self-continue between turns (the stop hook now
|
|
43
|
+
resolves to a file that actually exists).
|
|
44
|
+
- Existing agents with the broken registration are healed in place on update —
|
|
45
|
+
both the `settings.json` entry and the deployed skill prompt.
|
|
46
|
+
- The skill registration is now self-healing: activating autonomous mode always
|
|
47
|
+
ends with exactly one correct-path stop-hook entry, regardless of prior state.
|
|
48
|
+
|
|
49
|
+
## Evidence
|
|
50
|
+
|
|
51
|
+
- New unit suite `tests/unit/PostUpdateMigrator-autonomousHookPath.test.ts`
|
|
52
|
+
(9 tests): wrong-path → repaired; no duplicate added; siblings untouched;
|
|
53
|
+
already-correct → no-op; missing → registered; idempotent; SKILL.md content
|
|
54
|
+
asserts the corrected path + marker; topic-keyed migration re-deploys a stock
|
|
55
|
+
SKILL.md and skips a customized one.
|
|
56
|
+
- Empirical check of the SKILL.md Step 2a snippet against a settings file
|
|
57
|
+
carrying the wrong-path entry plus sibling hooks: the wrong entry is rewritten
|
|
58
|
+
to `bash ${CLAUDE_PROJECT_DIR}/.claude/skills/autonomous/hooks/autonomous-stop-hook.sh`,
|
|
59
|
+
siblings are preserved, and a second run is a no-op (idempotent).
|
|
60
|
+
- Existing autonomous/migration suites stay green
|
|
61
|
+
(`autonomous-skill-deployment`, `PostUpdateMigrator-buildStopHook`,
|
|
62
|
+
`autonomous-stop-hook-notify`, `installCodexHooks`, `emit-session-clock` —
|
|
63
|
+
50 tests). `tsc --noEmit` clean.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Side-Effects Review — Autonomous loop re-engagement fix (stop-hook registration path)
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `autonomous-stop-hook-path-fix`
|
|
4
|
+
**Date:** `2026-06-03`
|
|
5
|
+
**Author:** `Echo`
|
|
6
|
+
**Second-pass reviewer:** `Echo (self, single-pass — Tier-1 fix)`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
The autonomous-mode stop hook is what re-injects the task list on every `Stop`
|
|
11
|
+
event so an autonomous session keeps working between turns. It was registered in
|
|
12
|
+
`settings.json` at `.instar/hooks/instar/autonomous-stop-hook.sh`, but the hook
|
|
13
|
+
is only ever deployed to the skill dir (`.claude/skills/autonomous/hooks/`). The
|
|
14
|
+
registered path therefore pointed at a non-existent file: every `Stop` failed
|
|
15
|
+
silently and the loop never re-engaged. Files touched:
|
|
16
|
+
`.claude/skills/autonomous/SKILL.md` (Step 2a registration snippet),
|
|
17
|
+
`src/core/PostUpdateMigrator.ts` (`ensureAutonomousStopHook` repair pass +
|
|
18
|
+
`migrateAutonomousStopHookTopicKeyed` SKILL.md re-deploy), and a new unit suite.
|
|
19
|
+
The decision surface is purely *which file path is written into the Stop-hook
|
|
20
|
+
registration* — there is no message block/allow logic.
|
|
21
|
+
|
|
22
|
+
## Decision-point inventory
|
|
23
|
+
|
|
24
|
+
- `SKILL.md Step 2a registration` — modify — registers the deployed skill path
|
|
25
|
+
(was the never-deployed `.instar/hooks/instar/` path) and self-heals stale entries.
|
|
26
|
+
- `PostUpdateMigrator.ensureAutonomousStopHook` — modify — adds a repair pass that
|
|
27
|
+
rewrites wrong-path entries before the existing presence check.
|
|
28
|
+
- `PostUpdateMigrator.migrateAutonomousStopHookTopicKeyed` — modify — adds SKILL.md
|
|
29
|
+
to the marker-gated re-deploy list so existing agents receive the fixed prompt.
|
|
30
|
+
- No message-gating / block-allow decision point is touched.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 1. Over-block
|
|
35
|
+
|
|
36
|
+
No block/allow surface — over-block not applicable. The change only corrects a
|
|
37
|
+
filesystem path string in a hook registration; it never rejects any input.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 2. Under-block
|
|
42
|
+
|
|
43
|
+
No block/allow surface — under-block not applicable. One adjacent correctness
|
|
44
|
+
note: the repair targets specifically the `.instar/hooks/instar/autonomous-stop-hook.sh`
|
|
45
|
+
wrong path. If a future custom registration used some *third* wrong path, the
|
|
46
|
+
repair would not catch it — but that path was never shipped by instar, so there
|
|
47
|
+
is nothing in the install base to miss. The registration helper still adds a
|
|
48
|
+
correct entry if none exists at all.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 3. Level-of-abstraction fit
|
|
53
|
+
|
|
54
|
+
Correct layer. This is a deterministic settings/file-path migration — exactly the
|
|
55
|
+
class `PostUpdateMigrator` owns (Migration Parity Standard). The SKILL.md snippet
|
|
56
|
+
is the install/activation-time registrar; the migrator is the in-place repair for
|
|
57
|
+
already-deployed agents. No reasoning/LLM layer is involved or appropriate: the
|
|
58
|
+
correct path is a fixed, known string, so a structural fix is the right tool (and
|
|
59
|
+
matches the sibling `build-stop-hook.sh` path-repair precedent).
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 4. Signal vs authority compliance
|
|
64
|
+
|
|
65
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
66
|
+
|
|
67
|
+
- [x] No — this change has no block/allow surface.
|
|
68
|
+
|
|
69
|
+
It rewrites a hook-registration path in `settings.json`; it holds no message or
|
|
70
|
+
operation authority. The autonomous stop hook itself (unchanged here) remains the
|
|
71
|
+
authority for whether a session continues, and it is session-id-gated.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 5. Interactions
|
|
76
|
+
|
|
77
|
+
- **Shadowing:** The repair pass runs *before* the existing `hasAutonomousHook`
|
|
78
|
+
presence check inside `ensureAutonomousStopHook`. This is intentional and is the
|
|
79
|
+
core of the fix: previously the presence check matched the wrong-path entry and
|
|
80
|
+
short-circuited the correct registration, so the wrong path was permanent. After
|
|
81
|
+
repair, the entry already holds the correct path, so the presence check finds it
|
|
82
|
+
and adds no duplicate (verified by the "no duplicate" test).
|
|
83
|
+
- **Double-fire:** Two registrars exist — the SKILL.md Step 2a (activation-time,
|
|
84
|
+
dynamic add/remove) and `ensureAutonomousStopHook` (update-time, permanent). Both
|
|
85
|
+
now converge on the *same* command string, so they can no longer disagree or
|
|
86
|
+
produce two divergent entries. The SKILL.md snippet strips-then-appends, and the
|
|
87
|
+
migrator's presence check prevents duplicates; combined they always yield exactly
|
|
88
|
+
one correct entry (verified).
|
|
89
|
+
- **Races:** No shared concurrent state. `settings.json` is edited by the same
|
|
90
|
+
single-writer migration path as every other hook registration.
|
|
91
|
+
- **Feedback loops:** None. A one-time path correction; the corrected entry is a
|
|
92
|
+
fixed string, so subsequent passes are no-ops (idempotency verified).
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 6. External surfaces
|
|
97
|
+
|
|
98
|
+
- **Other agents on the machine:** none — per-project `settings.json` only.
|
|
99
|
+
- **Install base:** existing agents are healed on next update (the intended
|
|
100
|
+
surface). The `migrateAutonomousStopHookTopicKeyed` re-deploy is marker-gated and
|
|
101
|
+
fingerprint-guarded, so a customized `SKILL.md` (missing the stock
|
|
102
|
+
`ALL_TASKS_COMPLETE` fingerprint) is left untouched — verified by test.
|
|
103
|
+
- **External systems (Telegram/Slack/GitHub/Cloudflare):** none.
|
|
104
|
+
- **Persistent state:** `.claude/settings.json` and the deployed `SKILL.md`. The
|
|
105
|
+
edit is convergent (always lands on the one correct entry), so re-running is safe.
|
|
106
|
+
- **Timing/runtime:** none — the migration is synchronous on the existing update path.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 7. Rollback cost
|
|
111
|
+
|
|
112
|
+
Pure code + template change. Back-out is `git revert` + ship the next patch. There
|
|
113
|
+
is one consideration: this migration *writes a corrected entry* into existing
|
|
114
|
+
agents' `settings.json`. A revert would stop applying the correction but would NOT
|
|
115
|
+
re-break already-corrected agents (the correct path resolves to a real file, so a
|
|
116
|
+
reverted build leaves them working). No data migration, no agent reset, no
|
|
117
|
+
user-visible regression during the rollback window. Worst case of the fix itself
|
|
118
|
+
being wrong: an agent ends up with a Stop-hook entry pointing at the skill path —
|
|
119
|
+
which is exactly where the file lives — so the failure mode of the fix is "it
|
|
120
|
+
works".
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Conclusion
|
|
125
|
+
|
|
126
|
+
The review produced no design changes. The fix is a narrow, deterministic path
|
|
127
|
+
correction with a self-healing registrar and an in-place repair migration that
|
|
128
|
+
satisfies the Migration Parity Standard for both the `settings.json` entry and the
|
|
129
|
+
deployed skill prompt. The only decision surface is a fixed path string, the
|
|
130
|
+
repair is idempotent and convergent, and the customized-prompt guard is preserved.
|
|
131
|
+
Clear to ship.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Second-pass review (if required)
|
|
136
|
+
|
|
137
|
+
**Reviewer:** Echo (self) — Tier-1 fix, single-pass per the tiered process.
|
|
138
|
+
**Independent read of the artifact: concur**
|
|
139
|
+
|
|
140
|
+
The change has no message-gating surface, the repair-before-presence-check
|
|
141
|
+
ordering is the load-bearing correctness point and is tested, and the Migration
|
|
142
|
+
Parity obligations (settings repair + marker-gated SKILL.md re-deploy + customized
|
|
143
|
+
guard) are all covered. No concerns.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Evidence pointers
|
|
148
|
+
|
|
149
|
+
- `tests/unit/PostUpdateMigrator-autonomousHookPath.test.ts` — 9 tests (repair,
|
|
150
|
+
no-duplicate, sibling-preservation, no-op-when-correct, register-when-missing,
|
|
151
|
+
idempotency, SKILL.md content marker, topic-keyed re-deploy + customized-skip).
|
|
152
|
+
- Empirical SKILL.md snippet run against a wrong-path settings fixture: wrong entry
|
|
153
|
+
rewritten to the skill path, siblings preserved, second run idempotent.
|
|
154
|
+
- Regression: `autonomous-skill-deployment`, `PostUpdateMigrator-buildStopHook`,
|
|
155
|
+
`autonomous-stop-hook-notify`, `installCodexHooks`, `emit-session-clock` — 50
|
|
156
|
+
tests green. `tsc --noEmit` clean.
|