instar 1.3.244 → 1.3.246

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +4 -0
  2. package/dist/cli.js +20 -18
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/server.d.ts.map +1 -1
  5. package/dist/commands/server.js +108 -2
  6. package/dist/commands/server.js.map +1 -1
  7. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  8. package/dist/config/ConfigDefaults.js +13 -0
  9. package/dist/config/ConfigDefaults.js.map +1 -1
  10. package/dist/core/SessionManager.d.ts +3 -0
  11. package/dist/core/SessionManager.d.ts.map +1 -1
  12. package/dist/core/SessionManager.js +3 -0
  13. package/dist/core/SessionManager.js.map +1 -1
  14. package/dist/core/SessionServerGuard.d.ts +16 -0
  15. package/dist/core/SessionServerGuard.d.ts.map +1 -0
  16. package/dist/core/SessionServerGuard.js +44 -0
  17. package/dist/core/SessionServerGuard.js.map +1 -0
  18. package/dist/core/frameworkInjectionProcesses.d.ts +41 -0
  19. package/dist/core/frameworkInjectionProcesses.d.ts.map +1 -0
  20. package/dist/core/frameworkInjectionProcesses.js +53 -0
  21. package/dist/core/frameworkInjectionProcesses.js.map +1 -0
  22. package/dist/core/frameworkSessionLaunch.d.ts +9 -0
  23. package/dist/core/frameworkSessionLaunch.d.ts.map +1 -1
  24. package/dist/core/frameworkSessionLaunch.js +7 -0
  25. package/dist/core/frameworkSessionLaunch.js.map +1 -1
  26. package/dist/core/types.d.ts +22 -0
  27. package/dist/core/types.d.ts.map +1 -1
  28. package/dist/core/types.js.map +1 -1
  29. package/dist/messaging/SpawnRequestManager.d.ts +13 -0
  30. package/dist/messaging/SpawnRequestManager.d.ts.map +1 -1
  31. package/dist/messaging/SpawnRequestManager.js +3 -0
  32. package/dist/messaging/SpawnRequestManager.js.map +1 -1
  33. package/dist/messaging/types.d.ts.map +1 -1
  34. package/dist/messaging/types.js +8 -1
  35. package/dist/messaging/types.js.map +1 -1
  36. package/dist/threadline/ThreadlineRouter.d.ts +55 -1
  37. package/dist/threadline/ThreadlineRouter.d.ts.map +1 -1
  38. package/dist/threadline/ThreadlineRouter.js +246 -6
  39. package/dist/threadline/ThreadlineRouter.js.map +1 -1
  40. package/dist/threadline/WarmSessionPool.d.ts +22 -0
  41. package/dist/threadline/WarmSessionPool.d.ts.map +1 -1
  42. package/dist/threadline/WarmSessionPool.js +38 -0
  43. package/dist/threadline/WarmSessionPool.js.map +1 -1
  44. package/package.json +1 -1
  45. package/scripts/instar-dev-precommit.js +42 -0
  46. package/src/data/builtin-manifest.json +35 -35
  47. package/upgrades/1.3.245.md +39 -0
  48. package/upgrades/1.3.246.md +97 -0
  49. package/upgrades/side-effects/server-restart-sibling-target.md +96 -0
  50. package/upgrades/side-effects/threadline-warm-session-a2a.md +146 -0
  51. package/upgrades/threadline-warm-session-a2a.eli16.md +63 -0
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-06-04T16:26:00.075Z",
5
- "instarVersion": "1.3.244",
4
+ "generatedAt": "2026-06-04T18:56:49.668Z",
5
+ "instarVersion": "1.3.246",
6
6
  "entryCount": 198,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -778,7 +778,7 @@
778
778
  "type": "cli-command",
779
779
  "domain": "setup",
780
780
  "sourcePath": "src/cli.ts",
781
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
781
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
782
782
  "since": "2025-01-01"
783
783
  },
784
784
  "cli:setup": {
@@ -786,7 +786,7 @@
786
786
  "type": "cli-command",
787
787
  "domain": "setup",
788
788
  "sourcePath": "src/cli.ts",
789
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
789
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
790
790
  "since": "2025-01-01"
791
791
  },
792
792
  "cli:add": {
@@ -794,7 +794,7 @@
794
794
  "type": "cli-command",
795
795
  "domain": "setup",
796
796
  "sourcePath": "src/cli.ts",
797
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
797
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
798
798
  "since": "2025-01-01"
799
799
  },
800
800
  "cli:backup": {
@@ -802,7 +802,7 @@
802
802
  "type": "cli-command",
803
803
  "domain": "operations",
804
804
  "sourcePath": "src/cli.ts",
805
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
805
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
806
806
  "since": "2025-01-01"
807
807
  },
808
808
  "cli:git": {
@@ -810,7 +810,7 @@
810
810
  "type": "cli-command",
811
811
  "domain": "coordination",
812
812
  "sourcePath": "src/cli.ts",
813
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
813
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
814
814
  "since": "2025-01-01"
815
815
  },
816
816
  "cli:memory": {
@@ -818,7 +818,7 @@
818
818
  "type": "cli-command",
819
819
  "domain": "memory",
820
820
  "sourcePath": "src/cli.ts",
821
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
821
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
822
822
  "since": "2025-01-01"
823
823
  },
824
824
  "cli:knowledge": {
@@ -826,7 +826,7 @@
826
826
  "type": "cli-command",
827
827
  "domain": "memory",
828
828
  "sourcePath": "src/cli.ts",
829
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
829
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
830
830
  "since": "2025-01-01"
831
831
  },
832
832
  "cli:semantic": {
@@ -834,7 +834,7 @@
834
834
  "type": "cli-command",
835
835
  "domain": "memory",
836
836
  "sourcePath": "src/cli.ts",
837
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
837
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
838
838
  "since": "2025-01-01"
839
839
  },
840
840
  "cli:intent": {
@@ -842,7 +842,7 @@
842
842
  "type": "cli-command",
843
843
  "domain": "intent",
844
844
  "sourcePath": "src/cli.ts",
845
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
845
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
846
846
  "since": "2025-01-01"
847
847
  },
848
848
  "cli:feedback": {
@@ -850,7 +850,7 @@
850
850
  "type": "cli-command",
851
851
  "domain": "feedback",
852
852
  "sourcePath": "src/cli.ts",
853
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
853
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
854
854
  "since": "2025-01-01"
855
855
  },
856
856
  "cli:server": {
@@ -858,7 +858,7 @@
858
858
  "type": "cli-command",
859
859
  "domain": "server",
860
860
  "sourcePath": "src/cli.ts",
861
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
861
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
862
862
  "since": "2025-01-01"
863
863
  },
864
864
  "cli:status": {
@@ -866,7 +866,7 @@
866
866
  "type": "cli-command",
867
867
  "domain": "monitoring",
868
868
  "sourcePath": "src/cli.ts",
869
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
869
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
870
870
  "since": "2025-01-01"
871
871
  },
872
872
  "cli:user": {
@@ -874,7 +874,7 @@
874
874
  "type": "cli-command",
875
875
  "domain": "users",
876
876
  "sourcePath": "src/cli.ts",
877
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
877
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
878
878
  "since": "2025-01-01"
879
879
  },
880
880
  "cli:relationship": {
@@ -882,7 +882,7 @@
882
882
  "type": "cli-command",
883
883
  "domain": "relationships",
884
884
  "sourcePath": "src/cli.ts",
885
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
885
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
886
886
  "since": "2025-01-01"
887
887
  },
888
888
  "cli:job": {
@@ -890,7 +890,7 @@
890
890
  "type": "cli-command",
891
891
  "domain": "scheduling",
892
892
  "sourcePath": "src/cli.ts",
893
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
893
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
894
894
  "since": "2025-01-01"
895
895
  },
896
896
  "cli:lifeline": {
@@ -898,7 +898,7 @@
898
898
  "type": "cli-command",
899
899
  "domain": "communication",
900
900
  "sourcePath": "src/cli.ts",
901
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
901
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
902
902
  "since": "2025-01-01"
903
903
  },
904
904
  "cli:list": {
@@ -906,7 +906,7 @@
906
906
  "type": "cli-command",
907
907
  "domain": "monitoring",
908
908
  "sourcePath": "src/cli.ts",
909
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
909
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
910
910
  "since": "2025-01-01"
911
911
  },
912
912
  "cli:autostart": {
@@ -914,7 +914,7 @@
914
914
  "type": "cli-command",
915
915
  "domain": "operations",
916
916
  "sourcePath": "src/cli.ts",
917
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
917
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
918
918
  "since": "2025-01-01"
919
919
  },
920
920
  "cli:migrate": {
@@ -922,7 +922,7 @@
922
922
  "type": "cli-command",
923
923
  "domain": "updates",
924
924
  "sourcePath": "src/cli.ts",
925
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
925
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
926
926
  "since": "2025-01-01"
927
927
  },
928
928
  "cli:machines": {
@@ -930,7 +930,7 @@
930
930
  "type": "cli-command",
931
931
  "domain": "coordination",
932
932
  "sourcePath": "src/cli.ts",
933
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
933
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
934
934
  "since": "2025-01-01"
935
935
  },
936
936
  "cli:whoami": {
@@ -938,7 +938,7 @@
938
938
  "type": "cli-command",
939
939
  "domain": "identity",
940
940
  "sourcePath": "src/cli.ts",
941
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
941
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
942
942
  "since": "2025-01-01"
943
943
  },
944
944
  "cli:pair": {
@@ -946,7 +946,7 @@
946
946
  "type": "cli-command",
947
947
  "domain": "coordination",
948
948
  "sourcePath": "src/cli.ts",
949
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
949
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
950
950
  "since": "2025-01-01"
951
951
  },
952
952
  "cli:join": {
@@ -954,7 +954,7 @@
954
954
  "type": "cli-command",
955
955
  "domain": "coordination",
956
956
  "sourcePath": "src/cli.ts",
957
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
957
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
958
958
  "since": "2025-01-01"
959
959
  },
960
960
  "cli:wakeup": {
@@ -962,7 +962,7 @@
962
962
  "type": "cli-command",
963
963
  "domain": "coordination",
964
964
  "sourcePath": "src/cli.ts",
965
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
965
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
966
966
  "since": "2025-01-01"
967
967
  },
968
968
  "cli:leave": {
@@ -970,7 +970,7 @@
970
970
  "type": "cli-command",
971
971
  "domain": "coordination",
972
972
  "sourcePath": "src/cli.ts",
973
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
973
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
974
974
  "since": "2025-01-01"
975
975
  },
976
976
  "cli:doctor": {
@@ -978,7 +978,7 @@
978
978
  "type": "cli-command",
979
979
  "domain": "monitoring",
980
980
  "sourcePath": "src/cli.ts",
981
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
981
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
982
982
  "since": "2025-01-01"
983
983
  },
984
984
  "cli:review": {
@@ -986,7 +986,7 @@
986
986
  "type": "cli-command",
987
987
  "domain": "monitoring",
988
988
  "sourcePath": "src/cli.ts",
989
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
989
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
990
990
  "since": "2025-01-01"
991
991
  },
992
992
  "cli:nuke": {
@@ -994,7 +994,7 @@
994
994
  "type": "cli-command",
995
995
  "domain": "operations",
996
996
  "sourcePath": "src/cli.ts",
997
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
997
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
998
998
  "since": "2025-01-01"
999
999
  },
1000
1000
  "cli:playbook": {
@@ -1002,7 +1002,7 @@
1002
1002
  "type": "cli-command",
1003
1003
  "domain": "context",
1004
1004
  "sourcePath": "src/cli.ts",
1005
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
1005
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
1006
1006
  "since": "2025-01-01"
1007
1007
  },
1008
1008
  "cli:dev-preflight": {
@@ -1010,7 +1010,7 @@
1010
1010
  "type": "cli-command",
1011
1011
  "domain": "development",
1012
1012
  "sourcePath": "src/cli.ts",
1013
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
1013
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
1014
1014
  "since": "2025-01-01"
1015
1015
  },
1016
1016
  "cli:dev-ci-failures": {
@@ -1018,7 +1018,7 @@
1018
1018
  "type": "cli-command",
1019
1019
  "domain": "development",
1020
1020
  "sourcePath": "src/cli.ts",
1021
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
1021
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
1022
1022
  "since": "2025-01-01"
1023
1023
  },
1024
1024
  "cli:dev-profile-node": {
@@ -1026,7 +1026,7 @@
1026
1026
  "type": "cli-command",
1027
1027
  "domain": "development",
1028
1028
  "sourcePath": "src/cli.ts",
1029
- "contentHash": "410c6f2c325138a52996c3e2339d9b21fe7a32d90a20cc83d8754ad2d44e700f",
1029
+ "contentHash": "cedd7aaca10839a47af5a19f09b3ce8509a978166a6e2c4994fcbaa4de0a459a",
1030
1030
  "since": "2025-01-01"
1031
1031
  },
1032
1032
  "template:build-stop-hook.sh": {
@@ -1506,7 +1506,7 @@
1506
1506
  "type": "subsystem",
1507
1507
  "domain": "sessions",
1508
1508
  "sourcePath": "src/core/SessionManager.ts",
1509
- "contentHash": "d01eb671ddb9e21b1aeef11fb0b79a63db7a088baf94352fce58a3f0a7c4fd60",
1509
+ "contentHash": "4d50cc3ebd4b430069d5957fbed44bdadd487c17386b680f0cafe66a33c381e2",
1510
1510
  "since": "2025-01-01"
1511
1511
  },
1512
1512
  "subsystem:auto-updater": {
@@ -0,0 +1,39 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ Fixed the in-session server lifecycle guard so it only blocks the current
9
+ session's own managing server. Restarting a sibling agent server by target
10
+ directory or agent name is now allowed from inside a session.
11
+
12
+ Self-targeted server lifecycle commands are still blocked, and the error now
13
+ points operators to the supervisor path for bouncing that agent safely.
14
+
15
+ The CLI import shape remains compatible with the version-detection regression
16
+ test, and the exported guard is documented so docs coverage stays above the core
17
+ floor.
18
+
19
+ ## What to Tell Your User
20
+
21
+ - **Sibling agent restarts**: "I can now bounce another agent's server during
22
+ mentoring or fleet maintenance without being blocked by my own session guard.
23
+ My own managing server is still protected, so the active conversation is not
24
+ stranded by accident."
25
+
26
+ ## Summary of New Capabilities
27
+
28
+ | Capability | How to Use |
29
+ |-----------|-----------|
30
+ | Restart a sibling agent server from inside a session | Use the existing server lifecycle command with a sibling target |
31
+ | Safer self-server failure message | Automatic when an agent targets its own managing server |
32
+
33
+ ## Evidence
34
+
35
+ Reproduced the failing shape in a unit boundary test: a session with current
36
+ project Codey and target Gemini now returns allow, while current project Codey
37
+ targeting Codey still returns reject. The same targeted suite also verifies that
38
+ a symlink pointing back to Codey is rejected after realpath normalization. The
39
+ targeted server command test file passes with all ten tests green.
@@ -0,0 +1,97 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ Phase 2 of the Threadline agent-to-agent (A2A) continuity work: **warm sessions**.
9
+
10
+ The turn-based fix (#746) made a peer's spaced follow-up *resume* the same
11
+ conversation via `claude --resume`. But rapid-fire bursts (several messages in
12
+ seconds) still cold-spawned, because each A2A reply ran as a throwaway `-p`
13
+ session that answered once and exited — there was nothing alive to hand the next
14
+ message to — and a fresh thread could even hit the 30s per-peer spawn cooldown.
15
+
16
+ This change keeps the reply session **alive between messages** for a warm-enabled
17
+ peer and **injects** follow-ups into it:
18
+
19
+ - The first message from a verified, non-topic-bound peer spawns a **persistent
20
+ interactive** reply session (not a throwaway `-p`), carrying the full grounded
21
+ prompt as its first turn, and registers it in a new `WarmSessionPool` keyed by
22
+ threadId (caps: globalCap 3, perPeerCap 1, ttlMs 600000, trustFloor `verified`).
23
+ - The next message on that thread is **injected** into the same live session — no
24
+ cold-spawn, no cooldown — and refreshes its TTL.
25
+ - A periodic reap tick evicts on TTL/pressure; on eviction the **next message
26
+ falls back losslessly to the proven `--resume` path (#746)** — nothing is lost.
27
+
28
+ Three correctness/security fixes ride along, each independently load-bearing:
29
+
30
+ - **`claude.exe` allowlist fix** — live macOS Claude panes report
31
+ `pane_current_command = claude.exe`, which the inject allowlist
32
+ (`ALLOWED_INJECTION_PROCESSES`) did not contain, so A2A live-inject was
33
+ **dead-on-arrival on macOS**. Added `claude.exe`.
34
+ - **Grounding-on-inject** — injected follow-ups are now wrapped in the same
35
+ untrusted-data grounding preamble used on spawn/resume (they previously injected
36
+ the raw envelope body).
37
+ - **Per-thread isolation + peer-conflict guard** — each thread gets its own
38
+ private session (no shared listener, nothing to leak across peers), and
39
+ `WarmSessionPool.admit` throws `WarmSessionPeerConflictError` rather than letting
40
+ a different peer hijack an existing thread's warm session; a pre-spawn `peek`
41
+ check makes the conflict path fall back to a normal cold-spawn.
42
+
43
+ Dark-shipped behind `threadline.warmSessionA2A.enabled`, resolved via the
44
+ `developmentAgent` dev-gate (`enabled ?? !!config.developmentAgent`): **live on the
45
+ development agent, dark on the fleet**. With the flag absent and `developmentAgent`
46
+ false, behavior is byte-for-byte the current cold-spawn path.
47
+
48
+ **Framework-general (not Claude-specific).** The warm worker runs in the LOCAL
49
+ agent's framework (claude-code / codex-cli / gemini-cli / future), not hardcoded
50
+ Claude: the inject allowlist is now DERIVED from a per-framework process-name
51
+ registry (`Record<IntelligenceFramework, …>`), and the warm spawn passes the local
52
+ framework so the right CLI + resume mechanism applies. Enforced by compiler
53
+ exhaustiveness + `tests/unit/framework-agnosticism.test.ts` + a new `/instar-dev`
54
+ precommit gate that requires any launch/inject-abstraction change to state its
55
+ framework generality (standard: **Framework-Agnostic — and Framework-Optimizing**).
56
+
57
+ ## What to Tell Your User
58
+
59
+ When another agent and I go back and forth quickly, I now keep the same live
60
+ conversation open and type each new message into it — instead of starting a fresh,
61
+ memoryless reply every time. So a rapid exchange holds its thread end-to-end, not
62
+ just the slower turn-by-turn case. It's an internal robustness improvement that
63
+ ships active only on the development agent (dark on everyone else) and falls back
64
+ to the already-shipped resume path if a warm session is ever retired. Nothing to
65
+ turn on.
66
+
67
+ ## Summary of New Capabilities
68
+
69
+ | Capability | How to Use |
70
+ |-----------|-----------|
71
+ | Warm A2A sessions (keep-alive + inject) | Automatic for verified, non-topic-bound Threadline peers when `threadline.warmSessionA2A.enabled` is on (defaults to the `developmentAgent` flag). Rapid follow-ups inject into the live session instead of cold-spawning. |
72
+ | Tunable warm-session pool | `.instar/config.json` → `threadline.warmSessionA2A`: `globalCap` (3), `perPeerCap` (1), `ttlMs` (600000), `trustFloor` (`verified`). |
73
+ | Lossless eviction fallback | On TTL/pressure eviction, the next message resumes via the `--resume` path (#746) — no continuity lost. |
74
+
75
+ ## Evidence
76
+
77
+ **The `claude.exe` bug (reproduced in dev):** `ALLOWED_INJECTION_PROCESSES`
78
+ (`src/messaging/types.ts`) listed `claude` but not `claude.exe`. On macOS a live
79
+ Claude pane reports `pane_current_command = claude.exe`, so the inject guard
80
+ `isInjectableProcess()` returned **false for every live A2A reply session** —
81
+ agent-to-agent live-inject was dead-on-arrival on macOS.
82
+
83
+ - *Before:* the prior live Echo↔Dawn round-trip recorded `2× Spawned, 0× Resumed,
84
+ 1× spawn-denied (cooldown)` on a fresh thread — every follow-up cold-started; the
85
+ inject path was never reachable because the allowlist check rejected `claude.exe`.
86
+ - *After:* unit test asserts `claude.exe ∈ ALLOWED_INJECTION_PROCESSES`; the
87
+ integration test "2nd message on a thread with a live warm session → inject (no
88
+ 2nd spawn, no cooldown)" passes — the inject path is now reachable and exercised.
89
+
90
+ **Test evidence (re-run on top of current main, v1.3.243):** tsc `--noEmit` clean;
91
+ warm-session unit (105) + integration (5: incl. flag-on inject, flag-off
92
+ byte-identical cold-spawn, peer-conflict → cold fallback) + e2e (1: continuity then
93
+ evict → resume via #746) all green; esm / no-empty-catch / no-direct-destructive /
94
+ no-silent-fallbacks gates green (warm fail-opens annotated `@silent-fallback-ok`,
95
+ net silent-fallback count unchanged). The live Echo↔Dawn production round-trip
96
+ ("Resumed not Spawned" + rapid inject with no cooldown) is the post-deploy
97
+ standards-met gate, run by the orchestrator after merge.
@@ -0,0 +1,96 @@
1
+ # Side-effects review — session-safe sibling server restarts
2
+
3
+ **Scope**: `instar server start|stop|restart` now checks whether the requested
4
+ server target is the current session's own project before blocking lifecycle
5
+ commands from inside a session. Sibling targets are allowed. Self-targets remain
6
+ blocked and now print an actionable supervisor command.
7
+
8
+ Framework-ledger ref: `57ecfb92`.
9
+
10
+ ## Decision audit
11
+
12
+ **Candidate A: keep the blanket block and only improve the error.**
13
+
14
+ This would have preserved the original safety invariant, but it would not remove
15
+ the operational friction that caused this task. A mentoring agent still could
16
+ not bounce a sibling agent's server from the correct workflow.
17
+
18
+ **Candidate B: make the guard target-aware and keep a supervisor hint for
19
+ self-targets.**
20
+
21
+ Chosen. It preserves the invariant that a session cannot restart its own
22
+ managing server, while allowing maintenance of sibling agents. The supervisor
23
+ hint covers the remaining blocked case with an explicit human/operator path.
24
+
25
+ ## Over-block risk
26
+
27
+ Low. The guard normalizes the current project and target project through
28
+ `realpath` when possible. Sibling directories compare different and are allowed.
29
+ The only expected block is the current managing server, including symlink aliases
30
+ that point back to it.
31
+
32
+ One residual over-block case remains intentional: if no target is provided from
33
+ inside a session, the command targets the current project and is blocked.
34
+
35
+ ## Under-block risk
36
+
37
+ Low. A symlink to the current project is rejected after realpath normalization.
38
+ If a target path does not exist yet, normalization falls back to `path.resolve`;
39
+ that could only affect non-existing paths before the server command validates
40
+ them. Existing self-targets are protected.
41
+
42
+ ## Level-of-abstraction fit
43
+
44
+ The comparison lives in a pure core helper. The CLI resolves the optional agent
45
+ name before asking the helper for a decision, then formats any rejection for the
46
+ terminal. This keeps policy separate from command output and makes the behavior
47
+ directly unit-testable.
48
+
49
+ ## Signal vs authority
50
+
51
+ The helper is authority for this CLI guard only. It does not change supervisor,
52
+ launchd, systemd, or server internals. The server lifecycle implementation still
53
+ owns the actual start/stop/restart mechanics.
54
+
55
+ ## Interactions
56
+
57
+ - `server start [name]`, `server stop [name]`, and `server restart [name]` now
58
+ resolve the agent name before applying the guard.
59
+ - `--dir` targets are compared directly.
60
+ - `status [name]` is unchanged except that `resolveAgentDir` is now statically
61
+ imported by the CLI.
62
+ - Supervisor-managed restarts remain the documented path for the current agent.
63
+
64
+ ## External surfaces
65
+
66
+ User-facing behavior changes only for CLI output and command allowance:
67
+
68
+ - Sibling server lifecycle commands from inside a session can proceed.
69
+ - Self server lifecycle commands still fail, with a clearer message and
70
+ `launchctl kickstart -k gui/$UID/ai.instar.<name>` hint.
71
+
72
+ No API keys, credentials, network calls, or config migrations are involved.
73
+
74
+ ## Rollback cost
75
+
76
+ Small. Reverting the helper, CLI call-site changes, tests, and upgrade artifacts
77
+ restores the prior blanket in-session block.
78
+
79
+ ## Tests
80
+
81
+ Narrow regression coverage checks:
82
+
83
+ - no session id allows lifecycle commands;
84
+ - current managing server rejects;
85
+ - sibling target allows;
86
+ - symlink target resolving to the current managing server rejects.
87
+ - docs coverage documents `SessionServerGuard` in two indexed docs so the core
88
+ category stays at its configured floor.
89
+
90
+ Local verification intentionally uses targeted tests and static gates under the
91
+ current host load; CI remains the full matrix authority.
92
+
93
+ ## Conclusion
94
+
95
+ This change removes the Gemini-onboarding friction without weakening the
96
+ conversation-safety invariant that motivated the guard in the first place.