Skip to content

Commit 9f3f186

Browse files
committed
fix: audit remediation wave for REPOSITORY_AUDIT_2026-07-10 findings F-01..F-16
Safe mutation pipeline (F-01): per-call duplicate signatures registered only on success, serialized mutation chain for world/component/lua/skill tools, streamed mutating calls deferred to turn completion. Packaging (F-02): Hub-facing mods code extracted into optional CoreAI.Mods.Hub assembly; honest package dependency graphs. World state (F-04/F-05/F-06): inactive objects in save/clean-slate, Reset clears unresolved list, load_scene validates Build Settings plus Lua whitelist, WebGL IDBFS flush, always-on auto-save, mods rehydrate waits for WorldRestoreCompleted. Audit log (F-07): bounded queue with drop-oldest marker, commit seq/hash only after successful write, rotation marker+anchor entries, serialized flushes, shared CoreAiWebGlPersistence helper. Lua sandbox (F-08): per-instruction GC allocation budget (64 MB) on MoonSharp and Lua-CSharp, table.concat output cap. LLM resilience (F-09/F-10): fallback on internal streaming timeout with commit-aware streaming, orchestrator MaxPending admission cap, binary insertion, lifetime CTS and complete Dispose contract. Version stores (F-11): VersionRetentionPolicy bounds history, stable revision Index, index-based revert in both mod runtimes. Mod events (F-13): per-subscriber isolation. Diagnostics (F-16/F-23): capped trace sink, throttled IMGUI dashboards. Hub mods UX: version history/revert, bundled-update badge, clipboard export/import, cached mod list with debounced search. Also: agent camera/vision feature scaffolding and demo cleanups from the optimization review (#1-6, #11-14). Note: EditMode/PlayMode verification of this wave is still pending; two compile-blocking test regressions introduced alongside it were restored to HEAD (see Docs/REPOSITORY_AUDIT_2_2026-07-10.md, finding A-01).
1 parent 196e31b commit 9f3f186

150 files changed

Lines changed: 6494 additions & 986 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Assets/CoreAI.Demos/FullAccess/Scripts/FullModeModDemoController.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,7 @@ private void Start()
107107
return;
108108
}
109109

110-
var modsScope = FindFirstObjectByType<CoreAI.Composition.CoreAiModsLifetimeScope>();
111-
IObjectResolver luaContainer =
112-
(modsScope != null && modsScope.Container != null) ? modsScope.Container : coreAiScope.Container;
110+
IObjectResolver luaContainer = CoreAiDemoScope.ResolveModsContainer(coreAiScope);
113111

114112
_mods = luaContainer.Resolve<ILuaModRuntime>();
115113
_mods.ModReportEmitted += OnModReport;

Assets/CoreAI.Demos/FullAccess/Scripts/LuaPlatformExampleController.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,7 @@ private IEnumerator Start()
7575
yield break;
7676
}
7777

78-
var modsScope = FindFirstObjectByType<CoreAI.Composition.CoreAiModsLifetimeScope>();
79-
IObjectResolver luaContainer =
80-
(modsScope != null && modsScope.Container != null) ? modsScope.Container : coreAiScope.Container;
78+
IObjectResolver luaContainer = CoreAiDemoScope.ResolveModsContainer(coreAiScope);
8179

8280
_mods = luaContainer.Resolve<ILuaModRuntime>();
8381
_mods.ModReportEmitted += OnModReport;

Assets/CoreAI.Demos/Hub/CoreAiHub.prefab

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ GameObject:
1212
- component: {fileID: 6111818669321907978}
1313
- component: {fileID: 1799913033734913453}
1414
- component: {fileID: 8215100418470852411}
15+
- component: {fileID: 8215100418470999999}
1516
m_Layer: 0
1617
m_Name: CoreAiHub
1718
m_TagString: Untagged
@@ -80,7 +81,25 @@ MonoBehaviour:
8081
m_GameObject: {fileID: 4675024147730017900}
8182
m_Enabled: 1
8283
m_EditorHideFlags: 0
83-
m_Script: {fileID: 11500000, guid: c027407fd03b8c54ba0cf2a96404fba8, type: 3}
84-
m_Name:
85-
m_EditorClassIdentifier: CoreAI.Demos::CoreAI.Demos.HubModsDemoBinder
84+
m_Script: {fileID: 11500000, guid: f9af0a6b05e76364097c882227ac6b69, type: 3}
85+
m_Name:
86+
m_EditorClassIdentifier: CoreAI.Mods::CoreAI.Ai.Hub.CoreAiModsHubBinder
87+
hubWindow: {fileID: 0}
8688
allowFullTier: 1
89+
--- !u!114 &8215100418470999999
90+
MonoBehaviour:
91+
m_ObjectHideFlags: 0
92+
m_CorrespondingSourceObject: {fileID: 0}
93+
m_PrefabInstance: {fileID: 0}
94+
m_PrefabAsset: {fileID: 0}
95+
m_GameObject: {fileID: 4675024147730017900}
96+
m_Enabled: 1
97+
m_EditorHideFlags: 0
98+
m_Script: {fileID: 11500000, guid: 6f62b07a61a10114592464a4a3c64f2f, type: 3}
99+
m_Name:
100+
m_EditorClassIdentifier: CoreAI.Hub.UI::CoreAI.Hub.UI.CoreAiHubDemo
101+
registerAboutPage: 1
102+
registerBuiltInPages: 1
103+
chatTemplate: {fileID: 0}
104+
chatStyleSheet: {fileID: 0}
105+
chatConfig: {fileID: 0}

Assets/CoreAI.Demos/Hub/CoreAiHubDemo.unity

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -297,12 +297,6 @@ PrefabInstance:
297297
- targetCorrespondingSourceObject: {fileID: 4981408220228357819, guid: 32aa855d8ee3f8c43a5f6817d7056a99, type: 3}
298298
insertIndex: -1
299299
addedObject: {fileID: 687696252}
300-
- targetCorrespondingSourceObject: {fileID: 4981408220228357819, guid: 32aa855d8ee3f8c43a5f6817d7056a99, type: 3}
301-
insertIndex: -1
302-
addedObject: {fileID: 687696257}
303-
- targetCorrespondingSourceObject: {fileID: 4981408220228357819, guid: 32aa855d8ee3f8c43a5f6817d7056a99, type: 3}
304-
insertIndex: -1
305-
addedObject: {fileID: 687696258}
306300
m_SourcePrefab: {fileID: 100100000, guid: 32aa855d8ee3f8c43a5f6817d7056a99, type: 3}
307301
--- !u!1 &687696251 stripped
308302
GameObject:
@@ -323,31 +317,6 @@ MonoBehaviour:
323317
m_EditorClassIdentifier: CoreAI.Mods::CoreAI.Ai.Hub.CoreAiModsHubBinder
324318
hubWindow: {fileID: 0}
325319
allowFullTier: 1
326-
--- !u!114 &687696257
327-
MonoBehaviour:
328-
m_ObjectHideFlags: 0
329-
m_CorrespondingSourceObject: {fileID: 0}
330-
m_PrefabInstance: {fileID: 0}
331-
m_PrefabAsset: {fileID: 0}
332-
m_GameObject: {fileID: 687696251}
333-
m_Enabled: 1
334-
m_EditorHideFlags: 0
335-
m_Script: {fileID: 11500000, guid: 9879ea32cf82ce14c923837b61d03817, type: 3}
336-
m_Name:
337-
m_EditorClassIdentifier: CoreAI.Mods::CoreAI.Ai.Hub.WorldStateHubBinder
338-
--- !u!114 &687696258
339-
MonoBehaviour:
340-
m_ObjectHideFlags: 0
341-
m_CorrespondingSourceObject: {fileID: 0}
342-
m_PrefabInstance: {fileID: 0}
343-
m_PrefabAsset: {fileID: 0}
344-
m_GameObject: {fileID: 687696251}
345-
m_Enabled: 1
346-
m_EditorHideFlags: 0
347-
m_Script: {fileID: 11500000, guid: 61920cd1cd4bd5446af07a678e3955f2, type: 3}
348-
m_Name:
349-
m_EditorClassIdentifier: CoreAI.Mods::CoreAI.Ai.Hub.WorldStateAutoSaveHook
350-
saveIntervalSeconds: 60
351320
--- !u!1 &826394818
352321
GameObject:
353322
m_ObjectHideFlags: 0

Assets/CoreAI.Demos/LiveMechanics/Scripts/LiveMechanicsDemoController.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ private void Start()
6666
return;
6767
}
6868

69-
var modsScope = FindFirstObjectByType<CoreAI.Composition.CoreAiModsLifetimeScope>();
70-
IObjectResolver luaContainer =
71-
(modsScope != null && modsScope.Container != null) ? modsScope.Container : coreAiScope.Container;
69+
IObjectResolver luaContainer = CoreAiDemoScope.ResolveModsContainer(coreAiScope);
7270

7371
_slots = luaContainer.Resolve<LuaCsLogicSlots>();
7472
_mods = luaContainer.Resolve<ILuaModRuntime>();

Assets/CoreAI.Demos/LiveMechanicsMods/Scripts/HubModsDemoBinder.cs

Lines changed: 0 additions & 69 deletions
This file was deleted.

Assets/CoreAI.Demos/LiveMechanicsMods/Scripts/HubModsDemoBinder.cs.meta

Lines changed: 0 additions & 2 deletions
This file was deleted.

Assets/CoreAI.Demos/LiveMechanicsMods/Scripts/LiveMechanicsModsChatPersistenceController.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,7 @@ private IEnumerator Start()
140140
yield break;
141141
}
142142

143-
var modsScope = FindFirstObjectByType<CoreAI.Composition.CoreAiModsLifetimeScope>();
144-
IObjectResolver luaContainer =
145-
(modsScope != null && modsScope.Container != null) ? modsScope.Container : coreAiScope.Container;
143+
IObjectResolver luaContainer = CoreAiDemoScope.ResolveModsContainer(coreAiScope);
146144

147145
_mods = luaContainer.Resolve<ILuaModRuntime>();
148146
_versions = luaContainer.Resolve<ILuaScriptVersionStore>();

Assets/CoreAI.Demos/LiveMechanicsMods/Scripts/WaveAutoBattlerModsDemoController.cs

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public sealed class WaveAutoBattlerModsDemoController : MonoBehaviour
2626

2727
private const int MaxLogLines = 14;
2828
private const float EnemySpacing = 1.35f;
29+
private static readonly int BaseColorProperty = Shader.PropertyToID("_Color");
2930

3031
[Tooltip("Scene CoreAI scope. Auto-found when left empty.")] [SerializeField]
3132
private CoreAILifetimeScope coreAiScope;
@@ -39,6 +40,9 @@ public sealed class WaveAutoBattlerModsDemoController : MonoBehaviour
3940
private ILuaModRuntime _mods;
4041
private LuaCsLogicSlots _slots;
4142
private GameObject _heroVisual;
43+
private GUIStyle _richLabelStyle;
44+
private IReadOnlyList<LuaModInfo> _cachedMods = System.Array.Empty<LuaModInfo>();
45+
private Material _entityMaterial;
4246
private float _heroHp;
4347
private float _heroMaxHp = 120f;
4448
private float _heroAttack = 16f;
@@ -73,16 +77,17 @@ private void Start()
7377
return;
7478
}
7579

76-
var modsScope = FindFirstObjectByType<CoreAI.Composition.CoreAiModsLifetimeScope>();
77-
IObjectResolver luaContainer =
78-
(modsScope != null && modsScope.Container != null) ? modsScope.Container : coreAiScope.Container;
80+
IObjectResolver luaContainer = CoreAiDemoScope.ResolveModsContainer(coreAiScope);
7981

8082
_mods = luaContainer.Resolve<ILuaModRuntime>();
8183
_slots = luaContainer.Resolve<LuaCsLogicSlots>();
8284
DeclareSlots();
8385
EnsureAnchorsAndVisuals();
8486
_heroHp = _heroMaxHp;
8587
_mods.ModEventEmitted += OnModEvent;
88+
_mods.ModSourceLoaded += OnModsChanged;
89+
_mods.ModSourceUnloaded += OnModsChanged;
90+
RefreshCachedMods();
8691
_status = "Ask chat to create or edit mods. Prompt buttons insert ready requests.";
8792
Log("Battle started. Lua mods can alter wave scaling, damage, regen and rewards.");
8893
StartNextWave();
@@ -93,7 +98,24 @@ private void OnDestroy()
9398
if (_mods != null)
9499
{
95100
_mods.ModEventEmitted -= OnModEvent;
101+
_mods.ModSourceLoaded -= OnModsChanged;
102+
_mods.ModSourceUnloaded -= OnModsChanged;
96103
}
104+
105+
if (_entityMaterial != null)
106+
{
107+
Destroy(_entityMaterial);
108+
}
109+
}
110+
111+
private void OnModsChanged(string modId, string source, LuaCapabilities capabilities)
112+
{
113+
RefreshCachedMods();
114+
}
115+
116+
private void RefreshCachedMods()
117+
{
118+
_cachedMods = _mods.ListMods();
97119
}
98120

99121
private void DeclareSlots()
@@ -398,14 +420,13 @@ private void OnGUI()
398420

399421
GUILayout.Space(4);
400422
GUILayout.Label("<b>Loaded mods</b>", RichLabel());
401-
IReadOnlyList<LuaModInfo> mods = _mods.ListMods();
402-
if (mods.Count == 0)
423+
if (_cachedMods.Count == 0)
403424
{
404425
GUILayout.Label("No mods loaded.");
405426
}
406427
else
407428
{
408-
foreach (LuaModInfo mod in mods)
429+
foreach (LuaModInfo mod in _cachedMods)
409430
{
410431
GUILayout.Label(
411432
$"* {mod.Id} caps={mod.Capabilities} handlers={mod.HandlerCount} timers={mod.TimerCount} errors={mod.ErrorCount}");
@@ -427,17 +448,23 @@ private void DrawSlot(string slot, string args)
427448
GUILayout.Label($"* {slot}{args} - {(_slots.IsOverridden(slot) ? "Lua override" : "C# default")}");
428449
}
429450

430-
private static void SetRendererColor(GameObject go, Color color)
451+
private void SetRendererColor(GameObject go, Color color)
431452
{
432-
if (go != null && go.TryGetComponent(out Renderer renderer))
453+
if (go == null || !go.TryGetComponent(out Renderer renderer))
433454
{
434-
renderer.sharedMaterial = new Material(Shader.Find("Standard")) { color = color };
455+
return;
435456
}
457+
458+
_entityMaterial ??= new Material(Shader.Find("Standard"));
459+
renderer.sharedMaterial = _entityMaterial;
460+
var block = new MaterialPropertyBlock();
461+
block.SetColor(BaseColorProperty, color);
462+
renderer.SetPropertyBlock(block);
436463
}
437464

438-
private static GUIStyle RichLabel()
465+
private GUIStyle RichLabel()
439466
{
440-
return new GUIStyle(GUI.skin.label) { richText = true, wordWrap = true };
467+
return _richLabelStyle ??= new GUIStyle(GUI.skin.label) { richText = true, wordWrap = true };
441468
}
442469
#else
443470
private void Start()

Assets/CoreAI.Demos/LiveMechanicsMods/WaveAutoBattlerModsDemo.unity

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ GameObject:
182182
- component: {fileID: 532788471}
183183
- component: {fileID: 532788470}
184184
- component: {fileID: 532788469}
185+
- component: {fileID: 532788998}
185186
m_Layer: 0
186187
m_Name: CoreAiHub
187188
m_TagString: Untagged
@@ -198,10 +199,28 @@ MonoBehaviour:
198199
m_GameObject: {fileID: 532788468}
199200
m_Enabled: 1
200201
m_EditorHideFlags: 0
201-
m_Script: {fileID: 11500000, guid: c027407fd03b8c54ba0cf2a96404fba8, type: 3}
202-
m_Name:
203-
m_EditorClassIdentifier: CoreAI.Demos::CoreAI.Demos.HubModsDemoBinder
202+
m_Script: {fileID: 11500000, guid: f9af0a6b05e76364097c882227ac6b69, type: 3}
203+
m_Name:
204+
m_EditorClassIdentifier: CoreAI.Mods::CoreAI.Ai.Hub.CoreAiModsHubBinder
205+
hubWindow: {fileID: 0}
204206
allowFullTier: 1
207+
--- !u!114 &532788998
208+
MonoBehaviour:
209+
m_ObjectHideFlags: 0
210+
m_CorrespondingSourceObject: {fileID: 0}
211+
m_PrefabInstance: {fileID: 0}
212+
m_PrefabAsset: {fileID: 0}
213+
m_GameObject: {fileID: 532788468}
214+
m_Enabled: 1
215+
m_EditorHideFlags: 0
216+
m_Script: {fileID: 11500000, guid: 6f62b07a61a10114592464a4a3c64f2f, type: 3}
217+
m_Name:
218+
m_EditorClassIdentifier: CoreAI.Hub.UI::CoreAI.Hub.UI.CoreAiHubDemo
219+
registerAboutPage: 1
220+
registerBuiltInPages: 1
221+
chatTemplate: {fileID: 0}
222+
chatStyleSheet: {fileID: 0}
223+
chatConfig: {fileID: 0}
205224
--- !u!114 &532788470
206225
MonoBehaviour:
207226
m_ObjectHideFlags: 0

0 commit comments

Comments
 (0)