instar 1.0.8 → 1.0.10
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.map +1 -1
- package/dist/commands/init.js +16 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/core/IdentityRenderer.d.ts +23 -0
- package/dist/core/IdentityRenderer.d.ts.map +1 -1
- package/dist/core/IdentityRenderer.js +43 -2
- package/dist/core/IdentityRenderer.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +31 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +17 -17
- package/upgrades/1.0.10.md +55 -0
- package/upgrades/1.0.9.md +54 -0
- package/upgrades/side-effects/feat-portability-init-identity-shadows.md +59 -0
- package/upgrades/side-effects/feat-portability-neutral-relay-path.md +61 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-05-
|
|
5
|
-
"instarVersion": "1.0.
|
|
4
|
+
"generatedAt": "2026-05-19T20:08:37.872Z",
|
|
5
|
+
"instarVersion": "1.0.10",
|
|
6
6
|
"entryCount": 189,
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
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": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
123
123
|
"since": "2025-01-01"
|
|
124
124
|
},
|
|
125
125
|
"hook:auto-approve-permissions": {
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"domain": "safety",
|
|
129
129
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
130
130
|
"installedPath": ".instar/hooks/instar/auto-approve-permissions.js",
|
|
131
|
-
"contentHash": "
|
|
131
|
+
"contentHash": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
132
132
|
"since": "2025-01-01"
|
|
133
133
|
},
|
|
134
134
|
"job:health-check": {
|
|
@@ -1456,7 +1456,7 @@
|
|
|
1456
1456
|
"type": "subsystem",
|
|
1457
1457
|
"domain": "updates",
|
|
1458
1458
|
"sourcePath": "src/core/PostUpdateMigrator.ts",
|
|
1459
|
-
"contentHash": "
|
|
1459
|
+
"contentHash": "d8ba2811113c6f6417d5555bd5490d5169dd41d5774ff5af9e171693e4d140aa",
|
|
1460
1460
|
"since": "2025-01-01"
|
|
1461
1461
|
},
|
|
1462
1462
|
"subsystem:scheduler": {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Upgrade Guide — v1.0.10 (portability hardening 2 of 6)
|
|
2
|
+
|
|
3
|
+
<!-- bump: patch -->
|
|
4
|
+
|
|
5
|
+
## What Changed
|
|
6
|
+
|
|
7
|
+
Second of the six cross-framework portability hardening patches (v1.0.9–v1.0.14).
|
|
8
|
+
|
|
9
|
+
The Telegram reply helper script (`telegram-reply.sh`) is now also installed at
|
|
10
|
+
the framework-neutral location `.instar/scripts/telegram-reply.sh`, not only
|
|
11
|
+
under `.claude/scripts/`. The agent identity file's relay instructions now
|
|
12
|
+
point at the neutral path (with the old Claude path documented as a fallback
|
|
13
|
+
for older installs).
|
|
14
|
+
|
|
15
|
+
Before this, a Codex or Gemini agent — which has no `.claude/scripts/` folder —
|
|
16
|
+
was instructed by its identity file to run a relay script that did not exist,
|
|
17
|
+
so it could not reply on Telegram.
|
|
18
|
+
|
|
19
|
+
## Evidence
|
|
20
|
+
|
|
21
|
+
Reproduction prior to this change: configure an agent to run under Codex with
|
|
22
|
+
Telegram enabled. Its AGENTS.md relay section instructed `cat ... |
|
|
23
|
+
.claude/scripts/telegram-reply.sh`, a path absent on a non-Claude install. The
|
|
24
|
+
SessionStart hook already preferred the neutral path, but the neutral copy was
|
|
25
|
+
never installed, so even that preference fell back to the missing Claude path.
|
|
26
|
+
|
|
27
|
+
Observed after this change: `migrateScripts` installs the same generated script
|
|
28
|
+
to `.instar/scripts/telegram-reply.sh` (install-if-missing plus the existing
|
|
29
|
+
SHA-migrate guard for user-customized copies). The identity relay section now
|
|
30
|
+
references the neutral path. The Claude-Code copy is retained unchanged, so
|
|
31
|
+
Claude Code behavior is identical.
|
|
32
|
+
|
|
33
|
+
Unit verification: `tests/unit/PostUpdateMigrator-neutralRelayPath.test.ts` —
|
|
34
|
+
four cases: both locations installed with identical content; neutral copy
|
|
35
|
+
executable; idempotent on re-run; no-op when Telegram is not configured. The
|
|
36
|
+
IdentityRenderer assertion was updated to the neutral path plus fallback note,
|
|
37
|
+
and four adjacent relay-path test files were regression-checked green.
|
|
38
|
+
|
|
39
|
+
## What to Tell Your User
|
|
40
|
+
|
|
41
|
+
- "Agents running on Codex or Gemini can now reply on Telegram. The reply helper is installed in a runtime-neutral location instead of a Claude-only folder. Claude Code agents are unaffected — their existing setup is unchanged and they pick up the neutral copy on their next update."
|
|
42
|
+
|
|
43
|
+
## Summary of New Capabilities
|
|
44
|
+
|
|
45
|
+
| Capability | How to Use |
|
|
46
|
+
|-----------|-----------|
|
|
47
|
+
| Neutral relay script location | Automatic on update. The reply helper is mirrored to `.instar/scripts/` for every runtime. |
|
|
48
|
+
| Framework-neutral relay instructions | Automatic. The identity file's relay section points at the neutral path with a documented fallback. |
|
|
49
|
+
|
|
50
|
+
## Deferred (Tracked Follow-ups)
|
|
51
|
+
|
|
52
|
+
- Four remaining cross-framework portability gaps ship as v1.0.11–v1.0.14:
|
|
53
|
+
framework-aware connector-server registration, framework-session-store
|
|
54
|
+
abstraction, post-update-migrator framework guards, and the
|
|
55
|
+
migrator/identity-renderer unification.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Upgrade Guide — v1.0.9 (portability hardening 1 of 6)
|
|
2
|
+
|
|
3
|
+
<!-- bump: patch -->
|
|
4
|
+
|
|
5
|
+
## What Changed
|
|
6
|
+
|
|
7
|
+
First of the six cross-framework portability hardening patches the v1.0.8
|
|
8
|
+
release notes committed to (v1.0.9–v1.0.14).
|
|
9
|
+
|
|
10
|
+
`instar init` now writes the non-Claude identity files (AGENTS.md for Codex,
|
|
11
|
+
GEMINI.md for Gemini) from the canonical `.instar/AGENT.md` at setup time,
|
|
12
|
+
instead of writing only the Claude-Code-specific CLAUDE.md and leaving
|
|
13
|
+
non-Claude runtimes with no identity file until the first server spawn.
|
|
14
|
+
|
|
15
|
+
A new `renderNonClaudeIdentityShadows` helper renders every known framework
|
|
16
|
+
shadow except `claude-code` (whose CLAUDE.md is a rich capability document,
|
|
17
|
+
intentionally left to its own generator). It is additive, idempotent, and a
|
|
18
|
+
safe no-op when no canonical identity exists yet.
|
|
19
|
+
|
|
20
|
+
## Evidence
|
|
21
|
+
|
|
22
|
+
Reproduction prior to this change: run `instar init` for a project intended to
|
|
23
|
+
run under Codex. Result: a CLAUDE.md (which Codex does not read) and no
|
|
24
|
+
AGENTS.md. The agent had no auto-loaded identity until the first server spawn
|
|
25
|
+
triggered the runtime self-heal.
|
|
26
|
+
|
|
27
|
+
Observed after this change: the same setup additionally produces AGENTS.md and
|
|
28
|
+
GEMINI.md rendered from the canonical identity, immediately at init. CLAUDE.md
|
|
29
|
+
is byte-for-byte unchanged. With no canonical AGENT.md present the helper is a
|
|
30
|
+
clean no-op and does not throw.
|
|
31
|
+
|
|
32
|
+
Unit verification: `tests/unit/renderNonClaudeIdentityShadows.test.ts` — five
|
|
33
|
+
cases: renders AGENTS.md + GEMINI.md from canonical AGENT.md; never
|
|
34
|
+
writes/clobbers CLAUDE.md; no-op-no-throw when AGENT.md is absent; idempotent;
|
|
35
|
+
Telegram relay appendix on request.
|
|
36
|
+
|
|
37
|
+
## What to Tell Your User
|
|
38
|
+
|
|
39
|
+
- "If you set up an agent to run on Codex or Gemini, it now gets the right identity file from the moment you create it, instead of only after its first session start. Claude Code setups are unchanged."
|
|
40
|
+
|
|
41
|
+
## Summary of New Capabilities
|
|
42
|
+
|
|
43
|
+
| Capability | How to Use |
|
|
44
|
+
|-----------|-----------|
|
|
45
|
+
| Init-time non-Claude identity | Automatic during `instar init`. AGENTS.md / GEMINI.md are rendered from the canonical identity alongside CLAUDE.md. |
|
|
46
|
+
| Idempotent re-render | The helper reproduces identical shadow content on repeat runs and no-ops without a canonical source. |
|
|
47
|
+
|
|
48
|
+
## Deferred (Tracked Follow-ups)
|
|
49
|
+
|
|
50
|
+
- Five remaining cross-framework portability gaps ship as v1.0.10–v1.0.14:
|
|
51
|
+
framework-aware connector-server registration, framework-session-store
|
|
52
|
+
abstraction, neutral relay-script path, post-update-migrator framework
|
|
53
|
+
guards, and the migrator/identity-renderer unification (which will revisit
|
|
54
|
+
how CLAUDE.md relates to the canonical identity render).
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Side-effects review — Init non-Claude identity shadows (Gap 1)
|
|
2
|
+
|
|
3
|
+
Per L6. Seven dimensions.
|
|
4
|
+
|
|
5
|
+
## 1. Over-block / under-block
|
|
6
|
+
|
|
7
|
+
Before: UNDER — a non-Claude install got no identity file at init. After: no
|
|
8
|
+
over-block. claude-code is explicitly excluded so the rich CLAUDE.md is never
|
|
9
|
+
touched; only AGENTS.md/GEMINI.md are added. No new under-block: a no-canonical
|
|
10
|
+
state is a clean no-op, matching prior behavior (nothing was written then
|
|
11
|
+
either).
|
|
12
|
+
|
|
13
|
+
## 2. Level-of-abstraction fit
|
|
14
|
+
|
|
15
|
+
The render logic lives in IdentityRenderer (where all shadow rendering lives).
|
|
16
|
+
init just calls it. Correct altitude — init orchestrates, the renderer renders.
|
|
17
|
+
|
|
18
|
+
## 3. Signal vs Authority compliance
|
|
19
|
+
|
|
20
|
+
Canonical `.instar/AGENT.md` is the AUTHORITY. The shadow files are derived
|
|
21
|
+
SIGNAL copies carrying the auto-generated banner. The helper never invents
|
|
22
|
+
identity; it copies the canonical body. No brittle filter gains authority.
|
|
23
|
+
|
|
24
|
+
## 4. Interactions with adjacent systems
|
|
25
|
+
|
|
26
|
+
- **generateClaudeMd / CLAUDE.md** — untouched (excluded by design).
|
|
27
|
+
- **ensureFrameworkIdentityFile** (runtime spawn) — unchanged; this closes the
|
|
28
|
+
init-time window before first spawn, the two are complementary and both
|
|
29
|
+
idempotent so double-render is harmless.
|
|
30
|
+
- **Gap 6 (migrator/renderer unification)** — independent; this PR does not
|
|
31
|
+
pre-empt or block it.
|
|
32
|
+
- **PostUpdateMigrator** — not touched. Existing installs are unaffected (they
|
|
33
|
+
already self-heal at spawn via ensureFrameworkIdentityFile).
|
|
34
|
+
|
|
35
|
+
## 5. Rollback cost
|
|
36
|
+
|
|
37
|
+
Low. One new exported function + two call sites + one test file. `git revert`
|
|
38
|
+
restores prior behavior; no state migration, deployed agents unaffected
|
|
39
|
+
(runtime self-heal path unchanged).
|
|
40
|
+
|
|
41
|
+
## 6. Backwards compatibility / drift surface
|
|
42
|
+
|
|
43
|
+
Fully backward-compatible. Claude-code installs: identical behavior (CLAUDE.md
|
|
44
|
+
written exactly as before; AGENTS.md/GEMINI.md additionally appear but are
|
|
45
|
+
inert for Claude Code). Non-Claude installs: strictly better (identity present
|
|
46
|
+
from init). Drift surface: none — shadows are deterministic renders of
|
|
47
|
+
canonical, idempotent.
|
|
48
|
+
|
|
49
|
+
## 7. Authorization / Trust posture
|
|
50
|
+
|
|
51
|
+
No new authority. The helper reads canonical AGENT.md and writes derived
|
|
52
|
+
shadows under projectDir — the same write surface init already owns. Best-
|
|
53
|
+
effort: a render failure cannot break init or escalate anything.
|
|
54
|
+
|
|
55
|
+
## Outcome
|
|
56
|
+
|
|
57
|
+
Ship. Narrow, additive, verified against actual code, idempotent, fully
|
|
58
|
+
tested, trivial rollback. First of the v1.0.9–v1.0.14 portability hardening
|
|
59
|
+
series the v1.0.8 notes committed to.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Side-effects review — Framework-neutral relay path (Gap 4)
|
|
2
|
+
|
|
3
|
+
Per L6. Seven dimensions.
|
|
4
|
+
|
|
5
|
+
## 1. Over-block / under-block
|
|
6
|
+
|
|
7
|
+
Before: UNDER — Codex/Gemini agents instructed to run a nonexistent script.
|
|
8
|
+
After: no over-block. The `.claude/scripts/` copy is retained, so Claude Code
|
|
9
|
+
behavior is byte-identical. The neutral copy is additive.
|
|
10
|
+
|
|
11
|
+
## 2. Level-of-abstraction fit
|
|
12
|
+
|
|
13
|
+
Script installation stays in `migrateScripts` (where all reply-script
|
|
14
|
+
installation lives). The identity instruction stays in IdentityRenderer. No
|
|
15
|
+
logic leaked elsewhere.
|
|
16
|
+
|
|
17
|
+
## 3. Signal vs Authority compliance
|
|
18
|
+
|
|
19
|
+
The generated script content is the single source; both locations receive the
|
|
20
|
+
same bytes. The SHA-migrate guard remains the authority on whether a
|
|
21
|
+
user-customized copy is overwritten — unchanged, now applied to both copies.
|
|
22
|
+
|
|
23
|
+
## 4. Interactions with adjacent systems
|
|
24
|
+
|
|
25
|
+
- **SessionStart hook (3309-3314)** — already preferred the neutral path; now
|
|
26
|
+
it resolves because the file exists. No hook change needed.
|
|
27
|
+
- **Claude SessionStart hook template (1822)** — intentionally unchanged
|
|
28
|
+
(Claude-only path; Codex has no SessionStart hook — that's why the appendix
|
|
29
|
+
exists).
|
|
30
|
+
- **buildTelegramRelayBlock (bootstrap helper)** — separate function, not
|
|
31
|
+
touched; its tests still pass.
|
|
32
|
+
- **TemplatesDriftVerifier / verify-deployed-templates** — checks
|
|
33
|
+
`.claude/scripts/telegram-reply.sh`; that file still exists with the same
|
|
34
|
+
content, so drift verification is unaffected (regression-tested).
|
|
35
|
+
|
|
36
|
+
## 5. Rollback cost
|
|
37
|
+
|
|
38
|
+
Low. Two source edits + one new test + one updated assertion. `git revert`
|
|
39
|
+
restores prior behavior. The neutral copy left on disk after a revert is an
|
|
40
|
+
inert extra file (the appendix would point back at `.claude/scripts/`),
|
|
41
|
+
harmless.
|
|
42
|
+
|
|
43
|
+
## 6. Backwards compatibility / drift surface
|
|
44
|
+
|
|
45
|
+
Fully backward-compatible. Claude Code: unchanged. Existing agents: get the
|
|
46
|
+
neutral mirror on next update via Migration Parity, idempotent. Drift surface:
|
|
47
|
+
the two copies are generated from the same content in the same pass — they
|
|
48
|
+
cannot diverge within a run; the SHA-migrate guard handles user customization
|
|
49
|
+
identically for both.
|
|
50
|
+
|
|
51
|
+
## 7. Authorization / Trust posture
|
|
52
|
+
|
|
53
|
+
No new authority. Same write surface the migrator already owns
|
|
54
|
+
(`.claude/scripts/` and `.instar/scripts/` are both under projectDir/stateDir
|
|
55
|
+
the migrator already writes to). Best-effort: a neutral-copy write failure is
|
|
56
|
+
captured as a migration error, never throws out of the migration run.
|
|
57
|
+
|
|
58
|
+
## Outcome
|
|
59
|
+
|
|
60
|
+
Ship. Surgical, additive, Migration-Parity-compliant, regression-swept,
|
|
61
|
+
trivial rollback. Second of the v1.0.9–v1.0.14 hardening series.
|